Como sabréis, la capa de acceso a datos de MSDyn365FO es un poco diferente del T-SQL. Esto quiere decir que si copias una consulta en AX y la pegas en el SSMS no será válida en el 99% de los casos (y el 1% restante será un select * from tabla).

Para ayudarnos cuando queramos comprobar datos en SQL Server podemos usar el método getSQLStatement de la clase xRecord.

CustTable ct;

select generateonly ct
    where ct.AccountNum == 'US-001';

var sql = ct.getSQLStatement();

Si ejecutamos este código en Dynamics 365 obtendremos la consulta de SQL en la variable sql. Atentos al modificador generateonly, sin él no se generará la consulta SQL!

Esta es la consulta que obtenemos:

SELECT T1.PAYMTERMID,T1.LINEDISC,T1.TAXWITHHOLDGROUP_TH,T1.PARTYCOUNTRY,T1.ACCOUNTNUM,T1.ACCOUNTSTATEMENT,T1.AFFILIATED_RU,T1.AGENCYLOCATIONCODE,
T1.BANKACCOUNT,T1.BANKCENTRALBANKPURPOSECODE,T1.BANKCENTRALBANKPURPOSETEXT,T1.BANKCUSTPAYMIDTABLE,T1.BIRTHCOUNTYCODE_IT,T1.BIRTHPLACE_IT,T1.BLOCKED,
T1.CASHDISC,T1.CASHDISCBASEDAYS,T1.CCMNUM_BR,T1.CLEARINGPERIOD,T1.CNAE_BR,T1.CNPJCPFNUM_BR,T1.COMMERCIALREGISTER,T1.COMMERCIALREGISTERINSETNUMBER,
T1.COMMERCIALREGISTERSECTION, (MORE FIELDS) ,T1.RECVERSION,T1.PARTITION,T1.RECID,T1.MEMO FROM CUSTTABLE T1 WHERE (((PARTITION=5637144576) AND (DATAAREAID=N'usmf')) AND (ACCOUNTNUM=?))

He quitado algunos campos para mejorar la legibilidad, pero con el método getSQLstatement siempre obtendremos todos los campos en la consulta de SQL, incluso si seleccionamos un campo en AX. Como véis tenemos un ? como parámetro en la cláusula where en vez del valor. Si queremos mostrar también el valor tendremos que usar forceliterals en el select de D365:

CustTable ct;

select generateonly forceliterals ct
    where ct.AccountNum == 'US-001';

var sql = ct.getSQLStatement();

Y obtendremos esto:

SELECT T1.PAYMTERMID,T1.LINEDISC,T1.TAXWITHHOLDGROUP_TH,T1.PARTYCOUNTRY,T1.ACCOUNTNUM, (MORE FIELDS) ,T1.RECVERSION,T1.PARTITION,T1.RECID,T1.MEMO FROM CUSTTABLE T1 WHERE (((PARTITION=5637144576) AND (DATAAREAID=N'usmf')) AND (ACCOUNTNUM=N'US-001'))

Hay que tener en cuenta que si usamos el generateonly en nuestro select no tendremos datos en el buffer de la tabla:

Esto quiere decir que esta funcionalidad es únicamente para testeo y debugar, si os lo dejáis cuando hagáis el check in de vuestro código… bueno, os lo podéis imaginar.

¡Suscríbete!

Recibe un correo cuando se publique un nuevo post
Author

Microsoft Dynamics 365 Finance & Operations technical architect and developer. Business Applications MVP since 2020.

Write A Comment

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

ariste.info