Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: mad am Mai 23, 2021, 09:33:53

Titel: Formular mit DS aus Ausgangsformular öffnen
Beitrag von: mad am Mai 23, 2021, 09:33:53
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
Titel: Re: Formular mit DS aus Ausgangsformular öffnen
Beitrag von: DF6GL am Mai 23, 2021, 11:18:54
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?

Titel: Re: Formular mit DS aus Ausgangsformular öffnen
Beitrag von: mad am Mai 23, 2021, 12:54:23
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
Titel: Re: Formular mit DS aus Ausgangsformular öffnen
Beitrag von: mad am Mai 23, 2021, 15:10:33
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
Titel: Re: Formular mit DS aus Ausgangsformular öffnen
Beitrag von: Beaker s.a. am Mai 23, 2021, 15:40:31
Forms!frmTypenanlage!Typ_ArtenID = Me.UFArten!ArtenIDWobei "UFArten" NICHT der Name des Formulars ist sondern der Name
des UFo-Controls.
Schaust du auch hier. (http://www.donkarl.com?FAQ4.2)
Titel: Re: Formular mit DS aus Ausgangsformular öffnen
Beitrag von: mad am Mai 23, 2021, 16:29:37
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
Titel: Re: Formular mit DS aus Ausgangsformular öffnen
Beitrag von: mad am Mai 24, 2021, 07:37:47
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
Titel: Re: Formular mit DS aus Ausgangsformular öffnen
Beitrag von: Beaker s.a. am Mai 24, 2021, 12:11:45
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
Titel: Re: Formular mit DS aus Ausgangsformular öffnen
Beitrag von: mad am Mai 24, 2021, 17:52:06
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
Titel: Re: Formular mit DS aus Ausgangsformular öffnen
Beitrag von: Beaker s.a. am Mai 25, 2021, 09:53:26
@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
Titel: Re: Formular mit DS aus Ausgangsformular öffnen
Beitrag von: mad am Mai 25, 2021, 12:40:01
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



Titel: Re: Formular mit DS aus Ausgangsformular öffnen
Beitrag von: mad am Mai 25, 2021, 13:06:11
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
Titel: Re: Formular mit DS aus Ausgangsformular öffnen
Beitrag von: Beaker s.a. am Mai 25, 2021, 13:42:46
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
Titel: Re: Formular mit DS aus Ausgangsformular öffnen
Beitrag von: mad am Mai 25, 2021, 15:41:17
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
Titel: Re: Formular mit DS aus Ausgangsformular öffnen
Beitrag von: Beaker s.a. am Mai 25, 2021, 18:47:51
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
Titel: Re: Formular mit DS aus Ausgangsformular öffnen
Beitrag von: mad am Mai 26, 2021, 01:09:49
oK,

dann bleibe ich erstmal bei meiner Variante wie unter #6 beschrieben und setzte nur das Thema "GetNewTypNo()", vormals "Call ..." um.
Vielleicht hat ja später jemand noch eine Idee.


Vielen Dank
mad
Titel: Re: Formular mit DS aus Ausgangsformular öffnen
Beitrag von: DF6GL am Mai 26, 2021, 09:42:11
Hallo,

ZitatVielleicht hat ja später jemand noch eine Idee.

z. B.:  Das Tabellenkonzept in Ordnung bringen.

Beim jetzigen Zustand ist mir unerklärlich, wozu man für Dateneinträge in tblTypen ein separates Formular benötigt und durch die Brust ins Auge schießen will.


Entspr. dem gezeigten Tabellenaufbau:

Mach ein Hauptform für tblArten mit einem Kombifeld für die Auswahl einer Kategorie und ein Ufo-Steuerelement, das ein Form mit Datenherkunft zu "tblTypen" anzeigt und über die Felder "ArtenID" und "Typ_ArtenID" verknüpft.

Fertig.

Dazu braucht es überhaupt keinen Code.  Trotzdem solltest Du Dich mit den Argumenten der Docmd.Openform-Methode (intensiv) auseinandersetzen.



IMHO sollte "tblTypen" in "tblArtenTypen" umbenannt und eine zusätzliche Tabelle "tblTypen" (die sollte jetzt wirklich so heißen) erstellt werden, die alle möglich vorkommenden "Typenbezeichnungen" enthält.


In "tblArtenTypen" wird ein Fremdschlüsselfeld für den Primärschlüsselwert in tblTypen eingebaut. Dieses Feld wird als Kombi ausgeführt mit Datenherkunft zu Tabelle tblTypen, mit dem eben eine Typenbezeichnung ausgewählt werden kann (gleichermaßen wir das Kombifeld für Kategorien).


Wenn jetzt eine neue Type (oder auch eine neue Kategorie) "gemacht" werden muss, so kann jetzt(!) das "Nicht in Liste"-Ereignis des, bzw. der Kombis benutzt werden, um die neuen Daten "on the fly" in die Tabellen zu befördern und damit auswählbar zu machen. Hierfür braucht es dann ein paar Zeilen Code, die die neuen Daten entweder direkt mit SQL in die Tabelle schreiben oder ein Eingabe-Form aufrufen, wobei hier die Openargs-Methode als "Datentür" zum aufgerufenen Formular dienlich ist.





PS:  Wie ich grade noch sehe, ist eine "Formatierung" einer Long-Zahl beim Feld TypID und die Bezeichnung in "Typen-Nr,"  direkt in der Tabelle unbrauchbar/verwerflich.

Diese Methode zeigt, dass es an noch weiteren Tabellen fehlt ( siehe Hinweise ganz oben) , wenn es sich hier um eine "Stücklistenstruktur" handelt.


Das Feld "TypID" sollte als Autowert ausgeführt werden, das Feld für die  "Struktur-Nummer"  ist überflüssig, wenn eine Stücklisten-Tabellenstruktur aufgebaut wird. Sie wäre damit jederzeit einfach berechenbar und bräuchte nicht durch Code für ein Tabellenfeld erzeugt werden.

Titel: Re: Formular mit DS aus Ausgangsformular öffnen
Beitrag von: mad am Mai 26, 2021, 21:11:16
Hallo,

danke für die Anregungen. Hier nochmals ein paar Infos was ich mir dabei gedacht habe.

Zitat von: undefined... wenn eine Stücklisten-Tabellenstruktur ...
Es handelt sich um ein Inventarverzeichnis mit einer Prüfstruktur die in bestimmen Zeitabständen gemacht werden müssen.

Zitat von: undefinedz. B.:  Das Tabellenkonzept in Ordnung bringen.
Im Anhang nochmals das Komplette Beziehungsfenster, Bild: "Inv_Bezieh.png". Wie gesagt habe ich ein sehr stark reduzierte DB eingestellt.

Zitat von: undefinedBeim jetzigen Zustand ist mir unerklärlich, wozu man für Dateneinträge in tblTypen ein separates Formular benötigt und durch die Brust ins Auge schießen will.
Die drei Kombi-Felder sind reine Suche-Felder und mit Absicht nicht zur Dateneingabe vorgessen.

Zitat von: undefinedMach ein Hauptform für tblArten mit einem Kombifeld für die Auswahl einer Kategorie und ein Ufo-Steuerelement, das ein Form mit Datenherkunft zu "tblTypen" anzeigt und über die Felder "ArtenID" und "Typ_ArtenID" verknüpft.

Aufbau Formulare:
HF - frmKategorien (tdlKategorien) verknüpft von "KatID" nach "Arten_KatID" zum
  UF - frmArten (tblArten) verknüpft von "ArtenID" nach "Typ_ArtenID" zum
    UF - frmTypen verknüpft von "TypID" nach "Artikel_TypID" und weiteren UF.

Zitat von: undefined... die alle möglich vorkommenden "Typenbezeichnungen" enthält.
Ist meiner Meinung nach so. Aktuell befinden sich in der Tab 843 verschiedene Typen.

Zitat von: undefinedWenn jetzt eine neue Type (oder auch eine neue Kategorie) "gemacht" werden muss, so kann jetzt(!) das "Nicht in Liste"-Ereignis des, ...
Kategorien und Arten sind vollständig, nur Typen müssen bei bedarf ergänzt werden. Dazu das Form "frmTypenanlage".

Zitat von: undefinedPS:  Wie ich grade noch sehe, ist eine "Formatierung" einer Long-Zahl beim Feld TypID und die Bezeichnung in "Typen-Nr,"  direkt in der Tabelle unbrauchbar/verwerflich.
Was wäre die richtige "Formatierung"?

Zitat von: undefinedDas Feld "TypID" sollte als Autowert ausgeführt werden, das Feld für die  "Struktur-Nummer"  ist überflüssig,...
Die Artikelnummer haben wir aus dem Feuerwehrsystem übernommen und ist somit vorgegeben. Diese baut sich wie folgt auf:

Kategorie - erste Stelle eine Zahl z.B. 1.
Arten - zweite und dritte Stelle in Zahlen z.B. .02.
Typen - vierte bis sechste Stelle in Zahlen z.B. .031.
Die finale Artikelnummer wird dann nochmals durch vier weitere Zahlen, beginnend mit .0001 ergänzt.

Komplette Artikelnummer z.B.
1.02.031.0001 (die Punkte sind nur zur besseren lesbarkeit, in die Tabelle werden die Werte ohne Punkt geschrieben z.B. 1020310001)
Bei neuanlage eines Artikels wird dann im frmArtikel (tblArtikel) über einen Code die entsprechende Artikelnummer automatisch über den entsprechende Code um +1 hochgezählt, ähnlich wie "GetNewTypNo".

Ich hoffe ich habe euch jetzt nicht erschlagen, aber ich denke um das besser zu verstehen muß man es manchmal detaillierter beschreiben.

Zum Abschluss nochmals meine aktuellen Codes die erstmal funktionieren.

Private Sub SucheTypen_NotInList(NewData As String, Response As Integer)
     DoCmd.OpenForm "frmTypenanlage"
End Sub

Private Sub Form_Load()
    DoCmd.GoToRecord , , acNewRec
     Forms!frmTypenanlage!Typ_ArtenID = Forms!frmKategorien!UFArten!ArtenID
    GetNewTypNo
End Sub


Private Sub Typ_ArtenID_AfterUpdate()
    GetNewTypNo
End Sub


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


Gruss
mad