Получение запроса 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!