Показать сообщение отдельно
Старый 27.11.2007, 20:20   #13  
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.