Juni 24, 2021, 20:41:07

Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!


Bericht beim ersten öffnen in der Woche automatisch versenden

Begonnen von Savarol, Mai 20, 2010, 15:55:52

⏪ vorheriges - nächstes ⏩

Savarol

Hallo Leute,

ich habe in einer Datenbank (2007) einen Bericht und der soll beim ersten Öffnen der Datenbank in der Woche den Bericht automatisch verschicken. Ich habe, glaube ich, die Logik, kann das aber in VBA nicht umsetzen:

aktWoche=KW(Datum())
wenn aktWoche <> Woche
schicke Bericht
Woche=aktWoche

Das in ein Modul reinpacken und dann in ein Autoexec-Makro müsste funktionieren. Lieg ich da richtig? Kann mir das jemand in VBA übersetzen?

Danke
cu Savarol

database

Hallo,

nun, ich denke du benötigst hierfür natürlich auch ein Werkzeug um Access mitzuteilen, dass der besagte Bericht bereits gesendet wurde!
M.E. ist es am Einfachsten eine lokale Tabelle zu führen in der die KW (kalenderwoche, Zahl, byte)  mit einem Kennzeichen (sendekennzeichen, ja/nein, Standard 0) eingetragen sind.
Die Tabelle wird am Jahresende, nachdem der Bericht der letzten Kalenderwoche gesendet wurde per Aktualisierungsabfrage wieder zurückgesetzt.

Für die Bearbeitung kannst du das Autoexec-Makro zwar verwenden, wenn die Möglichkeit aber gegeben ist, würde ich eher die saubere VBA-Variante nehmen.
Dazu kannst du das Ereignis 'Beim Laden' eines ev. Startformulars verwenden um auf eine Public Sub in einem Standardmodul zu verweisen.


Public Sub Wochenbericht()

Dim kw As Byte

kw = DatePart("ww", Date)

'Überprüfung ob für die aktuelle KW schon gesendet wurde
If DLookup("kalenderwoche", "DeineTabelle", "kalenderwoche=" & kw & " AND sendekennzeichen=0") Then

    'könnte so gehen...
    DoCmd.SendObject acReport, "DeinBericht", "SnapshotFormat(*.snp)", _
                                "empfaenger@mailserver.de", "", "", "Wochenbericht" & " " & " " & Now, _
                                "Guten Morgen und eine angenehme Arbeitswoche," & vbCrLf & vbCrLf & _
                                "anbei erhalten Sie den akuellen Wochenbericht ... blabla " & vbCrLf & vbCrLf, False, """"

    'Die Tabelle aktualisieren damit der Bericht kein weiteres Mal gesendet wird
    DoCmd.RunSQL ("UPDATE DeineTabelle SET sendekennzeichen = -1 WHERE kalenderwoche=" & kw)

End If

End Sub


UNGETESTET!

Ich denke, für das Versenden von Berichten gibts vielleicht noch andere Methoden, Google weiß da sicher mehr darüber.

HTH
Peter

Savarol

Hai Peter,

danke für deine schnelle Hilfe. Ich hab es jetzt mal über eine Funktion versucht und mit dem AutoExec-Makro. Es funktioniert zwar, aber bei jedem öffnen der Datenbank. Was mach ich falsch? Leider sind meine VBA-Kenntnisse eigentlich keine Kenntnisse.

Public Function Wochenbericht()

Dim kw As Byte
Dim i As Byte
Dim stDocName As String

kw = DatePart("ww", Date)
stDocName = "Bericht"

'Überprüfung ob für die aktuelle KW schon gesendet wurde
If kw <> i Then
    DoCmd.SendObject acReport, stDocName, "pdf", "Verteiler;", , , "Betreff"
End If

i = kw

End Function

Vielleicht kannst du mir weiterhelfen. Also momentan haben kw und i den Wert 21, dann sollte doch nichts passieren?

Danke
Savarol

database

Mai 21, 2010, 18:02:52 #3 Letzte Bearbeitung: Mai 21, 2010, 18:04:53 von database
Hallo, grüß dich,

Zitataber bei jedem öffnen der Datenbank. Was mach ich falsch?


Tja wie ich in meiner ersten Antwort angemerkt habe, musst du Access ja mitteilen, dass der Bericht schon einmal gesendet wurde!
ZitatM.E. ist es am Einfachsten eine lokale Tabelle zu führen in der die KW (kalenderwoche, Zahl, byte)  mit einem Kennzeichen (sendekennzeichen, ja/nein, Standard 0) eingetragen sind.

Das alleinige setzen einer Variablen genügt da nicht, das dieser Wert nach dem Schließen des Formulars - oder wenn es sich um eine globale Variable handelt, die in einem Modul deklariert wurde - nach dem Beenden der Applikation nicht mehr verfügbar ist.
Du mußt die Information über das Versenden des Berichts also DAUERHAFT speichern.

Also mach folgendes:
Im Backend - oder wenn du keine Aufteilung hast in der aktuellen Datei - erzeugst du eine Tabelle Namens Wochenberichte.
Ergzeuge 2 Felder für die Kalenderwoche (kalenderwoche, Zahl, byte)  und für das Sendekennzeichen (sendekennzeichen, ja/nein, Standardwert 0)
Nun trage ins Feld Kalenderwoche einfach die Zahlen der Wochen ein von 1 - 53, die Chekboxen (sendekennzeichen) sollen durch Stadardwert 0 weiß bleiben.

Dann verwendest du bitte den folgenden Code:


Public Function Wochenbericht()

   Dim kw As Byte
   Dim stDocName As String

   'Überprüfung ob für die aktuelle KW schon gesendet wurde, dazu wird in der Tabelle nachgesehen
   If DLookup("kalenderwoche", "Wochenberichte", "kalenderwoche=" & kw & " AND sendekennzeichen=0") Then
       kw = DatePart("ww", Date)
       stDocName = "Bericht"
       DoCmd.SendObject acReport, stDocName, "pdf", "Verteiler;", , , "Betreff"
       'Der Datenbank bekann geben, dass der Bericht gesendet wurde
       DoCmd.RunSQL ("UPDATE DeineTabelle SET sendekennzeichen = -1 WHERE kalenderwoche=" & kw)
   End If

End Function



Somit wird in der Bedingung (If) geprüft ob für die KW - in deinem Fall 21 - das sendekennzeichen auf Nein (Häkchen NICHT gesetzt) steht.
Ist diese Bedingung erfüllt, ergibt die Prüfung TRUE und der Bericht wird verschickt, nach dem Senden wird das Häkchen für die KW 21 in der Tabelle gesetzt um das Versenden des Berichts DAUERHAFT zu vermerken.
Beim nächsten Öffnen der Datei...
...ergibt die Prüfung, dass das Häkchen gestetz wurde, - die Bedingung ergibt als Prüfergebnis FALSE - es wird ans Ende (End If) gesprungen und es passiert nichts.
Alles angekommen? :)

HTH
Peter