Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

In Kriterium von Abfrage prüfen, ob ein Formular geöffnet ist

Begonnen von jagger, April 14, 2019, 15:09:44

⏪ vorheriges - nächstes ⏩

jagger

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

DF6GL

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.



jagger

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

PhilS

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.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor