Невозможно создать отгрузку всех товаров SOLine на экране отгрузки (SOShipLine-Manually мы переносим товары, отсутствующие на складе, на экран отгрузки)

когда мы создаем поле «Отгрузка Is-Component», мы добавили новое в Экран заказа на продажу, когда мы проверили это поле, и когда мы обрабатываем отгрузку на экране «Отгрузка», конкретный элемент данных инвентаризации не передается только для проверенного элемента «Является компонентом», непроверенные позиции позиции «Компонент» могут перейти на экран отгрузки.

[PXOverride]
        public IEnumerable Action(PXAdapter adapter, Nullable<Int32> actionID, Nullable<DateTime> shipDate, String siteCD, String operation, String ActionName, ActionDelegate baseMethod)
        {
            if (actionID == 1)
            {

            SOShipmentEntry ShipGraph = PXGraph.CreateInstance<SOShipmentEntry>();
            PXGraph.InstanceCreated.AddHandler<SOShipmentEntry>((graph) =>
        {
            ShipGraph.RowInserting.AddHandler<SOShipLine>((sender, e) =>
            {
                foreach (SOLine line in Base.Transactions.Select())
                {
                    ShipGraph.Transactions.Current = PXSelect<SOShipLine, Where<SOShipLine.shipmentNbr, Equal<Required<SOShipLine.shipmentNbr>>>>.Select(Base, line.InventoryID, line.OrderNbr);
                    SOShipLine ShipLine = new SOShipLine();

                    SOLineExt NonStklnExt = line.GetExtension<SOLineExt>();
                    if (ShipGraph.Transactions.Current == null)
                    {
                        //if (NonStklnExt.UsrIsComponent == true || NonStklnExt.UsrIsComponent == false || NonStklnExt.UsrInvFlag == true || NonStklnExt.UsrInvFlag == false || NonStklnExt.UsrStkInventoryID == null || NonStklnExt.UsrStkInventoryID != null)
                        //{
                        ShipLine.InventoryID = line.InventoryID;
                        ShipLine.TranDesc = line.TranDesc;
                        // }
                        ShipGraph.Transactions.Insert(ShipLine);
                    }



                }
                Base.Transactions.View.RequestRefresh();
            });
        });
        }
        return baseMethod(adapter, actionID, shipDate, siteCD, operation, ActionName);
    }

person harikanth mantri    schedule 08.08.2019    source источник


Ответы (1)


Я могу предположить, что эти элементы добавляются на основе флага, а не всегда добавляются на основе элемента. Если это так, я бы проверил флаг «Требовать отгрузку» на элементе «Нет в наличии», чтобы он автоматически добавлялся.

Я бы пошел на это, переопределив функцию SOShipmentEntry CreateShipment, а не обработчик SOShipLine Insert. Убедитесь, что вы переопределили тот, у которого есть QuickProcessFlow.

Оттуда я буду искать исходный заказ и строки заказа, как вы это делаете после создания отгрузки. Ваша логика проверяет, установлены ли флажки в строке или нет, и их следует обновить. Например, если вы хотите найти все товары, не входящие в комплект поставки, для которых установлен компонент, которые не добавляются автоматически на основе флага NonStockShip, я бы сделал это следующим образом:

public delegate void CreateShipmentDelegate(SOOrder order, Nullable<Int32> SiteID, Nullable<DateTime> ShipDate, Nullable<Boolean> useOptimalShipDate, String operation, DocumentList<SOShipment> list, ActionFlow quickProcessFlow);
[PXOverride]
public void CreateShipment(SOOrder order, Nullable<Int32> SiteID, Nullable<DateTime> ShipDate, Nullable<Boolean> useOptimalShipDate, String operation, DocumentList<SOShipment> list, ActionFlow quickProcessFlow, CreateShipmentDelegate baseMethod)
{
    baseMethod(order, SiteID, ShipDate, useOptimalShipDate, operation, list, quickProcessFlow);

    if (order == null)
        return; //do not process for shipments that did not have an order sent for some reason

    //get all lines for non-stockitems that are not flagged to be shipped that have the component checked
    var SalesOrderLines = PXSelectJoin<
        SOLine, 
        InnerJoin<InventoryItem, 
            On<SOLine.inventoryID, Equal<InventoryItem.inventoryID>>>,
        Where<SOLine.orderNbr, Equal<Required<SOLine.orderNbr>>, 
            And<SOLine.orderType, Equal<Required<SOLine.orderType>>,                     
            And<InventoryItem.nonStockShip, Equal<False>,
            And<InventoryItem.stkItem, Equal<False>,
            And<SOLineExt.usrIsComponent, Equal<True>>>>>>>
        .Select(Base, order.OrderNbr, order.OrderType);

    foreach(SOLine SalesOrderLine in SalesOrderLines)
    {
        //double check that they were not added.... and match the orig line nbr
        var ShipmentLinesForItem = PXSelect<
            SOShipLine, 
            Where<SOShipLine.shipmentNbr, Equal<Current<SOShipment.shipmentNbr>>,
                And<SOShipLine.shipmentType, Equal<Current<SOShipment.shipmentType>>, 
                And<SOShipLine.inventoryID, Equal<Required<SOShipLine.inventoryID>>, 
                And<SOShipLine.origLineNbr, Equal<Required<SOShipLine.origLineNbr>>>>>>>
            .Select(Base, SalesOrderLine.InventoryID, SalesOrderLine.LineNbr);
        if (ShipmentLinesForItem.Count == 0)
        {
            //create your shipment lines for these items
            SOShipLine ShipmentLine = new SOShipLine();
            //set fields required. See function SOOrderEntry.CreateShipmentFromSchedules for examples of fields that should be set.
            Base.Transactions.Insert(ShipmentLine);
        }
    }
}
person KRichardson    schedule 09.08.2019