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。