Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: MaxP am September 24, 2019, 18:54:40

Titel: Formularname übergeben mit Openargs
Beitrag von: MaxP am September 24, 2019, 18:54:40
Hallo zusammen,

ich versuche seit Stunden bei dem Formular Form1!Ufo über ein Button folgenden Code auszuführen und Formular Form2 mit dem Openargs zu öffnen:

Dim stDocName As String
   
    stDocName = "Form2"
    DoCmd.OpenForm stDocName, , , , , , "Forms!Form1!Ufo"


Das Form2 ist ein kleiner Rechner, der aus mehreren Forms geöffnet werden soll. Der Wert soll dann an das Feld Menge des Form1 übertragen werden.

Dim var As Variant
   
    var = Me.openargs
    var.Form!Menge = Me!Ergebnis
   
    DoCmd.Close


Es erscheint die Fehlermeldung "Objekt erforderlich"
Bei debug.print var wird mir der richtige Formularname angezeigt. Gebe ich diesen statt var ein, funktioniert es, wie es soll.

Was mache ich falsch??

Gruß
Max
Titel: Re: Formularname übergeben mit Openargs
Beitrag von: DF6GL am September 24, 2019, 20:16:43
Hallo,


mit "Openargs" kann nur ein Ausdruck, der hier ein Literal-String ist, übergeben werden...

Die Zuweisung diese Strings an eine Variant-Variable öffnet ja nun kein Formular und "var.Form!Menge" ist eine sinnlose Angabe.


Du solltest den Wert mittels Openargs übergeben und zuweisen.  Wozu das "Docmd.Close" gut sein soll, sehe ich nicht.

Im Form1!Ufo:

Sub btnButton_Click()
Docmd.Openform "Form2", , , , , , Me!Ergebnis
End Sub


Im Form "Form2":

Sub Form_Load ()
  If not Isnull (Me.Openargs) Then
    Me!Menge = Me.Openargs
  End If
End Sub


Titel: Re: Formularname übergeben mit Openargs
Beitrag von: MaxP am September 25, 2019, 10:15:12
Da habe ich mich vielleicht nicht ganz verständlich ausgedrückt.

Das Feld Ergebnis gehört zu Form2 und nicht zu Form1!Ufo. Das Feld Menge gehört zu Form1!Ufo.

Form1!Ufo ist das Unterformular, in das der berechnete, arithmetische Wert aus Form2 in das Feld Menge eingefügt werden soll. Form2 ist ein Popup-Formular, dass ein ungebundenes Feld zur Eingabe der zu berechnenden Werte und das Ergebnisfeld Ergebnis (eval()) besitzt.

Form 2 ist in mehreren Formularen eingebunden.

Die Übergabe des Formularnamens Form1!Ufo als Openarg funktioniert in soweit, zumindest wenn ich in Form2 mir diesen Wert über debug.print anzeigen lasse.

Nach Ermittlung und Übergabe des Ergebnisses an Form1!Ufo wird gleichzeitig das Form2 gschlossen.

Vielleicht geht es auch ganz anders einfacher?

Gruß
Max


Titel: Re: Formularname übergeben mit Openargs
Beitrag von: PhilS am September 25, 2019, 10:48:58
Zitat von: MaxP am September 25, 2019, 10:15:12
Nach Ermittlung und Übergabe des Ergebnisses an Form1!Ufo wird gleichzeitig das Form2 gschlossen.

Vielleicht geht es auch ganz anders einfacher?
Nicht unbedingt einfacher, aber besser:
Schreib eine Funktion, die ...Diese Funktion rufst du überall auf, wo du die Berechnung über das Form brauchst.
Besser weil: Keine Abhängigkeiten zwischen den verschiedenen Formularen.
Als Sahnehäubchen könntest du das Berechnungsergebnis in Form2 von einer Property oder Function zurückliefern lassen, dann sind alle  Abhängigkeiten von Formularinterna (Steuerelemente)außerhalb ihrer jeweiligen Formulare eliminiert.
Titel: Re: Formularname übergeben mit Openargs
Beitrag von: DF6GL am September 25, 2019, 12:54:19
Hallo,

Alternativ zur Funktion mit ähnlicher Logik:

Im Form1!Ufo:

Sub btnButton_Click()
Docmd.Openform "Form2",,,,,acDialog
End Sub



Im Form "Form2":


Sub Form_Unload()
      Forms!Forms1!Ufo!Menge = Me!Ergebnis
End Sub

Titel: Re: Formularname übergeben mit Openargs
Beitrag von: MaxP am September 25, 2019, 15:14:15
Hallo zusammen,

@Franz
so hatte ich es anfänglich auch gemacht. Nur dann bin ich ausschließlich an Form1 gebunden, oder? Ich bräuchte für 3 Ausgangsformulare auch 3 Rechnerformulare mit eigenem Code entsprechend Form1.

@ Phil
Wozu ist der 2. Pkt "unsichtbar..." erforderlich?
Wie funktioniert der Pkt "Berechnungsergebnis als Rückgabewert der Funktion"? Schaffe ich es denn ohne Dein Sahnehäubchen, den Formularnamen Form1!Ufo im Code außen vor zu lassen?

Mit der Übergabe von Variablen zw. Funktion u. Sub habe ich so meine Probleme. Vielleicht hast Du ein kleines Beispiel parat?

Gruß
Max
Titel: Re: Formularname übergeben mit Openargs
Beitrag von: PhilS am September 25, 2019, 15:29:38
Zitat von: MaxP am September 25, 2019, 15:14:15
@ Phil
Wozu ist der 2. Pkt "unsichtbar..." erforderlich?
Wenn du ein Formular als Dialog öffnest (WindowMode=acDialog), hält der aufrufende Code an dieser Stelle an und nur Code innerhalb des Formulars läuft. Sobald du das Form unsichtbar machst, läuft der Code weiter.


Zitat von: MaxP am September 25, 2019, 15:14:15
Wie funktioniert der Pkt "Berechnungsergebnis als Rückgabewert der Funktion"? Schaffe ich es denn ohne Dein Sahnehäubchen, den Formularnamen Form1!Ufo im Code außen vor zu lassen?
Luftcode, ohne Gewähr:
Public Function Berechnung() As Double

    Const DIALOGFORM_NAME As String = "Form2"

    Dim Berechnungsergebnis As Double

    DoCmd.OpenForm DIALOGFORM_NAME, WindowMode = acDialog
    ' Der code hält hier an bis Form2 geschlossen oder unsichtbar
    ' Für diese Funktion ist unsichtbar erforderlich!
   
    Berechnungsergebnis = Forms(DIALOGFORM_NAME).Controls("SteuerelementMitBerechnungsergebnis").Value
    DoCmd.Close acForm, DIALOGFORM_NAME, acSaveNo
   
    Berechnung = Berechnungsergebnis

End Function

An beliebiger Stelle:Forms!Forms1!Ufo!Menge = Berechnung()
Titel: Re: Formularname übergeben mit Openargs
Beitrag von: MaxP am September 25, 2019, 16:21:34
es funzt nicht, sch...

Code im Ausgangsform:
Private Sub Befehl148_Click()

Call Berechnung
Forms!Forms1!Ufo!Menge = Berechnung()

End Sub


Code der Funktion:
Public Function Berechnung() As Double

    Const DIALOGFORM_NAME As String = "Form2"

    Dim Berechnungsergebnis As Double

    DoCmd.OpenForm DIALOGFORM_NAME, , , , , acDialog
    ' Der code hält hier an bis Form2 geschlossen oder unsichtbar
    ' Für diese Funktion ist unsichtbar erforderlich!
   
    Berechnungsergebnis = Forms(DIALOGFORM_NAME).Controls("Ergebnis").Value
    DoCmd.Close acForm, DIALOGFORM_NAME, acSaveNo
   
    Berechnung = Berechnungsergebnis
Debug.Print Berechnung 'okay

End Function


Code von form2 Ok-Button:
Private Sub Befehl13_Click()

Me.Visible = False
' bzw. Forms!Form2.Visible = False

End Sub


Gebe ich im letzten Code Forms!Form2.Visible = False ein,
gibt es zwqar keine Fehlermeldung, aber die Rechenwerte muss ich zweimal eingeben, bevor das Form ausgeblendet wird.

Gebe ich im letzten Code Forms!Form2.Visible = False öffnet sich Form2, es erscheint die Fehlermeldung: "Unzulässige Verwendung von Null". Es wird die Zeile
"Berechnungsergebnis = Forms(DIALOGFORM_NAME).Controls("Ergebnis").Value"
gelb markiert.

Gruß
Max


Titel: Re: Formularname übergeben mit Openargs
Beitrag von: PhilS am September 26, 2019, 08:25:31
Zitat von: MaxP am September 25, 2019, 16:21:34
es funzt nicht, sch...

Code im Ausgangsform:
Private Sub Befehl148_Click()

Call Berechnung
Forms!Forms1!Ufo!Menge = Berechnung()

End Sub

[...]
Gebe ich im letzten Code Forms!Form2.Visible = False ein,
gibt es zwqar keine Fehlermeldung, aber die Rechenwerte muss ich zweimal eingeben, bevor das Form ausgeblendet wird.

Gebe ich im letzten Code Forms!Form2.Visible = False öffnet sich Form2, es erscheint die Fehlermeldung: "Unzulässige Verwendung von Null". Es wird die Zeile
"Berechnungsergebnis = Forms(DIALOGFORM_NAME).Controls("Ergebnis").Value"
gelb markiert.
Du rufst im Ausgangsform die Berechnungsfunktion zweimal auf. - Die erste der beiden Zeilen bitte löschen.

Nachdem du die Berechnung zweimal gestartet hast, ist es klar dass du sie dann auch zweimal durchführen musst.

Die Fehlermeldung "Unzulässige Verwendung von Null" entsteht,. wenn das Steuerelement "Ergebnis" leer ist.
In dieser Hinsicht sollte der Code erweitert werden, um den Fall zu behandeln, dass der Benutzer entweder aus versehen die Berechnung nicht vollständig durchgeführt hat, oder sie bewusst abbrechen möchte. - Das erfordert aber Hintergrundwissen über den Prozess und liegt somit bei dir.
Titel: Re: Formularname übergeben mit Openargs
Beitrag von: MaxP am September 26, 2019, 11:10:14
Ja super, so funktioniert es, wie es soll.

Aber warum? Wie wird ohne CALL nun die Funktion aufgerufen?

Meine Denke: Durch die erste Codezeile soll die Funktion aufgerufen werden. Nach dem Durchlauf der kompletten Funktion soll mit Hilfe der 2. Codezeile das Ergebnis ins Ausgangsformular übertragen werden.

Gruß
Max
Titel: Re: Formularname übergeben mit Openargs
Beitrag von: MzKlMu am September 26, 2019, 11:12:03
Hallo,
Zitat= Berechnung()
Das ist der Aufruf der Funktion.
Titel: Re: Formularname übergeben mit Openargs
Beitrag von: MaxP am September 26, 2019, 11:27:38
Okay, habe ich verstanden.

Danke an Euch!

Gruß
Max
Titel: Re: Formularname übergeben mit Openargs
Beitrag von: Beaker s.a. am September 26, 2019, 17:41:22
Hallo Max,
ZitatOkay, habe ich verstanden.
Vielleicht noch ein paar Anmerkungen zur Vertiefung.
Public Function Berechnung() As Double
Zwischen die Klammern kämen die Parameter, mit der die Function etwas
anstellt. Gibt es hier zwar nicht, ist ein aber wichtiger Punkt zum Verständnis
wie Prozeduren funktionieren.
Die Deklaration eines Rückgabewertes (As Double) gibt es i.Ü. nur bei
Functions. Subs können zwar Parameter entgegennehmen/verarbeiten,
aber keinen Wert zurückgeben.
Call Berechnung
ruft eine Sub oder eine Function ohne Parameter auf.
Forms!Forms1!Ufo!Menge = Berechnung()
bewirkt, dass der Rückgabewert, daher "= FunctionName", in das ange-
gebene Textfeld (oder eine Variable) übertragen wird. Hier kämen dann
zwischen die Klammern die Werte, die die Function erwartet (s.o.).
gruss ekkehard
Titel: Re: Formularname übergeben mit Openargs
Beitrag von: MaxP am September 27, 2019, 09:39:24
Hallo,

vielen dank für den Background.
War mir alles neu.

Gruß
Max