Discussion:
Me.OpenArgs = Null
(zu alt für eine Antwort)
Michael Warlich
2008-09-10 07:03:33 UTC
Permalink
Hallo zusammen!

Ich habe einen Fehler in meiner Acc2003 Datenbank auf den ich einfach
nicht komme. Ich rufe ein Formular von einem anderen aus auf, und
übergebe ihm openargs.
Das Klappt auch meistens. ABER irgendwann und wo (Ich habe nicht
rausgefunden warum und wann) sind die OpenArgs Null obwohl ich definitiv
was übergebe.

Der Aufruf:
[CODE]
DoCmd.OpenForm "Checkliste", , , , , , Me.GesellschaftCode
[/CODE

Me.GesellschaftCode ist ein String.
Auf dem geöffneten Formular mach ich dann noch eine Zuweisung der
OpenArgs in eine Variable.
Wenn das einmal angefangen hat Null zu sein kann ich machen was ich
will, es geht nicht mehr weg. Erst wenn ich die DB komplett schließe und
neu aufmache geht es wieder.

Im Einzelschritt Debugging sehe ich das beim Aufrufen in
Me.GesellschaftCode was drin steht, dann nächster Schritt das Form_Open:
Me.OpenArgs ist leer. Das wunderliche ist das es zu 80% funktioniert...

Hat von euch jemand eine Idee was ich da falsch machen könnte?

LG
Michael
Mike Fried
2008-09-10 07:29:11 UTC
Permalink
Hallo Nichael,
Post by Michael Warlich
Ich habe einen Fehler in meiner Acc2003 Datenbank auf den ich einfach
nicht komme. Ich rufe ein Formular von einem anderen aus auf, und
übergebe ihm openargs.
Das Klappt auch meistens. ABER irgendwann und wo (Ich habe nicht
rausgefunden warum und wann) sind die OpenArgs Null obwohl ich definitiv
was übergebe.
[CODE]
DoCmd.OpenForm "Checkliste", , , , , , Me.GesellschaftCode
[/CODE
Me.GesellschaftCode ist ein String.
Auf dem geöffneten Formular mach ich dann noch eine Zuweisung der
OpenArgs in eine Variable.
Wenn das einmal angefangen hat Null zu sein kann ich machen was ich
will, es geht nicht mehr weg. Erst wenn ich die DB komplett schließe und
neu aufmache geht es wieder.
Im Einzelschritt Debugging sehe ich das beim Aufrufen in
Me.OpenArgs ist leer. Das wunderliche ist das es zu 80% funktioniert...
also verlieren tust Du den OpenArgs mit Sicherheit durch einen nicht
abgefangenen Fehler. Nicht abgefangene Fehler lösen aber in der Regel
Laufzeitfehler aus. Was passiert also in Deinem Open-Event im Formular?
Vermutlich wird der Geschäftscode verarbeitet. Nur so ins Blaue hinein
geschrieben könnte da ein Sonderzeichen oder ein reserviertes Wort drinnen
stehen. Sehr beliebt sind & ' und so. Um da aber genaueres zu sagen währe
der verarbeitende Code wichtig. Poste doch mal das Form_Open.

Gruß Mike
Michael Warlich
2008-09-10 07:41:09 UTC
Permalink
Post by Mike Fried
Hallo Nichael,
also verlieren tust Du den OpenArgs mit Sicherheit durch einen nicht
abgefangenen Fehler. Nicht abgefangene Fehler lösen aber in der Regel
Laufzeitfehler aus. Was passiert also in Deinem Open-Event im Formular?
Vermutlich wird der Geschäftscode verarbeitet. Nur so ins Blaue hinein
geschrieben könnte da ein Sonderzeichen oder ein reserviertes Wort drinnen
stehen. Sehr beliebt sind & ' und so. Um da aber genaueres zu sagen währe
der verarbeitende Code wichtig. Poste doch mal das Form_Open.
Gruß Mike
Hi Mike

Hier erstmal der Code des Form_Open
[CODE]
Private Sub Form_Open(Cancel As Integer)
AktGesellschaft = Me.OpenArgs
If StartHedgen("") = True Then
Call OpenCheckListe
Else
Cancel = True
End If
End Sub
[/CODE]

Sonderzeichen sind schon dabei, aber die sind auch dabei wenn es
funktioniert. Und das Sonderzeichen ist ein "_" welches keine Probleme
machen sollte. Der Gesellschaftscode ist z.B. "GE_1234".
Es ist der gleiche wenn es funktioniert oder wenn es nicht funktioniert.

LG
Michael
Lorenz Hölscher
2008-09-10 09:26:07 UTC
Permalink
Hallo Michael,
Post by Michael Warlich
Hier erstmal der Code des Form_Open
[CODE]
Private Sub Form_Open(Cancel As Integer)
AktGesellschaft = Me.OpenArgs
If StartHedgen("") = True Then
Call OpenCheckListe
Else
Cancel = True
End If
End Sub
[/CODE]
Sicherheitshalber würde ich beim Zugriff auf OpenArgs _immer_ prüfen,
ob die überhaupt gefüllt ist, also z.B.

If IsNull(Me.OpenArgs) Then
'dumm gelaufen
Else
AktGesellschaft = Me.OpenArgs
'usw.

Ansonsten versuchst Du nämlich möglicherweise, einer String(?)-
Variablen einen Null-Wert unterzujubeln, was natürlich einen Fehler
auslöst.

Unabhängig davon schreibst Du, dass Du immer OpenArgs übergibst. Kann
es sein, dass das Formular dann schon aus einem anderen Aufruf (oder
gar manuell wegen Test!) offen ist und daher OpenArgs gar nicht erneut
übergeben wird? Ich habe das noch nicht getestet, aber Du kannst es
bei Dir ja mal prüfen.

Bevor Dein Code also mit DoCmd.OpenForm das Formular öffnet, check das
doch mal mit einer solchen Funktion:

Function IstFormularOffen(strFormName As String)
IstFormularOffen = (SysCmd(acSysCmdGetObjectState, _
acForm, strFormName) = acObjStateOpen)
End Function


Viel Erfolg,
Lorenz

--
http://www.cls-software.de/cls_software/TippsAccessVBA.aspx
André Minhorst
2008-09-10 09:37:19 UTC
Permalink
Post by Lorenz Hölscher
Unabhängig davon schreibst Du, dass Du immer OpenArgs übergibst. Kann
es sein, dass das Formular dann schon aus einem anderen Aufruf (oder
gar manuell wegen Test!) offen ist und daher OpenArgs gar nicht erneut
übergeben wird? Ich habe das noch nicht getestet, aber Du kannst es
bei Dir ja mal prüfen.
Ich glaube, dass es genau das sein wird. Gerade wenn man ein Formular von
einem anderen Formular aus als modalen Dialog öffnet und dieses Formular
dann beim Klicken auf OK unsichtbar macht, um vom aufrufenden Formular
irgendwelche Steuerelemente des unsichtbaren Formulars auszulesen, passiert
es mir auch gelegentlich, dass ich die DoCmd.Close-Anweisung zum
endgültigen Schließen des unsichtbaren Formulars vergesse - und wenn das
dann beim nächsten Aufruf noch unsichtbar vorhanden ist, wird es einfach
nur sichtbar gemacht. OpenArgs werden so nicht neu übergeben.

Viele Grüße
André
--
http://www.access-entwicklerbuch.de
http://www.access-im-unternehmen.de
Henry Habermacher
2008-09-10 11:13:50 UTC
Permalink
Hallo Mike
Post by Michael Warlich
Hier erstmal der Code des Form_Open
[CODE]
Private Sub Form_Open(Cancel As Integer)
AktGesellschaft = Me.OpenArgs
If StartHedgen("") = True Then
In diesem Fall mach einfach beim Aufruf um den Parameter, den Du in OpenArgs
übergibst, ein Nz() drum herum.

Gruss
Henry
--
11. AEK Anmeldung unter http://donkarl.com/?AEK
Microsoft MVP Office Access
Keine E-Mails auf Postings in NGs. Danke.
Access FAQ www.donkarl.com
André Minhorst
2008-09-10 11:29:06 UTC
Permalink
Hi Henry,
Post by Henry Habermacher
Post by Michael Warlich
Hier erstmal der Code des Form_Open
[CODE]
Private Sub Form_Open(Cancel As Integer)
AktGesellschaft = Me.OpenArgs
If StartHedgen("") = True Then
In diesem Fall mach einfach beim Aufruf um den Parameter, den Du in OpenArgs
übergibst, ein Nz() drum herum.
das löst aber doch nicht das Problem. Und das lautet: Warum enthält
OpenArgs keinen Wert, obwohl ich eigentlich einen übergeben habe? Letztlich
verschleiert das Umwandeln von Null in "" oder 0 doch nur das Fehlen des
Öffnungsarguments und sorgt möglicherweise im weiteren Verlauf für das
Auftreten von Fehlverhalten, deren Ursache dann noch schwieriger zu orten
ist.

Da ist die Fehlermeldung, die einen mit der Nase auf den fehlenden
OpenArgs-Wert stößt, doch besser - vorausgesetzt natürlich, dass die
Anwendung einen leeren OpenArgs-Wert ausschließt. Sonst kann man den
natürlich, wie von Dir vorgeschlagen, umwandeln und anderweitig auswerten.

Ciao
André
--
http://www.access-entwicklerbuch.de
http://www.access-im-unternehmen.de
Henry Habermacher
2008-09-10 11:39:24 UTC
Permalink
Hallo André
Post by André Minhorst
das löst aber doch nicht das Problem. Und das lautet: Warum enthält
OpenArgs keinen Wert, obwohl ich eigentlich einen übergeben habe?
Letztlich verschleiert das Umwandeln von Null in "" oder 0 doch nur das
Fehlen des Öffnungsarguments und sorgt möglicherweise im weiteren Verlauf
für das Auftreten von Fehlverhalten, deren Ursache dann noch schwieriger
zu orten ist.
mit folgende Code wird as wohl einfach herausfindbar sein (ich gehe davon
aus, dass das OpenArgs richtig übergeben wird, aber eben in der Variablen
Null drin steht. Das hätte sonst garantiert schon jemand gemeldet.):

If Not IsNull(Me!GesellschaftCode) Then
DoCmd.OpenForm "Checkliste", , , , , , Me!GesellschaftCode
Else
Stop
End If

Ansonsten wäre es natürlich interessant zu wissen, wo der Aufruf erfolgt.
Könnte ja durchaus auch in einem weniger geeigneten Ereignis sein, bei dem
u.U. gar noch kein GesellschaftCode vorhanden ist.
Post by André Minhorst
Da ist die Fehlermeldung, die einen mit der Nase auf den fehlenden
OpenArgs-Wert stößt, doch besser - vorausgesetzt natürlich, dass die
Anwendung einen leeren OpenArgs-Wert ausschließt. Sonst kann man den
natürlich, wie von Dir vorgeschlagen, umwandeln und anderweitig auswerten.
Da ja nach dem Aufruf kontrolliert wird, ob es "" ist, bin ich davon
ausgegangen, dass eben genau das der Fall ist.

Gruss
Henry
--
11. AEK Anmeldung unter http://donkarl.com/?AEK
Microsoft MVP Office Access
Keine E-Mails auf Postings in NGs. Danke.
Access FAQ www.donkarl.com
Thomas Möller
2008-09-10 15:45:18 UTC
Permalink
Hallo Michael,
Post by Michael Warlich
Hier erstmal der Code des Form_Open
[CODE]
Private Sub Form_Open(Cancel As Integer)
AktGesellschaft = Me.OpenArgs
If StartHedgen("") = True Then
Call OpenCheckListe
Else
Cancel = True
End If
End Sub
[/CODE]
was ist eigentlich "AktGesellschaft"?

Handelt es sich dabei um eine Variable?
Oder um ein Steuerelement?

CU
--
Thomas

Homepage: www.Team-Moeller.de
Loading...