collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 53
  • Punkt Versteckte: 1
  • Punkt Mitglieder: 3
  • Punkt Benutzer Online:

* Forenstatistik

  • stats Mitglieder insgesamt: 13695
  • stats Beiträge insgesamt: 62165
  • stats Themen insgesamt: 8469
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 16
  • stats Am meisten online: 415

Autor Thema: if then funktion  (Gelesen 157 mal)

Offline Icemann1970

  • Access-Profi
  • **
  • Beiträge: 132
if then funktion
« am: Oktober 08, 2017, 23:03:44 »
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?
Mfg. Udo
 

Offline Lachtaube

  • Access-Meister
  • ***
  • Beiträge: 727
Re: if then funktion
« Antwort #1 am: Oktober 09, 2017, 06:05:48 »
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
Grüße von der (⌒▽⌒)
 

Offline Icemann1970

  • Access-Profi
  • **
  • Beiträge: 132
Re: if then funktion
« Antwort #2 am: Oktober 09, 2017, 07:15:17 »
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
Mfg. Udo
 

Offline Icemann1970

  • Access-Profi
  • **
  • Beiträge: 132
Re: if then funktion
« Antwort #3 am: Oktober 09, 2017, 22:00:57 »
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

Mfg. Udo
 

Offline Lachtaube

  • Access-Meister
  • ***
  • Beiträge: 727
Re: if then funktion
« Antwort #4 am: Oktober 10, 2017, 11:25:05 »
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?
Grüße von der (⌒▽⌒)
 

Offline Icemann1970

  • Access-Profi
  • **
  • Beiträge: 132
Re: if then funktion
« Antwort #5 am: Oktober 10, 2017, 18:52:04 »
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
Mfg. Udo
 

Offline Lachtaube

  • Access-Meister
  • ***
  • Beiträge: 727
Re: if then funktion
« Antwort #6 am: Oktober 10, 2017, 19:21:32 »
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.
Grüße von der (⌒▽⌒)
 

Offline Icemann1970

  • Access-Profi
  • **
  • Beiträge: 132
Re: if then funktion
« Antwort #7 am: Oktober 10, 2017, 19:49:33 »
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.
Mfg. Udo
 

Offline Lachtaube

  • Access-Meister
  • ***
  • Beiträge: 727
Re: if then funktion
« Antwort #8 am: Oktober 10, 2017, 20:37:34 »
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.
Grüße von der (⌒▽⌒)
 

Offline Icemann1970

  • Access-Profi
  • **
  • Beiträge: 132
Re: if then funktion
« Antwort #9 am: Oktober 10, 2017, 20:55:19 »
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.
Mfg. Udo
 

Offline Lachtaube

  • Access-Meister
  • ***
  • Beiträge: 727
Re: if then funktion
« Antwort #10 am: Oktober 10, 2017, 21:40:54 »
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.
Grüße von der (⌒▽⌒)
 
Folgende Mitglieder bedankten sich: Icemann1970

Offline Icemann1970

  • Access-Profi
  • **
  • Beiträge: 132
Re: if then funktion
« Antwort #11 am: Oktober 11, 2017, 21:47:38 »
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
Mfg. Udo