Показать сообщение отдельно
Старый 17.01.2007, 16:02   #2  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Пожалуйста: приведенный ниже код копирует поле из SalesLine в ReqPO. Практически ваш случай.

X++:
// EVGGL, PT0616 -->
protected void TCHUpdatePlannedOrderSalesPoolId(ReqSetupDim _setupDim)
{
    ReqTrans            reqTrans;
    ReqTransCov         reqTransCov;
    ReqTrans            reqTransSettled;
    SalesPoolId         salesPoolId, oldSalesPoolId;
    ReqPO               reqPO;

    Map                 mapPlannedOrder;
    MapIterator         mi_PlannedOrder;
    Map                 mapReqTransReceipts;

    ReqTransCache       reqTransCache   = reqPlanData.reqTransCache();

    mapPlannedOrder = reqTransCache.mapPlannedOrder();
    mapReqTransReceipts = reqTransCache.findReceipts(_setupDim);
    if (! mapPlannedOrder || ! mapReqTransReceipts)
        return;
    mi_PlannedOrder = new mapIterator(mapPlannedOrder);

    mi_PlannedOrder.begin();
    while (mi_PlannedOrder.more())
    {
        // ignore planned order coming from another cycle
        if (! mapReqTransReceipts.exists(mi_PlannedOrder.key()))
        {
            mi_PlannedOrder.next();
            continue;
        }

        reqTrans = mapPlannedOrder.lookup(mi_PlannedOrder.key());
        salesPoolId     = "";
        oldSalesPoolId  = "";

        if (reqTrans.CovQty && ! reqTrans.IsDerivedDirectly && ! reqTrans.IsForecastPurch &&
            (reqTrans.RefType == ReqRefType::ItemPlannedOrder || reqTrans.RefType == ReqRefType::BOMPlannedOrder))
        {
            reqTransCov     = reqTrans.selectCovJoinTrans(true);
            reqTransSettled = reqTransCov.joinChild();
            while (reqTransCov)
            {
                if (reqTransCov.Qty == 0)
                    continue;

                if (! reqTransSettled.InventTransId || ! reqTransSettled.RefId || reqTransSettled.RefType != ReqRefType::Sales)
                {
                    // There cannot be any common relation
                    salesPoolId = "";
                    break;
                }

                salesPoolId = SalesLine::findInventTransId(reqTransSettled.InventTransId).TCHSalesPoolId;
                if (! salesPoolId)
                    break;
                if (oldSalesPoolId && salesPoolId != oldSalesPoolId)
                {
                    salesPoolId = "";
                    break;
                }
                oldSalesPoolId = salesPoolId;

                next reqTransCov;
            }
            if (salesPoolId)
            {
                reqPO = reqTrans.reqPo(true);
                reqPO.TCHSalesPoolId = salesPoolId;
                reqPO.doUpdate();
            }
        }

        mi_PlannedOrder.next();
    }
}
Этот новый метод вызывается из ReqCalc.covCalc:
X++:
...
                                    }
                                    // EVGGL, PT0616 -->
                                    this.TCHUpdatePlannedOrderSalesPoolId(setupDim);
                                    // EVGGL, PT0616 <--
                                }

                                ttscommit;
                            }
                            catch (Exception::Deadlock)
...
Разумеется, все это работает только в модели планирования "1:1". В противном случае вы получаете одну закупку, которая "закрывает" несколько заказов на продажу.
За это сообщение автора поблагодарили: wojzeh (1), shogel (1).