PDA

Vollständige Version anzeigen : Anfängerfrage: Navigieren im Formular ohne Speicherung des aktuellen DS


Harry DAU
14.08.2001, 07:32
Hallo bin Anfänger und habe eine für Euch wahrscheinlich einfache Frage. Habe ein Formular erstellt, in dem neue DS eingefügt werden sollen. Es existieren aber auch entsprechende Schaltflächen um zwischen den DS zu navigieren. Habe festgestellt, daß ein DS gespeichert wird, wenn man ihn verläßt um zu einem anderen zu navigieren. Unter Umständen ist aber dann der aktuell neu erfasste DS noch nicht vollständig. Wie kann ich verhindern,daß dieser dann überhaupt gespeichert wird. Habe es mit einem Makro versucht, in dem ich vor der Navigationsaktion jeweils ein "Rückgängig" eingefügt habe. Das funktioniert dann aber nur, wenn der neue DS schon editiert wurde. Ansonsten erhalte ich die Meldung "Aktion rückgängig momentan nicht möglich" Abhilfe?

Danke schon mal im voraus.

Harry

Pittchen
14.08.2001, 08:13
Hey, ich habe keine Anfänger-Antwort, aber ich glaube sie funktioniert: du wechselst in den VBA-Code-Editor (In der Entwurfsansicht), dort suchst du das Formular-Ereignis Vor Aktualisierung (Before_Update) und schreibst folgende Code-Zeilen:

Private Sub Form_BeforeUpdate(Cancel As Integer)
If MsgBox("Möchten Sie die Änderungen speichern?", vbYesNo) = vbNo Then
Me.Undo
End If

End Sub

Viel Erfolg, Gruß Pittchen

Jochum Rainer
14.08.2001, 10:03
Hallo Pittchen!
Mit der Abfrage zum Speichern ja/nein hast du denselben Effekt wie beim Navigieren.
Wenn der DS nicht vollständig ist und der Benutzer sagt speichern ja ist der DS genauso unvollständig wie wenn er auf den nächsten DS klickt.
Eine Lösungsmöglichkeit wäre, dass bei den Feldern die auf jeden Fall eingegeben werden muessen Eingabe erforderlich auf ja (im Tabellenentwurf) gesetzt wird.
Der Benutzer kann erst dann den Satz wechseln, wenn alle Pflichtfelder gefüllt sind.
Zweite Möglichkeit:
Beim Update Ereignis des Formulars werden alle Felder, die der Benutzer unbedingt eingeben muss geprüft, ob sie leer sind.
Der Benutzer erhält eine msgbox mit den noch zu füllenden Feldern und der Focus wird auf das erste zu füllende Feld gesetzt.

Gruesse
Rainer Jochum

Harry Dau
14.08.2001, 11:04
Hallo Pittchen,

erst einmal vielen Dank für die prompte Beantwortung meiner Anfrage im Forum. Dein Vorschlag würde funktionieren,
entspricht aber leider nicht dem, was ich mir vorstelle. Vielleicht habe ich mein Problem nicht genug geschildert.
Wenn ein DS der gerade erfasst wird, durch das Betätigen der Navigationsschaltflächen verlassen wird, soll dieser auf
keinen Fall gespeichert werden. Die Speicherung des DS soll aussschließlich über eine separate Schaltfläche erfolgen, die vor
dem Speichern auch noch einige Plausibilitätsprüfungen durchführt.
Ich hoffe, Du kannst mir noch einmal helfen.

Harry

Jochum Rainer
14.08.2001, 11:12
Hallo Harry!
Du brauchst keine separate Schaltfläche!
Schau dir mein Lösungsvorschlag 2 an.
Damit funktioniert das.

Gruesse
Rainer Jochum

Jochum Rainer
14.08.2001, 11:22
Hallo!
Nachtrag: Deine Plausi Prüfungen kannst du natürlich auch beim Update Ereignis hinterlegen.
Der Benutzer kann erst dann den DS speichern, wenn alle Felder deinen Wünschen gemäß gefüllt sind, ansonsten wird er immer wieder an den DS zurückgewiesen.
Einen speziellen Button zum speichern benutzte ich eigentlich nur, wenn ich ein Formular mit lt. ungebunden Textfeldern habe(also keine Tabellenfelder) und diese werden dann per Button in die entsprechenden Felder der Datenbank geschrieben.
Gruesse
Rainer Jochum

Pittchen
14.08.2001, 11:28
Hallo Rainer,
welche Abfrage zum Speichern meinst Du? Und wie geht dein Vorschlag weiter? Deine Messageboxes müßten Inputboxes sein, deren Eingaben über Funktionen den Textfeldern zugeweisen werden müßten; erscheint mir ziemlich viel Aufwand
Gruß Pittchen
Hallo Harry, Geht aber dauert ein bißchen
Gruß Pittchen

Harry Dau
14.08.2001, 11:32
Hallo Rainer,

habe auch in meinem Formular viele ungebundene Textfelder und daher die separate Schaltfläche zum Speichern. Könntest
Du also einem blutigen Anfänger kurz erklären, wie ich die MsgBox mit den noch zu
füllenden Feldern erstelle? Ich möchte nämlich ungern im Tabellenentwurd die Felder als Pflichtfelder definieren, damit der User nicht ständig die Access-Meldungen um die Ohren geschlagen bekommt. Danke!

Harry

Pittchen
14.08.2001, 11:53
Hallo Harry,
wie und wo willst Du speichern, wenn die Textfelder ungebunden sind?
Gruß Pittchen

Jochum Rainer
14.08.2001, 11:57
Hallo Pittchen!

Ich meinte diese hier:
If MsgBox("Möchten Sie die Änderungen speichern?", vbYesNo) = vbNo Then
Me.Undo
Wobei das aber nach der weiteren Erklärung
von Harry, das die eingegeben Felder gelöscht werden müssen beim Verlassen prima funktioniert. Ich ging davon aus, dass er die bereits eingegeben Daten auf jeden Fall behalten will.
In deiner Funktion können jetzt die Plausi Prüfungen (ua auf leere Felder) eingebaut werden.
Eine Msgbox zeigt dir einfach die fehlenden und/oder falschen Angaben an. Kein Input nur Anzeige für den Benutzer, damit er sieht was er noch füllen muss bzw. was falsch war.
Danach wird der focus auf das erste Feld gesetzt das neu gefüllt werden muss.
Könnte so aussehen:

fehlbeschr = "Folgende Eingaben fehlen:" & vbCrLf

If IsNull(Me!Namen) Then
fehlbeschr = fehlbeschr & "Eingabe Name" & vbCrLf
ist_2fehler = True
End If

.
.
.
.

If ist_2fehler = True Then
MsgBox fehlbeschr
Me!Namen.SetFocus
Exit Sub
End If

Gruesse
Rainer Jochum

Jochum Rainer
14.08.2001, 12:15
Hallo Harry!
Die Msgbox mit den noch zu füllenden Feldern ist vielleicht etwas verwirrend. Ich benutze diese um das Programm Anwenderfreundlich zu gestalten. Du brauchst diese im Prinzip für deine Problemlösung nicht.
Zum Wegschreiben von ungebunde Textfeldern :

Private Sub Befehl28_Click()
Dim WS As Workspace
Dim DB As Database
Dim rsD As Recordset
Dim Lfnr$
Dim Kundennr$


Set WS = DBEngine(0)
Set DB = WS(0)
Set rsD = DB.OpenRecordset("ta_bewegung", DB_OPEN_DYNASET)



MsgBox "Datensatz wird gespeichert!"

DoCmd.Hourglass True


' Variablen füllen aus Hauptformular
Lfnr$ = Me!Schein_Nr
Kundennr$ = Me!KDNR



' in ta_bewegung wegschreiben

rsD.AddNew
rsD!Lfnr = Lfnr$
rsD!Kundennr = Kundennr$
rsD.Update

rsT.FindNext Krit$
Loop


DoCmd.Hourglass False

End If

End Sub

Der Code ist optimierbar, aber so besser zu verstehen.

Im Prinzip hast du jetzt Beispielhaft alle Komponeten die du brauchst.

Die Update Funktion von Pittchen plus die Msgbox(wie gesagt nur Optimierung) und den Code zum Füllen der DB mit ungebunden Textfeldern.

Gruesse
Rainer Jochum

Pittchen
15.08.2001, 12:06
Hallo Harry, Dank Stemas Hilfe hier der komplette Code; das Problem hat mich selbst gereizt, daher meine Hartnäckigkeit;

Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim ctl As Control
Dim frm As Form

'die Objektvariable frm wird auf das aktuelle Formular gesetzt
Set frm = Me

' Controls-Auflistung durchlaufen.
For Each ctl In frm.Controls
' Prüfen, ob das Steuerelement ein Textfeld ist.
If ctl.ControlType = acTextBox Then
If IsNull(ctl.Value) Then
Me.Undo
Exit For
End If
End If
Next ctl

End Sub

Wenn Du dir den Code anschaust, wirst Du feststellen, dass Deine Frage doch keine "ganz einfache" Anfängerfrage war. Viel Erfolg und
Gruß Pittchen