Hallo zusammen,
ich muss tgl. mehrere Berichte an unterschiedliche Empfänger versenden.
Bei den Berichten handelt es sich eigentlich nur um einen Bericht, allerdings mit empfängerbezogenen Daten.
Die Basis für den Bericht bildet eine Abfrage, so dass auch diese wissen muss welche Abfrage zu welcher Mailadresse gehört.
Abfragekrieterium und Mailadressen werden in einer Tabelle gepflegt.
Mein Ziel ist es nun, das alle Berichte mit den jeweiligen Daten nacheinander an den richtigen Empfänger geht.
Könnt Ihr mir mit einem entsprechenden VBA-Code helfen?
Lieben Dank im Vorraus
Andreas
Hallo Andreas,
ZitatDie Basis für den Bericht bildet eine Abfrage, so dass auch diese wissen muss welche Abfrage zu welcher Mailadresse gehört.
Nicht ganz klar, eine und welche widersprechen sich.
Vorgehensweise, die mir einfällt
- Recordset mit den Empfängern öffnen
- in einer Schleife durch dieses RS den Bericht mit Kriterium öffnen und versenden.
gruss ekkehard
P.S. Vielleicht lädst du eine kleine Beispiel-DB mit ein paar Spieldaten hier hoch.
Hallo Ekkehard,
im Anhang habe ich Dir einmal eine kleine DB erstellt.
Ich hoffe, dass diese verständlich ist.....
Liebe Grüße
Andreas
Hallo Andreas,
Sorry, aber so wird das nichts; - keine Schlüssel, keine Beziehungen ...
Da habe keine Lust dazu.
Beschäftige dich erstmal ein wenig mit den Grundlagen der Datenbankerstellung.
Gute Links findest du z.B. beim Forumsmitglied MzKlMu.
gruss ekkehard
Hallo Ekkehard,
es handelte sich hierbei ja auch nur um ein Beispiel, um zu verdeutlichen, was ich eigentlich meinte.
Die "echte" DB ist zu groß, um sie Euch zur Verfügung zu stellen.
Schade... :'( :'(
Wünsche allen einen erfolgreichen Wochenstart
Andreas
Hallo,
Zitates handelte sich hierbei ja auch nur um ein Beispiel,
gerade in einem Beispiel sollte man Beziehungen und alle Schlüsselfelder anlegen. Dann hat der Helfende sehr schnell einen Überblick.
Hole das nach, lade die DB noch mal hoch und Du wirst hier geholfen. ;D
Hallo Andreas,
ZitatDie "echte" DB ist zu groß
Wenn die genauso aussieht wie das Beispiel, solltest du allerdings zunächst
mal ein Bild des Beziehungsfensters posten, und ein paar Erläuterungen zum
Zweck der DB geben. Denn ich befürchte, dass da noch so Einiges im Argen liegt.
gruss ekkehard
Eine mögliche Gestaltung wäre:'Dein VBA Formular-Modul mit dem Knopf
Option Compare Database
Option Explicit
#If 0 Then
SQL-Abfragetext von qry_QR:
-------------------------------------------------------------------------------
SELECT d.Datum,
p.Name,
d.Tour,
d.Stopps,
d.Collis,
d.Partner
FROM tbl_Partner AS p
INNER JOIN tbl_Daten AS d
ON p.Partner_ID = d.Partner
WHERE d.Datum = [Forms]![frm_senden]![Datum];
-------------------------------------------------------------------------------
SQL-Abfragetext von spPartnerIdMailByDate:
-------------------------------------------------------------------------------
SELECT p.Partner_ID,
p.Mail
FROM tbl_Partner AS p
INNER JOIN tbl_Daten AS d
ON p.Partner_ID = d.Partner
WHERE d.Datum=[@Datum];
-------------------------------------------------------------------------------
#End If
#Const AsMail = False 'auf True zum Mailversand sezten
Private Sub Befehl2_Click()
Const QRY As String = "spPartnerIdMailByDate"
Dim ReportFilter As String
'nur wenn ein gültiges Datum vorliegt
If IsDate(Me.Datum) Then
'der Parameterabfrage
With CurrentDb.QueryDefs(QRY)
'das Datum zuweisen
.Parameters("@Datum") = Me.Datum
'ein Recordset öffnen
With .OpenRecordset(dbOpenSnapshot, dbForwardOnly)
'bis zum Ende des Recordsets
Do Until .EOF
'Filterausdruck zum Öffnen des Berichts erstellen
ReportFilter = BuildCriteria("Partner", dbLong, !Partner_ID)
'Bericht versteckt in der Vorschau öffnen
DoCmd.OpenReport "rpt_QR", acViewPreview, , ReportFilter, acHidden
#If AsMail Then
'Email erstellen und senden
'der Bericht wird hier als RTF exportiert
'ab Access 2007 kann acFormatPDF verwendet werden
'Betreff(Subject) und Text der Email anpassen.
'AFAIKsind 255 Zeichen erlaubt- müsstest Du testen.
DoCmd.SendObject acReport, "rpt_QR", acFormatRTF, !Mail, , , _
"Touren am " & Me.Datum, _
"Hallo," & vbLf & vbLf & vbLf & _
"Du bist für folgende Touren eingeteilt:"
#Else
'oder
'
'Export in einen Ordner
DoCmd.OutputTo acOutputReport, "rpt_QR", acFormatRTF, _
"c:\temp\" & Format$(Me.Datum, "yyyymmdd_") & _
!Partner_ID & ".rtf"
'hier könnte man Outlook oder CDO für den Versand automatiersen
'oder ein Programm wie blat.exe den Versand durchführen lassen.
#End If
'Vorschau schließen
DoCmd.Close acReport, "rpt_QR", acSaveNo
'zumnächsten Datensatz (Partner für ein gewähltes Datum)
.MoveNext
Loop
'Recordset schließen
.Close
End With
End With
End If
End Sub
Hallo Lachtaube,
ganz, ganz lieben Dank für den code.
Sobald ich ihn testen konnte melde ich mich wieder.
Möchte dennoch die Beispiel-DB nochmals hochladen. Habe die Beziehung und Schlüssel nachgetragen.
Liebe Grüße
Andreas
Hallo Lachtaube,
Erst nochmals vielen Dank für den Code, doch leider komme ich damit nicht klar.
Bin auch blutiger Anfänger..... :-[ :-[
Sowie ich SELECT eingebe, kommt die Fehlermeldung, das case benötigt wird.....
Darf ich Dich vielleicht bitten, dir die tatsächliche DB noch einmal anzuschauen und mir eine mögliche Lösung schicken.
Ganz, ganz lieben Dank im Voraus
Andreas
Hi Andreas,
oben nach #If 0 Then stehen als Freitextkommentare jeweils Abfragetexte (kein VBA-Code), die in der SQL-Ansicht einer gespeicherten Abfrage so einzutragen sind. Erst hinter #End If wird der VBA-Code ausgewertet.
Hallo Lauchtaube,
kaum macht man es richtig, funktioniert es, doch leider noch nicht ganz perfekt.
Der Bericht im Mail passt nicht zu dem jeweiligen Partner.
Es kommt mir so vor, als wenn der erste Bericht an den ersten Partner in der Tabelle geht. Das ist aber nur eine Vermutung eines Laien...
Kannst Du dir das bitte nochmals anschauen.
Ganz lieben Dank im Voraus
Andreas
Nun Andreas, aus der Ferne kann ich nichts zu den falschen Email-Zuordnungen sagen - an der Logik scheint es nicht zu liegen.
PS: Datenbankanhänge hier möglichst nur als Archiv hochladen und die Datenmenge darin auf vernünftige Dimensionen reduzieren und Daten ggf. anonymisieren.
Guten Morgen Lachtaube,
habe es nun nochmals getestet.
Es scheint noch mehr nicht zu stimmen.
1. Es wird ein Gesamtreport, mit allen Partnern, generiert.
2. Dieser Report geht per Mail immer nur an Partner_1
Liebe Grüße
Andreas
a) schließt Du den Bericht nicht nach jedem Senden.
b) gehst Du im Recordset nicht zum nächsten Datensatz
Das ergibt dann eine Endlosschleife mit immer denselben Daten.
Zitatb) gehst Du im Recordset nicht zum nächsten Datensatz
Genau, da fehlt ein
.MoveNext
vor dem
Loop
Hallo Lachtaube,
sorry, dass ich ständig nerve.
Offensichtlich tue "ich" die Sachen nicht.... :-\.
Ich als Laie konnte nur abschreiben.....
Kannst Du mir das bitte fertig machen?
Liebe Grüße
Andreas
...ups, der Rest Deiner Antwort ist auf die zweite Seite gerutscht..
Mit dem .MoveNext gibt es aber leider keine Änderung. Immer noch der gesamte Report an den selben Mailempfänger....
Du musst den versteckt geöffneten Bericht in jeder Runde schließen, was in Deinem Code (in meinem nicht) fehlt.
...sorry, hatte ich übersehen. Habe ich geändert, doch leider hat sich am Ergebnis nichts geändert.... :(
..noch immer wird ein kompletter Bericht (über alle Partner) generiert und immer nur an Partner_1 verschickt....
@Lalikowski
Zitat..noch immer wird ein kompletter Bericht (über alle Partner) generiert und immer nur an Partner_1 verschickt....
Nein, das stimmt nicht.
Ich habe gerade Lachtaubes DB runtergeladen, und mal im Einzelschritt-Modus
geprüft. Da wird der Bericht (gefiltert!) so oft an den gleichen Empfänger verschickt,
wie es DS mit diesem Empfänger in der Abfrage "spPartnerIdMailByDate" gibt.
I.Ü. denke ich, dass das Datenmodell nicht stimmt. Schon der Name "tbl_
Ergebnis"
lässt mich eher an eine gruppierte Abfrage denken. Und wenn schon berechenbare
Werte (Anzxxx) gespeichert werden, würde ich diese Tabelle eher als eine n:m
zwischen Partnern und Touren anlegen. Dann bräuchte es auch keinen Mehrfelder-PK
(den verstehe ich hier eh nicht) sondern höchstens einen eindeutigen FK über diese
Felder. Wobei dann auch gleich der PK/FK der Partner auf LongInteger umgestellt
werden sollte; - Text ist da doch eher nicht so geläufig.
gruss ekkehard
Ändere die Abfrage wie folgt:
SELECT DISTINCT p.TD_Leister, p.Mail
FROM tbl_Partner AS p
INNER JOIN tbl_Ergebnis AS d
ON p.TD_Leister = d.Partner
WHERE (((d.Datum)=[@Datum]));
und verwende wie in meiner ersten Antwort den Aufruf von DoCmd.OpenReport "rpt_QR", acViewPreview, , ReportFilter, acHidden
Sorry, das ist natürlich nicht richtig
ZitatUnd wenn schon berechenbare Werte (Anzxxx) gespeichert werden,
Die werden ja pro Tour erfasst. Da würde ich dann doch eher nur den Tabellennamen ändern; - tbl_Touren.
Hallo an Alle,
möchte mich bei Allen aufrichtig für die Hilfe und Anregungen bedanken.
Ganz besonders bedanke ich mich bei Lachtaube, die sich durch mein Generve nicht klein kriegen lassen hat..... :)
Es funktioniert, wie ich es mir vorgestellt habe...
Danke, Danke, Danke und ein entspanntes Wochenende
Andreas
Hallo Lachtaube,
habe ein kleines weiteres Problem.
würde gerne mit Deinem code auch Abfrage als Excel versenden, doch kann ich ihn nicht selber anpassen..... :'( :'(
Private Sub senden_Click()
Const QRY As String = "qry_Abw_Mail"
Dim ReportFilter As String
'nur wenn ein gültiges Datum vorliegt
If IsDate(Me.Leistungsdatum) Then
With CurrentDb.QueryDefs(QRY)
.Parameters("@Datum") = Me.Leistungsdatum
With .OpenRecordset(dbOpenSnapshot, dbForwardOnly)
Do Until .EOF
ReportFilter = BuildCriteria("Partner", dbText, !TD_Leister)
'hier muss sicherlich die Abfrage geöffnet werden, doch der Reportfilter hat hier wohl nichts zu suchen
'DoCmd.OpenReport "rpt_QR", acViewPreview, , ReportFilter, acHidden
'Mail versenden
'hier sollte nun die Abfrage "qry_Abweichung_XLS" nur an die ausgewählten Partner versendet werden
'DoCmd.SendObject acSendReport, "rpt_QR", acFormatPDF, !Mail, , , !TD_Leister & "_Qualitätsreport vom " & Format$(Me.Leistungsdatum, "ddmmyyyy"), _
'"Guten Morgen," & vbLf & vbLf & _
'True
'DoCmd.Close acReport, "rpt_QR", acSaveNo
DoCmd.Close acQuery, qry_Abweichung_XLS, acSaveNo
.MoveNext
Loop
.Close
End With
End With
End If
End Sub
Kannst Du dir das bitte einmal anschauen?
Wäre ganz lieb....
Lieben Dank im Voraus
Andreas
@Lalikowski
Das hatten wir doch schon mal
DoCmd.SendObject _
ObjectType:=acSendQuery, _
ObjectName:="qry_Abweichung_XLS", _
OutputFormat:=acFormatXLS, _
To:=.Fields(1).Value, _
Subject:="Dein Betreff", _
MessageText:="Dein Anschreiben", _
EditMessage:=False
Hallo Ekkehard,
das stimmt, allerdings musste ich der Tabelle Partner die Spalte Reporte (JA/NEIN) hinzufügen.
Diese Spalte soll bewirken, dass Mails nur an ausgewählte Partner verschrickt werden.
Bei dem Code von Lachtaube ist mir diese Anpassung selber gelungen, nicht aber dass ich Abfragen verschicken kann.
Bei Deinem Code habe ich diese Anpassung leider nicht hinbekommen....
Nun war meine Überlegung, das die Änderung des Anhangs leichter zu bewerkstelligen ist, als die Anpassung der Prozedur an sich.
Natürlich kann ich falsch liegen....😏😏
Könntest denn auch Du Deinen Code entsprechend anpassen?
Eine Beispiel-DB hängt wieder an....
Liebe Grüße
Andreas
Hallo,
Keine Ahnung, meinst du sowas
SELECT DISTINCT p.TD_Leister, p.Mail
FROM tbl_Partner AS p
INNER JOIN tbl_Ergebnis AS d
ON p.TD_Leister = d.Partner
WHERE d.Datum=[@Datum] AND Reporte = True
gruss ekkehard
Hallo Ekkehard,
leider nicht.
Schau Dir mal die Beispiel-DB an, d.h. die Tabelle tbl_Partner.
Ich denke dann weißt Du sicher was ich meine.
Ich hänge sie einfach nochmal dran.
Viele Grüße
Andreas
Hallo Andreas,
So wirklich verstehe ich es immer noch nicht.
Was mir jetzt bei näherem Hinsehen aber aufgefallen ist
ZitatWith .OpenRecordset(dbOpenSnapshot, dbForwardOnly)
Der erste Parameter "dbOpenSnapshot" lässt keine Schleife durch das
RS zu
With .OpenRecordset(dbOpenForwardOnly)
Der zweite Parameter wird dadurch unnötig. Ändere das mal und teste im
Einzelschrittmodus. Die "qry_Abw_Mail" enthält ja nur die ausgewählten
(.Report = True).
Den Rest kann ich nicht nachvollziehen, da der Report nicht in deiner DB
enthalten ist.
Im Moment sieht auch so aus als wolltest du Report
und Abfrage
("qry_Abweichung_XLS") versenden, also zwei Anlagen. Das geht dann
allerdings nur über eine Outlook-Automatisierung, -- glaube ich.
gruss ekkehard
P.S. Noch ein Tipp so nebenbei, der dir hilft deinen Code später besser
lesen zu können. Formatiere deinen Code ordentlich (logische Einrückungen).
Bei Methoden, die mehr als drei Parameter anfordern können, habe ich
mir angewöhnt mit
benannten Parametern zu arbeiten. Ist zwar deutlich
mehr Schreibarbeit, aber auch deutlich besser zu verstehen, - es ist sofort
ersichtlich welche Parameter übergeben werden ohne die ganzen Kommas
zählen zu müssen oder zu vergessen.
Hallo Ekkehard,
vielen Dank für die Tipps.
Schaue ich mir gerne an......
Viele Grüße
Andreas