C# my AIF Webservice for SalesAgreementHeader[AX 2012]的更新失败

C# my AIF Webservice for SalesAgreementHeader[AX 2012]的更新失败,c#,web-services,axapta,dynamics-ax-2012,aif,C#,Web Services,Axapta,Dynamics Ax 2012,Aif,您好,我创建了一个查询,其中只有SalesAgreementHeader作为表。然后,我使用向导创建了一个文档aif webservice。 Web服务工作正常,但更新总是报告一个“无效的xml文档。”错误。 此错误由类AxdBaseCreate中的方法moveToNextElement引发 例外的原因是 reader.fieldName() = AgreementClassification 及 我怎样才能解决这个问题?或者有什么好的方法来调试它吗 在我仅使用SalesAgreementH

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

例外的原因是

reader.fieldName() = AgreementClassification 

我怎样才能解决这个问题?或者有什么好的方法来调试它吗

在我仅使用
SalesAgreementHeader
创建查询之前,我有一个更复杂的查询,并且有相同的错误。然后我创建了一个新的,并将其简化为仅包含
SalesAgreementHeader

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

更新2: 这是调用堆栈:

[s] \Classes\AxdBaseCreate\moveToNextElement 9

[s] \Classes\AxdBaseCreate\readsubrogateforeignkeyvalue 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\update4

您能提供您正在使用的代码吗

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

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

//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 block。这会让你的生活更轻松

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();
}
试试看
{
//你的代码在这里
}
catch(System.ServiceModel.FaultException aifFaults)//即使在入站端口上“Logging mode=Logging is disabled”时,此代码也会捕获错误消息
{
SalesOrderDelete.SalesOrderDeleteCpnet.InfologMessage[]infologMessageList=aifFaults.Detail.infologMessageList;
foreach(infologMessageList中的SalesOrderDelete.SalesOrderDeleteCpnet.InfologMessage InfologMessage)
{
Console.WriteLine(“异常:+infologMessage.Message+”\n”);
}
Console.WriteLine(“\n按任意键退出。\n”);
Console.ReadKey();
cl.中止();
}

您能提供您正在使用的代码吗

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

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

//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 block。这会让你的生活更轻松

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();
}
试试看
{
//你的代码在这里
}
catch(System.ServiceModel.FaultException aifFaults)//即使在入站端口上“Logging mode=Logging is disabled”时,此代码也会捕获错误消息
{
SalesOrderDelete.SalesOrderDeleteCpnet.InfologMessage[]infologMessageList=aifFaults.Detail.infologMessageList;
foreach(infologMessageList中的SalesOrderDelete.SalesOrderDeleteCpnet.InfologMessage InfologMessage)
{
Console.WriteLine(“异常:+infologMessage.Message+”\n”);
}
Console.WriteLine(“\n按任意键退出。\n”);
Console.ReadKey();
cl.中止();
}

我知道这可能是您已经知道的,但看到stacktrace,我想知道这是否是因为存在代理密钥而不是自然密钥?我想我朝着正确的方向迈出了一步。我将生成的类
AxdSalesAgreement
中的方法
expandprograteforeignkeys
更改为返回
false
而不是
true
。现在我得到了新的错误,但我希望通过向查询中添加表
agrremenhader
来修复这些错误。
expandSurrogateForeignKeys
的帮助是:“获取一个值,该值确定代理键引用是否将由目标表的自然键中的字段替换。”在这种情况下,自然密钥是否为空。我知道这可能是您已经知道的,但看到stacktrace,我想知道这是否是因为存在代理密钥而不是自然密钥?我想我朝着正确的方向迈出了一步。我将生成的类
AxdSalesAgreement
中的方法
expandprograteforeignkeys
更改为返回
false
而不是
true
。现在我得到了新的错误,但我希望通过向查询中添加表
agrremenhader
来修复这些错误。
expandSurrogateForeignKeys
的帮助是:“获取一个值,该值确定代理键引用是否将由目标表的自然键中的字段替换。”在本例中,自然键为空。我不再有代码,因为概念已更改,不需要使用新概念更改SalesAgreementHeader。