2017-10-30 1 views
0

Dies ist eine Folgefrage von MS Access OpenRedcordset reading wrong string. Ich bin mir sicher, dass ich genug Parameter habe, Felder Deklaration, um Werte an OpenRecordSet Methode zu übergeben, aber ich bin immer noch fest.MS Access OpenRecordset und zu wenig Parameter Problem

Allgemeine Erklärung:

  1. Benutzer Eingabestartdatum und Enddatum auf ein Formular, das mein Abfragefiltern 2_Total (Einzelwert) My query
  2. Führen Sie die VBA-Funktion, die die Abfrage in eine Excel-Datei exportiert

Problem: Zu wenige Parameter. Erwartete 4 Fehler auf Set rst = qry.OpenRecordset(dbOpenDynaset)

SQLDesign View

PARAMETERS [BeginDate] DateTime, [EndDate] DateTime; 
SELECT Sum(dbo_SO_SalesHistory.DollarsSold) AS SumOfDollarsSold 
FROM dbo_SO_SalesHistory 
WHERE (((dbo_SO_SalesHistory.InvoiceDate) Between [Forms]![RUN]![textBeginOrderDate] And [Forms]![RUN]![textendorderdate])); 

VBA

Option Compare Database 

Option Explicit 
Public Function Trans2() 

    Dim xlApp As Excel.Application 
    Dim xlWB As Excel.Workbook 
    Dim xlWS As Excel.Worksheet 
    Dim acRng As Variant 
    Dim xlRow As Integer 

    Dim db As DAO.Database 
    Dim qry As QueryDef 
    Dim rst As Recordset 
    Dim prm As DAO.Parameter 
    Dim strSQL As String 

    Set db = CurrentDb 
    Set xlApp = New Excel.Application 
    Set xlWB = xlApp.Workbooks.Open("C:\Users\J\Desktop\August 2017.xlsx") 
    Set xlWS = xlWB.Worksheets("Totals") 

    xlRow = (xlWS.Columns("K").End(xlDown).Row) 

    Set qry = db.QueryDefs("2_Total") 

    qry![BeginDate] = [Forms]![Run]![textBeginOrderDate] 
    qry![EndDate] = [Forms]![Run]![textendorderdate] 

    Set rst = qry.OpenRecordset(dbOpenDynaset) 

    Dim c As Integer 
    c = 11 'C is the one that stores column number, in which c=1 means column A, 11 is for column K, 12 for Column L 
    xlRow = xlRow + 11 

    Do Until rst.EOF 
     For Each acRng In rst.Fields 
      xlWS.Cells(xlRow, c).Formula = acRng 
      c = c + 1 
     Next acRng 
     xlRow = xlRow + 1 
     c = 1 
     rst.MoveNext 
     If xlRow > 25 Then GoTo rq_Exit 
    Loop 


rq_Exit: 
    rst.Close 
    Set rst = Nothing 
    Set xlWS = Nothing 
    xlWB.Close acSaveYes 
    Set xlWB = Nothing 
    xlApp.Quit 
    Set xlApp = Nothing 
    Exit Function 

End Function 

Die folgenden nicht lösen das Problem. Ich habe immer noch zu wenige Parameter. Erwarteter 4 Fehler.

qry.Parameters("BeginDate").Value = [Forms]![Run]![textBeginOrderDate] 
qry.Parameters("EndDate").Value = [Forms]![Run]![textendorderdate] 
+0

Mögliches Duplikat [? Ist es möglich, Parameter programmatisch in einer Microsoft Access-Update-Abfrage zu übergeben] (https : //stackoverflow.com/questions/16568461/is-it-possible-to-pass-parameters-programmatical-in-a-microsoft-access-update) –

Antwort

0

versuchen, die Syntax: qry.Parameters("BeginDate").Value = Forms![Run]![textBeginOrderDate]

Sie auch eine Linie mit debug.print Forms![Run]![textBeginOrderDate] hinzufügen können, um sicherzustellen, dass es den Wert, den Sie erwarten.

https://stackoverflow.com/a/24535025/78522

Eine weitere Möglichkeit besteht darin, die Abfrage zu verändern und zum Beispiel
[Forms]![Run]![textBeginOrderDate] als Kriterium

+0

Vielen Dank für Ihre Antwort. aber ich bekomme immer noch den gleichen fehler, zu wenig arameter. erwartet 4. –

0

Set Where-Klausel zu BeginDate und EndDate in SQL verwenden:

PARAMETERS [BeginDate] DateTime, [EndDate] DateTime; 
SELECT Sum(dbo_SO_SalesHistory.DollarsSold) AS SumOfDollarsSold 
FROM dbo_SO_SalesHistory 
WHERE dbo_SO_SalesHistory.InvoiceDate Between [BeginDate] And [EndDate]; 
+0

Bei der Beantwortung Ihrer letzten Frage, die Sie hier verlinkt haben, verwendete [meine Lösung] (https://stackoverflow.com/a/46983213/1422451) nach unten diese genaue SQL-Anweisung. Im obigen Beitrag deklarieren Sie die Parameter, haben diese jedoch nie verwendet. Daher der Fehler. Die Idee ist, die Formularsteuerwerte an Parameter ** außerhalb des SQL in VBA zu binden. – Parfait

0

versuchen, diese SQL in Ihrer Suchanfrage:

SELECT 
     Sum(dbo_so_salesHistory.DollarsSold) AS SumOforderamt, 
     Min(dbo_so_salesHistory.InvoiceDate) AS MinOforderdate, 
     Max(dbo_so_salesHistory.InvoiceDate) AS MaxOforderdate, 
     Count(dbo_so_salesHistory.InvoiceDate) AS CountOforderdate, 
     forms!run![textBeginOrderDate] AS tbegin, 
     forms!run![textendorderdate] AS tend 
    FROM dbo_so_salesHistory 
    WHERE 
     (((dbo_so_salesHistory.InvoiceDate) Between 
     [forms]![run]![textBeginOrderDate] And 
     [forms]![run]![textendorderdate])) 
    GROUP BY 
     forms!run![textBeginOrderDate], 
     forms!run![textendorderdate]; 

und diesen VBA-Code:

Private Sub cmdRun_Click() 
    Dim db As DAO.Database 
    Dim qry As QueryDef 
    Dim rst As Recordset 

    Set db = CurrentDb 

    Set qry = db.QueryDefs("2_Total") 
    qry.Parameters(0).Value = Forms!Run![textBeginOrderDate] 
    qry.Parameters(1).Value = Forms!Run![textendorderdate] 

    Set rst = qry.OpenRecordset(dbOpenDynaset) 

End Sub