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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.06.2015, 17:51   #1  
Corel is offline
Corel
Участник
Ex AND Project
 
73 / 15 (1) ++
Регистрация: 19.04.2007
Загадочные пропажи шапок журналов
DAX 2009 Rollup 7

Изредка (раз 5 в день) наблюдается очень странная вещь: создаваемый программным кодом складской журнал (InventJournalTable) бесследно пропадает, при этом строки его остаются. Под "бесследно" имеется ввиду, что его следов нет в SysDatabaseLog. Строки его создаются в той же транзакции, но остаются на месте: когда подсовываешь им новую шапку, всё становится как надо.

Я даже сделал таблицу-дубль, в которую пишу всё содержание InventJournalTable в методе Application\ttsnotifyCommit(), и туда действительно всё пишется, оттуда хотя бы восстанавливать можно пропавшие данные. Но сама по себе ситуация напрягает.

Есть идеи, что это может быть, или, по крайней мере, как это поймать?
Старый 30.06.2015, 18:01   #2  
rudi is offline
rudi
Участник
 
1 / 10 (1) +
Регистрация: 03.09.2010
Проверь, что у тебя ошибки вида Exception::UpdateConflict или Exception::Deadlock не вызывают повторное создание журнала без создания шапки журнала.

Последний раз редактировалось mazzy; 01.07.2015 в 07:28.
За это сообщение автора поблагодарили: Logger (1),  (-1).
Старый 30.06.2015, 18:04   #3  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,909 / 5730 (197) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Я такие ситуации лечу дописыванием watchdog-кода в InventUpdateOnHand. Поскольку там логируется список всех измененных inventTrans, можно дописать новый тип 'как бы проверки' в inventSumDeltaDim. Потом при завершении транзакции можно написать запросик, который проверяет наличие складских журналов (конечно только по тем аналитикам и номенклатурам, которые обновлялись в текущей транзакции), у которых нету шапки. Проверка эта должна включаться/выключаться по какому-то глобальному параметру.
Потом ждем пока пользователь позвонит и пожалуется на непонятное сообщение. Дальше быстренько спрашиваем пользователя чего он такого делал и трассируем ситуацию сами. После достижения ясности можно этот watchdog отключить и попытаться исправить код, из за которого ошибка случается.

И так до следующего watchdog Можно конечно вообще в Application.ttsNotifyPreCommit поставить тупую проверку на все журналы без заголовков. Просто во многих случаях, проверка целостности вообще всех данных занимает очень много времени и нету возможности ее использовать. А при фильтрации по inventumDeltaDim для текущей сессии, все-таки удается проверяемое множество локализовать и время проверки опустить до разумных значений...
За это сообщение автора поблагодарили: Logger (3).
Старый 01.07.2015, 07:31   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Corel Посмотреть сообщение
...странная вещь ... имеется ввиду, что его следов нет в SysDatabaseLog.
ничего странного.
какой-то нехороший редиска-программист вызывает doDelete. или перед delete skip-метод.

скорее всего, будет оправдываться тем, что "так работает быстрее". бгггг.

ищите в коде.
Старый 01.07.2015, 07:33   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от rudi Посмотреть сообщение
Проверь, что у тебя ошибки вида Exception::UpdateConflict или Exception:eadlock не вызывают повторное создание журнала без создания шапки журнала.
так появилось бы внятное сообщение в инфологе.
такая ситуация возможна, если нехороший редиска-программист начал манипулировать инфологом, стирая "лишние" строки. если найдете - яйца отрывать.
Старый 01.07.2015, 09:29   #6  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Цитата:
Сообщение от mazzy Посмотреть сообщение
ничего странного.
какой-то нехороший редиска-программист вызывает doDelete
Попадает он в журнализацию.
Про skip'ы не помню точно результаты экспериментов, но тоже кажись не обходит и отлавливается журнализацией.
__________________
Мы летаем, кружимся, нагоняем ужасы ...
За это сообщение автора поблагодарили: S.Kuskov (5).
Старый 01.07.2015, 10:39   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Вроде была похожая ситуация в трешке еще. И был исправляющий хотфикс.
В некоторых случаях когда при создании складского журнала был фильтр по шапке, то ядро меняло значение journalId на другое.
Т.е. шапка не терялась и не удалялась. Значение номера журнала перескакивало на другое, а строчки сами по себе оставались. Что именно исправлял хотфикс - не помню.

Поищите, возможно как раз ваш случай.
Старый 01.07.2015, 10:39   #8  
Corel is offline
Corel
Участник
Ex AND Project
 
73 / 15 (1) ++
Регистрация: 19.04.2007
Цитата:
Сообщение от mazzy Посмотреть сообщение
ничего странного.
какой-то нехороший редиска-программист вызывает doDelete. или перед delete skip-метод.

скорее всего, будет оправдываться тем, что "так работает быстрее". бгггг.

ищите в коде.
В том-то и дело, что происходит это не в каком-то особом методе, вызываемом отдельно, а либо в пакетниках, штампующих такие журналы сотнями в день, либо при стандартных действиях пользователя по движению товара. И происходит далеко не всегда. В мой лог записывается call-stack и никаких вызовов левых методов в нём не видно.

То есть, пока что это выглядит так:

X++:
ttsbegin;
//***
inventJournalTable.insert();
//***
{
   inventJournaltrans.JournalId = inventJournalTable.JournalId;
   //***
   inventJournaltrans.insert();
}
ttscommit;
И изредка этот механизм сбоит так, что inventJournalTable на выходе нет, а все созданные inventJournaltrans на месте.
Старый 01.07.2015, 10:43   #9  
online
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
Попадает он в журнализацию.
Про skip'ы не помню точно результаты экспериментов, но тоже кажись не обходит и отлавливается журнализацией.
doXXXX методы однозначно не логируются. В случае skip* методов возможны варианты: Вопрос про skipDeleteMethod

Последний раз редактировалось S.Kuskov; 01.07.2015 в 11:00.
Старый 01.07.2015, 10:50   #10  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Из моего скромного опыта, doXXXX-методы не логируюся в журнал БД только в случае предварительного успешного вызова skipDatabaseLog(), иначе - логируются, как и обычные CUD-операции.
За это сообщение автора поблагодарили: S.Kuskov (5).
Старый 01.07.2015, 10:59   #11  
online
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Действительно. TasmanianDevil, gl00mie - ваша правда.
Старый 01.07.2015, 11:02   #12  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Только что проверил
X++:
static void Job387(Args _args)
{
    LedgerTable ledger;
    
    ;
    
    ttsbegin;
    
    ledger = LedgerTable::find('test', true);
    
    if(ledger.skipDatabaseLog(true))
        ledger.doDelete();
    
    ttscommit;
}
Удаляется и отлавливается в журнализации
Миниатюры
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 351
Размер:	272.9 Кб
ID:	9309  
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 01.07.2015, 11:17   #13  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
В 2009-й вроде как еще была бага, что журналирование надо было настраивать в каждом домене.
Так что если журналирование настроили для домена Admin а у пользователя права есть только в другом домене а в admin ничего нет то аксапта считает что журналирование к этому пользователю никакого отношения не имеет и записи в sysDatabaselog не пишет !
Старый 01.07.2015, 11:48   #14  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
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.
LedgerTable в 2009-й как раз кэшируется полностью. Я провел эксперимент на CustTransIdRef - там у меня skipDatabaseLog() успешно отключает логирование в журнал БД.
Старый 01.07.2015, 12:18   #15  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Фиг с ними, с нюансами журнализации удаления - другая мысль, весьма идиотского плана, есть.
Лог по Insert'у у пропащих журналов есть ?
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 01.07.2015, 13:16   #16  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от Logger Посмотреть сообщение
Вроде была похожая ситуация в трешке еще. И был исправляющий хотфикс.
В некоторых случаях когда при создании складского журнала был фильтр по шапке, то ядро меняло значение journalId на другое.
Т.е. шапка не терялась и не удалялась. Значение номера журнала перескакивало на другое, а строчки сами по себе оставались. Что именно исправлял хотфикс - не помню.

Поищите, возможно как раз ваш случай.
Да, такая ситуация регулярно повторялась, еще начиная с трешки, до 2009 включительно!

Помогает такое вставить в начало метода в таблице InventJournalTable

X++:
public void update()
{
    ;
    // bug fix -->
    if (this.JournalId != this.orig().JournalId)
    {
        throw error("Попытка изменить номер складского журнала - " + this.JournalId);
    }
    // bug fix <--
....
Попробуйте - помогает, проверено!
За это сообщение автора поблагодарили: Logger (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Одобрение складских журналов AlexeyBP DAX: Функционал 3 11.04.2013 14:25
Увеличение времени обработки журналов после установки новой формы ТТН Zan DAX: Программирование 3 03.08.2011 10:23
Разнести несколько журналов коммерческих соглашений из кода Карис DAX: Программирование 1 07.04.2009 07:02
Группы пользователей в настройке Проверки для Названий журналов Oz DAX: Функционал 2 09.06.2004 17:51
Очистка складских журналов dyatlowsky DAX: Функционал 0 26.03.2004 17:55

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

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

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