Moin,
ich habe ein Formular mit Unterformular. Wenn ich ins Unterformular wechsel, wird der Inhalt vom Hauptformular automatisch gespeichert.
Wie kann ich das verhindern?
Vielen Dank.
LGM
Hallo,
das kannst Du gar nicht verhindern. Sobald Du aus dem Hafo rausgehst wird gespeichert. Du kannst nur das Verlassen des Hafos verhindern.
Aber es ist nicht möglich einen begonnene DS mal zwischenzeitlich ohne Speichern zu verlassen.
Erkläre das Vorhaben mal genauer.
Zitat von: MzKlMu am Februar 03, 2017, 12:21:59
Hallo,
das kannst Du gar nicht verhindern. Sobald Du aus dem Hafo rausgehst wird gespeichert. Du kannst nur das Verlassen des Hafos verhindern.
Aber es ist nicht möglich einen begonnene DS mal zwischenzeitlich ohne Speichern zu verlassen.
Erkläre das Vorhaben mal genauer.
Komischerweise verliert der den Fokus gar nicht oder reagiert nicht darauf. Denn: Wenn ich im Hauptformular "Ereignis: Bei Fokusverlust" einstelle, und da eine msgbox aufrufe, passiert gar nichts.
Ok, hier das Problem im Detail:
Ich habe ein Formular mit Pflichtfeldern. Ob diese ausgefüllt sind, prüfe ich mittels VBA. Sind sie nicht ausgefüllt, kann man nicht speichern. (Ich habe einen eigenen Speichern-Button und alles access-interne abgeschaltet).
In einem Unterformular, stehen als Datenblatt alle bisherigen Datensätze. Klickt man einen an, wird er ins Hauptformular übernommen.
Nun das Szenario: Der Benutzer gibt im Hauptformular ein paar Daten ein (füllt aber nicht alle Pflichtfelder aus). Nun entscheidet er sich, in das Unterformular auf einen Datensatz zu klicken. Dieser wird logischerweise ins Hauptformular übernommen. Der (unvollständige) Datensatz im Hauptformular aber, wird ohne Prüfung gespeichert. Und genau das ist mein Problem.
Ich hoffe, ich habe es vernünftig erklärt. Danke für Deine Antwort.
LGM
Hallo,
in welchem Ereignis das Hafos prüfst Du die Pflichtfelder und wie ?
Zitat von: zoulhh am Februar 03, 2017, 13:05:44Der (unvollständige) Datensatz im Hauptformular aber, wird ohne Prüfung gespeichert. Und genau das ist mein Problem.
Dann musst du das
BeforeUpdate-Ereignis (Vor Aktualisierung) des Hauptformulars behandeln und darin deine Datenvalidierung ausführen. Wenn die Eingabe nicht gültig ist, setzt du das
Cancel-Argument auf True.
Das automatische Speichern komplett zu verhindern, ist nur möglich wenn man mit ungebunden Formularen arbeitet (schwierig in einem HF/UF-Konstrukt) oder wenn man die Formulare an Temporärtabellen bindet und per Code die Daten dann von der Temp-Tabelle in die echte Datentabelle kopiert. - Alles recht aufwendig...
Zitat von: PhilS am Februar 03, 2017, 13:33:25
Zitat von: zoulhh am Februar 03, 2017, 13:05:44Der (unvollständige) Datensatz im Hauptformular aber, wird ohne Prüfung gespeichert. Und genau das ist mein Problem.
Dann musst du das BeforeUpdate-Ereignis (Vor Aktualisierung) des Hauptformulars behandeln und darin deine Datenvalidierung ausführen. Wenn die Eingabe nicht gültig ist, setzt du das Cancel-Argument auf True.
Ich glaube, das rettet mich. Ich prüf das mal und melde mich ggf. oder löse diesen Thread.
Vielen Dank!
LGM
Habe nun einiges probiert und festgestellt, dass mein Problem wohl darin liegt, dass zwischen dem Hauptformular und dem Unterformular eine Beziehung besteht (und das Hauptformular deswegen gespeichert wird wenn das Unterformular fokussiert wird), die ich aber gar nicht brauche.
Daher meine Frage: Gibt es die Möglichkeit in einem Formular ein Datenblatt anzuzeigen, ohne dass dies ein Unterformular ist?
Ich weiß, ich könnte es in einem Dialogfenster anzeigen lassen, aber das möchte ich nicht.
LGM
Hallo,
die "Beziehung" kann gelöst/aufgehoben werden, wenn die Feldnamen in den Eigenschaften "Verknüpfen von/nach" des UFO-Steuerelementes entfernt werden.
Hi Franz,
ja, aber das hilft nichts. Das Hauptformular speichert immer noch sobald ich ins Unterformular klicke. Und wenn ich im Hauptformular before_update cancel = true setze bekomme ich einen Laufzeitfehler, wenn ich dem Unterformular das hier
Me!subSearchList.LinkChildFields = ""
mit auf dem Weg geben will. Der Laufzeitfehler kommt nur, wenn das Hauptformular dirty, also geändert wurde und ich das Speichern durch Cancel = True verhindern will.
Ich werde noch wahnsinnig.
LGM
Hallo,
zeige bitte mal den vollständigen Code zur Prüfung der Pflichtfelder.
Und was willst Du denn mit dieser Zeile erreichen ?
Me!subSearchList.LinkChildFields = ""
Ich glaube auch, wenn LinkChildFields gesetzt wird, muss auch LinkMasterFields gesetzt werden.
Aber das hat mit der Speichern Geschichte nichts zu tun.
Der Code zum Prüfen der Pflichtfeldern ist nicht relevant. Er wird bei diesem automatischen Speichern nicht ausgeführt. LinkMasterFields ist gesetzt.
Es geht nur darum:
Es wird ein Unterformular (Datenblatt) mittels Buttonklick angezeigt:
Private Sub Ctl101KDBERICHT_BT_Click()
Me!subSearchList.Visible = True
Me!subSearchList.SourceObject = "sfrm101_KD"
Me!subSearchList.LinkChildFields = ""
Me!subSearchList.LinkMasterFields = ""
End Sub
Und just in dem Moment wird der Inhalt des Hauptformulars gespeichert. Und das will ich nicht. Sobald ich aber Cancel = true in before_update setze, gibt
Me!subSearchList.LinkChildFields = ""
einen Laufzeitfehler aus. Und das ist, was ich nicht verstehe.
Danke für Deine Antwort.
LGM
Hallo,
ZitatDer Code zum Prüfen der Pflichtfeldern ist nicht relevant.
wenn Du das sagts.
Du schreibst doch aber, Du willst das Speichern des Hafo unterbinden wenn in das Ufo geklickt wird. Dann ist der entscheidende Punkt die Prüfung der Pflichtfelder.
Sorry, nein. Sind sie nicht. Habe es oben auch ausführlich erklärt. Die Geschichte mit Cancel = True und dem Laufzeitfehler.
LGM
Hallo,
ZitatDie Geschichte mit Cancel = True und dem Laufzeitfehler
aber Cancel = True ist doch Bestandteil der Prüfung.
Aber egal, Du brauchst die Hilfe.
PS:
Bitte unterlasse das zitieren kompletter Beiträge in direkter Antwort. Es verlängert nur die Themen. Ich habe die Zitate wieder gelöscht.
Zitat von: zoulhh am Februar 03, 2017, 16:52:31Der Code zum Prüfen der Pflichtfeldern ist nicht relevant. Er wird bei diesem automatischen Speichern nicht ausgeführt.
Er sollte es aber sein und wenn er nicht ausgeführt wird, ist das Teil des Problems.
Die Idee ist ja, vor dem Speichern die Prüfung auszuführen und nur dann zu Speichern, wenn die Eingabe OK ist. Daher
muss die Prüfung im
BeforeUpdate-Ereignis ausgeführt werden. - Sonst kannst du dort ja nicht entscheiden, ob gespeichert werden darf oder nicht.
Hallo,
in Antwort #6 hast du gefragt:
ZitatDaher meine Frage: Gibt es die Möglichkeit in einem Formular ein Datenblatt anzuzeigen, ohne dass dies ein Unterformular ist?
Eine solche Möglichkeit gibt es in Form eines Listenfeldes. Da dein bisheriges UFo ja auch als Datenblatt-Ansicht benutzt wird, ist die Optik eines Listenfeldes fast gleich. Natürlich kannst du im Listenfeld keine Daten ändern, aber das ist ja auch nicht gewünscht. Du willst ja nur einen bereits vorhandenen Datensatz auswählen können und das geht mit einem Listenfeld ohne Problem.
lg
crystal
Zitat von: PhilS am Februar 03, 2017, 17:42:30
Zitat von: zoulhh am Februar 03, 2017, 16:52:31Der
Die Idee ist ja, vor dem Speichern die Prüfung auszuführen und nur dann zu Speichern, wenn die Eingabe OK ist. Daher muss die Prüfung im BeforeUpdate-Ereignis ausgeführt werden. - Sonst kannst du dort ja nicht entscheiden, ob gespeichert werden darf oder nicht.
Nein. Siehe Antwort #10. Da ist das Problem.
LGM
Zitat von: crystal am Februar 03, 2017, 18:59:35
Hallo,
in Antwort #6 hast du gefragt:
ZitatDaher meine Frage: Gibt es die Möglichkeit in einem Formular ein Datenblatt anzuzeigen, ohne dass dies ein Unterformular ist?
Eine solche Möglichkeit gibt es in Form eines Listenfeldes.
Das schon. Danke für Deine Antwort. Nur das kann der Benutzer nicht sortieren oder mittels Textfilter durchsuchen.
LGM
Hallo nochmal,
dann habe ich noch eine andere, vielleicht sehr exotische Idee.
Access kann die Daten des HFo ja nur deshalb automatisch speichern, weil es die Tabelle kennt, in die diese Daten gehören.
Wie wäre es nun, Access genau das "zu klauen", wenn das Formular geöffnet wird oder bevor es geschrieben werden soll (Cancel=true im Before-Update-Event sollte das ja eigentlich auch machen)?
Ansonsten gäbe es wohl nur noch die Möglichkeit, das HFo ungebunden zu gestalten (wurde ja bereits vorgeschlagen) und die ganze Sache zweistufig zu gestalten:
1. im ungebundenen HFo ein paar Daten "auf Verdacht" eingeben.
2. "Suchen" klicken
3. Im UFo einen ggf. schon vorhandenen DS auswählen und
4. ein anderes Formular aufrufen, in dem die eigentliche Erfassung/Änderung der Daten erfolgt.
Übrigens könntest du dem User natürlich auch Funktionen bauen, mit denen er die Daten des Listenfeldes filtern oder sortieren kann. Einfach passende Buttons/Textfelder im Formular über die Spalten des Listenfeldes setzen und je nach eingegebenem Wert bzw. gedrücktem Button den Select-String des Listenfeldes anpassen.
lg
crystal
Pflichteingabefelder sollte man IMHO schon als solche im Tabellenentwurf auszeichnen. Weiterhin kann im Formular nach jedem Nach Aktualisierung Ereignis eines relevanten Steuerelements geprüft werden, ob die Mindestvoraussetzungen erfüllt sind, einen Datensatz speichern zu dürfen. Davon abhängig ließe sich die Aktiviert Eigenschaft eines Unteformularsteuerelements steuern, um die eingangs geschilderte Situation erst gar nicht aufkommen zu lassen.
Hallo zhoul,
ZitatDaher meine Frage: Gibt es die Möglichkeit in einem Formular ein Datenblatt anzuzeigen, ohne dass dies ein Unterformular ist?
Ja, ein Listfeld; - DS-Herkunft wie UFo mit Filter auf die ID im HFO (ent-
sprechend Link-Felder).
Beim Klick darauf kannst du auf .NewRecord prüfen, - bei True brichst du
die Prozedur ab, bei False wird der ausgewählte DS angezeigt.
gruss ekkehard
Hallo Lachtaube,
ZitatPflichteingabefelder sollte man IMHO schon als solche im Tabellenentwurf auszeichnen.
Da sollten Pflichtfelder aber trotzdem
BeforeUpdate geprüft werden
um die Fehlermeldung der JET zu verhindern.
ZitatWeiterhin kann im Formular nach jedem Nach Aktualisierung Ereignis eines relevanten Steuerelements geprüft werden,
Das wird aber hier und auch in anderen Foren oft als userunfreundlich
empfunden. Ich stimme dem zu, - eine Stelle an der die Pflichtfelder
geprüft, zusammengestellt und angezeigt werden, ist doch am über-
sichtlichsten.
gruss ekkehard
@ekkehard,
abhängig von der Realisierung von Pflichtfeldern kann ich mir auch (optional zusätzlich oder auch alleinstehend zum Vor Aktualisierung Ereignis des Formulars) selbst verfasste Gültigkeitsmeldungen um die Ohren hauen lassen bzw. das Bei Fehler Ereignis des Formulars auswarten, falls das Speichern der Daten nicht gelingt.
Wen interessiert die Empfindung anderer Foren? Wenn ich steuern will, dass ein Wechsel in ein Unterformularsteuerelement nur unter gegebenen Umständen stattfinden darf, sorge ich selbst dafür - und ein Deaktivieren des selben bietet sich als probates Mittel dazu an.
Danke für alle Antworten. Ich hab es wohl zu blöd erklärt. Ich habe es jetzt so gelöst, dass ich das Datenblatt nicht als Unterformular, sondern als acDialog öffne. Dann versucht Access nicht das Ursprungsformular zu speichern.
LGM