如何使用QBFC和VBA将发票行项目添加到现有Quickbooks发票

时间:2014-12-27 22:17:37

标签: vba access-vba quickbooks qbfc

是否有人使用QuickBooks QBFC将任何vba代码添加到现有QuickBooks发票中?查询我想要编辑的发票没有问题,我也可以在一个请求/响应事务中创建新发票及其行项目。但是,我似乎无法将代码添加到我现有的一张发票中。这是我的一些代码。您将看到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

2 个答案:

答案 0 :(得分:1)

(这是我的第一篇文章 - 请原谅/理顺任何协议失礼)

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

  • 你不能(或者至少我不能)将 x LineAdd对象(例如IInvoiceLineAdd,IEstimateLineAdd)设置为 x LineRet对象(例如IInvoiceLineRet, IEstimateLineRet) - 当您查看底层的xml时,您将无法做到这一点。

  • x LineAdd对象(例如IInvoiceLineAdd,IEstimateLineAdd)没有TxnLineID属性。 x LineMod(例如IInvoiceLineMod,IEstimateLineMod) 支持TxnLineID属性。

在向现有事务(例如Invoice,Estimate)添加(或修改)行时要注意的另一个问题是,您需要通过TxnLineID指定在行add / mod进程之后要保留的所有现有行。否则,在修改过程中将从事务中删除未以此方式显式指定的所有行。

来自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

答案 1 :(得分:0)

在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