2017-06-22 95 views
-1

我正在MS Access中使用vba创建与QODBC Quickbooks中的发票。 此过程需要首先插入多行发票项目并保存临时文件,直到插入主发票信息。我有几个需要作为批量插入的发票。我如何设置2插入查询基于openrecordset字段ID(使用QODBC&MS ACCESS的进销存)

实施例:

多(发票项目)=项目#,订单ID,项目说明等

** MULTILINE匹配基于订单ID

PRIMARY发票

初级(发票)=订单ID,姓名,地址,结算条件等

**主要是每单编号一行记录

“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 

末次

+0

不要使用DoCmd.SetWarnings False,因为您无法修复您忽略的错误(例如:miss在FROM和WHERE之前的空格,SELECT中的每个字符串必须用引号括起来)。使用'Debug.Print SQL'来检查你的SQL。使用错误处理程序来处理错误。使用'db.Execute SQL,dbFailOnError'而不是'DoCmd.RunSQL'获取更多错误信息。 – BitAccesser

回答

1

那是因为你正在更新一个字符串,VBA不能在这样的字符串中使用变量,这里是doiing它的正确方法:

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

如果值是一个字符串,您必须添加引号:

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

不应该是'rs.Fields(“OrderID”)。Value'? – BitAccesser

+0

对,我看到第一件事,我没有注意到:( –

+1

仍然是错误的属性(.getvalue)。修复这个为upvote。 – BitAccesser