2016-07-29 5 views
0

Ich kann nicht scheinen zu verstehen, was ich hier falsch gemacht habe. Ich bekomme einen Fehler 3265 (Artikel nicht in dieser Sammlung gefunden) in den drei Zeilen beginnend mit "qdf.Parameters ..." Ich verstehe, dass ich hier die where-Klausel meiner SQL-Anweisung definiere, aber vielleicht liege ich falsch ? Ziemlich neu zu vba mit Zugang so ein wenig verwirrt.Zugang VBA - qdf Parameter Artikel nicht gefunden - Fehler 3265

Sub Save_Invoices_Meet_Criteria() 

Dim FileName As String 
Dim FilePath As String 
Dim myStmt As String 
Dim Db As DAO.Database 
Dim myrs As DAO.Recordset 

Set Db = CurrentDb() 

Dim qdf As DAO.QueryDef 
Set qdf = Db.QueryDefs("qryCreateInvoicesApproved") 

qdf.Parameters("[Forms]![frmAccountingDatabaseInput]![Invoice_approved]") = [Forms]![frmAccountingDatabaseInput]![Invoice_approved] 
qdf.Parameters("[Forms]![frmAccountingDatabaseInput]![invoice_date]") = [Forms]![frmAccountingDatabaseInput]![Combo272] 
qdf.Parameters("[Forms]![frmAccountingDatabaseInput]![Invoice_Type}") = [Forms]![frmAccountingDatabaseInput]![Combo274] 

Set myrs = CurrentDb.OpenRecordset("SELECT distinct [reference] from qryCreateInvoicesApproved", 2) 

Do Until myrs.EOF 

FileName = Me.reference 
foldername = Format(Now(), "YYYY-MM-DD") 
FilePath = "C:\Users\company\Desktop\Invoicing Database\Save_Test\" & foldername & "\" & FileName & ".pdf" 

DoCmd.OpenReport "RPTInvoice", acFormatPDF, FilePath 
'DoCmd.OutputTo acOutputReport, , acFormatPDF, FilePath 



DoCmd.Close 
myrs.MoveNext 

Loop 

myrs.Close 
Set myrs = Nothing 

End Sub 

My SQL-Anweisung:

SELECT tblAccountingDatabase.* 
FROM tblAccountingDatabase 
WHERE (((tblAccountingDatabase.Invoice_approved)=Yes) And ((tblAccountingDatabase.invoice_date)=Forms!frmAccountingDatabaseInput!Combo272) And ((tblAccountingDatabase.Invoice_Type)=Forms!frmAccountingDatabaseInput!Combo274)); 
+0

Sie müssen nur auf Parameter Abfragen lesen und Querydefs verwenden. Sie müssen Ihre Parameter in 'qryCreateInvoicesApproved' definieren und dann die tatsächlichen Parameternamen verwenden, die in der Abfrage definiert sind. Es sieht so aus, als ob Sie versuchen, eine Art von Hybrid-Parametern zu verwenden, die auf dem Re-Cord-Set Ihres Formulars basieren ??? – dbmitch

Antwort

0

Es Art sieht aus wie Sie versuchen, sie zu zwingen, eine Parameterabfrage zu verwenden, aber nicht wirklich zu ihm verpflichtet. Wenn Sie nicht wirklich einen verwenden möchten, können Sie Ihre SQL-Struktur ändern, um generische Parameternamen zu verwenden - und dann die qdf.Parameters-Methode verwenden, um die Werte aus Ihrem Formular zu füllen.

Aber ich denke, das ist das einfachste für das, was Sie jetzt haben.

Ersetzen Sie diese Zeilen:

Dim qdf As DAO.QueryDef 
Set qdf = Db.QueryDefs("qryCreateInvoicesApproved") 

qdf.Parameters("[Forms]![frmAccountingDatabaseInput]![Invoice_approved]") = [Forms]![frmAccountingDatabaseInput]![Invoice_approved] 
qdf.Parameters("[Forms]![frmAccountingDatabaseInput]![invoice_date]") = [Forms]![frmAccountingDatabaseInput]![Combo272] 
qdf.Parameters("[Forms]![frmAccountingDatabaseInput]![Invoice_Type}") = [Forms]![frmAccountingDatabaseInput]![Combo274] 

Set myrs = CurrentDb.OpenRecordset("SELECT distinct [reference] from qryCreateInvoicesApproved", 2) 

Mit dieser Linie Recordset zu öffnen

Set myrs = qdf.OpenRecordset("SELECT * from qryCreateInvoicesApproved", 2)

Ändern Sie Ihre Anfrage an:

SELECT DISTINCT [reference] 
FROM tblAccountingDatabase 
WHERE (tblAccountingDatabase.Invoice_approved=[Forms]![frmAccountingDatabaseInput]![Invoice_approved]) 
AND (tblAccountingDatabase.invoice_date=Forms!frmAccountingDatabaseInput!Combo272) 
AND (tblAccountingDatabase.Invoice_Type=Forms!frmAccountingDatabaseInput!Combo274); 
+0

Sie haben Recht damit, es in db - oder currentdb zu ändern. Möglicherweise müssen Sie es in eine Parameterabfrage ändern, wenn Sie aus dem Recordset-Code ausführen. Verwenden Sie den @ Parfaits-Code unter – dbmitch

+0

Die Zeile, die Sie mir eingefügt hatten, gibt mir einen "Objekt erforderlich" -Fehler. Ich denke es ist weil qdf nicht definiert ist? Ich habe das in "Db.openrecordset (...)" geändert, aber jetzt bekomme ich eine Fehlermeldung "Zu wenig Parameter. Erwartet 3." – AstToTheRegionalMgr

+0

Ich habe auch @parfait Code versucht - Diese Abfrage hat mich Eingabewerte, wenn ich versuche, den Code auszuführen, aber die Werte bereits im Formular vorhanden sind. Wenn ich den ersten Teil der WHERE-Klausel Ihrer Abfrage ändern, um "WHERE (tblAccountingDatabase.Invoice_approved = Yes" zu sagen), werden die erwarteten Parameter auf zwei reduziert.Also ich denke, der Fehler ist in der Where-Klausel - es mag einfach nicht die Art, wie ich referenziere die Combo272 und 274 – AstToTheRegionalMgr

1

Fügen Sie einfach eine PARAMETERS Zeile am Anfang Ihrer gespeicherten Abfrage hinzu, auf die Sie dann im VBA-Objekt querydef verweisen. Verwenden Sie dann die Querydef.OpenRecordset() Methode, um parametrisierte Abfrage in einem Re-Cord-Set-Objekt zu übergeben. Gerade jetzt Sie übergeben benannte Parameter, die nicht existieren:

SQL

PARAMETERS [Approveparam] YesNo, [Dateparam] Datetime, [Typeparam] String; 
SELECT DISTINCT [reference] 
FROM tblAccountingDatabase 
WHERE (((tblAccountingDatabase.Invoice_approved) = [Approveparam]) 
    AND ((tblAccountingDatabase.invoice_date) = [Dateparam]) 
    AND ((tblAccountingDatabase.Invoice_Type) = [Typeparam])); 

VBA

... 
Dim qdf As DAO.QueryDef 
Set qdf = Db.QueryDefs("qryCreateInvoicesApproved") 

qdf!Approveparam = [Forms]![frmAccountingDatabaseInput]![Invoice_approved] 
qdf!Dateparam = [Forms]![frmAccountingDatabaseInput]![Combo272] 
qdf!Typeparam = [Forms]![frmAccountingDatabaseInput]![Combo274] 

Set myrs = qdf.OpenRecordset() 
... 

Um Parameter zu einem Formular/Bericht/Makro übergeben, die denselben verwendet parametrisierte Abfrage verwenden DoCmd.SetParameter Methode. Und ja, Sie müssen jeden Wert mit Anführungszeichen versehen, damit das Zitat verschwindet. Verwenden Sie auch DoCmd.OutputTo, um Bericht in PDF zu konvertieren:

DoCmd.SetParameter "Approveparam", _ 
      """" & [Forms]![frmAccountingDatabaseInput]![Invoice_approved] & """" 
DoCmd.SetParameter "Dateparam", _ 
      """" & [Forms]![frmAccountingDatabaseInput]![Combo272] & """" 
DoCmd.SetParameter "Typeparam", _ 
      """" & [Forms]![frmAccountingDatabaseInput]![Combo274] & """" 

DoCmd.OpenReport "RPTInvoice", acViewPreview 
DoCmd.OutputTo acOutputReport, "RPTInvoice", acFormatPDF, FilePath 
+0

ich don ' Das verstehe ich ganz gut - Wenn ich versuche, es auszuführen, bekomme ich eine Dialogbox, in der ich gefragt werde, ob ich Parameter für ApproveParam, DateParam, TypeParam eingeben soll. Diese sollten bereits in frmDatabaseInput definiert werden. – AstToTheRegionalMgr

+0

Wie läuft die Abfrage? Aus SQL-Fenster oder VBA-Code? Ist das Formular geöffnet, wenn Sie * mit Nicht-Null-Werten ausführen? – Parfait

+0

Nun, ich dachte, die VBA hat die Abfrage ausgeführt, und die Abfrage hängt von Werten aus FRmAccountingDatabaseInput, Rechnung genehmigt, Combo272, Combo 274. Dann ist das Formular, wo ich die VBA ausführen - Ich wähle das Rechnungsdatum (DateParam), wählen Sie eine Rechnungsart (typeparam), und übrig sind einige übereinstimmende Datensätze (Tabelle wird angezeigt). Das Ziel ist, diese wenigen Datensätze auf meinem Desktop als PDF zu speichern. Hoffnung, die Sinn macht! – AstToTheRegionalMgr

Verwandte Themen