30.06.2015, 17:51 | #1 |
Участник
|
Загадочные пропажи шапок журналов
DAX 2009 Rollup 7
Изредка (раз 5 в день) наблюдается очень странная вещь: создаваемый программным кодом складской журнал (InventJournalTable) бесследно пропадает, при этом строки его остаются. Под "бесследно" имеется ввиду, что его следов нет в SysDatabaseLog. Строки его создаются в той же транзакции, но остаются на месте: когда подсовываешь им новую шапку, всё становится как надо. Я даже сделал таблицу-дубль, в которую пишу всё содержание InventJournalTable в методе Application\ttsnotifyCommit(), и туда действительно всё пишется, оттуда хотя бы восстанавливать можно пропавшие данные. Но сама по себе ситуация напрягает. Есть идеи, что это может быть, или, по крайней мере, как это поймать? |
|
30.06.2015, 18:01 | #2 |
Участник
|
Проверь, что у тебя ошибки вида Exception::UpdateConflict или Exception::Deadlock не вызывают повторное создание журнала без создания шапки журнала.
Последний раз редактировалось mazzy; 01.07.2015 в 07:28. |
|
|
За это сообщение автора поблагодарили: Logger (1), (-1). |
30.06.2015, 18:04 | #3 |
Moderator
|
Я такие ситуации лечу дописыванием watchdog-кода в InventUpdateOnHand. Поскольку там логируется список всех измененных inventTrans, можно дописать новый тип 'как бы проверки' в inventSumDeltaDim. Потом при завершении транзакции можно написать запросик, который проверяет наличие складских журналов (конечно только по тем аналитикам и номенклатурам, которые обновлялись в текущей транзакции), у которых нету шапки. Проверка эта должна включаться/выключаться по какому-то глобальному параметру.
Потом ждем пока пользователь позвонит и пожалуется на непонятное сообщение. Дальше быстренько спрашиваем пользователя чего он такого делал и трассируем ситуацию сами. После достижения ясности можно этот watchdog отключить и попытаться исправить код, из за которого ошибка случается. И так до следующего watchdog Можно конечно вообще в Application.ttsNotifyPreCommit поставить тупую проверку на все журналы без заголовков. Просто во многих случаях, проверка целостности вообще всех данных занимает очень много времени и нету возможности ее использовать. А при фильтрации по inventumDeltaDim для текущей сессии, все-таки удается проверяемое множество локализовать и время проверки опустить до разумных значений... |
|
|
За это сообщение автора поблагодарили: Logger (3). |
01.07.2015, 07:31 | #4 |
Участник
|
|
|
01.07.2015, 07:33 | #5 |
Участник
|
Цитата:
такая ситуация возможна, если нехороший редиска-программист начал манипулировать инфологом, стирая "лишние" строки. если найдете - яйца отрывать. |
|
01.07.2015, 09:29 | #6 |
Мрачный тип
|
Цитата:
Про skip'ы не помню точно результаты экспериментов, но тоже кажись не обходит и отлавливается журнализацией.
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
|
За это сообщение автора поблагодарили: S.Kuskov (5). |
01.07.2015, 10:39 | #7 |
Участник
|
Вроде была похожая ситуация в трешке еще. И был исправляющий хотфикс.
В некоторых случаях когда при создании складского журнала был фильтр по шапке, то ядро меняло значение journalId на другое. Т.е. шапка не терялась и не удалялась. Значение номера журнала перескакивало на другое, а строчки сами по себе оставались. Что именно исправлял хотфикс - не помню. Поищите, возможно как раз ваш случай. |
|
01.07.2015, 10:39 | #8 |
Участник
|
Цитата:
То есть, пока что это выглядит так: X++: ttsbegin; //*** inventJournalTable.insert(); //*** { inventJournaltrans.JournalId = inventJournalTable.JournalId; //*** inventJournaltrans.insert(); } ttscommit; |
|
01.07.2015, 10:43 | #9 |
Участник
|
Цитата:
Последний раз редактировалось S.Kuskov; 01.07.2015 в 11:00. |
|
01.07.2015, 10:50 | #10 |
Участник
|
Из моего скромного опыта, doXXXX-методы не логируюся в журнал БД только в случае предварительного успешного вызова skipDatabaseLog(), иначе - логируются, как и обычные CUD-операции.
|
|
|
За это сообщение автора поблагодарили: S.Kuskov (5). |
01.07.2015, 10:59 | #11 |
Участник
|
Действительно. TasmanianDevil, gl00mie - ваша правда.
|
|
01.07.2015, 11:02 | #12 |
Мрачный тип
|
Только что проверил
X++: static void Job387(Args _args) { LedgerTable ledger; ; ttsbegin; ledger = LedgerTable::find('test', true); if(ledger.skipDatabaseLog(true)) ledger.doDelete(); ttscommit; }
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
01.07.2015, 11:17 | #13 |
Участник
|
В 2009-й вроде как еще была бага, что журналирование надо было настраивать в каждом домене.
Так что если журналирование настроили для домена Admin а у пользователя права есть только в другом домене а в admin ничего нет то аксапта считает что журналирование к этому пользователю никакого отношения не имеет и записи в sysDatabaselog не пишет ! |
|
01.07.2015, 11:48 | #14 |
Участник
|
LedgerTable - не самая удачная таблица для экспериментов Если, опять же, обратиться к книге Inside Dynamics AX 2009, то в 12-й главе читаем:
Цитата:
If a table is not entire-table cached, however, you can avoid any downgrade caused by the previously mentioned functionality.
|
|
01.07.2015, 12:18 | #15 |
Мрачный тип
|
Фиг с ними, с нюансами журнализации удаления - другая мысль, весьма идиотского плана, есть.
Лог по Insert'у у пропащих журналов есть ?
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
01.07.2015, 13:16 | #16 |
Участник
|
Цитата:
Сообщение от Logger
Вроде была похожая ситуация в трешке еще. И был исправляющий хотфикс.
В некоторых случаях когда при создании складского журнала был фильтр по шапке, то ядро меняло значение journalId на другое. Т.е. шапка не терялась и не удалялась. Значение номера журнала перескакивало на другое, а строчки сами по себе оставались. Что именно исправлял хотфикс - не помню. Поищите, возможно как раз ваш случай. Помогает такое вставить в начало метода в таблице InventJournalTable X++: public void update() { ; // bug fix --> if (this.JournalId != this.orig().JournalId) { throw error("Попытка изменить номер складского журнала - " + this.JournalId); } // bug fix <-- .... |
|
|
За это сообщение автора поблагодарили: Logger (1). |