Hallo Access-o-maniker,
ich habe erneut Probleme ein Recordset für einen automatischen Berichtsversand zu öffnen und bekomme diese Fehlermeldung:
Fehler 3061:2 Parameter wurden erwartet, aber es wurden zu wenig Parameter übergeben.
Private Sub CMD_AlterTiere_Mail_Click()
On Error GoTo Err_EMailVersandAbgebrochen 'Routine zum Abfangen von Fehlern und Abbruch des Benutzers
'Variablen definieren
Dim QRY_AT As String
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim rs_AT As DAO.Recordset
Dim REPname As String
Dim Repfilter As String
Dim ATTname As String
Dim SUBJ As String
Dim BDY As String
REPname = "REP_AT_CheckAlter" 'Report für die Auswertung
QRY_AT = "QRY_ES_Checkalter_Lieferanten" 'Abfrage mit den Lieferanten an die jeweils eine Mail versand werden soll
Set db = CurrentDb()
Set rs_AT = db.OpenRecordset(QRY_AT) 'Recordset öffnen
If rs_AT.EOF Then 'Wenn keine Einträge vorhanden sind
MsgBox "Keine Addressaten gefunden!"
Exit Sub
End If
'#LÖSCHMICH
rs_AT.Close 'Recordset schließen
Set rs_AT = Nothing
Set db = Nothing
'#LÖSCHMICH
BDY = "Sehr geehrte Damen und Herren," & vbCrLf & vbCrLf & "anbei eine Übersicht der Tiere deren Alter bei Anlieferung über 40 Tage lag." & vbCrLf & "" 'Mailbody erzeugen
Do Until rs_AT.EOF 'Für jeden Datensatz im Recordset
Repfilter = "Tier_zu_alt = 1 & Lieferant-Nr = " & rs_AT!Lieferant - Nr 'Filterparameter für den Report erneut setzen"
DoCmd.OpenReport REPname, acViewPreview, "", Repfilter, acWindowNormal 'Öffne den Report
ZielEmail = rs_AT!EMail 'Adresse beziehen
'ZielEmail = "Operator@brueninghoff.net"
SUBJ = "Fehlende Pässe " & CStr(rs_AT!Lieferant) 'Titel generieren
ATTname = "Übersicht fehlende Pässe " & rs_AT!Lieferant 'Name des Attachments
Reports(REPname).Caption = ATTname 'Titel des Reports neu setzen
Select Case MsgBox("Die Mail an " & ZielEmail & " verschicken?", vbYesNoCancel + vbInformation, "Mailversand")
Case vbCancel: 'Abbrechen
rs_AT.Close 'Recordset schließen
Set rs_AT = Nothing
Set db = Nothing
Exit Sub
Case vbYes:
DoCmd.SendObject acReport, REPname, "PDF", ZielEmail, , , SUBJ, BDY, False, "" 'Mail automatisch versenden (Outlook Warnung bestätigen)
DoCmd.Close acReport, REPname 'aktiven Report wieder schließen
rs_AT.MoveNext 'Nächster Datensatz im Recordset
Case vbNo:
DoCmd.Close acReport, REPname 'aktiven Report wieder schließen
rs_AT.MoveNext 'Nächster Datensatz im Recordset
End Select
Loop
rs_AT.Close 'Recordset schließen
Set rs_AT = Nothing
Set db = Nothing
LBL_AlterTiere_lastsend.Caption = Date & " | " & Time() & " | " & Environ("USERNAME")
CurrentProject.AllForms("FRM_Kleinkälber_EK").Properties("AlterTierelastsend").Value = LBL_AlterTiere_lastsend.Caption
Exit Sub 'Bei sauberem Verlauf (Email wurde gesendet, kein Abbruch) oder wenn der notwendige Parameter fehlt, verlasse die Subroutine vorzeitig
Exit_CMD_FehlendePässe_Mail:
Exit Sub
Err_EMailVersandAbgebrochen: 'Bei Abbruch durch den Benutzer Fehler 2501 Meldung ausgeben oder Fehler-Nummer
If Err.Number = 2501 Then
MsgBox "Die E-Mail wurde nicht gesendet.", vbCritical + vbOKOnly
Else
MsgBox "Fehler " & Err.Number & ":" & Err.Description
End If
rs_AT.Close 'Recordset schließen
Set rs_AT = Nothing
Set db = Nothing
End Sub
Ich habe eine Tabelle "QRY_ES_CheckAlter" in der die einzelnen Tiere mit den Daten für den Bericht gelistet werden. Hier die SQL-Abfrage:
SELECT dbo_Einstallung_ES01_TAB.ES01_LIEFERDATUM AS Lieferdatum, dbo_VK60_TAB.VK60_NR AS Belegnummer, dbo_VW_Kälberlieferanten.AL20_SUCHNAME AS Lieferant, dbo_VW_KTR_WW.AL14_BEZ AS Stall, dbo_Einstallung_ES02_TAB.ES02_OHRMARKE AS Ohrmarke, dbo_VW_Einstallung_Preisgruppen.PG_BEZEICHNUNG, dbo_SY50_TAB.SY50_CODE AS Rasse, IIf([SA81_GESCHLECHT]=0,"M","W") AS Geschlecht, dbo_SA81_TAB.SA81_DATUM_GEB AS Geburtsdatum, QRY_ES_CheckAlter_Passthrough.Alter_in_Tagen AS [Alter bei Einstallung], QRY_ES_CheckAlter_Passthrough.zu_alt AS Tier_zu_alt, QRY_ES_CheckAlter_Passthrough.zu_jung AS Tier_zu_jung, dbo_VW_Kälberlieferanten.AL21_EMAIL AS [Lieferant_E-Mail], dbo_VK60_TAB.VK60_NR AS [Lieferant-Nr], dbo_VW_Kälberlieferanten.AL20_STRASSE AS [Lieferant-Straße], dbo_VW_Kälberlieferanten.AL20_PLZ AS [Lieferant-PLZ], dbo_VW_Kälberlieferanten.AL20_ORT AS [Lieferant-Ort], dbo_JB_VW_Mandanten.JB_VW_Mandant_ABSENDER
FROM dbo_JB_VW_Mandanten, ((dbo_VW_Einstallung_Preisgruppen INNER JOIN ((((dbo_Einstallung_ES01_TAB INNER JOIN (QRY_ES_CheckAlter_Passthrough INNER JOIN dbo_Einstallung_ES02_TAB ON QRY_ES_CheckAlter_Passthrough.ES02_GEN = dbo_Einstallung_ES02_TAB.ES02_GEN) ON dbo_Einstallung_ES01_TAB.ES01_GEN = dbo_Einstallung_ES02_TAB.ES02_ES01_GEN) INNER JOIN dbo_VW_Kälberlieferanten ON dbo_Einstallung_ES01_TAB.ES01_LIEFERANT_NR = dbo_VW_Kälberlieferanten.VK30_NR) INNER JOIN dbo_VW_KTR_WW ON dbo_Einstallung_ES01_TAB.ES01_KOSTENTRAEGER_NR = dbo_VW_KTR_WW.AL14_NR) INNER JOIN dbo_VK60_TAB ON dbo_Einstallung_ES01_TAB.ES01_VK60_GEN = dbo_VK60_TAB.VK60_GEN) ON dbo_VW_Einstallung_Preisgruppen.PG_GEN = dbo_Einstallung_ES02_TAB.ES02_PREISGRUPPE) INNER JOIN dbo_SA81_TAB ON dbo_Einstallung_ES02_TAB.ES02_OHRMARKE = dbo_SA81_TAB.SA81_LOM) INNER JOIN dbo_SY50_TAB ON dbo_SA81_TAB.SA81_RASSE_SY50_GEN = dbo_SY50_TAB.SY50_GEN
WHERE (((dbo_Einstallung_ES01_TAB.ES01_LIEFERDATUM)>=[TempVars]![FilterFrom] And (dbo_Einstallung_ES01_TAB.ES01_LIEFERDATUM)<=[TempVars]![FilterTo]) AND ((dbo_JB_VW_Mandanten.JB_VW_Mandant_GEN)=1))
ORDER BY dbo_Einstallung_ES01_TAB.ES01_LIEFERDATUM, dbo_VK60_TAB.VK60_NR, dbo_Einstallung_ES02_TAB.ES02_OHRMARKE;
Darauf basiert dann die Abfrage "QRY_ES_CheckAlter_Lieferanten". Diese gruppiert die Daten und stellt nur noch die Daten für den Mailversand bereit.
SELECT QRY_ES_CheckAlter.Lieferant, QRY_ES_CheckAlter.[Lieferant_E-Mail], QRY_ES_CheckAlter.[Lieferant-Nr]
FROM QRY_ES_CheckAlter
GROUP BY QRY_ES_CheckAlter.Lieferant, QRY_ES_CheckAlter.[Lieferant_E-Mail], QRY_ES_CheckAlter.[Lieferant-Nr], QRY_ES_CheckAlter.Tier_zu_alt
HAVING (((QRY_ES_CheckAlter.Tier_zu_alt)=1));
da ich in der Vergangenheit schonmal Probleme mit gefilterten Datensätzen für ein Recordset hatte, wo es dann an einem Bezug auf ein Formularelement lag, habe ich diese Art von Verweisen generell auf TempVars umgestellt. Jetzt habe ich das gleiche Problem wieder aber mit eben diesen TempVars....
Wenn ich die Datumsfilterung aus "QRY_ES_CheckAlter" rausnehme, funktioniert auch das öffnen des Recordsets, die Filterung wird aber benötigt.
Ich hoffe jemand kann was mit dem ganzen anfangen und hat ne Idee wie sich das beheben lässt
Hallo,
welchen Inhalt haben die Tempvars-Elemente?
Im Direktfenster eingeben:
?TempVars!FilterFrom
?TempVars!FilterTo
Die TempVars haben jeweils ein Datum gespeichert:
FilterFrom -> 02.05.2022
FilterTo -> 06.05.2022
Der Filter funktioniert an sich auch korrekt, wenn ich die Tabelle und den Bericht manuell öffne, er verhindert nur das ich das ganze als Basis für ein Recordset nutze.
Hallo,
SQL benötigt USA- oder ISO-Datumsformat
---> TempVars.Add "FilterFrom", "05/02/2022"
Danke für die Rückmeldung.
Wie formatiere ich das Datum denn für den Aufruf um?
TempVars("FilterFrom") = Format(TempVars("FilterFrom"), "mm/dd/yyyy")daraus wird letztlich "05.02.2022"
Hallo,
schreib es doch gleich "richtig" in die Tempvars-Variable...
Zitatdaraus wird letztlich "05.02.2022"
Wie und wo siehst du das?
Wahrscheinlich schlägt die interne Typkonvertierung zu.
bzw. nutze das ISO-Format:
TempVars("FilterFrom") = Format(TempVars("FilterFrom"), "yyyy-mm-dd")