Ms access 如何基于openrecordset字段ID设置2个insert查询(使用QODBC&MS ACCESS开票)

Ms access 如何基于openrecordset字段ID设置2个insert查询(使用QODBC&MS ACCESS开票),ms-access,qodbc,Ms Access,Qodbc,我在MS Access中使用vba在Quickbooks中使用QODBC创建发票。 此过程要求首先插入多行发票项目,并保存临时数据,直到插入主发票信息。我有几张发票需要批量插入 例如: 多行发票项目=项目、订单ID、项目描述等 **多行根据OrderID匹配主发票 主发票=订单ID、名称、地址、账单条款等 **Primary是每个orderID的单行记录 QB_AppendInvoice_LoopRef包含需要处理的唯一orderid。我试图将其用作基于当前记录集orderid导入多行项目的记录

我在MS Access中使用vba在Quickbooks中使用QODBC创建发票。 此过程要求首先插入多行发票项目,并保存临时数据,直到插入主发票信息。我有几张发票需要批量插入

例如:

多行发票项目=项目、订单ID、项目描述等

**多行根据OrderID匹配主发票

主发票=订单ID、名称、地址、账单条款等

**Primary是每个orderID的单行记录

QB_AppendInvoice_LoopRef包含需要处理的唯一orderid。我试图将其用作基于当前记录集orderid导入多行项目的记录集,但是,我无法引用当前记录集orderid

Dim db          As DAO.Database
Dim rs          As DAO.Recordset
Dim iCount      As Integer
Set db = CurrentDb()
Set rs = db.OpenRecordset("QB_AppendInvoice_LoopRef") 'open the recordset for use (table, Query, SQL Statement)
   With rs

    If .RecordCount <> 0 Then 'Ensure that there are actually records to work with
        'The next 2 line will determine the number of returned records
        rs.MoveLast 'This is required otherwise you may not get the right count
        iCount = rs.RecordCount 'Determine the number of returned records
        Do While Not .BOF
            DoCmd.SetWarnings False
            'Append Invoice Line (determine tests ordered)
            Dim SQL1 As String
            SQL1 = "INSERT INTO InvoiceLine (CustomerRefListID, CustomerRefFullName, ARAccountRefListID, ARAccountRefFullName, InvoiceLineSerialNumber, InvoiceLineLotNumber, TemplateRefListID, IsPending, DueDate, TxnDate, InvoiceLineType, InvoiceLineItemRefListID, InvoiceLineItemRefFullName, InvoiceLineDesc, InvoiceLineRate, InvoiceLineAmount, FQSaveToCache, RefNumber)" & _
            "SELECT Customer.ListID, Customer.FullName, '4C0000-1070045186', 'Accounts Receivable', Null, Null, '80000023-1495649075', '0', QB_ORDER_DETAILS.OrderDate, QB_ORDER_DETAILS.OrderDate, 'Item', QB_TestList_TestCodes.ListID, QB_TestList_TestCodes.FullName, QB_TestList_TestCodes.Description, QB_TestList_TestCodes.SalesOrPurchasePrice, QB_TestList_TestCodes.SalesOrPurchasePrice, '1', QB_ORDER_DETAILS.OrderID " & _
            "FROM ((Customer INNER JOIN contacts ON Customer.AccountNumber = contacts.Company) INNER JOIN QB_ORDER_DETAILS ON contacts.[Full Member Info] = QB_ORDER_DETAILS.Physician) LEFT JOIN QB_TestList_TestCodes ON QB_ORDER_DETAILS.ProductID = QB_TestList_TestCodes.TestCode " & _
            "WHERE QB_ORDER_DETAILS.OrderID = rs.Fields.getvalue('OrderID')"
            DoCmd.RunSQL SQL1, False

            'Append Invoice to Invoice Line (put the tests ordered on an invoice)
            Dim SQL2 As String
            SQL2 = "INSERT INTO Invoice (CustomerRefListID, CustomerRefFullName, ARAccountRefListID, ARAccountRefFullName, TemplateRefListID, [Memo], IsPending, IsToBePrinted, CustomFieldOther, ItemSalesTaxRefListID, TxnDate, DueDate, RefNumber)" & _
            "SELECT Customer.ListID, Customer.FullName, '4C0000-1070045186', 'Accounts Receivable', '80000023-1495649075', [Patient_Last] & ', ' & [Patient_First] & ' - ' & [Full_Specimen_ID], '0', '0', [Patient_Last] & ', ' & [Patient_First] & ' - ' & [Full_Specimen_ID], Null, [OrderDate], [OrderDate], Orders.OrderID" & _
            "FROM Customer INNER JOIN (Orders INNER JOIN contacts ON Orders.Physician = contacts.[Full Member Info]) ON Customer.AccountNumber = contacts.Company" & _
            "WHERE Orders.OrderID = rs.Fields.getvalue('OrderID')"
            DoCmd.RunSQL SQL2, False
        .MovePrevious
        Loop
    Else
        MsgBox "There are no records in the recordset."
    End If
        MsgBox "SENT TO QB - SUCCESS!!!"

    End With
        rs.Close 'Close the recordset
        Set rs = Nothing 'Clean up
        DoCmd.SetWarnings True

End Sub

这是因为您正在更新字符串,VBA不能在字符串中使用这样的变量,以下是正确的方法:

"WHERE Orders.OrderID = " & rs.Fields("OrderID").Value
如果值是字符串,则必须添加引号:

"WHERE Orders.OrderID = '" & rs.Fields("OrderID").Value & "'"

它不应该是rs.FieldsOrderID.Value吗?对,我看到了第一件事,但我没有注意到:仍然是错误的属性。getvalue。为upvote解决这个问题。哇,真的,我现在应该关闭我的电脑,谢谢你提供的信息;不要使用DoCmd.SetWarnings False,因为您无法修复忽略的错误,例如:FROM和WHERE前面缺少空格,SELECT中的每个字符串都必须用引号括起来。使用Debug.printsql检查SQL。使用错误处理程序来处理错误。有关更多错误信息,请使用db.Execute SQL、dbFailOnError而不是DoCmd.RunSQL。