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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.02.2011, 10:57   #1  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Che Посмотреть сообщение
Проблема в следующем - склады с которых списывается продукция в 1с не должны уходить в минус по партии... Чтобы каждый раз не высчитывать по inventtrans`у - решил брать остатки с inventsum (жду критики ).
http://axapta.mazzy.ru/lib/inventsumdate/

Цитата:
Сообщение от Che Посмотреть сообщение
Но как мне проверить количество, учитывая ранее закаченный заказ, но не разнесенный? Т.е. я закачиваю сначала заказы, допустим со склад1 на склад2 (насколько я понимаю данное количество получается в заказе), потом - заказы со склада2 на клиентов... дык вот, если проверять при закачке заказов на клиента по полю физ. доступно - ясно дело количества по партии не хватит.
По каким полям высчитать "доступное количество" по партии?
Может где нибудь есть тема по расшифровке полей inventsum (но что то не нашел)?
легко:
1 - физическое наличие - товар лежит на полках
2 - зарезервировано из физ.наличия - зарезервировано из того, что лежит на полках
3 - доступно на полках после резервирования
4 - ожидается приход (заказы на покупку/журналы в статусе Заказано)
5 - ожидается расход (заказы на продажу/журналы в статусе Заказано)
6 - зарезервировано из ожидаемого прихода (если включена эта функциональность)
7 - доступно с учетом ожидаемого прихода и расхода

вам нужна колока 7

на вкладке "В наличии" есть более детальные суммы.
Миниатюры
Нажмите на изображение для увеличения
Название: 1.PNG
Просмотров: 363
Размер:	96.9 Кб
ID:	6613  
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: Che (1).
Старый 22.02.2011, 11:02   #2  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
Спасибо за исчерпывающие ответы!
Честно говоря, думал что будет критика))))
Все-таки, как думаете, оптимально ли по инвентсуму проверять (сам уже не раз сталкивался с корявыми остатками)... Но по инвенттрансу - долго

Последний раз редактировалось Che; 22.02.2011 в 11:04.
Старый 22.02.2011, 11:09   #3  
Evgeniy2020 is offline
Evgeniy2020
Участник
 
309 / 68 (3) ++++
Регистрация: 10.04.2007
Адрес: Москва, САО, СЗАО
рекомендую сначала сделать пробное суммирование по inventtrans по 200 - 1000 номенклатур и сравнить полученное значение с inventsum по этим же номенклатурам. если различий будет очень очень мало, то можно и по inventsum остатки считать.

но у нас было много кастомизаций. в итоге беглое сравнение показало что для первых 1000 номенклатур в 30% случаях суммы отличаются.

видимо где не успевало обновится inventsum
если у вас различия меньше 5% то можно наверно и по inventsum.
Старый 22.02.2011, 11:15   #4  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
Цитата:
Сообщение от Evgeniy2020 Посмотреть сообщение
рекомендую сначала сделать пробное суммирование по inventtrans по 200 - 1000 номенклатур и сравнить полученное значение с inventsum по этим же номенклатурам. если различий будет очень очень мало, то можно и по inventsum остатки считать.

но у нас было много кастомизаций. в итоге беглое сравнение показало что для первых 1000 номенклатур в 30% случаях суммы отличаются.

видимо где не успевало обновится inventsum
если у вас различия меньше 5% то можно наверно и по inventsum.
Ок! Спасибо! Но я думаю при возникновении ошибок воспользуюсь джобиком:
X++:
static void Job70(Args _args)
{
    InventTrans     inventTransStatus;
    RecordSortedList cacheInventSum;
    InventSum       inventSum;
    InventSum       inventSumCurrent;
    InventDimId     lastDimId;
    ItemId          itemId;
    boolean         mustInventBeControlled;
    boolean         ok;
    Dialog          dialog = new Dialog("Пересчет");
    DialogField     dfItemId;
    InventTable     iTb;

    void testSum(InventSum _inventSum)
    {
        inventSumCurrent.itemId         = _inventSum.itemId;
        inventSumCurrent.inventDimId    = _inventSum.inventDimId;
        cacheInventSum.find(inventSumCurrent);
        cacheInventSum.del(inventSumCurrent);
    }
    dfItemId = dialog.addFieldValue(typeid(ItemId),itemId,"Номенклатура");
    if(!dialog.run()) return; itemId = dfItemId.value();
    cacheInventSum = new RecordSortedList(TableNum(InventSum));
    cacheInventSum.sortOrder(FieldNum(InventSum,itemId),FieldNum(InventSum,inventDimId));
//Che
while select iTb where iTb.ItemId like itemId
{
//Che

//    mustInventBeControlled = InventTable::find(itemId).inventItemType().mustInventBeControlled();
    mustInventBeControlled = InventTable::find(iTb.ItemId).inventItemType().mustInventBeControlled();
    ttsbegin;
//    while select forupdate inventSum where inventSum.itemId == itemId
    while select forupdate inventSum where inventSum.itemId == iTb.ItemId
    {
        cacheInventSum.ins(inventSum);
        inventSum.delete();
    }
    if(mustInventBeControlled)
    {
    while select sum(qty),sum(costAmountPosted),sum(costAmountAdjustment),sum(CostAmountSecCurPosted_RU),sum(CostAmountSecCurAdjustment_RU),sum(CostAmountSecCurPhysical_RU),sum(costAmountPhysical)
            from inventTransStatus group by itemId,inventDimId,statusReceipt,statusIssue,datePhysical,dateInvent,dateExpected
//            where inventTransStatus.itemId == itemId
            where inventTransStatus.itemId == iTb.ItemId
        {
            if (ok)
            {
             if (inventTransStatus.inventDimId != lastDimId)
             {
//              inventSum.itemId        = itemId;
              inventSum.itemId        = iTb.ItemId;
              inventSum.inventDimId   = lastDimId;
              inventSum.insert();
              testSum(inventSum);
              inventSum.clear();
             }//if (inventTransStatus.inventDimId != lastDimId)
            } //if (ok)
            else ok = true;
            lastDimId       = inventTransStatus.inventDimId;
            inventSum.addInventTransOnSum(inventTransStatus);
        } //while
    }//if(mustInventBeControlled)
            if (ok)
            {
//             inventSum.itemId        = itemId;
             inventSum.itemId        = iTb.ItemId;
             inventSum.inventDimId   = lastDimId;
             inventSum.insert();
             testSum(inventSum);
            }//if (ok)
    ttscommit;
}//while select iTb where iTb.ItemId like itemId
}
Мало ли кому поможет)

Последний раз редактировалось Che; 22.02.2011 в 11:22.
Старый 22.02.2011, 12:43   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Che Посмотреть сообщение
Ок! Спасибо! Но я думаю при возникновении ошибок воспользуюсь джобиком:
это неправильный джобик.
на правильный указал S.Kuskov
там же сказано как сделать принудительный пересчет без джобиков, из главного меню
__________________
полезное на axForum, github, vk, coub.
Старый 22.02.2011, 12:50   #6  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
Цитата:
Сообщение от mazzy Посмотреть сообщение
это неправильный джобик.
на правильный указал S.Kuskov
там же сказано как сделать принудительный пересчет без джобиков, из главного меню
Хм... что же в нем не так? Вроде как нормально отрабатывает
Из главного меню, честно говоря не пользовался) Попробую...
Старый 22.02.2011, 13:06   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Che Посмотреть сообщение
Хм... что же в нем не так? Вроде как нормально отрабатывает
1. Закат солнца вручную
2. в вашей проверке нет таблицы inventSettlement, поэтому финансовые остатки вы проверить не сможете. только количество.
3. поле costAmountAdjustment само по себе является агрегатом (= sum of inventSettlement). это поле может содержать неверные значения (обычно из-за вмешательства программистов). Его нельзя использовать для ПРОВЕРКИ!

и сравните со стандартным кодом:
Пересчет inventSum
юзайте стандартные классы
__________________
полезное на axForum, github, vk, coub.
Старый 22.02.2011, 11:12   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1776 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Che Посмотреть сообщение
Все-таки, как думаете, оптимально ли по инвентсуму проверять (сам уже не раз сталкивался с корявыми остатками)... Но по инвенттрансу - долго
Ну как бы так сказать... она (таблица InventSum) как раз для этого и предназначена. Все стандартные проверки при разноске складских проводок используют её в этих целях.

А то что она у вас корявая, это значит что вы ручками/программно корректируете InventTrans в обход стандарта.
Также помните что всегда можно запустить процедуру пересчёта/актуализации InventSum.

Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
Если inventsum расходится с inventtrans - это повод сильно задуматься над работоспособностью вашего "решения".
Это повод задуматься над работоспособностью всей системы!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX Sustained Engineering: Fields modifiedDateTime and modifiedBy on Table InventSum Blog bot DAX Blogs 0 30.12.2010 00:12
InventSum Alexanderrrr DAX: Функционал 18 12.01.2010 07:43
Ошибка при разноске складских движений Starling DAX: Администрирование 9 12.10.2007 14:21
Вытащить записи из InventSum ... Rimantas DAX: Программирование 23 07.11.2006 14:47
Остатки номенклатуры Def DAX: Программирование 16 16.11.2005 16:12

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

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

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