7

In AX ich mehrere Einheiten haben. Wenn ich versuche, nicht gebuchte Zeiterfassungen schreiben funktioniert es für alle Unternehmen in Ordnung, außer einem, wo ich SQL-Fehler bin immer: „failed Conversion bei der Konvertierung von Datum und/oder Uhrzeit aus Zeichenfolge“Dynamics AX 2012: Fehler bei der Konvertierung bei der Konvertierung von Datum und/oder Uhrzeit aus Zeichenkette

Der Call-Stack unten:

enter image description here

in markierter Methode sehe ich, dass es keine SourceDocumentHeader in AccountDistribution Tabelle finden, so dass die AccountingDate ist leer.

Hat jemand gleiches Problem erlebt und weiß, wie es zu lösen? Es ist für mich seltsam, weil alle anderen Einheiten OK funktioniert.

Danke.

Antwort

6

Die technische Erklärung, was Sie sehen, ist, dass dieser Teil des Codes ungültig SQL erzeugt, aber es scheint mir, als ob Sie ein Problem mit Ihrem Setup haben.

Wenn Sie auf einem leeren Datum laufen date2str es gibt einen leeren String. Bitte versuchen Sie dies in einem Job, und Sie werden eine leere Zeichenfolge in der infolog sehen.

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

das dann in dem Verfahren konkateniert wird updateDistributionsForEvent eine SQL-Anweisung zu generieren:

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()); 

Wo T1.ACCOUNTINGDATE={ d\'%2\'} der relevante Teil ist, das T1.ACCOUNTINGDATE={ d''} in der SQL-Zeichenfolge erzeugt.

Wenn Sie versuchen, laufen

select {d''} 

in SQL finden Sie

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

erhalten, weil ein leerer String nicht zu einem Zeitpunkt analysiert werden kann.