Abfrage

Hallo,

ein neuer Tag, ein neues Problem :wink:. Ich habe ein Formular, in dem drei Komboboxen sind. Der Inhalt der Komboboxen ist abhängig vom gewählten Wert der anderen… ein Beispiel:

  1. KB „Wähle Monat“
  2. KB „Wähle Kunden“
  3. KB „Wähle Mitarbeiter“

in der dritten KB werden nur die Mitarbeiter des Kunden angezeigt, der in der 2. Box gewählt wurde. Soweit kein Problem. Nun wird’s knifflig:

Pro Mitarbeiter und Monat kann die Aktion nur einmalig durchgeführt werden, d.h. dass in der dritten KB ein Mitarbeiter des Kunden nicht mehr angezeigt werden soll, wenn dieser im entsprechenden Monat (Inhalt 1. KB) bereits verwendet wurde.

Ich brauche jetzt also eine Abfrage, die alle Mitarbeiter eines Kunden ausspuckt, die im gewählten Monat noch NICHT (!) bearbeitet wurden. Ob dies der Fall ist, ist in einer weiteren Tabelle gespeichert (dort ist ein Eintrag enthalten, WENN der Mitarbeiter bereits benutzt wurde).

Soweit das Nötigste. Als perfekten Gimmick wäre es auch noch klasse,
wenn in der zweiten Kombobox nur noch die Kunden angezeigt werden würden, für die die dritte Kombobox nicht leer ist.

Danke für jeden Hinweis

Hallo Marc,

ein neuer Tag, ein neues Problem :wink:. Ich habe ein Formular,
in dem drei Komboboxen sind. Der Inhalt der Komboboxen ist
abhängig vom gewählten Wert der anderen… ein Beispiel:

  1. KB „Wähle Monat“
  2. KB „Wähle Kunden“
  3. KB „Wähle Mitarbeiter“

in der dritten KB werden nur die Mitarbeiter des Kunden
angezeigt, der in der 2. Box gewählt wurde. Soweit kein
Problem. Nun wird’s knifflig:

Ich brauche jetzt also eine Abfrage, die alle Mitarbeiter
eines Kunden ausspuckt, die im gewählten Monat noch NICHT (!)
bearbeitet wurden. Ob dies der Fall ist, ist in einer weiteren
Tabelle gespeichert (dort ist ein Eintrag enthalten, WENN der
Mitarbeiter bereits benutzt wurde).

ok, öffne eine neue Abfrage, füge beide Tabellen ein. Verknüpfe beide Tabellen.

für das Feld BENUTZT das Kriterium NEIN/NULL ö.ä. definieren, je nach dem wie du den Feldtyp definiert hast.

Soweit das Nötigste. Als perfekten Gimmick wäre es auch noch
klasse,
wenn in der zweiten Kombobox nur noch die Kunden angezeigt
werden würden, für die die dritte Kombobox nicht leer ist.

da die Info im KB3 ja erst nach der Auswahl der KB2 erfolgt, mußt du in der Abfrage für KB2 die Dsum Funktion nutzen, um festzustellen, ob Daten in der Tabelle für KB3 vorhanden sind.

Grüße aus Essen
Wolfgang
(Netwolf)

Hallo Netwolf,

danke für Deine Anregung. Leider ist genau das Kriterium mein Problem.

ok, öffne eine neue Abfrage, füge beide Tabellen ein.
Verknüpfe beide Tabellen.

für das Feld BENUTZT das Kriterium NEIN/NULL ö.ä. definieren,
je nach dem wie du den Feldtyp definiert hast.

Also, ich vereinfache mal meine Tabellen auf das Nötigste:

Tabelle 1: Name, PersonID

Tabelle 2: PersonID, Zeitraum

für jeden erledigten Job wird nun ein Eintrag in Tabelle 2 getan, in der Art:

1, „10 2006“

Die Paare sind dabei immer eindeutig, aber natürlich kann eine andere Person für denselben Zeitraum auch einen Eintrag haben.

Wenn ich nun in der Abfrage das Kriterium ‚NICHT „10 2006“‘ eingebe, bekomme ich die Person trotzdem, weil sie ja vielleicht mit einem anderen Zeitraum „09 2006“ auch in der Liste ist.

Eigentlich brauche ich also ein Kriterium, die mir ALLE Personen ausgibt, abzüglich derjenigen, die bereits einen Eintrag für den Zeitraum „10 2006“ haben. Wobei der Zeitraum natürlich variabel ist (aber das sollte ja nicht das Problem sein).

Mit VBA wäre es wahrscheinlich sowas wie…

rs2.open „Tabelle 2“
rs1.open „Tabelle 1“
do while (not rs1.EOF)
rs2.filter = "PersonID = " + rs1!PersonID + AND "Zeitraum = " + zeitraum.Value
if (rs2.EOF)
Auswahlbox.additem(rs1!Name)
end if
rs1.moveNext
loop

oder so ähnlich (ungetestet). Nun stell ich mir das aber furchtbar (!) lahm vor. Und den Gimmick, nur die Einträge in KB2 anzuzeigen, die auch noch einen Eintrag in KB3 hätten, krieg ich so auch nicht hin :frowning:

Das muss doch irgendwie eleganter gehen… ?!

Vielen Dank für jeden Schubs in die richtige Richtung…

Hallo Marc,

für jeden erledigten Job wird nun ein Eintrag in Tabelle 2
getan, in der Art:

1, „10 2006“

Die Paare sind dabei immer eindeutig, aber natürlich kann eine
andere Person für denselben Zeitraum auch einen Eintrag haben.

logisch kann eine andere Person für diesen Zeitraum auch einen Eintrag haben, aber das soll ja auch nicht unterbunden werden?

Wenn ich nun in der Abfrage das Kriterium ‚NICHT „10 2006“‘
eingebe, bekomme ich die Person trotzdem, weil sie ja
vielleicht mit einem anderen Zeitraum „09 2006“ auch in der
Liste ist.

das wäre ja dann auch normal und richtig

Eigentlich brauche ich also ein Kriterium, die mir ALLE
Personen ausgibt, abzüglich derjenigen, die bereits einen
Eintrag für den Zeitraum „10 2006“ haben.

dein Zeitraum ist ein Text und kein Zeitraum im Sinne von Access.
D.h. du hast nun mehrere Möglichkeiten:

Kriterium: „10 2006“

Spalte: iif([Zeitraum] „10 2006“;TRUE;FALSE)
Kriterium: False

Wobei der Zeitraum
natürlich variabel ist (aber das sollte ja nicht das Problem
sein).

den kannst du als Parameter in der Abfrage eingeben, oder über ein Formular wählen lassen.

Nun stell ich mir das aber furchtbar (!) lahm vor.

das muß nicht sein :smile:

Und den Gimmick, nur die Einträge in
KB2 anzuzeigen, die auch noch einen Eintrag in KB3 hätten,
krieg ich so auch nicht hin :frowning:

wo genau liegt das Problem?

Grüße aus Essen
Wolfgang
(Netwolf)

Hallo Wolfgang,

vielen Dank, dass Du Dich in mein Problem reindenkst. Leider klappt es so eben nicht, ich versuch mal, es ein bisserl besser zu beschreiben:

Die Paare sind dabei immer eindeutig, aber natürlich kann eine
andere Person für denselben Zeitraum auch einen Eintrag haben.

logisch kann eine andere Person für diesen Zeitraum auch einen
Eintrag haben, aber das soll ja auch nicht unterbunden werden?

nein, das ist ganz normal. Ich wollte das nur nochmal herausstellen, weil es für das Abfrageproblem entscheidend ist.

Wenn ich nun in der Abfrage das Kriterium ‚NICHT „10 2006“‘
eingebe, bekomme ich die Person trotzdem, weil sie ja
vielleicht mit einem anderen Zeitraum „09 2006“ auch in der
Liste ist.

das wäre ja dann auch normal und richtig

ja, aber genau hier ist der Fehler in der Abfrage. Ich brauche ja eine Abfrage, bei der das nicht passiert.

Eigentlich brauche ich also ein Kriterium, die mir ALLE
Personen ausgibt, abzüglich derjenigen, die bereits einen
Eintrag für den Zeitraum „10 2006“ haben.

dein Zeitraum ist ein Text und kein Zeitraum im Sinne von
Access.

stimmt, war meinerseits missverständlich. Ich muss gestehen, dass mir gar nicht bewusst war, dass es in Access einen Datentypen dafür gibt.

D.h. du hast nun mehrere Möglichkeiten:

Kriterium: „10 2006“

Spalte: iif([Zeitraum] „10 2006“;TRUE;FALSE)
Kriterium: False

mir scheinen die beiden Beispiele äquivalent. Leider funktionert es so eben nicht.

Tabelle 1: Personen

„Hans Muster“, 1
„Mr. Access“, 2

Tabelle 2: Zuordnungen

1, „9 2006“
2, „10 2006“
2, „9 2006“
2, „11 2006“

Ich möchte nun eine Abfrage, die mir z.B. auf Eingabe (Parameter) „10 2006“ als Ergebnis (1) liefert. Auf „12 2006“ sollte (1,2) erscheinen, auf „9 2006“ die leere Menge. Ich denke, das Prinzip ist klar.

Wenn ich nun als Kriterium „9 2006“ eingebe, erhalte ich trotzdem (2), weil ja auch Einträge in der Tabelle sind, die das Kriterium erfüllen.

Wobei der Zeitraum
natürlich variabel ist (aber das sollte ja nicht das Problem
sein).

den kannst du als Parameter in der Abfrage eingeben, oder über
ein Formular wählen lassen.

das ist klar und bereits so realisiert.

Nun stell ich mir das aber furchtbar (!) lahm vor.

das muß nicht sein :smile:

das bezog sich auf die VBA-Lösung, auch der nachfolgende Absatz:

Und den Gimmick, nur die Einträge in
KB2 anzuzeigen, die auch noch einen Eintrag in KB3 hätten,
krieg ich so auch nicht hin :frowning:

wo genau liegt das Problem?

Wenn ich in einer Schleife alle Firmen durchlaufe und darin verschachtelt alle Personen dieser Firmen überprüfe, dann scheint mir das reichlich ineffizient und bei großem Datenbestand wird das schon eine Weile dauern, bevor sich das Kombofeld füllt. Was ja irgendwie nicht sein kann… :frowning:

Eigentlich ist das doch ein Paradebeispiel für etwas, was man aus einer Datenbank bekommen möchte. Das Inverse dieser Suche ist ja auch kein Problem (SELECT * FROM tbl WHERE zeitraum=„9 2006“).

Vielen Dank

Marc

Tabelle 1: Personen

„Hans Muster“, 1
„Mr. Access“, 2

Tabelle 2: Zuordnungen

1, „9 2006“
2, „10 2006“
2, „9 2006“
2, „11 2006“

Ich möchte nun eine Abfrage, die mir z.B. auf Eingabe
(Parameter) „10 2006“ als Ergebnis (1) liefert. Auf „12 2006“
sollte (1,2) erscheinen, auf „9 2006“ die leere Menge. Ich
denke, das Prinzip ist klar.

Nachtrag, bevor es zu Missverständnissen kommt:

Sofern in Tabelle 1 weitere Personen stehen, für die es in Tabelle 2 noch gar keine Einträge gibt, sollen diese auch in der Ergebnisliste auftauchen.

Also: Alle Einträge aus Tabelle 1 abzgl. deren, für die in Tabelle 2 ein Eintrag existiert, der ein bestimmtes Kriterium erfüllt (= „9 2006“ z.B.)

Hallo Marc,

klicke auf:

Abfragen
Neu
Abfrageassistent zur Inkonsistenzsuche

damit solltest du deine Auswertung hinbekommen.

Grüße aus Essen
Wolfgang
(Netwolf)