我的AIF Webservice for SalesAgreementHeader [AX 2012]的更新失败

时间:2013-01-18 19:15:23

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

您好我已经创建了一个只有SalesAgreementHeader作为表的查询。然后我使用向导创建aif webservice文档。 Web服务工作正常,但更新始终报告“Invalid xml document.”错误。 类moveToNextElement中的方法AxdBaseCreate抛出此错误。

例外的原因是,

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

1 个答案:

答案 0 :(得分:1)

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

我有一个假设(基于CoordinRelationType的名称,看起来这是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();
}