通过VB.net中的QBFC将自定义字段数据添加到Quickbooks发票

时间:2017-01-19 15:36:58

标签: vb.net quickbooks qbfc

我正致力于通过QBFC在Quickbooks中创建发票。我在自定义字段信息添加到InvoiceAdd请求时遇到问题。我使用以下代码:

Dim CountryExt As IDataExtAdd = msgReq.AppendDataExtAddRq
CountryExt.DataExtName.SetValue("Country")
CountryExt.DataExtValue.SetValue("Spain")
CountryExt.OwnerID.SetValue(0)
CountryExt.ORListTxnWithMacro.TxnDataExtWithMacro.TxnDataExtType.SetValue(ENTxnDataExtType.tdetInvoice)                
CountryExt.ORListTxnWithMacro.TxnDataExtWithMacro.TxnID.SetValueUseMacro("TxnID:" & i)

添加请求适用于没有客户设置的默认值的自定义字段,但在尝试覆盖客户设置的值时会导致索引超出范围错误。

例如,如果Quickbooks客户拥有自定义字段' Country'设置为葡萄牙'代码会产生超出范围错误的发票。但是,如果客户没有默认的“国家/地区”。代码将设置“国家/地区”。发票上的字段。

我是否需要在创建发票后通过第二个dataextmodrq添加自定义数据,或者我是否缺少某些UnSet选项?

2 个答案:

答案 0 :(得分:0)

您没有发布足够的代码来真正理解您正在做的事情,但我认为您正在做的是更新现有发票。

如果您尝试更新现有发票(及其上的自定义字段),则需要:

  1. 要更新发票,请发送没有自定义字段数据的InvoiceModRq
  2. 发送单独的DataExtModRq请求以更新任何自定义字段值
  3. 您无法直接在InvoiceModRq内更新自定义字段。

    您可以参考OSR,其中说明了用于更新发票的受支持字段。

答案 1 :(得分:0)

想出来。创建发票后,您必须使用DataExtModRq,并使用Quickbooks执行第二轮通信。看起来Quickbooks不允许您在invoiceaddrq中设置自定义字段。以下代码使用对InoviceAddRequests的响应将所有已创建发票的国家/地区字段更新为西班牙。

For i = 0 To invoiceAddResp.ResponseList.Count - 1
    If invoiceAddResp.ResponseList.GetAt(i).StatusCode <> 0 Then
    Check for failed entry here.
    Else
                Dim ExtInvoice As IInvoiceRet = invoiceAddResp.ResponseList.GetAt(i).Detail
                sessMgr.BeginSession("", ENOpenMode.omDontCare)
                Dim ExtReq = sessMgr.CreateMsgSetRequest("US", 12, 0)
                ExtReq.Attributes.OnError = ENRqOnError.roeContinue

                Dim DataExt As IDataExtMod = ExtReq.AppendDataExtModRq()
                DataExt.DataExtName.SetValue("Country")
                DataExt.DataExtValue.SetValue("Spain")
                DataExt.OwnerID.SetValue(0)
                DataExt.ORListTxn.TxnDataExt.TxnDataExtType.SetValue(ENTxnDataExtType.tdetInvoice)
                DataExt.ORListTxn.TxnDataExt.TxnID.SetValue(ExtInvoice.TxnID.GetValue)

                sessMgr.DoRequests(ExtReq)
                sessMgr.EndSession()
            End If
        Next