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.