7

在AX中,我有幾個實體。當我嘗試發佈尚未發佈的時間表正常工作的所有實體,除了一個在那裏我得到SQL錯誤:Dynamics AX 2012:從字符串轉換日期和/或時間時轉換失敗

調用棧低於「轉換時,轉換從字符串日期和/或時間失敗」

enter image description here

在突出顯示的方法中,我發現它在AccountDistribution表中找不到任何SourceDocumentHeader,因此AccountingDate爲空。

有沒有人遇到同樣的問題,並知道如何解決它? 這對我來說很奇怪,因爲所有其他實體都可以正常工作。

謝謝。

回答

6

你所看到的技術解釋是這部分代碼會生成無效的SQL,但它看起來好像你的設置有問題。

如果您在空日期運行date2str,它將返回一個空字符串。請在作業中嘗試此操作,您會在信息中看到空字符串。

static void TestEmptyDate(Args _args) 
{ 
    AccountingDate _date; 
    ; 
    info(date2str(_date, 321, 2, 3, 2, 3, 4, DateFlags::None)); 
} 

這則獲取方法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()); 

哪裏T1.ACCOUNTINGDATE={ d\'%2\'}是在SQL字符串生成T1.ACCOUNTINGDATE={ d''}相關部分。

如果您嘗試在SQL運行

select {d''} 

你會得到

Msg 241, Level 16, State 3, Line 1 Conversion failed when converting date and/or time from character string.

因爲一個空字符串不能被解析到一個日期。

相關問題