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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.02.2009, 21:47   #1  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 438 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от Андре Посмотреть сообщение
С учетом того, что блокировка может накладываться не только на запись, но и на страницу, экстент, таблицу или ключ индекса, решение данной задачи мне кажется невозможным.
Можно в info\add в файл писать весь инфолог.
При обновление этих таблиц всегда setPrefix на номенклатуру есть.
Цитата:
Сообщение от Андре Посмотреть сообщение
Ну и не совсем понятно, что даст на практике такая информация.
Да у меня остатки расходяться с проводками.
Написал джобик он недолго работает 10 минут.
Раз в неделю запускаю 6-8 позиций исправляет.
Но надо решать эту проблему.
Есть подозрения что это из-за блокировок.
Хотю удостовериться в этом или в обратном.
Есть мысль на inventTrans insert и update некую проверку повесить на время поиска откуда ноги растут.
Но очень хочется, чтоб это оказалось из-за блокировок.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 11.02.2009, 22:56   #2  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1853 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от miklenew Посмотреть сообщение
Да у меня остатки расходяться с проводками.
..
Есть подозрения что это из-за блокировок
Сами по себе блокировки - не абсолютное зло, как многие считают, а одно из средств обеспечения целостности данных в системе, поддерживающей работу нескольких конкурентных пользователей. И являться причиной неверных остатков в нормально спроектированной системе (а стандартную логику AX в области управления запасами я считаю нормально спроектированной ) не могут

Цитата:
Но очень хочется, чтоб это оказалось из-за блокировок
Увы

Я бы прислушался к совету Wamr

Если все-таки очень хочется найти "горячую" номенклатуру, можно попробовать такой "ход конем":
- настраиваем поголовный мониторинг длинных запросов всем пользователям
- включаем на AOS-е опцию internal=comments (в 3.0 работает, как в других версиях - не знаю). Теперь запрос сохранится со значениями литералов (в комментариях)
- собираем эту статистику какое-то время
- далее анализируем с группировкой (приводим текст запроса к varchar и группируем). Так как запрос "тяжелый", желательно делать это не на работающей системе, а выгрузить SYSTRACETABLESQL в отдельную БД. Еще лучше - на выделенный сервер. Еще лучше - дополнительно обработать табличку, добавив хэш по тексту запроса. Я таким образом строил куб на основе SYSTRACETABLESQL

Но все равно непонятно (с), что это даст. Рискну предположить, что "горячей" окажется наиболее часто продаваемая номенклатура. Предложим пореже продавать? Не оценят
__________________
-ТСЯ или -ТЬСЯ ?
За это сообщение автора поблагодарили: Logger (6), Lucky13 (2).
Старый 12.02.2009, 09:36   #3  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 438 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от Vadik Посмотреть сообщение
Сами по себе блокировки - не абсолютное зло, как многие считают, а одно из средств обеспечения целостности данных в системе, поддерживающей работу нескольких конкурентных пользователей. И являться причиной неверных остатков в нормально спроектированной системе (а стандартную логику AX в области управления запасами я считатаю нормально спроектированной ) не могут
Могут. Сам делал руками кривые проводки на стандарте Ax 3.0 sp4.
Долго подбирал данные, но смог подобрать.
Правда транзакции там ни причем были.
А потом мне нужно это найти не на стандарте.
Прилага на 80% модифицирована по формуле mazzy.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 12.02.2009, 12:33   #4  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,984 / 3273 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от miklenew Посмотреть сообщение
Могут. Сам делал руками кривые проводки на стандарте Ax 3.0 sp4.
Долго подбирал данные, но смог подобрать.
Интересно каким образом ?
Старый 12.02.2009, 23:32   #5  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 438 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от Logger Посмотреть сообщение
Интересно каким образом ?
1) Создаём новую номенклатуру new активны склад и ГТД
2) Создаём закупку
3) Создаём строку закупки new 2 шт (скл1 + гтд1) и
4) ещё одну строку закупки new 3 шт (скл1 + гтд2)
5) Разносим отборочную накладную
6) создаём журнал перенос (резервирование автоматическое)
7) Создаём строку журнала new 6 шт скл1->скл2. Сохраняем.
8) Смотрим проводки
-2шт
скл1 -> скл2
гтд1 -> гтд1
-3 шт
скл1 -> скл2
гтд2 -> гтд2
-1шт
скл1 -> скл2
9) уменьшаем количество по строке до 5 шт
сохраняем, смотрим
-2шт
скл1 -> скл2
гтд1 -> гтд1
-2шт
скл1 -> скл2
гтд1 -> гтд1
-1шт
скл1 -> скл2
гтд1 -> ?(пусто)

Ну т.е. вот так см картинку
Миниатюры
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 433
Размер:	62.3 Кб
ID:	4318  
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.

Последний раз редактировалось miklenew; 12.02.2009 в 23:37.
Старый 13.02.2009, 00:12   #6  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от miklenew Посмотреть сообщение
1) .........
.........
-2шт
скл1 -> скл2
гтд2 -> гтд2
-1шт
скл1 -> скл2
гтд2 -> ?(пусто)

Ну т.е. вот так см картинку
Прикольная картинка получилась, обязательно как-нить попробую повторить на досуге, но:
- откуда взялся странный вывод о том, что причина в блокировках? я бы сказал, что проблема в некорректной работе механизма авторезервирования, если всё так действительно происходит. Надо банально его протрейсить и найти баг....
- вы выше говорили что у вас "остатки расходяться с проводками", а здесь просто "испортилась" приходная проводка (InventTrans), при этом остатки у вас разве "разошлись" (InventSum)?
__________________
Zhirenkov Vitaly
Старый 13.02.2009, 06:31   #7  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 438 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от ZVV Посмотреть сообщение
- откуда взялся странный вывод о том, что причина в блокировках?
Да нет. Одно с другим не связано.
Там я вывернулся. Придумал выход.
Просто Vadim написал, что
Цитата:
Сообщение от Vadik Посмотреть сообщение
И являться причиной неверных остатков в нормально спроектированной системе (а стандартную логику AX в области управления запасами я считатаю нормально спроектированной ) не могут
Я ответил, что могут.
Не стоит доверять системе на 100%. Всякое бывает.
A logger попросил пример.
Это пример с блокировками никак не связан.
Просто тема немного ушла.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 27.02.2009, 21:55   #8  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,984 / 3273 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Vadik Посмотреть сообщение
включаем на AOS-е опцию internal=comments (в 3.0 работает, как в других версиях - не знаю). Теперь запрос сохранится со значениями литералов (в комментариях)
Спасибо за ценную инфу. Очень не хватало такой информации. Правда при использовании обнаружил один баг. - Иногда такое логирование неверно отображает значение параметра.

Как обнаружил - накладывал фильтр по таблице по полю modifiedDate
фильтр такой
X++:
...Addrange(...).value(date2strXpp(systemDateGet()));
отладочная инфа показала что на оракл уходит запрос
AND (MODIFIEDDATE=:IN2/*1900/1/1*/)
а datasource(1).tostring() выдал строку
SELECT * FROM VendTable WHERE (((modifiedDate = TO_DATE('2009-02-27 00:00:00','YYYY-MM-DD HH24:MI:SS'))))

Реально же вернулась нужная строка. Так что получается что для определенных значений параметров логирование SQL-запросов может показать неверную информацию.
Старый 28.02.2009, 14:13   #9  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Logger Посмотреть сообщение
Спасибо за ценную инфу. Очень не хватало такой информации.
ошибка update_recordset

Обратите внимание, что лучше таки использовать совместно с NOCURSORREUSE, т.к. иначе рискуете отловить не все запросы:
Цитата:
Сообщение от Documentation
∙ -Internal=Comments
∙ This option will insert value of bind variables as comment into the
generated SQL statement; Therefore, this option will cause insertion of
an odd number of the character ‘ in a STR field to fail.

∙ -Internal=NoCursorReuse
∙ This option will force Axapta not to reuse internal database cursors;
therefore, if you want to examine the value of bind variable for all
traced SQL statements you must use this option in connection with the
‘–internal = Comments’.

Цитата:
Сообщение от Logger Посмотреть сообщение
Правда при использовании обнаружил один баг. - Иногда такое логирование неверно отображает значение параметра.
...
Странно, не сталкивался... Возможно причина в системных полях (MODIFIEDDATE)? Можете вложить примерчик?
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: Logger (1).
Старый 12.02.2009, 02:15   #10  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,984 / 3273 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от miklenew Посмотреть сообщение
Да у меня остатки расходяться с проводками.
Блокировки не могут быть причиной такого расхождения. Ищите в другом месте.

Исключение - работа системы множественных складских транзакций. Но опять же там причина такого расхождения не в блокировках, а в прерывании работы системы, когда откатывается транзакция обновляющая inventTrans, но не откатывается транзакция обновлявшая inventsum. По Inventsumlogtts можно найти такие проблемы - если там есть записи с committed == 0
Но по идее Аксапта сама раз в 600 секунд делает эту проверку и таким образом восстанавливает соответствие InventTrans и InventSum
Старый 13.02.2009, 17:35   #11  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 868 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Цитата:
Сообщение от miklenew Посмотреть сообщение
Да у меня остатки расходятся с проводками.
Написал джобик он недолго работает 10 минут.
Раз в неделю запускаю 6-8 позиций исправляет.
Но надо решать эту проблему.
Есть подозрения что это из-за блокировок.
По первому предложению создается стойкое ощущение, что у вас InventSum != сумме InventTrans по полям ItemId & InventDimId.

Такое расхождение может возникнуть только при использовании doUpdate на InventTrans. Так как в update, insert, delete происходит обновление InventSum, то есть они всегда обновляются в паре.

Или я что-то опять не так понял?
Старый 13.02.2009, 20:18   #12  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 438 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от Wamr Посмотреть сообщение
По первому предложению создается стойкое ощущение, что у вас InventSum != сумме InventTrans по полям ItemId & InventDimId.
Всё правильно.
Цитата:
Сообщение от Wamr Посмотреть сообщение
Такое расхождение может возникнуть только при использовании doUpdate на InventTrans.
Я конечно поищу. Но всё же уже больше года работаю с этой прилагой и ламерских косяков в ней пока не встречал. Ошибки есть, я их исправляю, но не до такой же степени. В целом нормально, жить можно. Когда-то хорошую школу прошёл у человека, который учился у тебя. Сначала он у тебя, потом я у него.
Здесь степень модификаций (по формуле mazzy) даже чуть по меньше, чем у нас было на общем месте работы. Так что не привыкать.
Отвлёкся.
Цитата:
Сообщение от Wamr Посмотреть сообщение
Так как в update, insert, delete происходит обновление InventSum, то есть они всегда обновляются в паре.
Или я что-то опять не так понял?
Всё правильно. Но классы то InventUpdate и InventMovement модифицированы, есть даже сильные утверждения, которые архитиктуры связей меняют. Сильно измененена связь InventTrans -> InventTransPosting.
Резервирование сильно переделано.
Блокировки я уже откинул.
Вчера сделал пересчёт InventSum. Сегодня появилось две позиции.
Причём по этим номенклатурам блокировок не было.
Буду дальше искать.
Эта проблема замечена была несколько месяцев назад.
Пересчёт InventSum-а раз в неделю помогал.
Просто текучки хватало. Щас посвободнее стало вот и решил пора искать.
Найду.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.

Последний раз редактировалось miklenew; 13.02.2009 в 20:20.
Старый 13.02.2009, 20:25   #13  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,497 / 1096 (39) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
Сообщение от miklenew Посмотреть сообщение
Вчера сделал пересчёт InventSum. Сегодня появилось две позиции.
Если проблема так быстро проявляется, то рискну предложить вариант поиска.
Используем этот проект, включаем лог базы данных по всем операциям на InventTrans, через день отключаем лог, находим ошибочные позиции, смотрим по логу как это призошло.
За это сообщение автора поблагодарили: Dron AKA andy (4), miklenew (5).
Старый 13.02.2009, 21:51   #14  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 438 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от raz Посмотреть сообщение
Используем этот проект, включаем лог базы данных по всем операциям на InventTrans, через день отключаем лог, находим ошибочные позиции, смотрим по логу как это призошло.
Спасибо. Классная штука.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 17.02.2009, 12:37   #15  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 438 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Нашёл.
Была форма о которой я даже и не знал.
Она делила строки журнала, в текущем уменьшала количество и выносила их в другой журнал.
Ошибка была когда количество из текущего журнала полностью выносилось в другой журнал.
В ней был такой код
X++:
              if (!inventTrans.Qty)
                  inventTrans.delete();
              else
                  inventTrans.update();
На первый взгляд безобидный.
Только при qty = 0 inventTrans удалялся, а InventSum не пересчитывался. Понятно почему, количество то ноль.
Сделал так
X++:
              if (!inventTrans.Qty)
              {
                  inventTrans.update();
                  inventTrans.delete();
              }
              else
                  inventTrans.update();
Ошибка исчезла.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
За это сообщение автора поблагодарили: Logger (2).
Старый 16.06.2009, 19:09   #16  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,984 / 3273 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от miklenew Посмотреть сообщение
Нашёл.
Была форма о которой я даже и не знал.
Она делила строки журнала, в текущем уменьшала количество и выносила их в другой журнал.
Ошибка была когда количество из текущего журнала полностью выносилось в другой журнал.
В ней был такой код
X++:
              if (!inventTrans.Qty)
                  inventTrans.delete();
              else
                  inventTrans.update();
На первый взгляд безобидный.
Только при qty = 0 inventTrans удалялся, а InventSum не пересчитывался. Понятно почему, количество то ноль.
Сделал так
X++:
              if (!inventTrans.Qty)
              {
                  inventTrans.update();
                  inventTrans.delete();
              }
              else
                  inventTrans.update();
Ошибка исчезла.
Ого !

Получается что в InventTrans.delete() есть ошибка.

Вместо вызова

X++:
        if (InventSum::mustInventTransBeUpdated(this))
        {
            inventSum = appl.inventUpdateTTSControl().inventSumSelectLocked(this);
            inventSum.updateInventTrans(this,NoYes::No);
        }
правильнее поставить

X++:
        if (InventSum::mustInventTransBeUpdated(this.orig()))
        {
            inventSum = appl.inventUpdateTTSControl().inventSumSelectLocked(this.orig());
            inventSum.updateInventTrans(this.orig(),NoYes::No);
        }
Потому что иначе легко развалить связку InventSum и InventTrans - что собственно и произошло в вашем примере. Сперва отредактировали количество в проводке, поняли что оно 0 и update() ни к чему - вызвали delete() и получили ошибку, там где не ожидали.

Delete() должен работать на основе значений которые лежат в базе, а не в текущем буфере.

В принципе нечто подобное сделано в методе inventTrans.update() - сперва из InventSum вычитаются значения this.orig() а затем прибавляются значения this. Нужно было код перенести убрав прибавку this но оставив вычитание this.orig() Т.е. автор InventTrans.delete() неявно заложился на то что удаляемый InventTrans перед удалением не редактировался.

Последний раз редактировалось Logger; 16.06.2009 в 19:16. Причина: уточнение
За это сообщение автора поблагодарили: Maximin (1), miklenew (2).
Старый 17.02.2009, 12:39   #17  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 438 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Спасибо ещё раз raz за проект.
Модераторам:
Почему тема с проектом raz-a не в Базе знаний?
Перенесите пожалуйста.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Теги
internal, блокировка, лог, поиск ошибок, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Главная книга / Запросы / Аудит (TransactionLog) Зачем и кому он нужен? ta_and DAX: Функционал 18 24.09.2008 10:14
Эскалация блокировок в MSSQL fomenka DAX: Администрирование 6 24.04.2007 06:02
сброс блокировок при update somebody DAX: Программирование 3 27.03.2007 11:31
?Аудит пользователей Axapta Gray DAX: Администрирование 4 09.06.2004 07:08
Описание функциональности модуля "Аудит действий пользователей системы" D.Cheprasov DAX: Прочие вопросы 2 22.03.2004 04:32

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

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

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