C# 未创建付款

C# 未创建付款,c#,asp.net,intuit-partner-platform,C#,Asp.net,Intuit Partner Platform,我的付款没有显示在QuickBooks中 paymentHeader.TotalAmt = Convert.ToDecimal(rdr["amount"]); paymentHeader.TotalAmtSpecified = true; 我可以成功创建和更新客户。我还可以成功创建和更新发票。我无法创建付款。但问题是,当我在我的支付对象上执行Update命令时,我确实得到了一个正确的Id和域(NG)。我在运行同步后检查了同步日志文件(IntuitSyncManager.log),但没有错误消息

我的付款没有显示在QuickBooks中

paymentHeader.TotalAmt = Convert.ToDecimal(rdr["amount"]);
paymentHeader.TotalAmtSpecified = true;
我可以成功创建和更新客户。我还可以成功创建和更新发票。我无法创建付款。但问题是,当我在我的支付对象上执行Update命令时,我确实得到了一个正确的Id和域(NG)。我在运行同步后检查了同步日志文件(IntuitSyncManager.log),但没有错误消息。一切看起来都正常,只是QuickBooks中没有与发票关联的付款

paymentHeader.TotalAmt = Convert.ToDecimal(rdr["amount"]);
paymentHeader.TotalAmtSpecified = true;
我相信我正在设置所有必填字段,但我不确定其中的两个

1) PaymentLine有一个名为TxnId的字段。我将其设置为InvoiceHeader的Id和域,但不确定这是否正确

2) 还有另一个必填字段(根据文档),但我将其留空,因为我不知道用什么填充它。这是折扣会计字段。我不想要发票上的折扣

这是我的密码

SqlConnection connection = new SqlConnection(m_connectionString);
connection.Open();

SqlCommand cmd = new SqlCommand("dbo.Intuit_GetPayment", connection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@glmvSyncId", SqlDbType.Int).Value = glmvSyncId;

SqlDataReader rdr = cmd.ExecuteReader();
rdr.Read();

Intuit.Ipp.Data.Qbd.PaymentHeader paymentHeader = new Intuit.Ipp.Data.Qbd.PaymentHeader();
paymentHeader.ARAccountId = new Intuit.Ipp.Data.Qbd.IdType() {
    idDomain = Intuit.Ipp.Data.Qbd.idDomainEnum.QB,
    Value = "37"
};
paymentHeader.ARAccountName = "Accounts Receivable";
paymentHeader.DepositToAccountId = new Intuit.Ipp.Data.Qbd.IdType() {
    idDomain = Intuit.Ipp.Data.Qbd.idDomainEnum.QB,
    Value = "35"
};
paymentHeader.DepositToAccountName = "Undeposited Funds";
paymentHeader.CustomerId = new Intuit.Ipp.Data.Qbd.IdType() {
    idDomain = (rdr["cust_iddomain"].ToString() == "QB" ? Intuit.Ipp.Data.Qbd.idDomainEnum.QB : Intuit.Ipp.Data.Qbd.idDomainEnum.NG),
    Value = rdr["cust_idvalue"].ToString()
}; // cust_iddomain and cust_idvalue are from the Customer
paymentHeader.DocNumber = rdr["invoicekey"].ToString();
paymentHeader.TxnDate = DateTime.Now; 

List<Intuit.Ipp.Data.Qbd.PaymentLine> listLine = new List<Intuit.Ipp.Data.Qbd.PaymentLine>();

var paymentLine = new Intuit.Ipp.Data.Qbd.PaymentLine();
paymentLine.Amount = Convert.ToDecimal(rdr["amount"]);
paymentLine.TxnId = new Intuit.Ipp.Data.Qbd.IdType() {
    idDomain = (rdr["invc_iddomain"].ToString() == "QB" ? Intuit.Ipp.Data.Qbd.idDomainEnum.QB : Intuit.Ipp.Data.Qbd.idDomainEnum.NG),
    Value = rdr["invc_idvalue"].ToString()
}; // invc_iddomain and invc_idvalue are from the InvoiceHeader

listLine.Add(paymentLine);

Intuit.Ipp.Data.Qbd.Payment syncPayment = new Intuit.Ipp.Data.Qbd.Payment();
syncPayment.Header = paymentHeader;
syncPayment.Line = listLine.ToArray();

connection.Close();

Intuit.Ipp.Data.Qbd.Payment resultPayment = new Intuit.Ipp.Data.Qbd.Payment();

resultPayment = commonService.Add(syncPayment);
SqlConnection=newsqlconnection(m_connectionString);
connection.Open();
SqlCommand cmd=newsqlcommand(“dbo.Intuit\u GetPayment”,连接);
cmd.CommandType=CommandType.storedProcess;
cmd.Parameters.Add(“@glmvSyncId”,SqlDbType.Int).Value=glmvSyncId;
SqlDataReader rdr=cmd.ExecuteReader();
rdr.Read();
Intuit.Ipp.Data.Qbd.PaymentHeader PaymentHeader=新的Intuit.Ipp.Data.Qbd.PaymentHeader();
paymentHeader.ARAccountId=new Intuit.Ipp.Data.Qbd.IdType(){
idDomain=Intuit.Ipp.Data.Qbd.idDomainEnum.QB,
Value=“37”
};
paymentHeader.ARAccountName=“应收账款”;
paymentHeader.DepositoAccountId=new Intuit.Ipp.Data.Qbd.IdType(){
idDomain=Intuit.Ipp.Data.Qbd.idDomainEnum.QB,
Value=“35”
};
paymentHeader.DepositoAccountName=“未存款资金”;
paymentHeader.CustomerId=new Intuit.Ipp.Data.Qbd.IdType(){
idDomain=(rdr[“cust_idDomain”].ToString()=“QB”?Intuit.Ipp.Data.Qbd.idDomainEnum.QB:Intuit.Ipp.Data.Qbd.idDomainEnum.NG),
Value=rdr[“cust_idvalue”].ToString()
}; // cust_id域和cust_id值来自客户
paymentHeader.DocNumber=rdr[“invoicekey”].ToString();
paymentHeader.TxnDate=DateTime.Now;
List listLine=新列表();
var paymentLine=new Intuit.Ipp.Data.Qbd.paymentLine();
paymentLine.Amount=Convert.ToDecimal(rdr[“Amount”]);
paymentLine.TxnId=new Intuit.Ipp.Data.Qbd.IdType(){
idDomain=(rdr[“invc_idDomain”].ToString()=“QB”?Intuit.Ipp.Data.Qbd.idDomainEnum.QB:Intuit.Ipp.Data.Qbd.idDomainEnum.NG),
Value=rdr[“invc_idvalue”]。ToString()
}; // invc_iddomain和invc_idvalue来自InvoiceHeader
列表行。添加(付款行);
Intuit.Ipp.Data.Qbd.Payment syncPayment=新建Intuit.Ipp.Data.Qbd.Payment();
syncPayment.Header=paymentHeader;
syncPayment.Line=listLine.ToArray();
connection.Close();
Intuit.Ipp.Data.Qbd.Payment resultPayment=新的Intuit.Ipp.Data.Qbd.Payment();
resultPayment=commonService.Add(同步支付);
我怀疑问题出在TxnId上

我所做的就是创建一个客户,然后为客户创建发票,然后为发票创建付款。我在什么地方丢了东西吗


非常感谢所有帮助。

同步后,付款可能会进入错误状态。您可以通过执行PaymentQuery并设置ErroredObjectsOnly=true进行检查

如果实体处于错误状态,则可以使用状态API查询特定原因:

SyncStatusRequest-SyncStatusRequest=new-SyncStatusRequest();
syncStatusRequest.ErroredObjectsOnly=true;
syncStatusRequest.NgIdSet=new NgIdSet[]{new NgIdSet{NgId=,NgObjectType=objectName.Payment};
SyncStatusResponse[]response=dataServices.GetSyncStatus(syncStatusRequest);
如果付款处于错误状态,您可以从云中删除该实体,因为它从未与QuickBooks同步:

如果与实体的同步至少成功进行了一次,但随后更新将其推入错误状态,则需要执行还原:


从Status API中了解原因后,您也可以尝试直接对处于错误状态的实体进行更新,但由于没有文档记录,因此可能无法正常工作。

添加以下代码行似乎已修复该问题。付款现在记录在QuickBooks中

paymentHeader.TotalAmt = Convert.ToDecimal(rdr["amount"]);
paymentHeader.TotalAmtSpecified = true;

特定的错误消息是;'QBXML验证错误:[严重性=致命错误,消息=cvc复杂类型。2.4.a:发现以元素“ARAccountRef”开头的无效内容。应为“{CustomerRef}”之一,定位器=[url=null,行=-1,列=-1,节点=null,对象=com.intuit.sb.datasync.writeback.QBXML.schema。ARAccountRef@8ded1c0,field=null]]\n'。不幸的是,我不知道这意味着什么。我在任何文档中都没有看到ARAccountRef。好的,我删除了所有出错的对象(客户、发票和付款)。然后创建了一个新的客户和发票。这次当我添加付款时,错误是在保存ReceivePayment时出错。QuickBooks错误消息:事务为空。我不确定它指的是什么交易。我是否应该创建一个与发票相符的交易?