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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.11.2007, 17:44   #1  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
Цитата:
Сообщение от Vals Посмотреть сообщение
По какой комбинации аналитик?
по тому inventDimId что имеется в текущем InventSum(галку непосредственно в гриде) нужна

Цитата:
Сообщение от Vals Посмотреть сообщение
ПОпробуйте стандартный фильтр
стандартный то работает, хочется чтобы по галке (для простоты и удобства )
Старый 27.11.2007, 20:20   #2  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Прежде всего хотел сказать что форма SalesQuickQuote работает не правильно.
Причина в классе InventDimCtrl_Frm_QuickQuote метод initQuery строчка
X++:
queryBuildDs.addSelectionField(FieldNum(InventSum, inventDimId), SelectionField::MIN);
Поясню к чему это приводит.
Пусть есть номенклатура 1. По ней 3 остатка в inventsum(1, 2, 3).
остаток 1 - 100 шт.
остаток 2 - 50 шт.
остаток 3 - 40 шт.
Так вот когда у нас в отображение аналитики все галки сняты кроме itemId(номенклатуры). У нас они отображаются в виде 190 шт. Если мы поставим в edit-поле количество 190 шт. То они проставятся, но как. Заходим в отображение аналитики. Ставим все галки. Грид распахнулся, физ доступно расщепилось на состовляющие, но мы видим что это количество стоит только в одном строке. В какой? В отсатке 1. Т.к. причина та строка которую я написал. Вообщем такой финт ушами, только не правильный.
В проекте я изменил edit метод
X++:
edit Qty  Qty(boolean      set,
                        InventSum   _inventSum,
                        Qty    _qty)
{
    InventTrans inventTrans;
    Qty         qty;
    MRD_SelectQtyFromInventTrans selectQtyFromInventTrans;
    Map             map;
    MapEnumerator   mapEnumerator;
    InventDim       inventDimLoc;
    InventDim       inventDimLoc2;
    InventDimParm   inventDimParm;
    ;
    inventDimParm = inventDimFormSetup.dimParmVisibleGrid(); //чтобы знать какие аналитики отмечены галачками
    inventDimLoc2 = InventDim::find(_inventSum.InventDimId); //всэ то же min inventdim навязаный системой, но из него мы возмём то что нам нужно
    select sum (Qty) from tmpFrmVirtual
        where    tmpFrmVirtual.ItemId == _inventSum.itemId
            join inventDimLoc
                where inventDimLoc.inventDimId == tmpFrmVirtual.inventDimId &&
                   ((inventDimParm.InventBatchIdFlag && inventDimLoc.inventBatchId == inventDimLoc2.inventBatchId)
                    || !inventDimParm.InventBatchIdFlag) &&
                   ((inventDimParm.WMSLocationIdFlag && inventDimLoc.wMSLocationId == inventDimLoc2.wMSLocationId)
                    || !inventDimParm.WMSLocationIdFlag) &&
                   ((inventDimParm.WMSPalletIdFlag && inventDimLoc.wMSPalletId == inventDimLoc2.wMSPalletId)
                    || !inventDimParm.WMSPalletIdFlag) &&
                   ((inventDimParm.InventSerialIdFlag && inventDimLoc.inventSerialId == inventDimLoc2.inventSerialId)
                    || !inventDimParm.InventSerialIdFlag) &&
                   ((inventDimParm.InventLocationIdFlag && inventDimLoc.inventLocationId ==inventDimLoc2.InventLocationId)
                    || !inventDimParm.InventLocationIdFlag) &&
                   ((inventDimParm.ConfigIdFlag && inventDimLoc.configId == inventDimLoc2.configId)
                    || !inventDimParm.ConfigIdFlag) &&
                   ((inventDimParm.InventSizeIdFlag && inventDimLoc.InventSizeId == inventDimLoc2.InventSizeId)
                    || !inventDimParm.InventSizeIdFlag) &&
                   ((inventDimParm.InventColorIdFlag && inventDimLoc.InventColorId == inventDimLoc2.InventColorId)
                    || !inventDimParm.InventColorIdFlag) &&
                   ((inventDimParm.InventGTDIdFlag_RU && inventDimLoc.InventGtdId_RU == inventDimLoc2.InventGtdId_RU)
                    || !inventDimParm.InventGTDIdFlag_RU) &&
                   ((inventDimParm.MRD_DefectFlag && inventDimLoc.MRD_DefectId == inventDimLoc2.MRD_DefectId)
                    || !inventDimParm.MRD_DefectFlag) &&
                   ((inventDimParm.MRD_UnitFlag && inventDimLoc.MRD_UnitID == inventDimLoc2.MRD_UnitID)
                    || !inventDimParm.MRD_UnitFlag) &&
                   ((inventDimParm.MRD_BusinessDirectionFlag && inventDimLoc.MRD_BusinessDirectionId == inventDimLoc2.MRD_BusinessDirectionId)
                    || !inventDimParm.MRD_BusinessDirectionFlag);
    // В tmp в отличие от стандарта я пишу не минимальный, а реальный inventdimId по этому мне нужно узнавать сумму количеств в зависимости от тех галочек которые выбраны
    if (tmpFrmVirtual)
    {
        qty = tmpFrmVirtual.qty;
    }
    else
    {
        tmpFrmVirtual.tableNum          = _inventSum.tableId;
        tmpFrmVirtual.itemId            = _inventSum.itemId;
        tmpFrmVirtual.inventDimId       = _inventSum.inventDimId;
        tmpFrmVirtual.insert();
    }

    if (set) //еслт пользователь вставил новое значение начинается подбор
    {
        delete_from tmpFrmVirtual
            where tmpFrmVirtual.ItemId == _inventSum.itemId;// прежние результаты подбора по номенклатуре удаляем
        if (_qty > 0)
        {//сам подбор происходит в класса MRD_SelectQtyFromInventTrans.(я подбираю аналитики и количества из проводок, хоть это и не правильно сточки зрения архитиктуры, но на этом настоял аналитик, вы можете изменить  и подбирать из InventSum)
            selectQtyFromInventTrans = new MRD_SelectQtyFromInventTrans(_inventSum.itemId, _qty, _inventSum.InventDimId, inventDimParm);
            selectQtyFromInventTrans.run();
            map = selectQtyFromInventTrans.getRezult();//возращается map InventDimId и количество, больше вам и не надо номенклатура у вас уже есть
            error("Не удалось подобрать " + num2str(selectQtyFromInventTrans.getRemain(),2,2,2,2) + " единиц номенклатуры: " + _inventSum.itemId);
            mapEnumerator = map.getEnumerator();
            while (mapEnumerator.moveNext())
            {
                tmpFrmVirtual.tableNum      = _inventSum.tableId;
                tmpFrmVirtual.itemId        = _inventSum.itemId;
                tmpFrmVirtual.inventDimId   = mapEnumerator.current();
                tmpFrmVirtual.qty           = mapEnumerator.currentValue();
                tmpFrmVirtual.insert();//заполнили подобранными аналитиками tmp
            }
        }
        else
            qty = 0;
        InventSumAuto_ds.research();
    }
    return qty;
}
А теперь собственно, где отбираются отобранные.
X++:
public boolean modified()
{
    boolean     ret;
    str         strDimId;
    QueryBuildDataSource qbdsInventSumHand;
    QueryBuildRange      qbrInventDimIdHand;
;

    qbdsInventSumHand = InventSumHand_ds.query().dataSourceTable(tablenum(InventSum));
    qbrInventDimIdHand = qbdsInventSumHand.findRange(fieldnum(InventSum, InventDimId));
    if (!qbrInventDimIdHand)
        qbrInventDimIdHand = qbdsInventSumHand.addRange(fieldnum(InventSum, InventDimId));

    ret = super();

    if (this.value() == NoYes::Yes)//если поставили галочку отобразить
    {
        while select tmpFrmVirtual
            where   tmpFrmVirtual.Qty >  0
        {
            strDimId = strDimId ?  strDimId + ', ' + tmpFrmVirtual.InventDimId : tmpFrmVirtual.InventDimId;
        }//отбираем inventdimId у которых количество проставлено, кстати узкий момент ели inventdim-ом будет много, могут в range все не уместится(надо будет подумать как исправить)


        if (strDimId)//строим по ним range
        {
            qbrInventDimIdHand.value(strDimId);
        }
        else
        {
            qbrInventDimIdHand.value("0");
        }
    }
    else
    {
         qbrInventDimIdHand.value(SysQuery::valueUnlimited());
    }
    InventSumHand_ds.executeQuery();

    return ret;
}
Есть ещё штука. Если количество не ноль строка подсвечивается. Мож тоже пригодится
X++:
public void displayOption(Common _record, FormRowDisplayOption _options)
{
    InventSum       inventSumLoc;
    InventDim       inventDimLoc;
    InventDimParm   inventDimParm;
    InventDim       inventDimLoc2;
;
    inventSumLoc = _record;
    inventDimParm = inventDimFormSetup.dimParmVisibleGrid();
    inventDimLoc2 = InventDim::find(inventSumLoc.InventDimId);
    select sum (Qty) from tmpFrmVirtual
    where    tmpFrmVirtual.ItemId == inventSumLoc.itemId
        join inventDimLoc
            where inventDimLoc.inventDimId == tmpFrmVirtual.inventDimId &&
               ((inventDimParm.InventBatchIdFlag && inventDimLoc.inventBatchId == inventDimLoc2.inventBatchId)
                || !inventDimParm.InventBatchIdFlag) &&
               ((inventDimParm.WMSLocationIdFlag && inventDimLoc.wMSLocationId == inventDimLoc2.wMSLocationId)
                || !inventDimParm.WMSLocationIdFlag) &&
               ((inventDimParm.WMSPalletIdFlag && inventDimLoc.wMSPalletId == inventDimLoc2.wMSPalletId)
                || !inventDimParm.WMSPalletIdFlag) &&
               ((inventDimParm.InventSerialIdFlag && inventDimLoc.inventSerialId == inventDimLoc2.inventSerialId)
                || !inventDimParm.InventSerialIdFlag) &&
               ((inventDimParm.InventLocationIdFlag && inventDimLoc.inventLocationId ==inventDimLoc2.InventLocationId)
                || !inventDimParm.InventLocationIdFlag) &&
               ((inventDimParm.ConfigIdFlag && inventDimLoc.configId == inventDimLoc2.configId)
                || !inventDimParm.ConfigIdFlag) &&
               ((inventDimParm.InventSizeIdFlag && inventDimLoc.InventSizeId == inventDimLoc2.InventSizeId)
                || !inventDimParm.InventSizeIdFlag) &&
               ((inventDimParm.InventColorIdFlag && inventDimLoc.InventColorId == inventDimLoc2.InventColorId)
                || !inventDimParm.InventColorIdFlag) &&
               ((inventDimParm.InventGTDIdFlag_RU && inventDimLoc.InventGtdId_RU == inventDimLoc2.InventGtdId_RU)
                || !inventDimParm.InventGTDIdFlag_RU) &&
               ((inventDimParm.MRD_DefectFlag && inventDimLoc.MRD_DefectId == inventDimLoc2.MRD_DefectId)
                || !inventDimParm.MRD_DefectFlag) &&
               ((inventDimParm.MRD_UnitFlag && inventDimLoc.MRD_UnitID == inventDimLoc2.MRD_UnitID)
                || !inventDimParm.MRD_UnitFlag) &&
               ((inventDimParm.MRD_BusinessDirectionFlag && inventDimLoc.MRD_BusinessDirectionId == inventDimLoc2.MRD_BusinessDirectionId)
                || !inventDimParm.MRD_BusinessDirectionFlag);
   if (tmpFrmVirtual && tmpFrmVirtual.Qty > 0)
        _options.backColor(WinApi::RGB2int(0, 255, 0));
    else
        _options.backColor(winapi::RGB2int(255, 255, 255 ));
    super(_record, _options);
}
Щас у меня подбирается всё правильно при любых вариантах, когда галочка отображать стоит только на номенклатуре и когда она стоит на других. И при схлопование и разхлоповании отображается коректно.

Последний раз редактировалось miklenew; 27.11.2007 в 20:43.
Старый 27.11.2007, 20:41   #3  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
Цитата:
Сообщение от miklenew Посмотреть сообщение
Пусть есть номенклатура 1. По ней 3 остатка в inventsum(1, 2, 3).
остаток 1 - 100 шт.
остаток 2 - 50 шт.
остаток 3 - 40 шт.
Так вот когда у нас в отображение аналитики все галки сняты кроме itemId(номенклатуры). У нас они отображаются в виде 190 шт. Если мы поставим в edit-поле количество 190 шт. То они проставятся, но как. Заходим в отображение аналитики. Ставим все галки. Грид распахнулся, физ доступно расщепилось на состовляющие, но мы видим что это количество стоит только в одном строке. В какой в отсатке 1. Т.к. причина та строка которую я написал.
кхм, в четверке сей факт пронаблюдать не удается...
Старый 27.11.2007, 20:50   #4  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от sparur Посмотреть сообщение
кхм, в четверке сей факт пронаблюдать не удается...
Молодцы. Значит исправили. А мне вот руками пришлось исправлять.
Четвёрки у меня нет посмотреть не могу. Но вот в тройке есть.
Ну раз исправили хорошо. Только вот посоветовать теперь мне сложно что-то вам. Я не знаю, как они это исправили. Рискну предположить, что в tmp у них теперь всё нормально тогда смело берить код modif-айд галки и у вас поидее должно всё работать. Хотя вот думаю как исправить возможный косяк c переполнением range. Прийдётся наврное не все значения в один range через запятую. А сколько inventDimId столько и range формировать.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
лукап-форма с доп. фильтром patron DAX: Программирование 10 30.03.2007 12:19
Как передать параметры из одной web форма в другую dtsymbal DAX: Программирование 9 28.02.2006 10:31
новая форма расчета авансовых платежей Fedr Kuzmich DAX: Программирование 4 20.04.2005 09:57
LookUp форма и параметры SnowMan DAX: Программирование 7 18.09.2003 16:04
Произвольная Lookup форма Maxim Gorbunov DAX: База знаний и проекты 0 30.11.2001 21:59

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

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

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