【问题标题】:How to add an invoice line item to an existing Quickbooks invoice using QBFC and VBA如何使用 QBFC 和 VBA 将发票行项目添加到现有 Quickbooks 发票
【发布时间】:2014-12-27 22:17:37
【问题描述】:

是否有人有任何使用 QuickBooks QBFC 将发票行项目添加到现有 QuickBooks 发票的示例 vba 代码?我可以毫无问题地查询我希望编辑的发票,并且我还能够在一个请求/响应交易中创建一张新发票及其行项目。但是,我似乎无法获得正确的代码来简单地将发票行项目添加到我现有的发票之一。这是我的一些代码。您将看到 QBFC_GetInvoice 函数...这是我正在检索我希望添加行项目的发票的地方;

Dim SessionManager As New QBSessionManager
SessionManager.OpenConnection "xyz", "Test" 
SessionManager.BeginSession "", omDontCare     

Dim objMsgSetRequest As IMsgSetRequest
Set objMsgSetRequest = GetLatestMsgSetRequest(SessionManager)

QBFC_GetInvoice (TxnID)

Dim myinvoice As IInvoiceRet
Set myinvoice = objSavedInvoiceRet
Dim sEditSeq As String
sEditSeq = myinvoice.EditSequence.GetValue
Dim objInvoicemod As IInvoiceMod
objInvoicemod.ORInvoiceLineModList.Append.invoiceLineMod.ItemRef.ListID.SetValue TxnID     
Dim invoiceLineAdd As IInvoiceLineAdd
Set invoiceLineAdd = myinvoice.orInvoiceLineRetList.Append.InvoiceLineRet  

invoiceLineAdd.TxnLineID.SetValue "-1"
invoiceLineAdd.ItemRef.ListID.SetValue sLineItemid
invoiceLineAdd.Quantity.SetValue iQty

Dim objInvoiceMsgSetResponse As IMsgSetResponse

【问题讨论】:

    标签: ms-access vba quickbooks qbfc


    【解决方案1】:

    (这是我的第一篇文章 - 请原谅/纠正我的任何协议错误)

    我看到的一些问题(除了已经指出的问题)是:

    • 您不能(或者至少我不能)将 xLineAdd 对象(例如 IInvoiceLineAdd、IEstimateLineAdd)设置为 xLineRet 对象(例如 IInvoiceLineRet、 IEstimateLineRet) - 当您查看底层 xml 时,您将无法做到这一点是有道理的。

    • xLineAdd 对象(例如 IInvoiceLineAdd、IEstimateLineAdd)没有 TxnLineID 属性。 xLineMod(例如 IInvoiceLineMod、IEstimateLineMod)确实支持 TxnLineID 属性。

    向现有交易(例如发票、估计)添加(或修改)行时需要注意的另一个问题是,您需要通过 TxnLineID 指定在行添加/修改过程之后要保留的所有现有行.否则,在修改过程中,所有未以这种方式明确指定的行都将从事务中删除。

    来自 QBSDK 程序员指南:

    "在 Mod 请求中,您可以通过提供 TxnLineID 添加新行 值为-1。请记住:如果您修改任何行项目,您需要 指定所有其他行项目,否则它们将作为 Mod的结果。但是,您无需完全指定行项目 及其所有 ItemRef、Quantity 和其他元素。你只需要 按如下方式指定其 TxnLineID: <PurchaseOrderLineMod> <TxnLineID>101</TxnLineID> </PurchaseOrderLineMod>

    这将使订单项完全保留在 Mod 之前的状态。"

    这是我在现有估算中添加一行的一些代码(应该与添加发票的基本概念相同)。

    Sub AddLine()
      Dim SessMgr As New QBSessionManager
      Dim MsgReqObj As IMsgSetRequest
      Set MsgReqObj = SessMgr.CreateMsgSetRequest("US", 13, 0)
    
      Dim EstimateModObj As IEstimateMod
      Dim ExistingEstimateObj As IEstimateRet
    
      Set EstimateModObj = MsgReqObj.AppendEstimateModRq
      Set ExistingEstimateObj = GetEstimateByRef("12")  'function that takes a Reference Number and returns an IEstimateRet object corresponding existing estimate (not included here).
    
      EstimateModObj.TxnID.SetValue ExistingEstimateObj.TxnID.GetValue
      EstimateModObj.EditSequence.SetValue  ExistingEstimateObj.EditSequence.GetValue
    
    'loop thru line items on existing transaction and add TxnLineIDs to the Mod Object (so they don't get deleted).
      For i = 0 To ExistingEstimateObj.OREstimateLineRetList.Count - 1
          EstimateModObj.OREstimateLineModList.Append.EstimateLineMod.TxnLineID.SetValue _
            ExistingEstimateObj.OREstimateLineRetList.GetAt(i).EstimateLineRet.TxnLineID.GetValue
      Next
    
      Dim EstLineAdd As IEstimateLineMod
      Set EstLineAdd = EstimateModObj.OREstimateLineModList.Append.EstimateLineMod
    
      EstLineAdd.TxnLineID.SetValue "-1"
      EstLineAdd.ItemRef.FullName.SetValue "Drywall - cost"
      EstLineAdd.ORRate.Rate.SetValue "150"
    
      SessMgr.OpenConnection "", "GetVendorTest"
      SessMgr.BeginSession "", omDontCare
    
      Set MsgRespObj = SessMgr.DoRequests(MsgReqObj)
    
      SessMgr.EndSession
      SessMgr.CloseConnection
    End Sub
    

    【讨论】:

      【解决方案2】:

      当您在 QuickBooks 中修改任何内容时,您必须提供您正在修改的对象的 TxnID 以及 EditSequence。看起来您正在获取 EditSequence,但从未在您的 mod 请求中设置它。看起来您正在将 TxnID 设置为行,而不是整个事务。

      Dim objInvoicemod As IInvoiceMod
      
      // Set the TxnID for the invoice
      objInvoicemod.TxnID.SetValue TxnID  
      
      // Set the EditSequence for the invoice
      objInvoicemod.EditSequence.SetValue sEditSeq
      
      Dim invoiceLineAdd As IInvoiceLineAdd
      Set invoiceLineAdd = myinvoice.orInvoiceLineRetList.Append.InvoiceLineRet  
      
      invoiceLineAdd.TxnLineID.SetValue "-1"
      invoiceLineAdd.ItemRef.ListID.SetValue sLineItemid
      invoiceLineAdd.Quantity.SetValue iQty
      
      Dim objInvoiceMsgSetResponse As IMsgSetResponse
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多