August 17, 2022, 15:39:43

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


Recordset lässt sich nicht mit gefilterten Daten öffnen

Begonnen von brueninghoff, Mai 06, 2022, 10:44:17

⏪ vorheriges - nächstes ⏩

brueninghoff

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

DF6GL

Hallo,


welchen Inhalt haben die Tempvars-Elemente?

Im Direktfenster eingeben:

?TempVars!FilterFrom

?TempVars!FilterTo




brueninghoff

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.


brueninghoff

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"

DF6GL

Mai 06, 2022, 13:49:18 #5 Letzte Bearbeitung: Mai 06, 2022, 14:46:07 von DF6GL
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")