Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: NickNac am Dezember 04, 2016, 18:33:05

Titel: Nummer aus aktivem DS automatisch in nächstes Formular als neuen DS mitnehmen
Beitrag von: NickNac am Dezember 04, 2016, 18:33:05
Hi an alle die mehr Ahnung haben als ich ;)

Habe ein Formular (Endlos) basierend auf einer Abfrage zwecks Kunde suchen.
Jeder Zeile sind Fkt.Buttons zugewiesen.
Per Button soll nun das Frm. Kaufvertrtag (und andere) geöffnet werden und dort ein neuer DS erstellt werden, wobei die Kundennummer aus vorherigem Endlosformular automatisch in das Zahlfeld Kundennummer in der Tab. Kaufvertrag übernommen wird.

(Arbeite in Access 2013, kenne mich nicht mit VBA aus, kann aber codes anpassen sobald ich sie verstanden hab ;) )


Titel: Re: Nummer aus aktivem DS automatisch in nächstes Formular als neuen DS mitnehmen
Beitrag von: crystal am Dezember 04, 2016, 19:11:23
Hallo,
die einfachste Möglichkeit wäre es wohl, die Kunden-Nr. per openargs an das zu öffnende Formular zu übergeben.
Im Klick-Ereignis eines Buttons müsste dazu etwas VBA-Code stehen, z.B.


private sub btnKaufVertrag_click()
docmd.openform "frmKaufVertrag",,,acFormAdd,,str(me.KundenNr)
end sub

und im Formular frmKaufVertrag:

Private Sub Form_Open(Cancel As Integer)
if openargs <> "" then
   me.KundenNr = openargs
  cancel = false
else
  'Fehler
  cancel = true
end if
end sub


Mit acFormAdd legt Access einen neuen Datensatz an, das Open-Argument muss als String übergeben werden.
Im aufgerufenen Formular wird das Open-Argument dann dem dortigen Feld "KundenNr" zugewiesen.

Bitte probieren, denn dies ist nur ein erster Hinweis zur Lösung, da ich deine Anwendung und besonders deinen Formular-Aufbau nicht kenne.

lg
crystal

Titel: Re: Nummer aus aktivem DS automatisch in nächstes Formular als neuen DS mitnehmen
Beitrag von: NickNac am Dezember 04, 2016, 19:48:19
Hi Crystal, danke für die schnelle Antwort.
leider klappt es noch nicht.
Habe beide Codes eingefügt (und angepasst) Erhalte jetzt beim Aufruf aus dem Endlosformular
Laufzeitfehler 2498: Sie habenfür eines der Argumente einen Ausdruck eingegeben, der nicht den für das Argument erforderlichen Datentyp hat.

Private Sub KVNeu_Click()
    DoCmd.OpenForm "frmKaufvertrag", , , acFormAdd, , Str(Me.KDNR)  <-acFormAdd=0 , Str(..) richtige Nr
End Sub

Seit einfügen vom Code ins Kaufvertrag Formular kann ich es nicht mehr manuell öffnen?! hier keine Meldungen.

LG, Nick
Titel: Nummer aus aktivem DS automatisch in nächstes Formular als neuen DS mitnehmen
Beitrag von: DF6GL am Dezember 04, 2016, 20:04:33
Hallo,


Private Sub btnKaufVertrag_Click()
Docmd.Openform "frmKaufVertrag",,,acFormAdd,,,Me!KdNr
End Sub


und im Formular frmKaufVertrag:

Private Sub Form_Open(Cancel As Integer)
If Not IsNull(Me.Openargs ) Then
   Me!KdNr.DefaultValue = Me.Openargs  'Falls Kundennummer von Datentyp LONG ist
   'Me!KdNr.DefaultValue = """" & Me.Openargs & """" 'Falls Kundennummer von Datentyp TEXT ist
End If

End Sub
Titel: Re: Nummer aus aktivem DS automatisch in nächstes Formular als neuen DS mitnehmen
Beitrag von: crystal am Dezember 04, 2016, 20:08:54
Hallo Nick,
sorry, wenn es Probleme macht.
Bitte übergebe als OpenArgs einfach nur me.KDNR statt "str(..."

Wenn du das Vertrags-Formular nicht mhr aufrufen kannst, liegt es wohl daran, dass die Prüfung des openargs fehl schlägt und daher Cancel true wird (wodurch das Formular wieder geschlossen wird).

Im VBA-Editor kannst du in jeder Code-Zeile einen Breakpoint setzen (ganz links in der Zeile klicken - im Rollbalken). Wenn ein brauner Punkt erscheint, hast du einenen Breakpoint gesetzt und die Ausführung stoppt genau an dieser Stelle. Dann kannst du im VBA-Fenster z.B. den aktuellen Inhalt von Variablen anschauen (Mauszeiger auf den Feldnamen bewegen)und im Direktfenster anzeigen lassen, z.B. "?me.kdnr" (ohne Anführungszeichen; "?" steht hier als Kürzel für "print").

lg
crystal

Überschnitten mit der Antwort von DF6GL. Danke für deine Korrekturen!
Titel: Re: Nummer aus aktivem DS automatisch in nächstes Formular als neuen DS mitnehmen
Beitrag von: Lachtaube am Dezember 04, 2016, 21:14:11
Mit OpenArgs handelt man sich schnell hübsche Abhängigkeiten ein - oder man muss noch einen Textparser dazwischen hängen. Ich würde deshalb die Steuerung vom öffnenden Formular aus übernehmen.Private Sub DeinKnopf_Click()
   Const FNAME$ = "frmKaufVertrag"

   DoCmd.OpenForm FNAME
   With Forms(FNAME)
      .Recordset.AddNew
      .Zielfeldname = Me.KDNR
      'ggf. weitere Felder setzen
   End With
End Sub
Titel: Re: Nummer aus aktivem DS automatisch in nächstes Formular als neuen DS mitnehmen
Beitrag von: NickNac am Dezember 04, 2016, 22:10:29
Juhu :) Dank euch ganz herzlich! Die Korrektur von DF6GL hat es schon gelöst! funktioniert prima!
Die Idee von Lachtaube werd ich noch probieren! Danke !

LG, Nick
Titel: Nummer aus aktivem DS automatisch in nächstes Formular als neuen DS mitnehmen
Beitrag von: DF6GL am Dezember 05, 2016, 09:44:40
Hallo,

@Lachtaube:   
Wie sähe diese Lösung aus, wenn das Form modal geöffnet werden soll/muss?
Titel: Re: Nummer aus aktivem DS automatisch in nächstes Formular als neuen DS mitnehmen
Beitrag von: Lachtaube am Dezember 05, 2016, 11:49:19
Modale Dialoge bilden wohl eine Ausnahme.

Aber auch dort könnte man auf OpenArgs verzichten und z. Bsp. extern in einem Modul eine entsprechende Klassen-Instanz verwenden, die als Schnittstelle fungiert, ohne einen Textparser einbauen zu müssen.
Titel: Nummer aus aktivem DS automatisch in nächstes Formular als neuen DS mitnehmen
Beitrag von: DF6GL am Dezember 05, 2016, 13:41:26
Hi,

naja, "Ausnahme" würde ich da nicht sagen wollen... Genau in diesem Fall ist ein modal geöffnetes Form angebracht.

Eine extra Klasseninstanz für die Schnittstelle aufzubauen, ist ja nun auch mit Aufwand verbunden ( und ein wenig komplizierter als das OpenArgs-Argument.)

Ohne jetzt viel weiter diskutieren zu wollen (das machen Andere "besser"   ;)  )   , ist ein "Parser"  bei Übergabe mehrfacher Werte auch kein Ding, unter dem Gesichtspunkt, sich hier mit einer kleinen Access-DB
zu beschäftigen, in der die Verwendung von Formularen recht übersichtlich ist.  Diese Methodik sollte natürlich und sowieso  ein Bestandteil der (frühzeitigen) Formular-Konzeption sein.

Das alles ist natürlich nur eine Frage des Standpunktes....  8)

Docmd.Openform "frmTest",,,acFormAdd,,acDialog,"Das ist Text für Textfeld1" & "|" & Me!Zahlwert & "|" & "Das ist Text für Textfeld2"

Sub Form_Open(Cancel As Integer)
If Not Isnull(Me.Openargs) Then
Me!Textfeld1!Defaultvalue = """" & Split(Me.Openargs,"|")(0) & """"
Me!ZahlFeld= Split(Me.Openargs,"|")(1)
Me!Textfeld2!Defaultvalue = """" & Split(Me.Openargs,"|")(2) & """"
End If
End Sub