PDA

Vollständige Version anzeigen : wie bringe ich in einen Speicher-Button eine Abfrage und evtl. ein Zurück zur Eingab


bkleine
05.05.2011, 19:11
Hallo,

ich habe ein Formular mit zwei Zahlen(Integer)-Feldern, von denen beide, nur eines, aber nicht keines ausgefüllt werden darf. Ich habe versucht einen "Save"-Button zu benutzen und in dessen Makrotabelle eine Zeile mit einer konditionellen Meldung "bitte wenigstens ein Feld ausfüllen" einzufügen.

die Bedingung:
[Formulare]![frm_grouplisting]![grpList_staffToAdd]<1 Und [Formulare]![frm_grouplisting]![grpList_groupToAdd]<1

die Aktion:
Meldung

Argumente:
Bitte wenigstens eins von beiden eingeben!

Leider wird die Meldung nicht angezeigt, auch wenn beide Felder leerbleiben.

Die anschließende Frage ist, wie kann ich, wenn die Bedingung erfüllt ist, sowohl die Meldung schicken und mittels Button ein "Zurück zum Eintrag" gestalten.

Ich hätte auch keine Probleme, den Command-Button mit einem geeigneten VBA-Schnipsel zu beschicken. Mein erster Versuch damit ging allerdings daneben:

Private Sub Form_BeforeUpdate(Cancel As Integer)

Me.grpList_entered = Now() 'setzt den timestamp
If Me.grpList_groupToAdd < 1 Then
If Me.grpList_staffToAdd < 1 Then
MsgBox "Please enter at least one group or one person!", vbRetryCancel
End If
End If
End Sub

auch hier wurde die Meldung nicht angezeigt.

Bitte ganz freundlich um Hilfe!

Bernhard

ebs17
05.05.2011, 19:30
Als Prüfung würde ich mir etwa vorstellen:
If ((Len(Me.grpList_groupToAdd) = 0) + Len(Me.grpList_staffToAdd) = 0)) < -1 Then ...

bkleine
05.05.2011, 20:13
If ((Len(Me.grpList_groupToAdd) = 0) + (Len(Me.grpList_staffToAdd) = 0)) < -1 Then ...

ich habe mal die fehlende Klammer von dem zweiten Len noch eingefügt. Leider funktioniert das nicht. der timestamp (in der gleichen sub) wird geändert, aber die beiden felder bleiben leer, ohne dass die msgbox erscheint.

Ich schätze, dass len(feld)=0 -1 ergibt und dass daher bei zwei leeren feldern -2 herauskommen sollte.

aber zuerst einmal wunder ich mich, dass die MsgBox nicht erscheint.

ebs17
05.05.2011, 20:37
Ich schätze, dass len(feld)=0 -1 ergibt und dass daher bei zwei leeren feldern -2 herauskommen sollte.
So hatte ich es mir gedacht, eine Prüfung ergibt True (-1) oder False (0), die Summe dann 0, -1 oder -2. Kommt denn eine solche Summe an?

Marsu65
05.05.2011, 20:51
Hallo zusammen.
Alternativ zu Eberhards Vorschlag:
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim res As VbMsgBoxResult
If IsNull(Me.grpList_groupToAdd) And IsNull(Me.grpList_staffToAdd) Then
Cancel = True 'Speichern abbrechen

res = MsgBox("Please enter at least one group or one person!", vbRetryCancel)

Select Case res
Case vbRetry
Me.grpList_groupToAdd.SetFocus
Case vbCancel
'Andere tolle Dinge wie z.B. Undo für alle Eingaben
End Select

Else
Me.grpList_entered = Now() 'setzt den timestamp
End If
End Sub

bkleine
05.05.2011, 21:09
Die Lösung:

Private Sub Form_BeforeUpdate(Cancel As Integer)
Me.grpList_entered = Now()

If (IsNull(Me.grpList_groupToAdd) And IsNull(Me.grpList_staffToAdd)) = True Then
MsgBox "Please enter at least one group or one person!", vbRetryCancel
End If
End Sub

Das wird auch ausgeführt, wenn der Save the Record-Button gedrück wird. daher ist die Makro-Ergänzung in dem Save the Record-Button nicht nötig.

Marsu65
05.05.2011, 21:20
Schön das es funktioniert, wie du möchtest.
Zwei kleine Anmerkungen seien dennoch erlaubt:

Ich frage mich, warum du zwei Buttons in der MsgBox zur Auswahl stellst (vbRetryCancel) wenn es eh egal ist, auf welchen der Anwender klickt ;)

Wird das Speichern auf Tabellenebene verhindert?
Da du nirgends Cancel = True setzt, wird der Datensatz trotz Meldung gespeichert.

bkleine
05.05.2011, 21:24
Hallo Eberhard, hallo Marsu65

du warst etwas schneller hier im Forum und dein Code erscheint viel professioneller, das werde ich doch glatt verwenden.

Ich habs halt mit einer Messagebox ausgeführt und dort probiert, was ich erhalte:

Len(groupToAdd) nicht definiert
IsEmpty(groupToAdd) falsch
IsNull(groupToAdd) wahr

und das habe ich dann verwendet.

Wenn Ihr mir jetzt noch verraten könnt, wie die Undo-Funktion funktioniert und eingebaut werden, bin für heute wunschlos glücklich!

Herzlichen Dank!

ebs17
05.05.2011, 21:29
Len(groupToAdd) nicht definiert
Den Nullwert im Feld kann man durch einen Leerstring entschärfen:
If Len("" & groupToAdd) = 0 ...
Die Variante könnte sinnvoll sein, wenn Du z.B. 3 von 5 Feldern ausgefüllt haben musst.

Bezüglich Undo: Siehe Rückfrage vor dem Speichern (http://www.donkarl.com?FAQ4.32)

bkleine
05.05.2011, 21:50
Auf die donkarls#sche faq hätte ich auch selbst kommen können.

herzlichen dank noch mal!

bernhard