AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.06.2023, 13:18   #1  
MorpheusX is offline
MorpheusX
Участник
 
191 / 58 (2) ++++
Регистрация: 04.02.2022
Вызов метода RetailGiftCardTable::findCrossCompany сбрасывает значение TtsLevel с 1 на 0.
D365FO 10.0.29, 10.0.33

В методе validateGiftCard() класса RetailTransactionServiceTransactions вызов метода RetailGiftCardTable::findCrossCompany сбрасывает значение TtsLevel с 1 на 0, что приводит к исключению "Call to TTSCOMMIT without first calling TTSBEGIN" после вызова ttscommit оператора в блоке try метода..

Вызываемые методы не кастомизировались/расширялись.

Как диагностировать причину проблемы?
__________________
Быть, а не казаться!

Последний раз редактировалось MorpheusX; 23.06.2023 в 13:21.
Старый 23.06.2023, 17:52   #2  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,907 / 5717 (196) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Похоже где-то между 10.0.26 и 10.0.30 Микрософт сломал отладчик. Если внутри отладочной сессии выполняются select с crosscompany или любые операции с table map, TtsLevel сбрасывается в ноль, До какой-то степени помогает обвязка сомнительного кода breakpoint (в общем - чтобы магические операции через Step Into и Step Over не проходить, а проскочить проклятое место по Run).
За это сообщение автора поблагодарили: Stitch_MS (5), MorpheusX (1).
Старый 23.06.2023, 18:47   #3  
MorpheusX is offline
MorpheusX
Участник
 
191 / 58 (2) ++++
Регистрация: 04.02.2022
Цитата:
Сообщение от fed Посмотреть сообщение
Похоже где-то между 10.0.26 и 10.0.30 Микрософт сломал отладчик. Если внутри отладочной сессии выполняются select с crosscompany или любые операции с table map, TtsLevel сбрасывается в ноль, До какой-то степени помогает обвязка сомнительного кода breakpoint (в общем - чтобы магические операции через Step Into и Step Over не проходить, а проскочить проклятое место по Run).
В приложный CPOS UAT при пытке оплаты подарочной картой появляется сообщение об ушибке "An error has occurred during gift card transaction.". Для наглядности привожу упрощенную версию метода.

X++:
public static container validateGiftCard(RetailGiftCardId _dataEntryId, ...)
{
    ...

    try
    {
        ttsbegin;
            ...
            tGiftCardTable = RetailGiftCardTable::findCrossCompany(_dataEntryId, companiesToAttemptToLocateTheRecordIn, true);
            ...
            tGiftCardTable.reserveCard(_terminalId, _channelId, _transactionId);
            giftCardStatus = [true, '', tGiftCardTable.CurrencyCode, tGiftCardTable.balance()];
            ...
        ttscommit;
    }
    catch
    {
        giftCardStatus = [false, "@RET2429"]; // An error has occurred during gift card transaction.
        eventSource.EventWritePaymentsGiftCardValidationError(_dataEntryId);
    }

    return giftCardStatus;
}
__________________
Быть, а не казаться!
Старый 26.06.2023, 08:43   #4  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,907 / 5717 (196) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Я сам с неделю назад боролся с проблемой. У меня запрос возвращал 2 строки, а логика обработки, вроде бы, вторую стороку не видела. Я провел пол-дня пытаясь понять в чем проблема. У меня после запроса по cross-company тоже транзакция слетала и я думал что это и есть основная проблема. А потом оказалось что вылет транзакции - это проблема отладчика, а то что вторая строка запроса теряется, это было совершенно другая проблема, просто вызванная кривизной данных. (То есть - запрос все правильно возвращал, но логика внутри while select не обрабатывала одну строку из за кривых данных в другом месте).
Я просто подозреваю, что ты тоже борешься с вылетом транзакции в отладчике, хотя реальная проблема в UAT - где-то еще. Я бы попробовал собрать трассировку и посмотреть в трассировке, где именно и почему оно вылетает...
Старый 26.06.2023, 11:28   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Я встречал похожий глюк в 2009-й аксапте. Проблема была в том, что возникала ошибка в кастомизированном методе ToString класса SysAnyType. Отладчик дергает этот метод, возникает ошибка, транзакция откатывается, но ни исключения ни прерывания исполнения не происходит. Разбирался почему была ошибка - оказывается был перекрыт new в sysAnyType и при этом не вызывался super(). Из-за этого при вызове super в методе ToString откуда-то из ядра вылетала ошибка и транзакция откатывалась. Лечилось просто - либо в двух местах (new и ToString) ставить super() либо убирать.

Может тут что-то подобное. Перекрыт где-то ToString на объекте, который всегда в отладчике висит.
За это сообщение автора поблагодарили: Товарищ ♂uatr (5).
Старый 26.06.2023, 16:20   #6  
MorpheusX is offline
MorpheusX
Участник
 
191 / 58 (2) ++++
Регистрация: 04.02.2022
Обратился в поддержку Майкрософта.
__________________
Быть, а не казаться!
Старый 12.07.2023, 19:47   #7  
MorpheusX is offline
MorpheusX
Участник
 
191 / 58 (2) ++++
Регистрация: 04.02.2022
Цитата:
Сообщение от MorpheusX Посмотреть сообщение
Обратился в поддержку Майкрософта.
Из поддержки попросили предоставить трейс файл.
Создал и отправил им его для анализа.
Теперь пытаюсь сам найти причину проблемы, анализируя трейс файл.

Как видно на картинке, выполнение метода RetailGiftCardTable::unlockCard(), в методе RetailTransactionServiceTransactions::GiftCardPayment(), завершается неуспешно и повторяется несколько раз, пока не будет достигнуто максимально допустимое значение xSession::currentRetryCount.
Нажмите на изображение для увеличения
Название: GiftCardPayment_UnlockCard.JPG
Просмотров: 50
Размер:	179.9 Кб
ID:	13584

А причина, по которой выполнение метода RetailGiftCardTable::unlockCard() не может быть завершено неуспешно возникает еще в методе RetailTransactionServiceTransactions::ValidateGiftCard() перед вызовом метода RetailTransactionServiceTransactions::GiftCardPayment().
Нажмите на изображение для увеличения
Название: RetailTransactionServiceTransactions_ValidateGiftCard.JPG
Просмотров: 49
Размер:	164.5 Кб
ID:	13585

К сожалению, не смог обнаружить ничего, что дало бы подсказку н а причину проблемы.
__________________
Быть, а не казаться!

Последний раз редактировалось MorpheusX; 12.07.2023 в 19:50.
Старый 13.07.2023, 09:19   #8  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Как я понял, проблема очень хорошо воспроизводится не только у вас. Может дать им пример кода вместе с кодом инициализирующим начальные данные, так что они смогут сами легко воспроизвести проблему.
Старый 14.07.2023, 15:05   #9  
MorpheusX is offline
MorpheusX
Участник
 
191 / 58 (2) ++++
Регистрация: 04.02.2022
Нажмите на изображение для увеличения
Название: RetailTransactionServiceTransactions_GiftCardPayment.JPG
Просмотров: 34
Размер:	94.9 Кб
ID:	13586

Для таблицы RetailGiftCardTransactions в кастомизации были реализованы DataEventHandler(ы) с целью обновления значения кастомного поля "Дата последней транзакции", добавленного в таблицу RetailGiftCardTable. Из метода RetailTransactionServiceTransactions.giftCardPayment() последовательно вызываются методы RetailGiftCardTransactions::add() и RetailGiftCardTable.unlockCard(). но в промежутке между этими методами выполняется DataEventHandler на таблице RetailGiftCardTransactions, обновляющий запись RetailGiftCardTable, которая теперь не сможет быть обновлена методом RetailGiftCardTable.unlockCard().

Выполнение DataEventHandler(а) удалось увидеть при помощи трассировщика.

Рекомендовал не использовать логику обновления поля кастомного поля "Дата последней транзакции" в таблице RetailGiftCardTable, а создать View, которое будет группировать записи в таблице RetailGiftCardTransactions и возвращать максимальное значение даты транзакции.
__________________
Быть, а не казаться!

Последний раз редактировалось MorpheusX; 14.07.2023 в 15:16.
Старый 14.07.2023, 15:13   #10  
MorpheusX is offline
MorpheusX
Участник
 
191 / 58 (2) ++++
Регистрация: 04.02.2022
Цитата:
Сообщение от fed Посмотреть сообщение
Похоже где-то между 10.0.26 и 10.0.30 Микрософт сломал отладчик. Если внутри отладочной сессии выполняются select с crosscompany или любые операции с table map, TtsLevel сбрасывается в ноль,
Дебаггер таки сломан.
__________________
Быть, а не казаться!
Старый 14.07.2023, 18:52   #11  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от MorpheusX Посмотреть сообщение
Дебаггер таки сломан.
Чинить будут ?
Или порекомендовали "так" не делать ? )
Теги
debugger, отладчик

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
вызов метода таблицы через переменную Common. возможно? oleggy DAX: Программирование 3 28.03.2022 18:44
Значение display метода по его названию Андрей К. DAX: Программирование 41 25.11.2020 06:52
Вызов статического метода, зная UtilElementType, имя объекта и имя метода Vasiliusis DAX: Программирование 5 16.02.2017 06:22
Вызов метода element.args().caller().setOfficialsParams(.... Poleax DAX: Программирование 6 04.09.2008 19:49
вызов метода из таблицы в операторе while select V777 DAX: Программирование 7 23.04.2008 09:11

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:20.