Übergabe-Parameter Wert in der Access-Abfrage mit vba
Unsere Anforderung -
Wir haben einige Lieferanten und wir wollen, dass für die Generierung eines monatlichen Berichts der Käufe von einzelnen Lieferanten im Laufe des Monats und nach excel exportieren. Ich glaube, die Lösung ist das erstellen einer parameter-Abfrage, wo ich kann, übergeben Sie den Wert der Lieferanten-ID, Monat und Jahr. Die Liste der Lieferanten ändert sich ständig, und ist in einer separaten Tabelle gespeichert.
Also, im Grunde, ich sollte in der Lage sein, um sequenziell Lesen Sie die Lieferanten-ID aus einer Tabelle und als parameter übergeben, um meine Abfrage zu generieren, die den Bericht für die Lieferanten.
Die nächsten Lösungen, dass fand ich für meine Anforderung wurde auf (die ähnlich wie in der Natur) -
Export-Recordset in eine Tabelle
, Warum ich denke, es könnte eine bessere Lösung sein -
In der vorgeschlagenen Lösung sind wir die Erstellung mehrerer Abfragen und löschen diese. Konzeptionell, ich fühle es sollte eine Möglichkeit zum erstellen einer parameter-Abfrage, und verwenden Sie die do while-Schleife nacheinander übergeben Sie den Wert des Parameters (DeptName im obigen Beispiel), um die Abfrage und die Ergebnisse nach excel exportieren.
Ich sollte in der Lage sein, dies zu erreichen, wenn ich von vba zu übergeben, Wert auf eine parameter-Abfrage. Und das ist das, was ich noch nicht in der Lage, um herauszufinden.
Update am 24-Feb -
Folgenden ist der code, den ich geschrieben habe -
Private Sub Monthly_Supplier_Sales_Report_Click()
Dim strDirectoryPath As String
Dim DateFolderName As String
DateFolderName = Format$((DateSerial(year(Date), month(Date), 1) - 1), "YYYY MM")
strDirectoryPath = "C:\dropbox\Accounting\Sales Reports\" & DateFolderName
If Dir(strDirectoryPath, vbDirectory) = "" Then MkDir strDirectoryPath
Dim Filename As String
Dim strSQL1 As String
Dim strSQL2 As String
Dim DesignerCode As String
Dim month1 As String
Dim year1 As Integer
Dim Query1 As DAO.QueryDef
Dim query2 As DAO.QueryDef
Dim rsDesigner As DAO.Recordset
Set rsDesigner = CurrentDb.OpenRecordset("Designer Details Master")
Do While Not rsDesigner.EOF
DesignerCode = rsDesigner![Designer Code]
month1 = "Jan" 'right now hardcoded, will call this programatically
year1 = 2014 'right now hardcoded, will call this programatically
strSQL1 = "SELECT * FROM [Sales Report Generation Data] WHERE [designer code] = '" & DesignerCode & "' AND [Shipping Month]= '" & month1 & "' AND [Shipping Year]=" & year1
strSQL2 = "SELECT * FROM [Sales Report Generation - Monthwise Inventory Snapshot] WHERE [designer code] = '" & DesignerCode & "' AND [Snapshot Month]= '" & month1 & "' AND [Snapshot Year]= " & year1
Set Query1 = CurrentDb.CreateQueryDef(Name:="TempSalesQuery", SQLText:=strSQL1)
Set query2 = CurrentDb.CreateQueryDef(Name:="TempInventoryQuery", SQLText:=strSQL2)
Filename = strDirectoryPath & "\" & DesignerCode & Format$(Now(), " yyyy mm") & ".xls"
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "TempSalesQuery", Filename, False, "Sales Report"
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "TempInventoryQuery", Filename, False, "Inventory"
CurrentDb.QueryDefs.Delete "TempSalesQuery"
CurrentDb.QueryDefs.Delete "TempInventoryQuery"
rsDesigner.MoveNext
Loop
End Sub
Statt, die Logik, Die ich anwenden möchten, ist -
Do While Not
assign Value to Parameter 1 = rsDesigner![Designer Code]
assign Value to Parameter 2 = Month1
assign Value to Parameter 3 = Year1
Run the two Parameter queries, for which about three parameters are the input value and export to excel in respective sheets.
Loop
Nur, dass ich noch nicht in der Lage, herauszufinden, - wie Sie diese erreichen.
Ich war in der Lage, den code zu schreiben, wie pro die Lösung gegeben, in die beiden links und das gewünschte Ergebnis zu erhalten. Aber nur so, dass ich das Gefühl, es sollte eine bessere Lösung sein. Selbst in dem, was Sie sind, was darauf hindeutet, Frage ich mich, warum sollten wir haben, um das Formular zu erstellen, zu Holen das Wert, weil mein plan ist, verwenden Sie diese, um auszuführen, an jedem 4. / 5. des Monats zu Holen, die Berichte für den vorangegangenen Monat für alle Lieferanten. Also, am besten, wir sollten in der Lage sein zu definieren, die den Wert von Monats -, Jahres-und Lieferanten-mithilfe von vba-code.
Natürlich können Sie es automatisch ausgeführt, -- und ich dachte, möchten Sie vielleicht die Flexibilität der Ausführung der Berichte, Wann immer Sie wollte-und für einen ausgewählten Lieferanten, wenn man nur nötig, für eine. Die Abfrage, wie gezeigt, in der links, die Sie befestigt haben, brauchen nicht gelöscht zu werden -- und Sie können eine Abfrage verwenden, um 'TransferSpreadsheet' (zumindest in Office 2010 und höher). Sollten Sie Ihre Abfrage Parameter akzeptieren (oder Funktionen) für Datum und Lieferant, (es sei denn, Sie möchten, dass alle Lieferanten), dann muss nur die Parameter in VBA.
Die Bearbeitung der oben genannten Frage: der code, den ich verwendet haben, als je die zwei-Lösung gegeben.
InformationsquelleAutor Rohit Bansal | 2014-02-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine Lösung. Beachten Sie, dass ich erstellt " - Funktionen, die zwei Abfragen verwenden.
Erstellen Sie einfach zwei Abfragen und speichern Sie diese (siehe Beispiel-SQL unten), fügen Sie Ihren code abholen Termine und alles sollte gut sein.
Ich weiß nicht, wie Sie implementiert ist mein Vorschlag - haben Sie kopieren Sie den gesamten code? Wo ist dein msgbox - innerhalb der 'Sub Monthly_Supplier_Sales_Report_Click'? BEACHTEN Sie, dass bearbeitete ich meinen code 22 Stunden vergessen, weil ich die () in der SQL nach dem Funktionsnamen. Auch vorsichtig sein, da die Variablen-Namen sind ähnlich wie die Funktion Namen!! Hier ist, wie bei einem test MIT DEM OBEN genannten: (1) legen Sie die folgenden msgbox-gerade, nachdem Sie eingestellt fvShipMonth & fvShipYear: MsgBox "Mo:" & fvShipMonth & vbTab & "Jahr:" & fvShipYear & vbTab & "fMo:" & fShipMonth() & vbTab & "fYr:" & fShipYear()
1. Kopiert den public function in Modul 2. modifiziert die parameter Abfragen einstellen Wert der drei Parameter gleich fshipmonth() und so weiter, 3. kopiert, eingefügt, Ihren code, 4. aktualisiert werden die Namen der Abfragen in der transferspreadsheat Methode. Dieser erstellt die excel-Dateien, die aber alle leer waren. Also, erstellt eine message-box in - the-loop MsgBox (fDesignerCode() & ", " & fShipMonth() & ", " & fShipYear()) zurückgegeben , ,0
Ich lief einfach Ihre msgbox und bekam | Jan 2014| das heißt, Sie haben etwas falsch eingestellt. Bitte diesen MANUELL die Werte vor der msgbox mit den zwei Zeilen: fvShipMonth = "Jan" und fvShipYear = Jahr 2014 werden Dann sehen, was die msgbox erzeugt.
Noch Kein Glück! Ich denke, es ist etwas falsch mit der Art, wie die Funktion eingerichtet ist, bin ich nicht in der Lage, um herauszufinden. Aber egal, ich mag die Lösung, die Sie zur Verfügung gestellt, und ich lernte ein paar neue Dinge. Vielen Dank!
InformationsquelleAutor Wayne G. Dunn
Fügen Sie die Ergebnisse aus dem Direktfenster in Ihre Antwort.
InformationsquelleAutor Wayne G. Dunn