需要帮助携带销售订单用户字段来创建采购订单屏幕

时间:2019-08-05 15:40:05

标签: acumatica

我有一个自定义项,其中我向“销售订单(SO301000)”屏幕交易网格中添加了三个用户字段。我想在“创建采购订单”屏幕(PO505000)上设置字段。我曾经使用过POFixedDemand的'RowSelected'事件,该事件运行良好-但是,当任何人尝试连续修改任何内容时,都会引起问题-重新触发该事件-并非期望的结果。

我已经尝试了'RowInserting'和'RowInserted'事件-但它们从未触发过。我假设此时,我将不得不在“ POCreate” BLC中截取一些代码,以在“创建采购订单”屏幕中创建POFixedDemand记录-但我真的不知道从哪里开始。我可以将它放在EnumerateAndPrepareFixedDemands方法中的某个地方吗?

这是我创建的代码,该代码适用于RowSelected事件,但不适用于用户修改行的情况。任何帮助表示赞赏。谢谢。

    protected virtual void POFixedDemand_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
    {
        var pofd = (POFixedDemand)e.Row;
        if (pofd == null) return;

        var filter = Base.Filter.Current;
        var ordernbr = filter.OrderNbr;
        var ordertype = filter.OrderType;

        var solinesplit = (SOLineSplit)PXSelect<SOLineSplit, Where<SOLineSplit.planID, Equal<Required<SOLineSplit.planID>>>>.Select(Base, pofd.PlanID);
        if (solinesplit != null)
        {
            var soline = (SOLine)PXSelect<SOLine,
                                 Where<SOLine.orderNbr, Equal<Required<SOLine.orderNbr>>,
                                 And<SOLine.orderType, Equal<Required<SOLine.orderType>>,
                                 And<SOLine.lineNbr, Equal<Required<SOLine.lineNbr>>>>>>.Select(Base, solinesplit.OrderNbr, solinesplit.OrderType, solinesplit.LineNbr);

            if (soline != null)
            {
                var solineext = PXCache<SOLine>.GetExtension<SOLineExt>(soline);
                pofd.VendorID = solineext.UsrVendor;
                pofd.EffPrice = solineext.UsrVendorUnitCost;
                pofd.ExtCost = solineext.UsrVendorExtendedCost;

                //Now set the Vendor location...
                var location = (Location)PXSelect<Location,
                                         Where<Location.bAccountID, Equal<Required<Location.bAccountID>>>>.Select(Base, pofd.VendorID);

                if (location != null)
                {
                    pofd.LocationID = location.LocationID;
                }

            }
        }
    }

2 个答案:

答案 0 :(得分:0)

  

我现在假设我必须截取一些代码   “ POCreate” BLC

是的,您需要按照这些原则进行操作。 对于初始化POLine而不是POFixedDemand,这里有类似的答案: https://stackoverflow.com/a/37255340/7376238

进行一些细微调整后,通常的模式将是:

public class POCreateExt : PXGraphExtension<POCreate>
{
    public override void Initialize()
    {
        PXGraph.InstanceCreated.AddHandler<POOrderEntry>((graph) =>
        {
            graph.RowInserting.AddHandler<POFixedDemand>((sender, e) =>
            {
                // Initialize fields when row is inserted
                POFixedDemand demand = e.Row as POFixedDemand;
                demand.DACField = [initialization value];
            });

            graph.RowUpdating.AddHandler<POFixedDemand>((sender, e) =>
            {
                // Sometimes fields are updated so you need to 
                // hook RowUpdating too and re-initialize
                POFixedDemand demand = e.NewRow as POFixedDemand;
                demand.DACField = [initialization value];
            });
        });
    }
}

答案 1 :(得分:0)

经过一番调查,我想到的是重写“ EnumerateAndPrepareFixedDemands”方法来设置值。代码如下:

    public delegate IEnumerable EnumerateAndPrepareFixedDemandsDelegate(PXResultset<POFixedDemand> fixedDemands);
    [PXOverride]
    public IEnumerable EnumerateAndPrepareFixedDemands(PXResultset<POFixedDemand> fixedDemands, EnumerateAndPrepareFixedDemandsDelegate baseMethod)
    {
        foreach (PXResult<POFixedDemand> rec in fixedDemands)
        {
            POFixedDemand demand = rec;

            var solinesplit = (SOLineSplit)PXSelect<SOLineSplit, Where<SOLineSplit.planID, Equal<Required<SOLineSplit.planID>>>>.Select(Base, demand.PlanID);
            if (solinesplit != null)
            {
                var soline = (SOLine)PXSelect<SOLine,
                             Where<SOLine.orderNbr, Equal<Required<SOLine.orderNbr>>,
                             And<SOLine.orderType, Equal<Required<SOLine.orderType>>,
                             And<SOLine.lineNbr, Equal<Required<SOLine.lineNbr>>>>>>.Select(Base, solinesplit.OrderNbr, solinesplit.OrderType, solinesplit.LineNbr);
                if (soline != null)
                {
                    var solineext = PXCache<SOLine>.GetExtension<SOLineExt>(soline);
                    demand.VendorID = solineext.UsrVendor;
                    demand.EffPrice = solineext.UsrVendorUnitCost;
                    demand.ExtCost = solineext.UsrVendorExtendedCost;

                    //Now set the Vendor location...
                    var location = (Location)PXSelect<Location,
                                             Where<Location.bAccountID, Equal<Required<Location.bAccountID>>>>.Select(Base, solineext.UsrVendor);

                    if (location != null)
                    {
                        demand.VendorLocationID = location.LocationID;
                    }

                }
            }
        }

        return baseMethod(fixedDemands);
    }