Daten visuell erfassen in 1:n- und 1:1- Beziehungen

Prüfen, welcher Fall vorliegt

Nun müssen Sie prüfen, welcher Fall vorliegt. Es könnte sein, dass es noch gar keinen Zahlungseingang für den Auftrag gibt. In diesem Fall hat das Feld txtRestbetrag den Wert Null. Sie sollten daher auf jeden Fall zuerst den Wert des Feldes txtAnzahl prüfen. Hat es den Wert 0, und wurde der Status auf 1 gesetzt, buchen Sie den Auftragswert.

Bild 4: Das Formular zur Laufzeit.
Bild 4: Das Formular zur Laufzeit.

Private Sub Status_Change()
Dim strSQL As String
Dim varPos As Variant
strSQL = ""
varPos = Me.Bookmark
Dim bytStatusAlt As Byte
'Prüfen, welchen Status der Auftrag vorher hatte
If Not (IsNull(Me.Status.OldValue)) Then
bytStatusAlt = Me.Status.OldValue
End If
'wenn alter und neuer Wert identisch
'Prozedur verlassen
If bytStatusAlt = Me.Status.Value Then
Me.Requery
Me.Bookmark = varPos
Exit Sub
End If
If (Me.txtAnzahl.Value = 0) Then
If Me.Status.Value = 1 Then 'bezahlt
'Restbetrag buchen
If Me.Auftragsart.Value = 2 Then 'gutschrift
strSQL = "INSERT INTO tabZahlungen (Betrag,Referenz,Auftrag) " & _
"VALUES(" & getWert(Me.Auftragswert.Value * (-1)) & ",""Auftrag
" & _
Me.ID.Value & """," & Me.ID.Value & ");"
ElseIf Me.Auftragsart.Value = 1 Then 'Rechnung
strSQL = "INSERT INTO tabZahlungen (Betrag,Referenz,Auftrag) " & _
"VALUES(" & getWert(Me.Auftragswert.Value) & ",""Auftrag " & _
Me.ID.Value & """," & Me.ID.Value & ");"
End If
'Prüfen ob der alte Wert "geliefert" war, dann
'Status auf "abgeschlossen" setzen
If bytStatusAlt = 2 Then
Me.Status.Value = 4
End If
End If
ElseIf (Me.txtRestbetrag.Value <> 0) Then
If Me.Status.Value = 1 Then 'bezahlt
'Restbetrag buchen
If Me.Auftragsart.Value = 2 Then 'gutschrift
strSQL = "INSERT INTO tabZahlungen (Betrag,Referenz,Auftrag) " & _
"VALUES(" & getWert(Me.txtRestbetrag.Value * (-1)) & ",""Auftrag
" & _
Me.ID.Value & """," & Me.ID.Value & ");"
ElseIf Me.Auftragsart.Value = 1 Then 'Rechnung
strSQL = "INSERT INTO tabZahlungen (Betrag,Referenz,Auftrag) " & _
"VALUES(" & getWert(Me.txtRestbetrag.Value) & ",""Auftrag " &
_
Me.ID.Value & """," & Me.ID.Value & ");"
End If
'Prüfen ob der alte Wert "geliefert" war, dann
'Status auf "abgeschlossen" setzen
If bytStatusAlt = 2 Then
Me.Status.Value = 4
End If
End If
ElseIf Me.txtRestbetrag.Value = 0 Then
'Wenn Status="geliefert" oder "offen", dann Rückbuchung
'ansonsten keine Buchung
If (Me.Status.Value = 2) Or (Me.Status.Value = 3) Then
'Rückbuchung
If Me.Auftragsart.Value = 2 Then 'gutschrift
strSQL = "INSERT INTO tabZahlungen (Betrag,Referenz,Auftrag) " & _
"VALUES(" & getWert(Me.txtRestbetrag.Value) & ",""Storno Auftrag "
& _
Me.ID.Value & """," & Me.ID.Value & ");"
ElseIf Me.Auftragsart.Value = 1 Then 'Rechnung
strSQL = "INSERT INTO tabZahlungen (Betrag,Referenz,Auftrag) " & _
"VALUES(" & getWert(Me.txtRestbetrag.Value * (-1)) & ",""Storno
Auftrag " & _
Me.ID.Value & """," & Me.ID.Value & ");"
End If
'Prüfen ob der alte Wert "abgeschlossen" war, dann
'Status auf "geliefert" setzen
If bytStatusAlt = 4 Then
Me.Status.Value = 2
End If
End If
End If
'SQL-Anweisung ausführen
If strSQL > "" Then
Application.CurrentDb.Execute strSQL
End If
Me.Requery
On Error GoTo FEHLER
Me.Bookmark = varPos
Exit Sub
FEHLER:
If Err.Number = 3259 Then
DoCmd.GoToRecord acDataForm, Me.Name, acLast
End If
Exit Sub
End Sub

Der erste Else-If-Zweig prüft nun, ob der Restbetrag ungleich 0 ist. Falls in diesem Fall als Status bezahlt gewählt wurde, erzeugen Sie eine Buchung mit dem Restbetrag. Im nächsten und letzten Else-If-Zweig prüfen Sie, ob der Restbetrag gleich 0 ist. Wurde gleichzeitig der Status auf offen oder geliefert gesetzt, müssen Sie den Gesamtbetrag rückbuchen. Dazu multiplizieren Sieden Betrag bei Rechnungen mit -1, bei Gutschriften verwenden Sie den gespeicherten Wert.

Zum Schluss führen Sie die erzeugte SQL-Anweisung mit der Execute-Methode aus. Damit dann auch die neuen Werte angezeigt werden, rufen Sie die Requery-Methode auf und setzen dann die Bookmark-Eigenschaft auf den zwischengespeicherten Wert, um den Datensatz wieder zu aktivieren.

Mit diesem Code geht Ihren Benutzern die Buchung von Zahlungseingängen so leicht von der Hand, das sie gar nichts anderes mehr machen möchten. Aber noch schöner wäre es natürlich, Sie würden ihnen auch ein Formular anbieten, mit dem Teilbeträge gebucht werden können.