【问题标题】:The update from my AIF Webservice for SalesAgreementHeader [AX 2012] fails从我的 AIF Web 服务更新 SalesAgreementHeader [AX 2012] 失败
【发布时间】:2013-11-20 17:46:56
【问题描述】:

您好,我创建了一个查询,其中只有 SalesAgreementHeader 作为表。然后我使用向导创建了一个文档 aif webservice。 网络服务工作正常,但更新总是报告“Invalid xml document.”错误。 此错误是由类AxdBaseCreate 中的方法moveToNextElement 引发的。

异常的原因是,

reader.fieldName() = AgreementClassification 

_expectedElementName = AgreementRelationType.

我该如何解决这个问题?或者有什么好的调试方法吗?

在我只使用SalesAgreementHeader 创建查询之前,我有一个更复杂的查询并且遇到了同样的错误。然后我创建了一个新的并将其缩减为只有SalesAgreementHeader

更新: A 尚未解决问题,但我认为问题可能是因为 SalesAgreementHeader 扩展了 AgreementHeader 并且字段 RelationType 在 AOS 中不可见,但如果您直接在 DB 中查看。

更新 2: 这是调用堆栈:

[s] \Classes\AxdBaseCreate\moveToNextElement 9

[s]\Classes\AxdBaseCreate\readSurrogateForeignKeyValue 37

[s]\Classes\AxdBaseCreate\readProperty 14

[s]\Classes\AxdBaseCreate\readProperties 122

[s] \Classes\AxdBaseUpdate\deserializeTopEntity 25

[s]\Classes\AxdBaseUpdate\deserializeDocument 131

[s]\Classes\AxdBaseUpdate\updateDocumentList 42

[s]\Classes\AxdBase\updateList 64

[s]\Classes\AifDocumentService\updateList 34

[s] \Classes\SalesAgreementService\update 4

【问题讨论】:

  • 我知道这可能是您已经知道的事情,但是看到堆栈跟踪我想知道这是否是因为存在代理键而不是自然键?
  • 我认为我朝着正确的方向迈出了一步。我将生成的类AxdSalesAgreement 中的方法expandSurrogateForeignKeys 更改为返回false 而不是true。现在我遇到了新的错误,但我希望通过将表 AgrremenHaeder 添加到查询中来修复它们。
  • expandSurrogateForeignKeys 的帮助是:“获取一个值,该值确定代理键引用是否将被目标表的自然键中的字段替换。”在这种情况下,自然键为空。

标签: c# web-services axapta dynamics-ax-2012 aif


【解决方案1】:

能否提供您正在使用的代码?

我有一个假设(基于 AgreementRelationType 的名称,它看起来像 Enim )您正在尝试基于枚举更新字段。如果是这种情况,那么我希望我能帮助你。

当您需要更新枚举时,请使用以下方法:

//here is an example how to change Status on SalesTable
//as you may see when you change the value of enum you have to set boolean autogenerated field to "true". 
//Name of such fields ends with suffix "Specified"
salesTable.SalesStatus = AxdEnum_SalesStatus.Invoiced;
salesTable.SalesStatusSpecified = true;

我想提前建议您(如果您没有这样做)使用以下 try..catch 块。这将使您的生活更轻松。

try
{
    //your code here
}
catch (System.ServiceModel.FaultException<SalesOrderDelete.SalesOrderDeleteTcpNet.AifFault> aifFaults) // This code catches error messages even when "Logging mode = Logging is disabled" on Inbound port
{
    SalesOrderDelete.SalesOrderDeleteTcpNet.InfologMessage[] infologMessageList = aifFaults.Detail.InfologMessageList;

    foreach (SalesOrderDelete.SalesOrderDeleteTcpNet.InfologMessage infologMessage in infologMessageList)
    {

        Console.WriteLine("Exception: " + infologMessage.Message + "\n");
    }

    Console.WriteLine("\nPress any key to quit.\n");
    Console.ReadKey();
    cl.Abort();
}

【讨论】:

  • 我没有代码了,因为概念发生了变化,不需要用新概念更改 SalesAgreementHeader。但是你的“catch”看起来很有趣,我想我可以在其他项目中使用它的一部分。 :)
猜你喜欢
  • 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
相关资源
最近更新 更多