Hallo Access-Profis,
ich erstelle in einem Hauptformular zwei Unterformulare; nach der Eingabe in Ufo1 verlasse ich dieses per Tab-Taste oder Mausklick und rufe im nächsten Ufo2 einen neuen Datensatz zur Eingabe auf. Mit folgendem Code klappt dies zwar mit dem Aufruf, doch kann ich den eingegebenen Datensatz nicht speichern. Gehe ich manuell nach Ufo2 und rufe das eingebettete Makro zur Eingabe eines neuen Datensatzes auf, so klappt die Speicherung;
Das wäre aber weniger anwenderfreundlich.
Mein Code:
Sub AUF_Gutachten_AfterUpdate()
Const cFormName = "frm_SCHUELER03"
Const cSubFormName = "frm_Schueler_ufoBearbeitung03"
Const cQryName = "qry_BEARBEITUNG_SCH_VER"
DoCmd.RunCommand acCmdSaveRecord
If CurrentProject.AllForms(cFormName).IsLoaded Then
Forms(cFormName)(cSubFormName).Form.Recordset.AddNew
Forms(cFormName)(cSubFormName).SetFocus
End If
End Sub
Anbei eine vielleicht einsichtigere Beschreibung
Hallo,
kommt irgendeine Fehlermeldung?
Wie lauten die Namen der UFO-STEUERELEMENTE, die die Formulare anzeigen?
Wie sind die UFO-St.-El. mit dem Hauptform verknüpft?
Ansonsten:
Sub AUF_Gutachten_Exit()
'DoCmd.RunCommand acCmdSaveRecord 'sollte überflüssig sein
Me.Parent!UFO-Steuerelementname1.Setfocus
Me.Parent!UFO_Steuerelementname1.Form.Dataentry=true
Me.Parent!UFO_Steuerelementname1!Textfeld1.Setfocus
End Sub
Hallo DF6GL,
Du hattest mir zu Jahresbeginn schon mal bei dieser Datenbank geholfen, nun bin ich froh, wieder von Dir zu hören.
Vorab zu Deinen Fragen:
- es kommt keine Fehlermeldung; ich sah lediglich in der Abfrage/Tabelle, dass der Datensatz nicht gespeichert wurde. Zudem sind die eingegebenen Daten nach dem Neustart des Formulars nicht mehr da.
- Ufo1: frm_Schueler_ufoAuftraege03 mit [AUF_AntragEltern], [AUF_AntragSchule], [EIN_FS], [AUF_Datum],[AUF_Lehrkraft], [AUF_Gutachten]
- Ufo2: frm_Schueler_ufoBearbeitung03 mit [VER_FS], [UMS_FS], [SOP_FS], [EIN_FS], [KOS_FS], [BEA_MeldgLRADatum], [BEA_RueckMeldgLRADatum], [BEA_BescheidDatum], [BEA_Beginn], [BEA_Wiedervorlage], [EIN_Telefon1], [EIN_Leitung], [BEA_Ansprechpartner]
- jeweils von SuS_FS nach SuS_PS; das Hauptformular heißt frm_SCHUELER03
Dein Code funktioniert prima; jedoch zeigt das Formular jetzt eine andere Verhaltensweise:
-Nachdem ich in Ufo1 das Datum eingetragen habe und mit Tab-Taste dieses verlasse, springt der Cursor korrekt in das Ufo2 und wartet auf die Eingabe des neuen Datensatzes. Nachdem ich diesen aber speichere und das Haupt-Formular auch aktualisiere, ist dieser soeben eingetragene Datensatz wohl korrekt gespeichert, im Formular aber nicht mehr sichtbar; alle Eingabefelder in Ufo2 sind und bleiben auch leer. Ich kann daher auch mittels den Pfeiltasten nicht mehr zwischen den Maßnahmen eines Schülers blättern, geschweige denn eine Maßnahme wieder aus dem Ufo2 löschen?
Wird da irgendetwas gesperrt?
Den Zyklus habe ich schon auf den "aktuellen Datensatz" gestellt - das zeigt aber keine Wirkung.
Hallo,
so ganz genau versteh ich die Probleme nicht... Bis auf das, dass mit DataEntry =true das Form in den "Eingabemodus" gesetzt wird und andere DS nicht mehr anzeigt. Man könnte das Form auch mit
Docmd.GotoRecord,, acnewrec
mit seiner Anzeige auf einen neuen, leeren DS setzen. Dabei blieben die vorhandenen DS anzeigbar. Wenn sich Daten nicht speichern lassen, kann das an "nicht aktualisierbaren" Abfragen liegen oder die Daten werden gespeichert, lediglich nur nicht angezeigt, weil die Verknüpfungen der UFO-Steuerelemente nicht stimmen oder die Fremdschlüssel nicht korrekt behandelt werden. Evtl. ist auch je nach Situation ein Requery der betroffenen Form erforderlich.
Hallo Franz,
klasse - herzlichen Dank für Deine Hilfe; mit 'Docmd.GotoRecord,, acnewrec' verhält sich das Formular wie es sein soll - toll!
Jetzt hätte ich noch zwei, vermutlich kleinere Anliegen:
1. Wenn das Datum des Gutachtens in [AUF_Gutachten] in Ufo1 nachträglich geändert wird, also kein neuer Datensatz angelegt werden soll, sollte nur die Änderung in diesem gespeichert werden. Es sollte also kein Sprung zu einem neuen Datensatz in Ufo2 erfolgen, sondern der Cursor sollte lediglich im Feld [AUF_AntragEltern] "warten".
Was mach ich da? Ich hab es mit dem Change-Ereignis probiert, aber das war wohl eine Sackgasse.
2. Gibt es eine Möglichkeit, das ganze Haupt-Formular gleichsam auf eine niedrigere Auflösung zu "zoomen"? Wir haben im Amt eine Monitorauflösung 1280x1024; zuhause habe ich aber eine größere, so dass das Formular sehr groß, gleichsam Bildschirm füllend daher kommt.
Vorab vielen Dank, Du hast mir ungemein geholfen!!
Gruß
Max
Hallo,
1)
"Warten" kann er wohl nicht, evtl. kann er wieder auf das Feld zurrückgesetzt werden, was aber in einer "Gefangenschaft" endet...
Dazu muss auf NewRecord getestet und entspr. reagiert werden:
Sub AUF_Gutachten_Exit()
If Me.Newrecord Then
'DoCmd.RunCommand acCmdSaveRecord 'sollte überflüssig sein
Me.Parent!UFO-Steuerelementname1.Setfocus
Me.Parent!UFO_Steuerelementname1.Form.Dataentry=true
Me.Parent!UFO_Steuerelementname1!Textfeld1.Setfocus
Else
'Fokus auf ein passendes Feld legen
End If
End Sub
Hallo DF6GL,
jetzt habe ich Deine Hilfe bestimmt falsch umgesetzt:
Ist es richtig, dass ich das Ereignis AUF_Gutachten_AfterUpdate() auskommentiere und das neue Ereignis AUF_Gutachten_Exit() wie folgt anpasse:
'Sub AUF_Gutachten_AfterUpdate()
'
'Me.Parent!frm_Schueler_ufoBearbeitung03.SetFocus
'DoCmd.GoToRecord , , acNewRec
''Me.Parent!frm_Schueler_ufoBearbeitung03.Form.DataEntry = True
'Me.Parent!frm_Schueler_ufoBearbeitung03!VER_FS.SetFocus
'
'
'End Sub
Sub AUF_Gutachten_Exit()
If Me.NewRecord Then
Me.Parent!frm_Schueler_ufoBearbeitung03.SetFocus
'DoCmd.GoToRecord , , acNewRec ''war im obigen Code die bessere Alternative
Me.Parent!frm_Schueler_ufoBearbeitung03.Form.DataEntry = True
Me.Parent!frm_Schueler_ufoBearbeitung03!VER_FS.SetFocus
Else
Me.Parent!frm_SCHUELER03!SuS_Tel1.SetFocus 'Fokus auf ein passendes Feld legen
End If
End Sub
Das obige, auskommentierte Ereignis 'AfterUpdate' hat funktioniert; das Problem war, wenn das bereits eingetragene Datum verändert werden müsste, dann sollte das Feld AUF_Gutachten nur diese Änderung annehmen, speichern und nicht zum nächsten Formular Ufo2 (frm_Schueler_ufoBearbeitung03) springen. Dies sollte nur dann passieren, wenn noch gar kein Datum eingetragen war und erstmalig eines eingetragen wird, dann muss der Anwender in Ufo2 dann auch eine Maßnahme festlegen.
Beim obigen Code erhalte ich nach Betätigung der Tab-Taste eine Fehlermeldung (vgl. Fehlermeldung02.jpg).
Sorry, aber vielleicht kann man das noch in den Griff kriegen?
Hallo,
der Prozedur-Code ist ja nur beispielhaft und soll die Verwendung von Me.Newrecord zeigen.
Welchen Code Du bei der jeweiligen Bedingung ausführst, ist (hier) sekundär.
Die Fehlermeldung sagt aus, dass bei der Exit-Prozedur ein Argument fehlt (Cancel as Integer). Du solltest auch geposteten Code nicht einfach kopieren und einsetzen, sondern die Prozeduren richtig erzeugen und den Code an Deine Situation anpassen.
Hallo DF6GL,
sorry für das verspätete Melden, aber ich konnte mich nicht vertiefend genug um die Datenbank kümmern; jetzt versuche ich den Faden wieder aufzunehmen und bitte wiederum um Hilfe in fortsetzender Fragestellung.
Ich habe nun letzte Mail aufgreifend folgenden Code eingegeben:
Sub AUF_Gutachten_Exit(Cancel As Integer)
If Me.NewRecord = False Then
Me.Parent!frm_Schueler_ufoBearbeitung03.SetFocus
DoCmd.GoToRecord , , acNewRec
Me.Parent!frm_Schueler_ufoBearbeitung03!VER_FS.SetFocus
Else
Me.Parent!frm_Schueler_ufoAuftraege03.SetFocus
End If
End Sub
Der Code funktioniert aber nicht wie erhofft.
Vielleicht formuliere ich auch nicht präzise genug?!
Ich brauche zwei Ereignisse:
1. Ereignis: In dem Feld AUF_Gutachten steht noch kein Datum drin; nach Eingabe eines solchen sollte der Cursor in das andere Unterformular (frm_Schueler_ufoBearbeitung03) springen und auf die Eingaben des Anwenders warten, diese entgegennehmen und den bereits bestehenden Datensatz um eben diesen Eintrag ergänzen und abspeichern! Das funktioniert prima!
2. Ereignis: Im Feld AUF_Gutachten steht bereits ein Datum drin; dieses muss - aus welchen Gründen auch immer - geändert werden, der nachfolgende Datensatz im Unterformular (frm_Schueler_ufoBearbeitung03) bleibt aber ohne Änderung stehen. Das funktioniert nicht! Stattdessen wartet das Unterformular fälschlicherweise auf die Eingabe eines weiteren Datensatzes; dieser steht aber bereits da.
Für jemand der sich der VBA-Programmierung erst langsam nähert ein schwieriges Unterfangen.
Vorab vielen Dank!
Hallo,
sorry, aber Punkt 2 versteh ich nicht. Warum sollte sich der "nachfolgende Datensatz" (?) ändern, wenn ein Datum geändert wird?
btw: bin den Rest der Woche hier nicht online..
Hallo DF6GL,
das ging schnell, danke!
Vorab werden die Felder der Tabelle tbl_AUFTRAEGE vom Anwender befüllt, der Auftrag wird also erteilt - der Datensatz besteht! Im Feld [AUF_Gutachten] erfolgt erst nach Eingang des Gutachtens mehrere Wochen später der entsprechende Datumseintrag in dem bereits bestehenden Datensatz (1. Ereignis, s.o.).
Wenn ich den Code verstehe, erkennt er das Vorhandensein eines NewRecords als 'false' und reagiert entsprechend richtig mit 'DoCmd.GoToRecord , , acNewRec' !
Wenn ich das bestehende Datum in [AUF_Gutachten] ändere, prüft er wieder das Vorhandensein eines NewRecords - wiederum 'false' - und verhält sich jetzt aber falsch, weil er den Anwender wieder mit 'DoCmd.GoToRecord , , acNewRec ' zu einer Neu-Eingabe verleitet. Das sollte jetzt unterbleiben!
In der Hoffnung auf eine einsichtige Darstellung verbleibe ich mit freundlichem Doppelkick!
HAllo,
dann muss noch auf das Vorhandensein eines Datums geprüft werden...:
Sub AUF_Gutachten_Exit(Cancel As Integer)
If isnull(Me!AUF_Gutachten) Then
If Me.NewRecord = False Then
Me.Parent!frm_Schueler_ufoBearbeitung03.SetFocus
DoCmd.GoToRecord , , acNewRec
Me.Parent!frm_Schueler_ufoBearbeitung03!VER_FS.SetFocus
End If
Me.Parent!frm_Schueler_ufoAuftraege03.SetFocus
End If
End Sub
oder evtl. Afterupdate benutzen und den vorhergehenden Wert (OldValue) des Datumsfeldes auf NULL prüfen
Hallo DF6GL,
mit AfterUpdate und der Prüfung von OldValue funktioniert das bestens - genau so, wie ich mir das vorgestellt habe!!
Du hast mir wirklich - wieder mal - bestens geholfen. Vielen Dank!
Meine Anfrage gilt als gelöst!!
falsches Symbol! Das Thema gilt als gelöst! Bestens sogar!