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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.11.2006, 11:51   #1  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
? Можно ли чистить InventSum?
День Добрый!

Вопрос такой -- можно ли из InventSum удалять записи с Closed == NoYes::Yes и ClosedQty == NoYes::Yes

Выводит количество таких записей (у нас примерно 80%):
PHP код:
static void countEmptyInventSum(Args _args)
{
    
Query                   query = new Query();
    
QueryBuildDataSource    qbdsInventSum;
    
QueryRun                queryRun;
    ;

    
qbdsInventSum query.addDataSource(tableNum(InventSum));
    
qbdsInventSum.addRange(fieldNum(InventSumClosedQty)).value(SysQuery::value(NoYes::Yes));
    
qbdsInventSum.addRange(fieldNum(InventSumClosed)).value(SysQuery::value(NoYes::Yes));
    
queryRun = new queryRun(query);

    
info(strFmt("%1",SysQuery::countTotal(queryRun)));

Старый 30.11.2006, 12:11   #2  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Пользуйтесь поиском!

Пересчет inventSum
__________________
С уважением,
glibs®
Старый 30.11.2006, 12:56   #3  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Вы правы! Спасибо! Не углядел
Старый 01.12.2006, 09:51   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от DreamCreator Посмотреть сообщение
Вопрос такой -- можно ли из InventSum удалять записи с Closed == NoYes::Yes и ClosedQty == NoYes::Yes
Мы немножко не о том говорили.
Обрати внимание, что у 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 - это признак того, что в базу вмешивались грубой силой.)
__________________
полезное на axForum, github, vk, coub.
Старый 01.12.2006, 09:59   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
И еще одно.
После грубых манипуляций с InventSum обязательно стоит выполнить процедуру Проверка целостности данных компании, в которой указать режим Коррекция и оставить галочку Управление Запасами, Номенклатура, В наличии.

Эта процедура пересчитывает InventSum (но ничего не удаляет)
См. класс InventConsistencyCheck_Onhand

Обрати внимание, что:
1. на 40Гб базе эта процедура может выполняться несколько часов
2. она блокирует работу пользователей, которые работают со складом (поэтому эту процедуру лучше выполнять ночью)
__________________
полезное на axForum, github, vk, coub.
Старый 01.12.2006, 12:23   #6  
xshaman is offline
xshaman
Участник
 
36 / 11 (1) +
Регистрация: 17.12.2003
Адрес: Санкт-Петербург
Цитата:
Сообщение от mazzy Посмотреть сообщение
Поэтому правильный алгоритм такой:
1. Найти записи в InventSum для которых InventSum.isAllFieldsZero() == true
2. Найти количество InventTrans для таких записей
3. Если количество в InventTrans == 0, то InventSum удалять можно.
Как может быть InventSum.isAllFieldsZero() == true и количество в inventTrans != 0?

Лишняя проверка.
Старый 01.12.2006, 17:46   #7  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
2 mazzy:

Большое Спасибо за подробную инструкцию, сейчас поэксперементирую - результаты скину.
Старый 01.12.2006, 18:47   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от xshaman Посмотреть сообщение
Как может быть InventSum.isAllFieldsZero() == true и количество в inventTrans != 0?

Лишняя проверка.
Нет, не лишняя.
Извините за пропущенное слово
Полная фраза
InventSum.isAllFieldsZero() == true и количество записей в inventTrans != 0

полный правильный алгоритм
Поэтому правильный алгоритм такой:
1. Найти записи в InventSum для которых InventSum.isAllFieldsZero() == true
2. Найти количество записей InventTrans для каждой записи из InventSum
3. Если количество записей в InventTrans == 0, то InventSum удалять можно.
__________________
полезное на axForum, github, vk, coub.
Старый 01.12.2006, 18:47   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от DreamCreator Посмотреть сообщение
2 mazzy:

Большое Спасибо за подробную инструкцию, сейчас поэксперементирую - результаты скину.
Хорошо.
__________________
полезное на axForum, github, vk, coub.
Старый 04.12.2006, 10:23   #10  
xshaman is offline
xshaman
Участник
 
36 / 11 (1) +
Регистрация: 17.12.2003
Адрес: Санкт-Петербург
Цитата:
Сообщение от mazzy Посмотреть сообщение
Нет, не лишняя.
Извините за пропущенное слово
Полная фраза
InventSum.isAllFieldsZero() == true и количество записей в inventTrans != 0

полный правильный алгоритм
Поэтому правильный алгоритм такой:
1. Найти записи в InventSum для которых InventSum.isAllFieldsZero() == true
2. Найти количество записей InventTrans для каждой записи из InventSum
3. Если количество записей в InventTrans == 0, то InventSum удалять можно.
Все таки не совсем понятна необходимость проверки на кол-во заприсей в складских проводках. InventSum.isAllFieldsZero() = true говорит нам о том, что все количественные поля в инвентсуме = 0 (то есть ничего не заказано, не зарезервировано и тд) - а значит в наличии нет. Какой смысл смотреть количество в инвенттрансе, если уже по этому флагу мы знаем, что такую запись из инвентсума можно удалить вместе со всеми складскими проводками.
Старый 04.12.2006, 10:40   #11  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от xshaman Посмотреть сообщение
Все таки не совсем понятна необходимость проверки на кол-во заприсей в складских проводках
- первого числа купите ящик гвоздей
- десятого его продайте
- постройте отчеты из Управление запасами / Отчеты / Статус / Физическое наличие на пятое число
- убедитесь, что CLOSED==1 && CLOSEDQTY==1
- удалите INVENTSUM
- снова постройте отчеты
glibs писал именно об этом

Цитата:
Какой смысл смотреть количество в инвенттрансе, если уже по этому флагу мы знаем, что такую запись из инвентсума можно удалить вместе со всеми складскими проводками
Программисты должны быть смелыми (c) ?
__________________
-ТСЯ или -ТЬСЯ ?
Старый 04.12.2006, 11:26   #12  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от xshaman Посмотреть сообщение
Все таки не совсем понятна необходимость проверки на кол-во заприсей в складских проводках.
Если изменения происходили штатными средствами, то необходимости в проверке нет.
Но кроме штатных средств есть экспорт/импорт и doInsert/doUpdate/doDelete

Складские проводки (InventTrans) нельзя удалять ни в коем случае.
В крайнем случае можно объединять штатной функцией Суммирование.
Но не удалять!

(InventTrans удалять только после того, как решение будет обдумано и взвешено 7 раз и то, только через год после принятия решения об удалении)
__________________
полезное на axForum, github, vk, coub.
Старый 04.12.2006, 16:50   #13  
Dodger is offline
Dodger
Участник
 
26 / 15 (1) ++
Регистрация: 02.12.2005
Цитата:
Сообщение от mazzy Посмотреть сообщение
Складские проводки (InventTrans) нельзя удалять ни в коем случае.
В крайнем случае можно объединять штатной функцией Суммирование.
Но не удалять!
А почему удалять нельзя? Например, взять и удалить "старые" складские проводки.
От этого некоторые отчеты правда перестанут работать, но другой функционал (обработка накладных и т.п.) не должен пострадать.
Старый 04.12.2006, 16:58   #14  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Dodger Посмотреть сообщение
От этого некоторые отчеты правда перестанут работать, но другой функционал (обработка накладных и т.п.) не должен пострадать.
И в самом деле - мелочь какая - "некоторые отчеты перестанут работать".
Если вас это не беспокоит, то и в самом деле почему бы не удалить?
__________________
полезное на axForum, github, vk, coub.
Старый 05.12.2006, 14:56   #15  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Цитата:
Сообщение от xshaman
...
Все таки не совсем понятна необходимость проверки на кол-во заприсей в складских проводках.
...
Я сам не пробовал, но слыхал, что если включить IMTS, то InventSum может стать недостоверным. Так что, как говорится, лучше перебдеть чем недобдеть.

А вообще можно, конечно, просто все удалить и запустить пересчет InventSum. Но оно восстановит записи с нулевым количеством и нулевой стоимостью.
__________________
С уважением,
glibs®
Старый 05.12.2006, 15:01   #16  
aidsua is offline
aidsua
AX*****
Аватар для aidsua
 
106 / 40 (2) +++
Регистрация: 28.09.2005
Адрес: 2:463/Kyiv
можно использовать вместо длительного
Цитата:
Проверка целостности данных компании
ниже приведенный код.. если известен перечень номенклатур с некорректными отстатками (ручные исправления в базе).

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  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
1. Спасибо.
2. Обсуждение сильно уходит в сторону от исходного вопроса.
Цитата:
Сообщение от aidsua Посмотреть сообщение
reCalcItem.updateNow();
Метод reCalcItem.updateNow() не удаляет никаких записей, насколько я помню.
Он только пересчитывает те записи, которые в момент пересчета затрагиваются в inventTrans.
__________________
полезное на axForum, github, vk, coub.
Старый 05.12.2006, 15:22   #18  
aidsua is offline
aidsua
AX*****
Аватар для aidsua
 
106 / 40 (2) +++
Регистрация: 28.09.2005
Адрес: 2:463/Kyiv
Цитата:
Сообщение от mazzy Посмотреть сообщение
1. Спасибо.
2. Обсуждение сильно уходит в сторону от исходного вопроса.

Метод reCalcItem.updateNow() не удаляет никаких записей, насколько я помню.
Он только пересчитывает те записи, которые в момент пересчета затрагиваются в inventTrans.
не согласен.. В версии 2.5 если по номенклатуре есть левые остатки ничем кроме inventsum не подкреплены -- данный код "убьет" эти остатки из таблицы inventsum.
Старый 05.12.2006, 15:31   #19  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от mazzy Посмотреть сообщение
1. Спасибо.
Метод reCalcItem.updateNow() не удаляет никаких записей, насколько я помню.
Он только пересчитывает те записи, которые в момент пересчета затрагиваются в inventTrans.
Удаляет.
Вот кусок кода из метода loadCurrentInventSum() (вызывается внутри updateNow())
X++:
    while select forupdate inventSum
        where inventSum.itemId == itemId
    {
        cacheInventSum.ins(inventSum);

        if (checkFix == checkFix::Fix)
            inventSum.delete();
    }
}
checkFix::Fix устанавливается по умолчанию в конструкторе класса
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: aidsua (1).
Старый 05.12.2006, 15:38   #20  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от AndyD Посмотреть сообщение
Удаляет.
Спасибо
__________________
полезное на axForum, github, vk, coub.
Теги
inventsum, производительность

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Пересчет inventSum DreamCreator DAX: Программирование 43 15.11.2014 16:48
Книга Покупок можно ли не закрывать? asabin DAX: Функционал 1 18.11.2005 17:50
Можно ли в инамическом запросе использовать "group by"? yooshi DAX: Программирование 26 23.09.2005 16:35
Можно ли исп. switch задать диапазон для case ??? djoker DAX: База знаний и проекты 23 27.12.2004 15:28
Можно ли поменять налоговый код по проведенной закупке или накладной поставщика Голова 2уха DAX: Функционал 1 25.10.2004 11:51
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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