Access-o-Mania

Access-Forum (Deutsch/German) => Bericht => Thema gestartet von: Lalikowski am September 22, 2018, 13:43:12

Titel: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lalikowski am September 22, 2018, 13:43:12
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
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Beaker s.a. am September 22, 2018, 15:45:01
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.
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lalikowski am September 23, 2018, 10:55:20
Hallo Ekkehard,

im Anhang habe ich Dir einmal eine kleine DB erstellt.

Ich hoffe, dass diese verständlich ist.....

Liebe Grüße

Andreas
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Beaker s.a. am September 23, 2018, 15:46:32
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
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lalikowski am September 24, 2018, 10:12:49
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
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: MzKlMu am September 24, 2018, 10:16:38
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
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Beaker s.a. am September 24, 2018, 11:39:54
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
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lachtaube am September 24, 2018, 16:40:59
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
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lalikowski am September 24, 2018, 17:24:02
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
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lalikowski am September 26, 2018, 16:09:54
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
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lachtaube am September 26, 2018, 16:36:06
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.
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lalikowski am September 26, 2018, 19:13:55
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
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lachtaube am September 26, 2018, 21:10:20
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.
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lalikowski am September 27, 2018, 08:53:18
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
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lachtaube am September 27, 2018, 12:31:07
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.
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Beaker s.a. am September 27, 2018, 13:27:58
Zitatb) gehst Du im Recordset nicht zum nächsten Datensatz
Genau, da fehlt ein
.MoveNext
vor dem
Loop
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lalikowski am September 27, 2018, 14:45:07
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
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lalikowski am September 27, 2018, 14:52:16
...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....
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lachtaube am September 27, 2018, 14:56:38
Du musst den versteckt geöffneten Bericht in jeder Runde schließen, was in Deinem Code (in meinem nicht) fehlt.
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lalikowski am September 27, 2018, 15:44:44
...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....
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Beaker s.a. am September 27, 2018, 16:17:04
@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
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lachtaube am September 27, 2018, 16:18:44
Ä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
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Beaker s.a. am September 27, 2018, 16:22:25
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.
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lalikowski am September 28, 2018, 10:19:53
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
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lalikowski am November 21, 2018, 11:38:13
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
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Beaker s.a. am November 21, 2018, 13:49:35
@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
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lalikowski am November 21, 2018, 18:10:30
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
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Beaker s.a. am November 21, 2018, 18:26:54
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
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lalikowski am November 21, 2018, 18:59:44
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
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Beaker s.a. am November 22, 2018, 13:44:56
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.
Titel: Re: Bericht(e) senden, Empfänger kommen aus einer Tabelle
Beitrag von: Lalikowski am November 22, 2018, 16:16:02
Hallo Ekkehard,

vielen Dank für die Tipps.

Schaue ich mir gerne an......

Viele Grüße

Andreas