AYE*_*ETY 7 sql-server microsoft-dynamics ssms axapta dynamics-ax-2012-r2
在AX我有几个实体.当我尝试发布未发布的时间表时,除了我遇到SQL错误之外的所有实体都可以正常工作:"从字符串转换日期和/或时间时转换失败"
调用堆栈如下:
在突出显示的方法中,我看到它在AccountDistribution表中找不到任何SourceDocumentHeader,因此AccountingDate为空.
有没有人遇到同样的问题,知道如何解决它?对我来说很奇怪,因为所有其他实体都可以正常工作.
谢谢.
您所看到的技术解释是这部分代码生成了无效的SQL,但它看起来好像您的设置有问题.
如果在空日期运行date2str,则返回空字符串.请在工作中尝试这个,你会在infolog中看到一个空字符串.
static void TestEmptyDate(Args _args)
{
AccountingDate _date;
;
info(date2str(_date, 321, 2, 3, 2, 3, 4, DateFlags::None));
}
Run Code Online (Sandbox Code Playgroud)
然后在方法中连接updateDistributionsForEvent
以生成SQL语句:
sqlStatementText = strFmt('UPDATE T1 SET ACCOUNTINGEVENT=%1,RECVERSION=%2 FROM ACCOUNTINGDISTRIBUTION T1 WITH (INDEX(I_7452SOURCEDOCUMENTHEADERIDX)) CROSS JOIN SOURCEDOCUMENTLINE T2 ', _accountingEventRecId, xGlobal::randomPositiveInt32());
sqlStatementText += strFmt('WHERE (((T1.PARTITION=%1) AND (T1.ACCOUNTINGEVENT=0) AND (T1.ACCOUNTINGDATE={ d\'%2\'})) AND (T1.SOURCEDOCUMENTHEADER=%3)) AND ', getcurrentpartitionrecid(), sqlDate, _sourceDocumentRecId);
sqlStatementText += strFmt('((T2.RECID=T1.SOURCEDOCUMENTLINE) AND (T2.ACCOUNTINGSTATUS=%1 OR T2.ACCOUNTINGSTATUS=%2)) AND (T2.PARTITION=%3)', enum2int(SourceDocumentLineAccountingStatus::Completed), enum2int(SourceDocumentLineAccountingStatus::Canceled), getcurrentpartitionrecid());
Run Code Online (Sandbox Code Playgroud)
SQL字符串中T1.ACCOUNTINGDATE={ d\'%2\'}
生成的相关部分在哪里T1.ACCOUNTINGDATE={ d''}
.
如果你试试跑步
select {d''}
Run Code Online (Sandbox Code Playgroud)
在SQL中你会得到
从字符串转换日期和/或时间时,消息241,级别16,状态3,行1转换失败.
因为无法将空字符串解析为日期.