August 03, 2021, 14:47:00

Neuigkeiten:

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


Formular mit DS aus Ausgangsformular öffnen

Begonnen von mad, Mai 23, 2021, 09:33:53

⏪ vorheriges - nächstes ⏩

mad

Hallo Zusammen,

habe mal wieder ein Problem bei dem ich nicht weiter komme und auf eure Hilfe hoffe.

Folgende Ausgangssituation:
Ich habe ein HF "frmKategorie" indem sich ein UF "UFArten" befinden und in diesem wiederum ein UF "UFTypen".
"UFArten" und "UFTypen" sind über die beiden Felder "ArtenID" und "Typ_ArtenID" (1:n) verknüpft.

In dem UF "UFTypen" befindet sich ein Kombifeld "SuchenTypen" mit dem ich, wenn der entsprechende DS nicht vorhanden ist, ich mit den Ereignisprozedur (Bei Nicht in Liste) das Formular "frmTypenanlage" öffne um einen neuen DS anlegen zu können.

Code:
Private Sub SucheTypen_NotInList(NewData As String, Response As Integer)
    DoCmd.OpenForm "frmTypenanlage", , , "Typ_ArtenID = " & Me!ArtenID
End Sub

Das Formular öffnet sich zwar, springt bzw. öffnet aber nicht mit der entsprechenden "ArtenID".

Hätte jemand eine Idee was ich falsch mache?


Gruss
mad

DF6GL

Hallo,

wenn ich die Konstellation richtig begreife, sollte es so lauten:

DoCmd.OpenForm "frmTypenanlage", , , "Typ_ArtenID = " & Me!Typ_ArtenID

Warum benutzt Du ein Kombifeld, um ein Formular zu öffnen, wenn Du gleich einen neuen DS im UFTypen eintragen könntest?


Wie lautet die Datenherkunft von UFTypen und die Datensatzherkunft des Kombifeldes?


mad

Hallo,

Datensatzherkunft (Datensatzquelle) UFTypen:
SELECT tblArtikel.InventarNr, tblArtikel.KfzKenn, tblArtikel.Typenschild, tblArtikel.Hersteller, tblArtikel.BjHerstelldat, tblArtikel.Beschaffdat, tblArtikel.Beschaffkosten, tblArtikel.Ausgemustert, tblArtikel.Ausmusterdat, tblArtikel.Pruefpflicht, tblArtikel.Pruefintervall, tblArtikel.Ausmusterzeit, tblArtikel.Seriennummer, tblArtikel.Pruef_M_J, tblArtikel.Geraeteraum, tblArtikel.Wechselmodul, tblTypen.TypID, tblArtikel.Artikel_TypID, tblTypen.Typ_Bez, tblArtikel.ArtikelID, tblArtikel.Artikel_PVID, tblArtikel.PruefpflichtMM, tblArtikel.PruefintervallMM, tblArtikel.label FROM tblTypen INNER JOIN tblArtikel ON tblTypen.TypID = tblArtikel.Artikel_TypID;
Datensatzherkunft (Datensatzquelle) Kombifeld "SuchenTypen":
SELECT tblTypen.TypID, tblTypen.Typ_Bez, tblTypen.Typ_ArtenID FROM tblTypen WHERE (((tblTypen.Typ_ArtenID)=[Forms]![frmKategorien]![UFArten]![SucheArten])) ORDER BY tblTypen.Typ_Bez;
Hier kann ich nur Daten auswählen, aber nicht neu eingeben.
Nach dem aktualisieren kommt folgender Code:
Private Sub SucheTypen_AfterUpdate()
'Filter aufrufen
    Me.Filter = "TypID = " & SucheTypen
    Debug.Print
    Me.FilterOn = True
'Unterformular aktualisieren...
     Forms!frmKategorien!UFArten!UFTypen.Requery

   End Sub

Das mit dem neuen DS finde ich eine gute Idee.
Wäre es möglich das Formular "frmTypenanlage" mit "neuen DS anlegen" zu öffenen und in dem Kombifeld "Typ_ArtenID" den aktuellen DS ("ArtenID") aus "UFArten" auszuwählen?


Gruss
mad

mad

Hallo,

habe mich mal durch weitere Beträge im Forum und auch anderen Foren gelesen.

Bin dann auf einen Beitrag gestoßen von dem ich glaubte er würde mir weiterhelfen.

Code:
Private Sub SucheTypen_NotInList(NewData As String, Response As Integer)
    On Error GoTo Err_SucheTypen_NotInList
    DoCmd.OpenForm "frmTypenanlage"
    DoCmd.GoToRecord , , acNewRec
    Forms!frmTypenanlage!Typ_ArtenID = UFArten!ArtenID
    Forms!frmTypenanlage!Typ_ArtenID.SetFocus
Exit_SucheTypen_NotInList:
    Exit Sub
Err_SucheTypen_NotInList:
    MsgBox Err.Description
    Resume Exit_SucheTypen_NotInList
End Sub

Das Formular "frmTypenanlage" wird zwar geöffnet, aber leider wird kein neuer DS angelegt in dem das Feld "Typ_ArtenID" bereits mit dem Inhalt von "UFArten!ArtenID" gefüllt wird.


Gruss
mad

Beaker s.a.

Forms!frmTypenanlage!Typ_ArtenID = Me.UFArten!ArtenIDWobei "UFArten" NICHT der Name des Formulars ist sondern der Name
des UFo-Controls.
Schaust du auch hier.
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

mad

Hallo,

habe nun auch nachfolgende Varianten ausprobiert:

Forms!frmTypenanlage!Typ_ArtenID = UFArten!ArtenIDForms!frmTypenanlage!Typ_ArtenID = Me!frmArten!ArtenIDForms!frmTypenanlage!Typ_ArtenID = frmTypen!frmArten!ArtenIDForms!frmTypenanlage!Typ_ArtenID = frmKategorien!frmTypen!frmArten!ArtenID
Bei alle Varianten wird zwar das "frmTypenanlage" geöffnet, aber leider wird kein neuer (leerer) DS angelegt in dem das Feld "Typ_ArtenID" bereits mit dem Inhalt von "ArtenID" gefüllt wird.

Es wird auch kein Fehler angezeigt. Auch das Kompilieren läuft fehlerfrei durch.


Gruss
mad

mad

Hallo Zusammen,

nachdem ich mir die ganze Nacht um die Ohren geschlagen habe, habe ich nun eine Lösung gefunden. Ob das allerdings die feine Engliche Art ist, weis ich nicht, aber sie funktioniert:

Mein "frmTypeneanlage" öffne ich ganz einfach:
Private Sub SucheTypen_NotInList(NewData As String, Response As Integer)
     DoCmd.OpenForm "frmTypenanlage"
End Sub

Beim öffnen/laden von "frmTypeneanlage" wende ich jetzt folgenden Code an:
Private Sub Form_Load()
    DoCmd.GoToRecord , , acNewRec 'neuer Datensatz'
     Forms!frmTypenanlage!Typ_ArtenID = Forms!frmKategorien!UFArten!ArtenID 'übergabe von ArtenID an Type_ArtenID'

    Call Typ_ArtenID_AfterUpdate
End Sub

Mit "Call Typ_ArtenID_AfterUpdate" führe ich noch einen weiteren Befehl aus dem es schon im Formular gab.


Für eine elegantere Lösung bin ich immer offen.

Gruss
mad

Beaker s.a.

Hallo,
Wenn du die von der Methode bereitgestellten Parameter verwendest,
geht das alles auch kürzer und ohne den Bezug auf ein Formular
Private Sub SucheTypen_NotInList(NewData As String, Response As Integer)
     DoCmd.OpenForm _
           FormName:="frmTypenanlage", _
           DataMode:=acFormAdd, _
           OpenArgs:=Me.ArtenID
End Sub
und
ZitatPrivate Sub Form_Load()
    DoCmd.GoToRecord , , acNewRec 'neuer Datensatz'
'entfällt durch "DataMode"
     Me!Typ_ArtenID = OpenArgs

    Call Typ_ArtenID_AfterUpdate
'Das macht man nicht. Schreibe den Code, der dort ausgeführt wird,
'in eine separate Prozedur und rufe diese sowohl hier als auch bei
'"Typ_ArtenID_AfterUpdate" auf
    DeineNeueProzedur
'auf "Call" kannst du verzichten
End Sub

gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

mad

Hallo,

habe Deinen Vorschlag so in den Code reinkopiert:
Private Sub SucheTypen_NotInList(NewData As String, Response As Integer)
     DoCmd.OpenForm _
           FormName:="frmTypenanlage", _
           DataMode:=acFormAdd, _
           OpenArgs:=Me.ArtenID
           
End Sub



Private Sub Form_Load()
     Me!Typ_ArtenID = OpenArgs
     'Call Typ_ArtenID_AfterUpdate
End Sub

Hier wird nun folgender Fehler angezeigt:
"Sie haben einen Wert eingegeben, der für dieser Feld nicht zulässig ist." siehe auch Bild: LFZ2113

Leider komme ich mit der angebotenen Hilfe nicht weiter.

Call gehe ich im nächsten Schritt an!


Gruß
mad

Beaker s.a.

@mad
Hast du dir angeschaut, welchen Wert "OpenArgs" übermittelt?
Haben beide Felder den gleichen Datentyp?
Ich sehe allerdings auch gerade, dass mein Code nicht ganz
korrekt ist; - es müsste heissen.
ZitatMe!Typ_ArtenID = Me.OpenArgs
Evtl. versagt auch die autom. Typumwandlung von VBA, obwohl ich
es nicht glaube. "OpenArgs" übergibt ja einen String. Du könntest
also versuchen den Datentyp explizit umzuwandeln, bei der Übergabe
OpenArgs:=Str(Me.ArtenID)beim Abruf
Me!Typ_ArtenID = CLng(Me.OpenArgs)Zuerst würde ich aber den übergebenen Wert prüfen (s.o.).

gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

mad

Hallo,

leider weis ich immer noch nicht wie das geht mit dem Anzeigen/ermitteln welcher Wert übergeben wird.
Gibt es dazu einen Standardcode für z.B. die MsgBox den man im alktuellen Code einsetzen kann, die Code erstmal stoppt und die MsgBox den Wert anzeigt?
Wenn ich das über "Debuggen - Aktuellen Wert anzeigen" mache kommt die Meldung, siehe Anhang: "Wert_ausgeben"

Die beiden Felder/Werte sind Zahlen. Im Formular angezeigt wird natürlich lesbarer Text.

Mit den beiden neuen Code-Auszügen:
ZitatOpenArgs:=Str(Me!ArtenID)
ZitatMe!Typ_ArtenID = CLng(Me.OpenArgs)

kommt die Fehlermeldung: LZF13 - Typen unverträglich (vermutlich da es sich ja um keinen Text handelt)


Gruss
Manfred




mad

Hallo,
habe noch etwas weiterrecherchiert.

Habe nun die MxgBox als erste Zeile bei "Form_Load" eingefügt.

Private Sub Form_Load()

     MsgBox Forms!frmKategorien!UFArten!ArtenID

     Me!Typ_ArtenID = Me.OpenArgs
    Call Typ_ArtenID_AfterUpdate
End Sub

Dann bekomme ich die MsgBox wie folgt, siehe Bild, angezeigt:

Ich hoffe das holft weiter.


Gruss
mad

Beaker s.a.

Hallo,
Das mit der MsgBox zum Anzeigen eines Wertes ist eine Möglichkeit.
Ich bevorzuge das Setzen eines Haltepunktes und das Abarbeiten des
Code per Einzelschritt, - egal.
Das Ergebnis sieht zumindest aus wie eine Zahl. Da fällt mir nicht
mehr wirklich was ein ausser vielleicht
- "ArtenID" und "Typ_ArtenID" müssen vom Typ "LongInteger" sein
- das Formular-Feld "Typ_ArtenID" muss an genau dieses Tabellenfeld
gebunden sein.
Ansonsten erstelle eine datenreduzierte Kopie deiner DB und lade sie
hier hoch.

gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

mad

Hallo,

habe jetzt mal eine sehr stark reduzierte DB mit hochgeladen.
Beim öffnen startet die DB gleich mit dem Form "frmKategorie".
Anschliessend bitte durch die drei rechten Suchfelder "gelb" von oben nach unten klicken. Beim dritten Suchfeld keine Auswahl mehr treffen, sondern auf das Icon "SucheTypen_NotInList" klicken. Kommt zum tragen wenn der entsprechende Typ nicht vorhanden ist und über das "frmTypenanlage" einen neuen Typ angelegt werden muß.

der Code "Private Sub Typ_ArtenID_AfterUpdate()" ist auch sehr wichtig, den dieser legt gleich die entsprechende Nummerierung im "frmTypenanlage" an.

Ich hoffe das hilft.


Gruss
mad

Beaker s.a.

Hallo,
Im Prinzip funzt es so,
1. die Eigenschaft "Nur Listeneinträge" des Typen-Kombis muss auf "Ja"
stehen, damit das Ereignis "NotInList" überhaupt ausgelöst wird.
2. In dessen Behandlung muss der Parameter "Response" gesetzt werden
Private Sub SucheTypen_NotInList(NewData As String, Response As Integer)
    Response = acDataErrContinue
    DoCmd.OpenForm _
           FormName:="frmTypenanlage", _
           DataMode:=acFormAdd, _
           WindowMode:=acDialog, _
           OpenArgs:=Me.Typ_ArtenID
     
    Me.SucheTypen.Requery     '*
   
End Sub
* an der Stelle lauft der Code auf diesen Fehler
Zitat2118, Sie müssen das aktuelle Feld speichern, bevor Sie die
AktualisierenDaten-Aktion ausführen können.
Leider verstehe ich das nicht, da das Kombi doch ungebunden ist.

Die After_Update-Geschichte löst sich so
Private Sub GetNewTypNo()
On Error GoTo MyErr
    Dim rs As DAO.Recordset
   If Me.NewRecord Then
        Set rs = CurrentDb.OpenRecordset("select top 1 " & " max(val(Mid(TypID,4))) as MaxTyp from tblTypen Where Typ_ArtenID =" & Me!Typ_ArtenID & " ", dbOpenSnapshot)
        If rs.RecordCount > 0 Then Me!TypID = Me!Typ_ArtenID & Format(rs(0) + 1, "000")
    End If
Exit Sub

MyErr:
    MsgBox Err.Number & ":  " & Err.Description

End Sub
Private Sub Typ_ArtenID_AfterUpdate()
    GetNewTypNo
End Sub

Private Sub Form_Load()
     Me!Typ_ArtenID = Me.OpenArgs
    GetNewTypNo
End Sub

gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.