Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: jagger am April 14, 2019, 15:09:44

Titel: In Kriterium von Abfrage prüfen, ob ein Formular geöffnet ist
Beitrag von: jagger am April 14, 2019, 15:09:44
Guten Tag in die Runde,

mit der Funktion
Public Function fctIsFormOpen(StrName As String) As Boolean
  fctIsFormOpen = (SysCmd(acSysCmdGetObjectState, acForm, StrName) > 0)
End Function

http://www.donkarl.com?FAQ4.19
prüfe ich, ob das Formular "mnu_Kunden" geöffnet ist.
Die Funktion liefert das entsprechende Ergebnis, wenn ich sie per vba aufrufen.

Ich habe nun die Funktion als Kriterium in eine Abfrage eingebaut.
SELECT tab_ex_Umsatz_kompl.AGKDNR
FROM tab_ex_Umsatz_kompl
GROUP BY tab_ex_Umsatz_kompl.AGKDNR
HAVING (((tab_ex_Umsatz_kompl.AGKDNR)=IIf(fctIsFormOpen("mnu_Kunden")=True,[Formulare]![mnu_Kunden]![lbxKunden],[Formulare]![frm_Kunde]![AGKDNR])));


Kann man das eigentlich so machen oder funktioniert das generell nicht, oder habe ich die Funktion falsch eingesetzt?

Wenn nun Formular "mnu_Kunden" geöffnet ist (es ist auch in der Listbox ein Datensatz gewählt)
und Formular "frm_Kunde" ist nicht geöffnet,
fragt Access (Parameter eingeben) nach "Formulare!frm_Kunde!AGKDNR"
Eigentlich sollte hier ja "[Formulare]![frm_Kunde]![AGKDNR]" ignoriert werden.

Ist Formular "mnu_Kunden" nicht geöffnet
und Formular "frm_Kunde" ist geöffnet, fragt Access (Parameter eingeben) nach
"Formulare!mnu_Kunden!lbxKunden".
Eigentlich sollte hier ja "[Formulare]![mnu_Kunden]![lbxKunden]" ignoriert werden.

Sind beide Formulare geöffnet, wir die Abfrage ausgeführt.

Ich kann leider keinen Fehler erkennen.
Hat jemand eine Idee?

LG
jagger
Titel: Re: In Kriterium von Abfrage prüfen, ob ein Formular geöffnet ist
Beitrag von: DF6GL am April 14, 2019, 16:13:00
Hallo,

erstens ist es praktisch immer von Nachteil, sich auf Formular-Steuerelemente zu beziehen. Original liegen die Daten in den Tabellen, Formulare dienen nur zur visuellen Darstellen und ggfls. dem Editieren der Daten.

Zweitens werden bei der IIF-Funktion immer beide Bedingungszweige ausgewertet und ergeben in diesem Fall eine Fehlersituation. (Ein "fehlender" Vergleichswert ist auch eine solche..)

Man könnte den IIF-Ausdruck in eine Public-Function auslagern. Zudem könnten die entspr. Formular-Steuerelement-Werte in Public-Variablen (oder Tempvar-Elemente) vorher abgelegt  und von da aus weiter bearbeitet werden.


Titel: Re: In Kriterium von Abfrage prüfen, ob ein Formular geöffnet ist
Beitrag von: jagger am April 14, 2019, 17:02:22
Hallo DF6GL,

den IIF-Ausdruck in eine Public-Function auszulagern, funktioniert super.

Funktion:
Public Function fctFormIsOpen()
  If fctIsFormOpen("mnu_Kunden") = True Then
  fctFormIsOpen = Forms!mnu_Kunden!lbxKunden
  Else
  fctFormIsOpen = Forms!frm_Kunde!AGKDNR
  End If
End Function


Abfrage:
SELECT tab_ex_Umsatz_kompl.AGKDNR
FROM tab_ex_Umsatz_kompl
GROUP BY tab_ex_Umsatz_kompl.AGKDNR
HAVING (((tab_ex_Umsatz_kompl.AGKDNR)=fctFormIsOpen()));


Danke für den Tipp!

LG
jagger
Titel: Re: In Kriterium von Abfrage prüfen, ob ein Formular geöffnet ist
Beitrag von: PhilS am April 15, 2019, 10:20:57
Zitat von: jagger am April 14, 2019, 17:02:22
den IIF-Ausdruck in eine Public-Function auszulagern, funktioniert super.

Funktion:
Public Function fctFormIsOpen()
     If fctIsFormOpen("mnu_Kunden") = True Then
Zum Abschluss solltest du deiner Funktion noch einen Namen verleihen, der wirklich das widerspiegelt, war sie tut. Die beiden Namen fctFormIsOpen und fctIsFormOpen sind schon in den wenigen Zeilen Code der Funktion selbst total verwirrend.