Hallo zusammen. Ich hänge nun schon seit einigen Tagen an einer Funktion fest und denke das Ihr mir wieder helfen könnt.
Es handelt sich um drei Bedingungen "After Update". Einzeln funktionieren sie aber wenn ich sie zusammenfüge ist keine Funktion da.... keine Fehlermeldung.
Private Sub Form_AfterUpdate()
If (([Verpackt_am]) And ([Verpackt_von])) And (([AusgeliefertDurch]) And ([Ausgeliefert_am])) And IsNull(VerpacktUndAusgeliefertSendenDatum) Then
Dim Element1 As Variant, strAdr As String
On Error GoTo Rundmail_Err
DoCmd.SendObject acSendNoObject, "", , strAdr, , , " Statusmeldung: Das Gerät Nr. " & Me.Geräte_Nummer & " ist verpackt
und ausgeliefert.", " Das Gerät ist verpackt und wurde ausgeliefert."
CurrentDb.Execute "Update Objekt Set VerpacktUndAusgeliefertSendenDatum = Now() Where [Geräte_Nummer]= '" & Me![Geräte_Nummer] & "'"
Rundmail_Exit:
Me.KontrollFreigabe = 0
Exit Sub
Rundmail_Err:
MsgBox "Die Mail wurde nicht versendet. Die Mail muss versendet werden bevor das Fenster geschlossen werden kann !!!."
Resume Rundmail_Exit
End If
If ([AusgeliefertDurch]) And ([Ausgeliefert_am]) And IsNull(AusgeliefertSendenDatum) Then
Dim Element2 As Variant, strAdr As String
On Error GoTo Rundmail_Err
DoCmd.SendObject acSendNoObject, "", , strAdr, , , " Statusmeldung: Das Gerät Nr. " & Me.Geräte_Nummer & " wurde
ausgeliefert.", " Das Gerät wurde Ausgeliefert."
CurrentDb.Execute "Update Objekt Set AusgeliefertSendenDatum = Now() Where [Geräte_Nummer]= '" & Me![Geräte_Nummer] & "'"
Rundmail_Exit:
Me.KontrollFreigabe = 0
Exit Sub
Rundmail_Err:
MsgBox "Die Mail wurde nicht versendet. Die Mail muss versendet werden bevor das Fenster geschlossen werden kann !!!."
Resume Rundmail_Exit
End If
If ([Verpackt_am]) And ([Verpackt_von]) And IsNull(VerpacktSendenDatum) Then
Dim Element3 As Variant, strAdr As String
On Error GoTo Rundmail_Err
DoCmd.SendObject acSendNoObject, "", , strAdr, , , " Statusmeldung: Das Gerät Nr. " & Me.Geräte_Nummer & " ist
verpackt.", " Das Gerät wurde verpackt und steht zur Auslieferung bereit."
CurrentDb.Execute "Update Objekt Set VerpacktSendenDatum = Now() Where [Geräte_Nummer]= '" & Me![Geräte_Nummer] & "'"
Rundmail_Exit:
Me.KontrollFreigabe = 0
Exit Sub
Rundmail_Err:
MsgBox "Die Mail wurde nicht versendet. Die Mail muss versendet werden bevor das Fenster geschlossen werden kann !!!."
Resume Rundmail_Exit
End If
End Sub
habe viele sachen hin und her probiert.... die End If alle zum schluss, Rundmail_Exit1,,2 Rundmail_Err1,2 erweitert.
Was mache ich falsch?
Udo, 3x strAdr als Variable deklariert und keine Fehlermeldung kaufe ich Dir nicht ab. :)
Wo die Email-Adressen herkommen, weißt nur Du. Deshalb habe ich im Code ein Me.FeldMitEMailAdressen eingesetzt, was anzupassen ist.
Private Sub Form_AfterUpdate()
'verpackt
Const SUBJECT_PACKAGED As String = _
"Statusmeldung: Das Gerät Nr. %% wurde verpackt"
Const MSGTEXT_PACKAGED As String = _
"Das Gerät wurde verpackt und steht zur Auslieferung bereit."
'ausgeliefert
Const SUBJECT_SHIPPED As String = _
"Statusmeldung: Das Gerät Nr. %% wurde ausgeliefert"
Const MSGTEXT_SHIPPED As String = _
"Das Gerät wurde ausgeliefert."
'verpackt und ausgeliefert
Const SUBJECT_PACKAGED_AND_SHIPPED As String = _
"Statusmeldung: Das Gerät Nr. %% wurde verpackt und ausgeliefert"
Const MSGTEXT_PACKAGED_AND_SHIPPED As String = _
"Das Gerät wurde verpackt und ausgeliefert."
'zusätzlicher Fehlertext
Const ERR_MSG As String = _
"Die Mail wurde nicht versendet. Die Mail muss versendet werden " & _
"bevor das Fenster geschlossen werden kann!!!."
On Error GoTo Rundmail_Err
'verpackt und ausgeliefert? -- klingt redundant
If IsNull(Me.VerpacktUndAusgeliefertSendenDatum) And _
IsDate(Me.Ausgeliefert_am) And _
IsDate(Me.Verpackt_am) And _
Not IsNull(Me.Verpackt_von) And _
Not IsNull(Me.AusgeliefertDurch) Then
DoCmd.SendObject To:=Me.FeldMitEMailAdressen, _
Subject:=Replace(SUBJECT_PACKAGED_AND_SHIPPED, "%%", _
Me.Geräte_Nummer), _
MessageText:=MSGTEXT_PACKAGED_AND_SHIPPED
Me.VerpacktUndAusgeliefertSendenDatum = Now()
'ausgeliefert?
ElseIf IsNull(Me.AusgeliefertSendenDatum) And _
IsDate(Me.Ausgeliefert_am) And _
Not IsNull(Me.AusgeliefertDurch) Then
DoCmd.SendObject To:=Me.FeldMitEMailAdressen, _
Subject:=Replace(SUBJECT_SHIPPED, "%%", _
Me.Geräte_Nummer), _
MessageText:=MSGTEXT_SHIPPED
Me.AusgeliefertSendenDatum = Now()
'verpackt?
ElseIf IsNull(Me.VerpacktSendenDatum) And _
IsDate(Me.Verpackt_am) And _
Not IsNull(Me.Verpackt_von) Then
DoCmd.SendObject To:=Me.FeldMitEMailAdressen, _
Subject:=Replace(SUBJECT_PACKAGED, "%%", _
Me.Geräte_Nummer), _
MessageText:=MSGTEXT_PACKAGED
Me.VerpacktSendenDatum = Now()
End If
'???
Me.KontrollFreigabe = 0
'Datensatz speichern
Me.Dirty = False
Exit Sub
Rundmail_Err:
MsgBox Err.Description & vbCrLf & vbCrLf & ERR_MSG, , _
"Fehlernummer.: " & Err.Number
End Sub
Hallo Lachtaube,
vielen Dank für den bearbeiteten Code. Ich werde ihn heute Abend einsetzen und mich melden. Habe echt keinen Fehler angezeigt bekommen und mit den Mail Adressen hatte ich vor DoCmd.SendObject acSendNoObject, "", , strAdr,"MAX MUSTERMANN@xxx.com", , " Statusmeldung: Das Gerät
einzusetzen da die Mail Adresse an eine Abteilung gesendet wird.
Supieeeee ;D
Hallo Lachtaube. Der Code funktioniert soweit ...... habe auch nicht daran gezweifelt :D aber da ist noch eine Funktion, die ich gerne hätte.
Wenn die Mail nicht gesendet wird, soll sich am KontrollFreigabe nichts änderen (0). Dieses brauche ich zum Sperren des Formulars wenn Feld [Verpackt], [Ausgeliefert] oder [Verpackt und Ausgeliefert] ist. Kann vom vorgesetzten wieder freigeschaltet werden. Und nach erscheinen des Fehlers "zusätzlicher Fehlertext" MSGTEXT : Mail wurde nicht versendet, soll das Formular nicht schließen. Kannst du mir da behilflich sein?
Habe einige Änderungen im Code eingegeben .... Funktioniert. Habe an einigen Stellen zum Verständnis noch einen Kommentar eingefügt.
Private Sub Form_AfterUpdate()
'verpackt
Const SUBJECT_PACKAGED As String = "Statusmeldung: Das Gerät Nr. %% wurde verpackt"
Const MSGTEXT_PACKAGED As String = "Das Gerät wurde verpackt und steht zur Auslieferung bereit."
'ausgeliefert
Const SUBJECT_SHIPPED As String = "Statusmeldung: Das Gerät Nr. %% wurde ausgeliefert"
Const MSGTEXT_SHIPPED As String = "Das Gerät wurde ausgeliefert."
'verpackt und ausgeliefert
Const SUBJECT_PACKAGED_AND_SHIPPED As String = "Statusmeldung: Das Gerät Nr. %% wurde verpackt und ausgeliefert"
Const MSGTEXT_PACKAGED_AND_SHIPPED As String = "Das Gerät wurde verpackt und ausgeliefert."
'zusätzlicher Fehlertext
Const ERR_MSG As String = "Die Mail wurde nicht versendet. Die Mail muss versendet werden " & "bevor das Fenster geschlossen werden kann!!!."
On Error GoTo Rundmail_Err
'verpackt und ausgeliefert? -- klingt redundant <-------- je nachdem kann es sein, das ein Gerät ohne verpacken das Haus verlässt, daher alle drei fälle
If IsNull(Me.VerpacktUndAusgeliefertSendenDatum) And IsDate(Me.[Ausgeliefert am]) And IsDate(Me.[Verpackt am]) And Not IsNull(Me.[Verpackt von]) And Not IsNull(Me.AusgeliefertDurch) Then
DoCmd.SendObject To:="Max@Mustermann.de", Subject:=Replace(SUBJECT_PACKAGED_AND_SHIPPED, "%%", Me.[Geräte Nummer]), MessageText:=MSGTEXT_PACKAGED_AND_SHIPPED
CurrentDb.Execute "Update Objekt Set VerpacktUndAusgeliefertSendenDatum = Now() Where [Geräte Nummer]= '" & Me![Geräte Nummer] & "'"
'ausgeliefert?
ElseIf IsNull(Me.AusgeliefertSendenDatum) And IsDate(Me.[Ausgeliefert am]) And Not IsNull(Me.AusgeliefertDurch) Then
DoCmd.SendObject To:="Max@Mustermann.de", Subject:=Replace(SUBJECT_SHIPPED, "%%", Me.[Geräte Nummer]), MessageText:=MSGTEXT_SHIPPED
CurrentDb.Execute "Update Objekt Set AusgeliefertSendenDatum = Now() Where [Geräte Nummer]= '" & Me![Geräte Nummer] & "'"
'verpackt?
ElseIf IsNull(Me.VerpacktSendenDatum) And IsDate(Me.[Verpackt am]) And Not IsNull(Me.[Verpackt von]) Then
DoCmd.SendObject To:="Max@Mustermann.de", Subject:=Replace(SUBJECT_PACKAGED, "%%", Me.[Geräte Nummer]), MessageText:=MSGTEXT_PACKAGED
CurrentDb.Execute "Update Objekt Set VerpacktSendenDatum = Now() Where [Geräte Nummer]= '" & Me![Geräte Nummer] & "'"
'Me.VerpacktSendenDatum = Now()<------wird mit dem Code darüber zum jeweiligen Gerät gespeichert
End If
'Me.KontrollFreigabe = 0 <-------damit setze ich ein Kontrollkästchen, welches den Zugriff auf das Formular sperrt, wird bei Freigabe auf-1 gesetzt undder zugriff ist wieder möglich.
Exit Sub
Rundmail_Err:
MsgBox Err.Description & vbCrLf & vbCrLf & ERR_MSG, , "Fehlernummer.: " & Err.Number
In meinem ursprünglichem Code habe ich das so umgesetzt
If ([AusgeliefertDurch]) And ([Ausgeliefert am]) And IsNull(AusgeliefertSendenDatum) Then
Dim Element As Variant, strAdr As String
On Error GoTo Rundmail_Err
DoCmd.SendObject acSendNoObject, "", , strAdr,"Max@Mustermann.de" , , " Statusmeldung: Das Gerät Nr. " & Me.Geräte_Nummer & " wurde ausgeliefert.", " Das Gerät wurde Ausgeliefert."
CurrentDb.Execute "Update Objekt Set AusgeliefertSendenDatum = Now() Where [Geräte Nummer]= '" & Me![Geräte Nummer] & "'"
Rundmail_Exit:
Me.KontrollFreigabe = 0
Exit Sub
Rundmail_Err:
MsgBox "Die Mail wurde nicht versendet. Die Mail muss versendet werden bevor das Fenster geschlossen werden kann !!!."
Resume Rundmail_Exit
End If
Udo, ich habe nur einige Anmerkungen.
Zumindest im Forum macht es sich gut, Codezeilen nicht länger als 80 Zeichen werden zu lassen - sonst ist der Lesefluß total gestört.
Warum verwendest Du wieder Aktualisierungsabfragen, statt direkt im Datensatz die Zeitstempel einzutragen?
In meinem Beispielcode gehe ich genau so mit KontrollFreigabe um, wie Dein ursprünglicher Code. Wo ist das Problem?
Hallo Lachtaube.
Werde mich bessern mit der Länge der Zeichen ;D. Ich habe dein Zeitstempel jetzt auch von Dir so eingefügt. Hatte ein Brett vor dem Kopf gehabt. Soweit Funktioniert es auch habe aber mit deinem Code ein Problem, welches du auch Kommentiert hast.
'verpackt und ausgeliefert? -- klingt redundant
'verpackt
Const SUBJECT_PACKAGED As String = "Statusmeldung: Das Gerät Nr. %% wurde verpackt"
Const MSGTEXT_PACKAGED As String = "Das Gerät wurde verpackt und steht zur Auslieferung bereit."
'ausgeliefert
Const SUBJECT_SHIPPED As String = "Statusmeldung: Das Gerät Nr. %% wurde ausgeliefert"
Const MSGTEXT_SHIPPED As String = "Das Gerät wurde ausgeliefert."
'verpackt und ausgeliefert
Const SUBJECT_PACKAGED_AND_SHIPPED As String = "Statusmeldung: Das Gerät Nr. %% wurde verpackt und ausgeliefert"
Const MSGTEXT_PACKAGED_AND_SHIPPED As String = "Das Gerät wurde verpackt und ausgeliefert."
Klingt redudant... is es auch ....
Mein Anliegen war, das eine Mail versendet und das KontrollFeigabe auf -1 gesetzt wird, wenn ich das Objekt verpacke und das Formular verlasse. --> Objekt verpackt, nicht ausgeliefert und Innendienst per Mail Informiert.
Wenn am Tag des Ausliefern die Daten eingegeben werden, wieder: Mail versendet und das KontrollFeigabe auf -1 gesetzt wird, wenn ich das Objekt Ausliefere und das Formular verlasse. --> Objekt ausgeliefert und Innendienst per Mail Informiert.
Wenn ich beides zusammen an einem Tag erledige, Mail versendet und das KontrollFeigabe auf -1 gesetzt wird, wenn ich das Objekt Verpackt und Ausliefere und das Formular verlasse. --> Objekt verpackt und ausgeliefert und Innendienst per Mail Informiert.
Es kann ja auch sein das ein Objekt ohne verpacken ausgeliefert wird, daher die 3 Möglichkeiten.
In deinem Code fragt er alle Zustände hintereinander ab und möchte 3 zustände (verpackt, ausgeliefert und beides) beim verlassen (after Update) durchschieben.
Hoffe ich habe mich verständlich ausgedrückt ;D ;D ;D
Durch das Ändern der Daten wird nachträglich vermutlich erneut das Formular-Ereignis Nach Aktualisierung ausgelöst - in einem Durchlauf erfolgt aber nur maximal das Abarbeiten eine oder keine der drei Bedingungen. Wenn eine zweite bzw. dritte Runde unerwünscht ist, dürfte das Vor Aktualisierung Ereignis des Formulars besser geeignet sein.
Stimmt, eingefügt in "vor Aktualisierung" passt es. Jeweils eine der drei Möglichkeiten werden abgearbeitet, leider kommt die Rundmail_Err:
MsgBox Err.Description & vbCrLf & vbCrLf & ERR_MSG, , "Fehlernummer.: " & Err.Number
und die 'zusätzlicher Fehlertext
Const ERR_MSG As String = "Die Mail wurde nicht versendet. Die Mail muss versendet werden " & "bevor das Fenster geschlossen werden kann!!!."
On Error GoTo Rundmail_Err
immer und es wird nicht verhindert, dass das Formular geschlossen wird, wenn die Aktion Mail senden abbruch ausgelöst wird.
Das Schließen eines Formulars kann im Beim Entladen-Ereignis des Formulars verhindert werden, indem Cancel einen Wert ungleich 0 erhält. Ebenso kann das Speichern von Daten im Vor Aktualisierung Ereignis unterbunden werden. Und wenn Du jetzt auch noch Fehlernummer und Fehlertext anführst, kann man ggf. konkreter helfen.
Beim Abbruch senden der Mail kommt die Fehlernummer 2501: Die Aktion SendObject wurde abgebrochen & die ERR_MSG, was auch richtig ist.
Wenn man aus versehen die Daten z.b.: "Verpackt am" ausfüllt und sofort löscht kommt beim verlassen des Formulars die Fehlernummer 2115: Das Makro oder die Funktion bzw die für dieses Feld auf die Eigenschaft "VorAktualisierung" oder "Gültigkeitsregel" festgelegt ist, hindert MS Access daran, die Daten im Feld zu speichern.
Bei beiden Meldungen erscheint im Infofeld nur ein Button "OK", nach dem bestätigen schließt dieses Formular.
Die 2501 kannst Du in der Fehlerbehandlung abfangen und Cancel = 1 setzen, falls nicht gespeichert werden soll oder darf. Zur 2115 musst Du mal nachsehen, ob eine Gültigkeitsregel existiert.
Hallo Lachtaube, ich hatte leichte Probleme mit dem Code, vor Update oder nach Update und grundsätzlich sobald ich in einem anderen Feld was geändert hatte kam die aufforderung zur Mail. Habe mir meinen Code nochmal vorgenommen und ihn sehr stark reduziert und es funktioniert. Habe den 3. Fall : [VerpacktUndAusgeliefert] rausgelassen, da er wie du schon sagtest überflüssig war.
Private Sub Form_AfterUpdate()
Dim Element As Variant
On Error GoTo Rundmail_Err
If ([AusgeliefertDurch]) And ([Ausgeliefert am]) And IsNull(AusgeliefertSendenDatum) Then
DoCmd.SendObject acSendNoObject, "", , "Max@Mustermann.de", , " Statusmeldung: Das Gerät Nr. " & Me![Geräte Nummer] & " wurde ausgeliefert.", " Das Gerät wurde Ausgeliefert."
CurrentDb.Execute "Update Objekt Set AusgeliefertSendenDatum = Now() Where [Geräte Nummer]= '" & Me![Geräte Nummer] & "'"
ElseIf ([Verpackt am]) And ([Verpackt von]) And IsNull(VerpacktSendenDatum) Then
DoCmd.SendObject acSendNoObject, "", , "Max@Mustermann2.de", , " Statusmeldung: Das Gerät Nr. " & Me.Geräte_Nummer & " ist verpackt.", " Das Gerät wurde verpackt und steht zur Auslieferung bereit."
CurrentDb.Execute "Update Objekt Set VerpacktSendenDatum = Now() Where [Geräte Nummer]= '" & Me![Geräte Nummer] & "'"
Rundmail_Exit:
Me.KontrollFreigabe = 0
Exit Sub
Rundmail_Err:
MsgBox "Die Mail wurde nicht versendet. Die Mail muss versendet werden bevor das Fenster geschlossen werden kann !!!."
Resume Rundmail_Exit
End If
End Sub
Vielen Dank nochmal für deine Unterstützung. :D Daumen hoch