30.11.2006, 11:51 | #1 |
Moderator
|
Можно ли чистить InventSum?
День Добрый!
Вопрос такой -- можно ли из InventSum удалять записи с Closed == NoYes::Yes и ClosedQty == NoYes::Yes Выводит количество таких записей (у нас примерно 80%): PHP код:
|
|
30.11.2006, 12:11 | #2 |
Member
|
__________________
С уважением, glibs® |
|
30.11.2006, 12:56 | #3 |
Moderator
|
Вы правы! Спасибо! Не углядел
|
|
01.12.2006, 09:51 | #4 |
Участник
|
Цитата:
Обрати внимание, что у InventSum есть методы isAllFieldsZero isAllQtyFieldsZero isAllValueFieldsZero Надо проверить записи для которых InventSum.isAllFieldsZero() == true Такие записи могут появляться в двух случаях: 1. выполнен приход и расход. Итог обнулился, но его удалять нельзя 2. человек создал строчку в журнале/заказе/закупке с неправильной складской аналитикой. Но потом обнаружил свою ошибку и исправился до разноски. В этом случае в InventDim появится запись с комбинацией, которая нигде больше не используется. А в inventSum - запись с итогами на такой InventDim. Такие inventSum могут быть и закрытыми, и незакрытыми. Поэтому правильный алгоритм такой: 1. Найти записи в InventSum для которых InventSum.isAllFieldsZero() == true 2. Найти количество InventTrans для таких записей 3. Если количество в InventTrans == 0, то InventSum удалять можно. Дополнительное расширение алгоритма: = сначала можно проверить "забытые" inventTrans - остались ли неразнесенные InventTrans, которые относятся к несуществующим (или аннулированным) журналам/заказам/закупкам/производству = в конкретном вашем случае можно смягчить проверку и проверять InventSum.isAllQtyFieldsZero() == true (но будь предельно внимательным если у тебя появились записи в InventSum c нулевым количеством И ненулевой суммой И с отсутствующими проводками в InventTrans - это признак того, что в базу вмешивались грубой силой.) |
|
01.12.2006, 09:59 | #5 |
Участник
|
И еще одно.
После грубых манипуляций с InventSum обязательно стоит выполнить процедуру Проверка целостности данных компании, в которой указать режим Коррекция и оставить галочку Управление Запасами, Номенклатура, В наличии. Эта процедура пересчитывает InventSum (но ничего не удаляет) См. класс InventConsistencyCheck_Onhand Обрати внимание, что: 1. на 40Гб базе эта процедура может выполняться несколько часов 2. она блокирует работу пользователей, которые работают со складом (поэтому эту процедуру лучше выполнять ночью) |
|
01.12.2006, 12:23 | #6 |
Участник
|
Цитата:
Лишняя проверка. |
|
01.12.2006, 17:46 | #7 |
Moderator
|
2 mazzy:
Большое Спасибо за подробную инструкцию, сейчас поэксперементирую - результаты скину. |
|
01.12.2006, 18:47 | #8 |
Участник
|
Цитата:
Извините за пропущенное слово Полная фраза InventSum.isAllFieldsZero() == true и количество записей в inventTrans != 0 полный правильный алгоритм Поэтому правильный алгоритм такой: 1. Найти записи в InventSum для которых InventSum.isAllFieldsZero() == true 2. Найти количество записей InventTrans для каждой записи из InventSum 3. Если количество записей в InventTrans == 0, то InventSum удалять можно. |
|
01.12.2006, 18:47 | #9 |
Участник
|
Хорошо.
|
|
04.12.2006, 10:23 | #10 |
Участник
|
Цитата:
Сообщение от mazzy
Нет, не лишняя.
Извините за пропущенное слово Полная фраза InventSum.isAllFieldsZero() == true и количество записей в inventTrans != 0 полный правильный алгоритм Поэтому правильный алгоритм такой: 1. Найти записи в InventSum для которых InventSum.isAllFieldsZero() == true 2. Найти количество записей InventTrans для каждой записи из InventSum 3. Если количество записей в InventTrans == 0, то InventSum удалять можно. |
|
04.12.2006, 10:40 | #11 |
Модератор
|
Цитата:
- десятого его продайте - постройте отчеты из Управление запасами / Отчеты / Статус / Физическое наличие на пятое число - убедитесь, что CLOSED==1 && CLOSEDQTY==1 - удалите INVENTSUM - снова постройте отчеты glibs писал именно об этом Цитата:
Какой смысл смотреть количество в инвенттрансе, если уже по этому флагу мы знаем, что такую запись из инвентсума можно удалить вместе со всеми складскими проводками
__________________
-ТСЯ или -ТЬСЯ ? |
|
04.12.2006, 11:26 | #12 |
Участник
|
Цитата:
Но кроме штатных средств есть экспорт/импорт и doInsert/doUpdate/doDelete Складские проводки (InventTrans) нельзя удалять ни в коем случае. В крайнем случае можно объединять штатной функцией Суммирование. Но не удалять! (InventTrans удалять только после того, как решение будет обдумано и взвешено 7 раз и то, только через год после принятия решения об удалении) |
|
04.12.2006, 16:50 | #13 |
Участник
|
Цитата:
От этого некоторые отчеты правда перестанут работать, но другой функционал (обработка накладных и т.п.) не должен пострадать. |
|
04.12.2006, 16:58 | #14 |
Участник
|
Цитата:
Если вас это не беспокоит, то и в самом деле почему бы не удалить? |
|
05.12.2006, 14:56 | #15 |
Member
|
Цитата:
Сообщение от xshaman
...
Все таки не совсем понятна необходимость проверки на кол-во заприсей в складских проводках. ... А вообще можно, конечно, просто все удалить и запустить пересчет InventSum. Но оно восстановит записи с нулевым количеством и нулевой стоимостью.
__________________
С уважением, glibs® |
|
05.12.2006, 15:01 | #16 |
AX*****
|
можно использовать вместо длительного
Цитата:
Проверка целостности данных компании
X++: static void Job(Args _args) { InventSumReCalcItem reCalcItem; Dialog dialog = new Dialog("Коррекция остатков номенклатуры"); DialogField dialogItemId = dialog.addField(typeId(ItemId)); ItemId itemId; InventTable inventTable; ; if (dialog.run()) { itemId = dialogItemId.value(); } if (itemId) { while select inventTable where inventTable.ItemId == itemId { reCalcItem = new InventSumReCalcItem(inventTable.ItemId, true, CheckFix::Fix); reCalcItem.updateNow(); } } } |
|
05.12.2006, 15:12 | #17 |
Участник
|
1. Спасибо.
2. Обсуждение сильно уходит в сторону от исходного вопроса. Метод reCalcItem.updateNow() не удаляет никаких записей, насколько я помню. Он только пересчитывает те записи, которые в момент пересчета затрагиваются в inventTrans. |
|
05.12.2006, 15:22 | #18 |
AX*****
|
не согласен.. В версии 2.5 если по номенклатуре есть левые остатки ничем кроме inventsum не подкреплены -- данный код "убьет" эти остатки из таблицы inventsum.
|
|
05.12.2006, 15:31 | #19 |
Участник
|
Цитата:
Вот кусок кода из метода loadCurrentInventSum() (вызывается внутри updateNow()) X++: while select forupdate inventSum where inventSum.itemId == itemId { cacheInventSum.ins(inventSum); if (checkFix == checkFix::Fix) inventSum.delete(); } }
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: aidsua (1). |
05.12.2006, 15:38 | #20 |
Участник
|
|
|
Теги |
inventsum, производительность |
|
|