7

W AX mam kilka podmiotów. Kiedy próbuję pisać niewysłane ewidencja to działa dobrze dla wszystkich podmiotów, z wyjątkiem jednego, gdzie dostaję błąd SQL: „Konwersja nie powiodła się, kiedy datę i/lub czas od ciągu znaków konwersji”Dynamika AX 2012: Konwersja nie powiodła się podczas przekształcania daty i/lub czasu na łańcuch znaków

Stos wywołań jest poniżej:

enter image description here

W metodzie podświetlonym widzę, że nie można znaleźć żadnego SourceDocumentHeader w tabeli AccountDistribution, więc AccountingDate jest pusty.

Czy ktoś napotkał ten sam problem i wie, jak go rozwiązać? To dziwne dla mnie, ponieważ wszystkie inne podmioty działają poprawnie.

Dzięki.

Odpowiedz

6

Technicznym wyjaśnieniem tego, co widzisz, jest to, że ta część kodu generuje nieprawidłowy kod SQL, ale wygląda na to, że masz problem z konfiguracją.

Jeśli uruchomisz date2str na pustej dacie, zwróci pusty ciąg znaków. Spróbuj tego w pracy, a zobaczysz pusty napis w informatorze.

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

To wtedy dostaje łączone w metodzie updateDistributionsForEvent wygenerować 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()); 

Gdzie T1.ACCOUNTINGDATE={ d\'%2\'} jest odpowiednia część, która generuje T1.ACCOUNTINGDATE={ d''} w ciągu SQL.

Jeśli spróbujesz działa

select {d''} 

w SQL otrzymasz

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

bo pusty łańcuch nie może być analizowany na bieżąco.