Получение запроса T-SQL из X ++ в Dynamics 365

Как вы, возможно, знаете, уровень доступа к данным Dynamics 365 довольно сильно отличается от T-SQL. Это означает, что если вы скопируете запрос в AX и вставите его в SSMS, он не будет валидирован в 99% случаев (остальные 1% — это select * from table).

Различия особенно очевидны в предложениях объединения, например, в соединении AX (not) exists join , которое переводится в T-SQL как WHERE NOT EXISTS (SELECT statement).

Чтобы помочь нам, когда мы хотим проверить данные в SQL Server, мы можем использовать метод getSQLStatement класса xRecord.

CustTable ct;
 
select generateonly ct
    where ct.AccountNum == 'US-001';
 
var sql = ct.getSQLStatement();

Если мы запустим этот код в Dynamics 365, мы получим запрос SQL в переменной sql. Обратите внимание на ключевое слово generateonly в операторе select, которое позволит это сделать, без него не получится.

Вот запрос T-SQL, который мы получаем:

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=?))

Здесь удалены некоторые поля для лучшего чтения, но вы всегда получите все поля в запросе SQL, используя метод getSQLstatement, даже если выберете одно поле в AX. Как вы видите здесь  есть «?» в качестве параметра в предложении where вместо его значения. Если вы хотите показать значение, вам нужно использовать forceliterals в операторе выбора в Dynamics 365:

CustTable ct;
 
select generateonly forceliterals ct
    where ct.AccountNum == 'US-001';
 
var sql = ct.getSQLStatement();

Тогда вы получите это:

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'))

Помните, что если вы используете generateonly в операторе select, у вас не будет никаких данных в буфере таблицы:

 

 

 

 

 

 

Это означает, что эта функциональность предназначена только для тестирования или отладки, если вы забудете удалить ее перед проверкой кода … ну, вы можете себе представить.

 

Источник: https://ariste.info/en/2019/11/get-the-t-sql-query-from-x/

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar