Access 2003: Abfrage auf NULL/Leer in Datumsfeldern

edmin

Grünschnabel
Hallo Xperts und n' fröhliches 2007!

Ich habe in Access 2003 ein Formular zu Projekten gebaut in dem sich ein Kombifeld (cboJahr) und ein Listenfeld (lstProjekte) befindet.
Die Daten für beide Steuerelemente liefert die Tabelle projekte ...
- ID (gleich der Projektnummer)
- Projektname (Text)
- Start (Datum)
- Ende (Datum)
... in dem sich testweise folgende Datensätze befinden:

000376 ProjektA 10.01.2006 22.01.2006
000377 ProjektB 10.04.2007 13.04.2007
000379 ProjektC 14.02.2008
000381 ProjektD
Im Listenfeld werden entsprechend der im Kombifeld gewählten Projekte mit den Feldern aufgelistet.
Das Kombifeld selbst soll die in der Tabelle in "Start" enthaltenen Werte nach Jahreszahlen filtern.

Vom Prinzip ne' einfache Sache, oder?
Mein Problem ist, dass es auch Projekte gibt (und geben soll!), denen erst mal kein Startdatum zugwiesen wird.
Also brauche ich Einträge, die nicht nur das Filtern nach einzelnen Jahren zulassen, sondern auch ALLE! Projekte und auch die Projekte ermitteln, die kein Startdatum haben.

Im Kombifeld selbst werden die Werte durch folgende Abfrage generiert:
SELECT "ALLE" as jahreszahl,0 As ODERB FROM projekte
UNION
SELECT "ohne Startdatum" as jahreszahl,1 As ODERB FROM projekte
UNION
SELECT Format([Start],"yyyy") AS jahreszahl,2 As ODERB FROM projekte
WHERE (((Format([Start],"yyyy"))>""))
ORDER BY ODERB, jahreszahl DESC;

... was folgende 5 Einträge ergibt:
(1) ALLE (--> soll alle Projekte anzeigen, inkl. der Proj. ohne Startdatum)
(2) ohne Startdatum (--> nur Projekte ohne Startdatum)
(3) 2008
(4) 2007
(5) 2006

Solange eine Jahreszahl wie in (3)/(4)/(5)gewählt wird ist alles OK.
Wie erreiche ich aber die Anzeige der Projekte entsprechend der vorgenannten Einträge (1) und (2)?
Denn dort stehen ja keine Jahre als Kriterien, sondern Zeichenketten drin, die für die Abfrage umgewandelt werden müssen.

Für die Datenherkunft des Listenfelds lstProjekte entsprechend (1) habe ich es mit folgender Abfrage versucht:
SELECT projekte.ID, projekte.Projektname, projekte.Start, projekte.Ende
FROM projekte
WHERE (((Year([Start])) Like IIf([Forms]![frmProjekte]![cboJahr]="ALLE","*",[Forms]![frmProjekte]![cboJahr])))
ORDER BY projekte.ID DESC;
Ich bekomme hier nur die Projekte, denen ein Startdatum zugewiesen wurde (Projekt D fehlte).

Erstelle ich eine unabhängige Abfrage auf die Tabelle für (1) mit:
SELECT projekte.ID, projekte.Projektname, projekte.Start, projekte.Ende
FROM projekte
WHERE projekte.Start Is Null OR projekte.Start Is Not Null
ORDER BY projekte.ID DESC;
... werden mir auch wirklich alle Datensätze angezeigt.
(bzw. für (2) mit WHERE projekte.Start Is Null)
Logisch :)
Bloß: da weiß ich nicht, wie ich das in die IIF-Anweisung einbauen sollte.

Versuche zu (2) für die erwünschte Anzeige von "Projekt D" mit ...
WHERE (((Year([Start])) Like IIf([Forms]![frmProjekte]![cboJahr]="ALLE",IS NULL,[Forms]![frmProjekte]![cboJahr])))
... oder ...
WHERE (((Year([Start])) Like IIf([Forms]![frmProjekte]![cboJahr]="ALLE",NULL,[Forms]![frmProjekte]![cboJahr])))
... oder ...
WHERE (((Year([Start])) Like IIf([Forms]![frmProjekte]![cboJahr]="ALLE",,[Forms]![frmProjekte]![cboJahr])))
... oder ...
WHERE (((Year([Start])) Like IIf([Forms]![frmProjekte]![cboJahr]="ALLE",0,[Forms]![frmProjekte]![cboJahr])))
... oder ...
WHERE (((Year([Start])) Like IIf([Forms]![frmProjekte]![cboJahr]="ALLE","",[Forms]![frmProjekte]![cboJahr])))
... oder was weiss ich, schlugen auch alle fehl.

Meine Frage: wie bringe ich die zwei Kriterien (1) und (2) in die Abfrage für das Listenfeld?
Bin ich komplett auf dem falschen Dampfer und sollte ich lieber nach einer reinen VBA-Lösung suchen, die die Abfrage für das Listenfeld generiert?
Bin allen für Hinweise und Anregungungen dankbar.

Danke und Gruss an alle tutorianer
 
Hy Edmin

Ich habe mich mal heute deiner Sache angenommen, und etwas gebastelt.

Mein Problem dabei war wie du es schon bemerkt hast, das ich keine Abfrage hinbekommen habe die mir z.B. Startdatum =kein Eintrag angezeigt bekommen wurde.
Ist eigentlich auch logisch wenn ich kein Geld habe muss ich auch keins suchen zum ausgeben ?

Somit habe ich in der Tabelle (tblProjekte) "angelegtStart" und "angelegtEnde" hinzugefügt mit einem JA/NEIN Kästchen. Dies macht die Sache einfacher nach etwas zu suchen was nicht eingegeben worden ist. Der Standartwert liegt bei Nein ist logisch.(Nein für noch kein Eintrag)

Bei Projekt eingaben sollte nun im Formular so hinterlegt werden das wenn ein Start bzw. Enddatum vorhanden ist somit auch ein Häkchen automatisch hinzugefügt wird. Dies habe ich nicht gemacht ! (Bei Startdatum hinterlegen nach Eingabe (angelegtStart=Ja) und bei Enddatum (angelegtEnde=Ja)

So nun habe ich folgende Abfragen erstellt:

qryProjekte -> filtert nach Jahr/Monat
qryProjekte_alle -> filtert erst wenn >Alle Projekte< ausgewählt wurde
qryProjekte_ohne Ende -> filtert erst wenn >Ohne Ende< ausgewählt wurde
qryProjekte_ohne Start -> filtert erst wenn >Ohne Start< ausgewählt wurde

So nun folgende Formulare für die Auswahl:
FrmProjekte -> Jahr und Monat auswählbar bzw. Alle Projekte ; Ohne Start ; Ohne Ende
FrmProjekteUF ->zeigt die vorhandenen Daten an

Im (frmProjekte ) gibt es nun ein Listfeld Namens „Monat“ das eine Ereignissproz. Aufruft und je nach dem was Du möchtest im (frmProjekteUF) anzeigt. Er verweist je nach Auswahl auf die verschiedenen Abfragen.

Ich hoffe Du wirst schlau und wünsche Dir alles gute.

Mit freundlichen Grüßen

Sascha
 

Anhänge

  • 27683attachment.zip
    20,3 KB · Aufrufe: 142
Hallo Sascha,

erst mal n' ganz dickes Danke für Deine hilfreiche Antwort und dem nicht unerheblichen Aufwand der kleinen Projekt-DB.
Hatte bereits Bedenken, dass meine Anfrage zu lang und somit ermüdend wirken würde.

Dein Ansatz gefällt mir sehr, denn die Zuweisung einer bestimmten Abfrage entsprechend dem gewählten Eintrag im Listenfeld ...
... tja, genial, das isses!
If Me.Monat = 14 Then
Forms!frmProjekte!frmProjekteUF.Form.RecordSource = "qryProjekte_ohne Start" ...
Ich werd mich gleich mal dran setzen und mich an meiner DB versuchen.

Dir jedenfalls n' schönes Wochenende!

Viele Grüsse zurück
Edmin Grünschnabel
 
Hy Edmin

Freut mich wenns weiterhilft.

Vergiss bitte nicht wenn das Thema erledigt für Dich ist dies auch als "Erledigt" zu makieren.

Wünsche Dir auch ein schönes Wochenende.

MfG
Sascha
 
Moin Edmin,

dann werde ich auch noch schnell was schreiben, bevor Du den Beitrag schließt.. ;-)

Irgendwie scheint mir RavelinePower funktionierende Lösung ein wenig überdimensioniert.

IMHO würde reichen:
a) für ALLE Projekte:
Code:
SELECT projekte.ID, projekte.Projektname, projekte.Start, Year([projekte.Start]), projekte.Ende
FROM projekte
WHERE (Iif(Year([Start]) Is null,"offen", Year([Start])) 
  Like IIf([Forms]![frmProjekte]![cboJahr])))="ALLE","*",[Forms]![frmProjekte]![cboJahr]))
ORDER BY projekte.ID DESC;
b) Für noch nicht begonnene Projekte
Code:
SELECT projekte.ID, projekte.Projektname, projekte.Start, Year([projekte.Start]), projekte.Ende
FROM projekte
WHERE (Iif(Year([Start]) Is null,"offen", Year([Start])) Like IIf([Forms]![frmProjekte]![cboJahr])))="ohne Startdatum","offen",[Forms]![frmProjekte]![cboJahr]))
ORDER BY projekte.ID DESC;

oder, beide kombiniert:

Code:
SELECT projekte.ID, projekte.Projektname, projekte.Start, Year([projekte.Start]), projekte.Ende
FROM projekte
WHERE 
  (Iif(Year([Start]) Is null,"offen", Year([Start])) 
  Like 
   IIf([Forms]![frmProjekte]![cboJahr])))="ALLE","*",
   IIf([Forms]![frmProjekte]![cboJahr])))="ohne Startdatum","offen"
                                      ,[Forms]![frmProjekte]![cboJahr]))))

ORDER BY projekte.ID DESC;

Gruß
Biber2
 
Hallo Biber2,

auch Dir ein Danke für Deine Antwort!
Du beschreibst die Lösung, welche der eigentliche Ursprung des Problems war: verschachtelte Abfragen.
Denn die bekam ich nicht hin, weil ich nicht wusste wie.
Inzwischen habe ich mich aber in den von RavelinePower dargestellten Ansatz (ohne iif in der Prozedur) verliebt, denn diese Variante ist für mich übersichtlicher.
Aus meiner Sicht kann man die Abfragen ohne 'Iif' besser kontrollieren/testen.
Für Grünschnäbel wie mich würde ich diese Variante empfehlen :) .
Wie auch immer: beide Lösungen haben mir weitergeholfen und ich habe dazu gelernt.
Denn jetzt weiß ich, dass das auch geht.
Nochmals Danke!

Dir noch nen' schönen und unbeschwerten Sonntag!
Viele Grüsse
Edmin Grünschnabel
 

Neue Beiträge

Zurück