|
23.06.2023, 13:18 | #1 |
Участник
|
Вызов метода 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 |
Moderator
|
Похоже где-то между 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 |
Участник
|
Цитата:
Сообщение от fed
Похоже где-то между 10.0.26 и 10.0.30 Микрософт сломал отладчик. Если внутри отладочной сессии выполняются select с crosscompany или любые операции с table map, TtsLevel сбрасывается в ноль, До какой-то степени помогает обвязка сомнительного кода breakpoint (в общем - чтобы магические операции через Step Into и Step Over не проходить, а проскочить проклятое место по Run).
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; }
__________________
Быть, а не казаться! |
|
14.07.2023, 15:13 | #4 |
Участник
|
Дебаггер таки сломан.
__________________
Быть, а не казаться! |
|
14.07.2023, 18:52 | #5 |
Участник
|
|
|
26.06.2023, 08:43 | #6 |
Moderator
|
Я сам с неделю назад боролся с проблемой. У меня запрос возвращал 2 строки, а логика обработки, вроде бы, вторую стороку не видела. Я провел пол-дня пытаясь понять в чем проблема. У меня после запроса по cross-company тоже транзакция слетала и я думал что это и есть основная проблема. А потом оказалось что вылет транзакции - это проблема отладчика, а то что вторая строка запроса теряется, это было совершенно другая проблема, просто вызванная кривизной данных. (То есть - запрос все правильно возвращал, но логика внутри while select не обрабатывала одну строку из за кривых данных в другом месте).
Я просто подозреваю, что ты тоже борешься с вылетом транзакции в отладчике, хотя реальная проблема в UAT - где-то еще. Я бы попробовал собрать трассировку и посмотреть в трассировке, где именно и почему оно вылетает... |
|
26.06.2023, 11:28 | #7 |
Участник
|
Я встречал похожий глюк в 2009-й аксапте. Проблема была в том, что возникала ошибка в кастомизированном методе ToString класса SysAnyType. Отладчик дергает этот метод, возникает ошибка, транзакция откатывается, но ни исключения ни прерывания исполнения не происходит. Разбирался почему была ошибка - оказывается был перекрыт new в sysAnyType и при этом не вызывался super(). Из-за этого при вызове super в методе ToString откуда-то из ядра вылетала ошибка и транзакция откатывалась. Лечилось просто - либо в двух местах (new и ToString) ставить super() либо убирать.
Может тут что-то подобное. Перекрыт где-то ToString на объекте, который всегда в отладчике висит. |
|
|
За это сообщение автора поблагодарили: Товарищ ♂uatr (5). |
26.06.2023, 16:20 | #8 |
Участник
|
Обратился в поддержку Майкрософта.
__________________
Быть, а не казаться! |
|
12.07.2023, 19:47 | #9 |
Участник
|
Из поддержки попросили предоставить трейс файл.
Создал и отправил им его для анализа. Теперь пытаюсь сам найти причину проблемы, анализируя трейс файл. Как видно на картинке, выполнение метода RetailGiftCardTable::unlockCard(), в методе RetailTransactionServiceTransactions::GiftCardPayment(), завершается неуспешно и повторяется несколько раз, пока не будет достигнуто максимально допустимое значение xSession::currentRetryCount. А причина, по которой выполнение метода RetailGiftCardTable::unlockCard() не может быть завершено неуспешно возникает еще в методе RetailTransactionServiceTransactions::ValidateGiftCard() перед вызовом метода RetailTransactionServiceTransactions::GiftCardPayment(). К сожалению, не смог обнаружить ничего, что дало бы подсказку н а причину проблемы.
__________________
Быть, а не казаться! Последний раз редактировалось MorpheusX; 12.07.2023 в 19:50. |
|
13.07.2023, 09:19 | #10 |
Участник
|
Как я понял, проблема очень хорошо воспроизводится не только у вас. Может дать им пример кода вместе с кодом инициализирующим начальные данные, так что они смогут сами легко воспроизвести проблему.
|
|
14.07.2023, 15:05 | #11 |
Участник
|
Для таблицы RetailGiftCardTransactions в кастомизации были реализованы DataEventHandler(ы) с целью обновления значения кастомного поля "Дата последней транзакции", добавленного в таблицу RetailGiftCardTable. Из метода RetailTransactionServiceTransactions.giftCardPayment() последовательно вызываются методы RetailGiftCardTransactions::add() и RetailGiftCardTable.unlockCard(). но в промежутке между этими методами выполняется DataEventHandler на таблице RetailGiftCardTransactions, обновляющий запись RetailGiftCardTable, которая теперь не сможет быть обновлена методом RetailGiftCardTable.unlockCard(). Выполнение DataEventHandler(а) удалось увидеть при помощи трассировщика. Рекомендовал не использовать логику обновления поля кастомного поля "Дата последней транзакции" в таблице RetailGiftCardTable, а создать View, которое будет группировать записи в таблице RetailGiftCardTransactions и возвращать максимальное значение даты транзакции.
__________________
Быть, а не казаться! Последний раз редактировалось MorpheusX; 14.07.2023 в 15:16. |
|
Теги |
debugger, отладчик |
|
|