7

In AX I sono presenti più entità. Quando cerco di inviare le schede attività non registrati tutto funziona bene per tutte le entità ad eccezione di quello in cui sto ottenendo l'errore SQL: "Conversione non riuscita durante la data e/o l'ora da stringa di caratteri di conversione"Dynamics AX 2012: conversione non riuscita durante la conversione di data e/o ora dalla stringa di caratteri

Lo stack di chiamate è qui sotto:

enter image description here

nel metodo evidenziato vedo che non trova alcun SourceDocumentHeader nella tabella AccountDistribution, quindi l'AccountingDate è vuoto.

Qualcuno ha avuto lo stesso problema e sa come risolverlo? È strano per me perché tutte le altre entità funzionano bene.

Grazie.

risposta

6

La spiegazione tecnica di ciò che stai vedendo è che questa parte del codice genera SQL non valido, ma mi sembra che tu abbia un problema con la tua configurazione.

Se si esegue date2str su una data vuota, viene restituita una stringa vuota. Si prega di provare questo in un lavoro e vedrete una stringa vuota nel infolog.

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

Che poi viene concatenato nel metodo updateDistributionsForEvent per generare un'istruzione 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()); 

Dove T1.ACCOUNTINGDATE={ d\'%2\'} è la parte rilevante che genera T1.ACCOUNTINGDATE={ d''} nella stringa SQL.

Se si prova a correre

select {d''} 

in SQL otterrete

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

perché una stringa vuota non può essere analizzato a una data.