Kann das Access?

Hallo Leute,

ich habe folgendes Problem:

Ich habe mehrere Tabellen, die von der Struktur alle gleich sind.

Tabelle: SACHSEN
LAND LANDNAM RESSORT RTITEL ETAT
1 Sachsen 40 Schulen 300
1 Sachsen 60 Uni 430
... ... ... ... ...

Tabelle: NRW
LAND LANDNAM RESSORT RTITEL ETAT
4 NRW 40 Medizin 300
4 NRW 60 Straßen 430
... ... ... ... ...

Tabelle: weitere Tabellen

Lediglich die Inhalte sind natürlich unterschiedlich.

Um die Etats dem Benutzer zielsicher anzeigen zu können, schwebt mir folgendes vor:

1.: Per Kombinationsfeld ein Land wählen.

2.: Nach der Auswahl des Landes soll ein Kombinationsfeld erscheinen, in der die Landesspezifischen Ressorts angezeigt werden.

3.: Nach dem man das Ressort angeklickt hat, soll der Etat des Ressorts des Lands angezeigt werden.

Leider finde ich in der Online-Hilfe keine Hinweise dazu, auch nicht im Access-Handbuch, wie man einen Datensatz anzeigt, dessen Auswahl durch zwei vorgeschaltete Kombinations-/Listenfelder determiniert werden.

Hat jemand vielleicht eine Idee oder einen anderen Vorschlag, wie man dieses Problem lösen kann?

Ich wäre Euch sehr dankbar für Eure Lösungshilfen.

Gruss,
Seppel

Hallo,

Ich habe mehrere Tabellen, die von der Struktur alle gleich
sind.

Tabelle: SACHSEN
LAND LANDNAM RESSORT RTITEL ETAT
1 Sachsen 40 Schulen 300
1 Sachsen 60 Uni 430
… … … … …

Tabelle: NRW
LAND LANDNAM RESSORT RTITEL ETAT
4 NRW 40 Medizin 300
4 NRW 60 Straßen 430
… … … … …

Tabelle: weitere Tabellen

Wenn lediglich die Daten unterschiedlich sind, würde ich das nicht in unterschiedliche Tabellen packen, sondern die jeweiligen Datensätze per WHERE-Klausel auswählen.

Ich würde die Länder in eine Referenztabelle verbannen (normalisieren). Sonst könnte passieren, daß Du z.B. zwei verschiedene Einträge für das Land 4 erhälst.

Wenn ich das richtig verstehe, sind die Ressorts und die Etats korrespondierend (d.h., pro Ressort gibt es nur ein Etat). Ansonsten auch hier: teile diese Informationen in zwei Tabellen auf, in Ressorts und Etats.

Lange Rede, kurzer Sinn: Erstelle die zwei Tabellen, Länder und Ressorts. Die eine enthält alle Länderinformationen (LAND, LANDNAM) . Die andere enthält die Ressortinformationen (RESSORT, RTITEL, ETAT) plus einen Verweis (Foreign Key) auf die Ländernummer.

Erstelle ein Formular basierend auf der Tabelle Ressorts mit den Feldern RESSORT, RTITEL, ETAT.

Erstelle zusätzlich ein ungebundenes Kombinationsfeld cbLand, als Datenquelle gibst Du „SELECT LAND, LANDNAM FROM LAENDER“ ein, gebundenes Feld ist das erste.

Als Datenquelle des Formulars gibst Du „SELECT RESSORT, RTITEL, ETAT FROM RESSORTS WHERE LAND = Me!cbLand“ an.

Das Kombinationsfeld muß eine AfterUpdate-Prozedur erhalten, die als einziges Me.Requery aufruft (d.h., die Daten des Formulars werden bei jeder Auswahl im Kombinationsfeld neu angezeigt).

Willst Du nicht eine Liste, sondern wirklich nur einen Datensatz anzeigen, kannst Du das Ganze natürlich wiederholen: erstelle ein weiteres Kombifeld cbRessort, als Datenquelle wird „SELECT RESSORT, RTITEL FROM RESSORTS WHERE LAND = Me!cbLand“ eingetragen. Die Datenquelle des Formulars lautet „SELECT RESSORT, RTITEL, ETAT FROM RESSORTS WHERE LAND = Me!cbLand AND RESSORT = Me!cbRessort“. Die Ereignisprozedur von cbLand ruft nicht Me.Requery, sondern Me!cbRessort.Requery auf. Die Ereignisprozedur von cbRessort dann Me.Requery.

Hoffe geholfen zu haben!

Gruß

J.

Hallo José,

zunächst einmal Danke für Deine schnelle und doch sehr präzise Antwort. Jedoch habe ich an Deiner Antwort festgestellt, dass meine Frage nicht genau genug war und dass ich einiges nicht verstanden habe. Dazu mehr unten …

Tabelle: SACHSEN
LAND LANDNAM RESSORT RTITEL ETAT
1 Sachsen 40 Schulen 300
1 Sachsen 60 Uni 430
… … … … …

Tabelle: NRW
LAND LANDNAM RESSORT RTITEL ETAT
4 NRW 40 Medizin 300
4 NRW 60 Straßen 430
… … … … …

Tabelle: weitere Tabellen

Wenn lediglich die Daten unterschiedlich sind, würde ich das
nicht in unterschiedliche Tabellen packen, sondern die
jeweiligen Datensätze per WHERE-Klausel auswählen.

Ich würde die Länder in eine Referenztabelle verbannen
(normalisieren). Sonst könnte passieren, daß Du z.B. zwei
verschiedene Einträge für das Land 4 erhälst.

Wenn ich das richtig verstehe, sind die Ressorts und die Etats
korrespondierend (d.h., pro Ressort gibt es nur ein Etat).

Prinzipiell schon, jedem Ressort ist ein Etat zugewiesen, nur das es sich dabei um Zeitreihen handelt, z.B. von 1895 bis 1933 oder von 1875 mit Lücken bis 1955. Also pro Jahr ein Etat für das Ressort. Ich habe diese Angaben nur weggelassen um die Tabelle hier nicht so unübersichtlich zu machen.

Ansonsten auch hier: teile diese Informationen in zwei
Tabellen auf, in Ressorts und Etats.

Lange Rede, kurzer Sinn: Erstelle die zwei Tabellen, Länder
und Ressorts. Die eine enthält alle Länderinformationen (LAND,
LANDNAM) . Die andere enthält die Ressortinformationen
(RESSORT, RTITEL, ETAT) plus einen Verweis (Foreign Key) auf
die Ländernummer.

Wie erstelle ich einen Verweis? Ich habe beides in der Hilfe eingegeben, Verweis und Foreign Key, aber nicht gefunden.

Erstelle ein Formular basierend auf der Tabelle Ressorts mit
den Feldern RESSORT, RTITEL, ETAT.

Erstelle zusätzlich ein ungebundenes Kombinationsfeld cbLand,

…cbLand wäre dann unter Eigenschaften der Name?

als Datenquelle gibst Du „SELECT LAND, LANDNAM FROM LAENDER“
ein, gebundenes Feld ist das erste.

…Datenquelle wäre dann unter Eigenschaften Datenherkunft?

Als Datenquelle des Formulars gibst Du „SELECT RESSORT,
RTITEL, ETAT FROM RESSORTS WHERE LAND = Me!cbLand“ an.

…sehe ich das richtig, das ich für das Formular die Eigenschaften erreiche, indem ich oben links das Kästchen markiere um das gesamte Formular zu markieren? Also darüber die Datenquelle/herkunft definieren?

Das Kombinationsfeld muß eine AfterUpdate-Prozedur erhalten,
die als einziges Me.Requery aufruft (d.h., die Daten des
Formulars werden bei jeder Auswahl im Kombinationsfeld neu
angezeigt).

Willst Du nicht eine Liste, sondern wirklich nur einen
Datensatz anzeigen, kannst Du das Ganze natürlich wiederholen:

…was wäre denn Deiner Meinung nach der Unterschied zwischen Liste und Datensatz, das habe ich nicht verstanden.

erstelle ein weiteres Kombifeld cbRessort, als Datenquelle
wird „SELECT RESSORT, RTITEL FROM RESSORTS WHERE LAND =
Me!cbLand“ eingetragen. Die Datenquelle des Formulars lautet
„SELECT RESSORT, RTITEL, ETAT FROM RESSORTS WHERE LAND =
Me!cbLand AND RESSORT = Me!cbRessort“. Die Ereignisprozedur
von cbLand ruft nicht Me.Requery, sondern Me!cbRessort.Requery
auf. Die Ereignisprozedur von cbRessort dann Me.Requery.

Ich danke Dir trotzdem schon mal, auch wenn Du mir vielleicht nicht auf alles antworten kannst.

Gruß,
Seppel

Hi,

Wenn ich das richtig verstehe, sind die Ressorts und die Etats
korrespondierend (d.h., pro Ressort gibt es nur ein Etat).

Prinzipiell schon, jedem Ressort ist ein Etat zugewiesen, nur
das es sich dabei um Zeitreihen handelt, z.B. von 1895 bis
1933 oder von 1875 mit Lücken bis 1955. Also pro Jahr ein Etat
für das Ressort. Ich habe diese Angaben nur weggelassen um die
Tabelle hier nicht so unübersichtlich zu machen.

Also mehrere Etats pro jedem Ressort (das nennt man eine 1:n-Beziehung: zu einem Datensatz der Ressort-Tabelle gibt es bis zu n Datensätze in der Etattabelle

Ansonsten auch hier: teile diese Informationen in zwei
Tabellen auf, in Ressorts und Etats.

Mußt Du dann also machen.

Lange Rede, kurzer Sinn: Erstelle die zwei Tabellen, Länder
und Ressorts. Die eine enthält alle Länderinformationen (LAND,
LANDNAM) . Die andere enthält die Ressortinformationen
(RESSORT, RTITEL, ETAT) plus einen Verweis (Foreign Key) auf
die Ländernummer.

Wie erstelle ich einen Verweis? Ich habe beides in der Hilfe
eingegeben, Verweis und Foreign Key, aber nicht gefunden.

Foreign Key = Fremdschlüssel. Weiß jetzt nicht, wie das in der Access-Hilfe heißt (bin momentan auf einer AIX-Maschine zugange).
Das Ganze bedeutet: es ist eine Spalte gleichen Datentyps wie der Primärschlüssel auf einer anderen Tabelle, in diesem Fall also LAND der Tabelle LAENDER. Hier werden nur Werte eingetragen, die es in LAENDER als Ländernummer gibt. Das wird unter Access im Menüpunkt „Beziehungen“ abgehakt (ich glaube, Datei/Beziehungen).

…cbLand wäre dann unter Eigenschaften der Name?

Genau. Es gibt eine Benamsungs-Konvention, bei der die Namen der Steuerelemente einen Präfix erhalten, der ihren Typ angibt, hier steht also „cb“ für ComboBox.

als Datenquelle gibst Du „SELECT LAND, LANDNAM FROM LAENDER“
ein, gebundenes Feld ist das erste.

…Datenquelle wäre dann unter Eigenschaften Datenherkunft?

Äh, sorry, ja, genau.

Als Datenquelle des Formulars gibst Du „SELECT RESSORT,
RTITEL, ETAT FROM RESSORTS WHERE LAND = Me!cbLand“ an.

…sehe ich das richtig, das ich für das Formular die
Eigenschaften erreiche, indem ich oben links das Kästchen
markiere um das gesamte Formular zu markieren? Also darüber
die Datenquelle/herkunft definieren?

Ja, so ist es.

Das Kombinationsfeld muß eine AfterUpdate-Prozedur erhalten,
die als einziges Me.Requery aufruft (d.h., die Daten des
Formulars werden bei jeder Auswahl im Kombinationsfeld neu
angezeigt).

Willst Du nicht eine Liste, sondern wirklich nur einen
Datensatz anzeigen, kannst Du das Ganze natürlich wiederholen:

…was wäre denn Deiner Meinung nach der Unterschied zwischen
Liste und Datensatz, das habe ich nicht verstanden.

Mit der Liste bekommst Du mehrere Datensätze angezeigt (z.B. als Endlosformular), weil Dein SELECT eine Datensatzmenge ergibt. Der einzelne Datensatz ergibt sich erst, wenn Du das Ressort ausgewählt hast - heute weiß ich, daß dies auch nicht ausreicht, denn es können mehrere auftreten.

Ich hoffe, das hilft. Ich muß Dich aber hier auf ein Access-Buch oder einen erfahrenen Kollegen, der Dir zur Seite steht, denn das ist ein weites Feld, und ohne Anleitung wirst Du schnell die Lust verlieren!

Gruß

J.