13.02.2009, 15:08 | #21 |
Участник
|
Ну я так и думал. Ваше исходное сообщение можно было понять словно из-за блокировок развалились InventSum и InventTrans. Как видно из примера ничего похожего и близко нет.
|
|
13.02.2009, 16:13 | #22 |
Участник
|
Процитирую сам себя
Та была совсем другая история, она давно закрыта.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
13.02.2009, 17:35 | #23 |
----------------
|
Цитата:
Такое расхождение может возникнуть только при использовании doUpdate на InventTrans. Так как в update, insert, delete происходит обновление InventSum, то есть они всегда обновляются в паре. Или я что-то опять не так понял? |
|
13.02.2009, 20:18 | #24 |
Участник
|
Цитата:
Цитата:
Здесь степень модификаций (по формуле mazzy) даже чуть по меньше, чем у нас было на общем месте работы. Так что не привыкать. Отвлёкся. Цитата:
Резервирование сильно переделано. Блокировки я уже откинул. Вчера сделал пересчёт InventSum. Сегодня появилось две позиции. Причём по этим номенклатурам блокировок не было. Буду дальше искать. Эта проблема замечена была несколько месяцев назад. Пересчёт InventSum-а раз в неделю помогал. Просто текучки хватало. Щас посвободнее стало вот и решил пора искать. Найду.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. Последний раз редактировалось miklenew; 13.02.2009 в 20:20. |
|
13.02.2009, 20:25 | #25 |
NavAx
|
Если проблема так быстро проявляется, то рискну предложить вариант поиска.
Используем этот проект, включаем лог базы данных по всем операциям на InventTrans, через день отключаем лог, находим ошибочные позиции, смотрим по логу как это призошло. |
|
|
За это сообщение автора поблагодарили: Dron AKA andy (4), miklenew (5). |
13.02.2009, 21:51 | #26 |
Участник
|
Цитата:
Сообщение от raz
Используем этот проект, включаем лог базы данных по всем операциям на InventTrans, через день отключаем лог, находим ошибочные позиции, смотрим по логу как это призошло.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
17.02.2009, 12:37 | #27 |
Участник
|
Нашёл.
Была форма о которой я даже и не знал. Она делила строки журнала, в текущем уменьшала количество и выносила их в другой журнал. Ошибка была когда количество из текущего журнала полностью выносилось в другой журнал. В ней был такой код 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). |
17.02.2009, 12:39 | #28 |
Участник
|
Спасибо ещё раз raz за проект.
Модераторам: Почему тема с проектом raz-a не в Базе знаний? Перенесите пожалуйста.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
27.02.2009, 21:55 | #29 |
Участник
|
Цитата:
Как обнаружил - накладывал фильтр по таблице по полю 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 | #30 |
MCITP
|
ошибка 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’. Странно, не сталкивался... Возможно причина в системных полях (MODIFIEDDATE)? Можете вложить примерчик?
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: Logger (1). |
28.02.2009, 20:39 | #31 |
Участник
|
Джобец
X++: // GRD_fixQueryValue_pkoz // pkoz 27.02.2009 static void Job463(Args _args) { int dd; // str data;// = 27\02\2009; date data = dateNull(); // date data = 27\02\2009; vendTable vendTable; Query Query; QueryRun qr; str getRange() { ; //return date2strXpp(data); return strFMT( '((%1==%2))', fieldStr(vendTable, modifiedDate), //QueryValue(data) // с таким параметром кривая дата будет пр использовании расширенных запросов date2strXpp(data) // а при таком все нормально ) ; } void qu(boolean _lit, boolean _ext, str _s) { boolean good; ; //info(""); Query = New Query(); if (_lit) Query.literals(1); if (_ext) Query.addDataSource(tableNum(vendTable)).addRange(fieldNum(vendTable, //modifiedDate recId )).value( getRange() ); else Query.addDataSource(tableNum(vendTable)).addRange(fieldNum(vendTable, modifiedDate)).value(QueryValue(data)); info(Query.dataSourceNo(1).toString()); qr = New QueryRun(Query); good = qr.next(); info(strFMT("%3 Литералы %1, Расш запрос %2, recId = %4", _lit, _ext, good ? "Есть результат" : "Нет результата", good ? qr.getNo(1).RecId : 0)); info(""); //info(""); } ; setPrefix("Оператор SQL"); info(getRange()); //GRD_SqlTraceOn(); //info(""); qu(0, 0); qu(0, 1); qu(1, 0); qu(1, 1); //info(""); //GRD_SqlTraceOff(); } Как вы и предполагали, проблема связана с использованием -Internal=NoCursorReuse Без использования этого ключа логирование может выдавать неверную информацию. modifiedDate - ни при чем При изменении даты фильтрации X++: date data = dateNull(); |
|
|
За это сообщение автора поблагодарили: ZVV (1). |
16.06.2009, 19:09 | #32 |
Участник
|
Цитата:
Сообщение от 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);
} Delete() должен работать на основе значений которые лежат в базе, а не в текущем буфере. В принципе нечто подобное сделано в методе inventTrans.update() - сперва из InventSum вычитаются значения this.orig() а затем прибавляются значения this. Нужно было код перенести убрав прибавку this но оставив вычитание this.orig() Т.е. автор InventTrans.delete() неявно заложился на то что удаляемый InventTrans перед удалением не редактировался. Последний раз редактировалось Logger; 16.06.2009 в 19:16. Причина: уточнение |
|
|
За это сообщение автора поблагодарили: Maximin (1), miklenew (2). |
Теги |
internal, блокировка, лог, поиск ошибок, полезное |
|
|