Acumatica 在自定义字段SOLine中填充序列化项目的单位成本

Acumatica 在自定义字段SOLine中填充序列化项目的单位成本,acumatica,Acumatica,我需要从具有相同批号/序列号的采购收据中的序列化项目单位成本填充SOLine中的自定义列(用户定义成本)(屏幕截图1)。如果项目已拆分批次/序列号(屏幕截图2),则我必须根据用户在SOLine项目中输入的批次/序列号读取相应的单位成本 我已经编写了SOLine_RowPersisting事件来处理未拆分的项,但不确定如何查找是否存在拆分的序列化项。下面是SOLine_RowPersisting事件的代码。请建议 protected virtual void SOLine_RowPersistin

我需要从具有相同批号/序列号的采购收据中的序列化项目单位成本填充SOLine中的自定义列(用户定义成本)(屏幕截图1)。如果项目已拆分批次/序列号(屏幕截图2),则我必须根据用户在SOLine项目中输入的批次/序列号读取相应的单位成本

我已经编写了SOLine_RowPersisting事件来处理未拆分的项,但不确定如何查找是否存在拆分的序列化项。下面是SOLine_RowPersisting事件的代码。请建议

protected virtual void SOLine_RowPersisting(PXCache sender, PXRowPersistingEventArgs e)
{
    SOLine row = (SOLine)e.Row;
    if (row == null)
        return;

    if (!string.IsNullOrEmpty(row.LotSerialNbr))
    {
        SOOrderEntry graph = PXGraph.CreateInstance<SOOrderEntry>();

        //select UnitCost, * from POReceiptLine where CompanyID = 2 and ReceiptNbr = 'PR004082' and InventoryID = '8502' and LotSerialNbr = 'SUB1703210365'
        //select LotSerialNbr, * from POReceiptLineSplit where CompanyID = 2 and InventoryID = '8502' and LotSerialNbr = 'SUB1704270366'

        //TODO : How to get it from POReceiptLineSplit also

        POReceiptLine poRow = PXSelect<POReceiptLine,
                        Where<POReceiptLine.inventoryID, Equal<Required<POReceiptLine.inventoryID>>,
                            And<POReceiptLine.lotSerialNbr, Equal<Required<POReceiptLine.lotSerialNbr>>,
                            And<POReceiptLine.pOType, Equal<Required<POReceiptLine.pOType>>>>>>.Select(graph, row.InventoryID, row.LotSerialNbr, "RO");

        SOLineExtension ext = PXCache<SOLine>.GetExtension<SOLineExtension>(row);
        ext.UsrUserDefinedCost = poRow.UnitCost;
    }
}
protected virtual void SOLine_row持久化(PXCache发送方,PXRowPersistingEventArgs e)
{
SOLine行=(SOLine)e.row;
if(行==null)
返回;
如果(!string.IsNullOrEmpty(row.LotSerialNbr))
{
SOOrderEntry graph=PXGraph.CreateInstance();
//从POReceiptLine中选择UnitCost,*其中CompanyID=2,ReceiptNbr='PR004082',InventoryID='8502',LotusSerialNBR='SUB1703210365'
//从POReceiptLineSplit中选择LotSerialNbr,*其中CompanyID=2,InventoryID='8502',LotSerialNbr='SUB1704270366'
//TODO:如何从POReceiptLineSplit获取它
POReceiptLine poRow=PXSelect.Select(图形,row.InventoryID,row.LotSerialNbr,“RO”);
SOLineExtension ext=PXCache.GetExtension(行);
ext.UsrUserDefinedCost=poRow.UnitCost;
}
}
屏幕截图1:- 屏幕截图2:-

您可以从基本DAC的“拆分”数据视图中迭代POReceiptLineSplit记录

为此,在Acumatica中打开网格,按住Control+Alt并单击它。这将弹出一个包含网格中记录的DAC名称的弹出窗口。

从中选择您的自定义项目。单击“网格:拆分”,网格的DataMember属性为“拆分”。这是基类中数据视图的名称。

有了这些信息,您可以从图形扩展迭代网格的内容。请注意,我们使用基前缀,因为我们从扩展中引用基图

       foreach (POReceiptLineSplit split in Base.splits.Select())
       {
          PXTrace.WriteInformation("ReceiptNbr: {0}{1}LineNbr: {2}{3}SplitLineNbr: {4}",
                                   split.ReceiptNbr, Environment.NewLine,
                                   split.LineNbr, Environment.NewLine,
                                   split.SplitLineNbr);
       }

SOLineSplit_LotSerialNbr_FieldUpdated事件需要在SOOrder扩展中扩展,PoreciptLine_行需要在PoreciptEntry扩展中选择。下面的代码将有助于从采购收据中获取单位成本


POReceiptLine poRow=PXSelectJoin.Select(图形,row.InventoryID,row.LotSerialNbr,“RT”)存在SOLineSplits,它是POReceiptLines的SOLine和POReceiptLineSplit的分配。您可以使用BQL获取当前行分配并执行您需要的操作。有了这些信息,我如何更新SOIt中自定义字段中的值取决于用例,字段是否绑定/解除绑定以及是否应引发事件。我看到您有:SOLineExtension ext=PXCache.GetExtension(row);ext.UsrUserDefinedCost=poRow.UnitCost;要持久化到数据库,您应该添加:PXCache.Update(行);行持久化事件调用update可能有点晚。如果可以,请在执行持久化操作之前引发的事件中移动该代码。SOLine\u LotSerialNbr\u FieldUpdated可能适合您的用例。我认为SOLine\u LotSerialNbr\u FieldUpdated不会从POReceipt屏幕执行。