【问题标题】:Populate Unit Cost for Serialized Item in custom field SOLine在自定义字段 SOLine 中填充序列化项目的单位成本
【发布时间】:2017-05-27 04:13:44
【问题描述】:

我需要从具有相同批次/序列号的采购收据的序列化项目单位成本中填充 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;
    }
}

截图 1:- 屏幕截图 2:-

【问题讨论】:

  • 有 SOLineSplits 是 POReceiptLines 的 SOLine 和 POReceiptLineSplit 的分配。您可以使用 BQL 获取当前线路分配并做您需要的。

标签: acumatica


【解决方案1】:

您可以从 Base DAC 的“splits”数据视图中迭代 POReceiptLineSplit 记录。

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

从那里选择您的定制项目。单击“网格:拆分”,网格的 DataMember 属性为“拆分”。这是来自 Base 类的 DataView 的名称。

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

       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);
       }

【讨论】:

  • 有了这些信息,我如何更新 SO 中自定义字段的值
  • 这取决于用例,字段是否绑定/未绑定以及是否应该引发事件。我看到你有: SOLineExtension ext = PXCache.GetExtension(row); ext.UsrUserDefinedCost = poRow.UnitCost;
  • 要持久化到数据库,您应该添加:PXCache.Update(row);在这些线下方。
  • 行持久事件调用更新可能有点晚。如果可以,请将该代码移到执行 Persist 操作之前引发的事件中。 SOLine_LotSerialNbr_FieldUpdated 可能适合您的用例。
  • 我认为 SOLine_LotSerialNbr_FieldUpdated 不会从 POReceipt 屏幕执行。
【解决方案2】:

SOLineSplit_LotSerialNbr_FieldUpdated 事件需要在 SOOrder Extension 中扩展,POReceiptLine_RowSelected 在 POReceiptEntry 扩展中。下面的代码将帮助从购买收据中获取单位成本。

POReceiptLine poRow = PXSelectJoin<POReceiptLine,
	LeftJoin<POReceiptLineSplit,
		On<POReceiptLine.receiptNbr, Equal<POReceiptLineSplit.receiptNbr>,
			And<POReceiptLine.inventoryID, Equal<POReceiptLineSplit.inventoryID>,
			And<POReceiptLine.lineNbr, Equal<POReceiptLineSplit.lineNbr>>>>>,
	Where<POReceiptLine.inventoryID, Equal<Required<POReceiptLine.inventoryID>>,
			And<POReceiptLineSplit.lotSerialNbr, Equal<Required<POReceiptLineSplit.lotSerialNbr>>,
			And<POReceiptLine.receiptType, Equal<Required<POReceiptLine.receiptType>>>>>>.Select(graph, row.InventoryID, row.LotSerialNbr, "RT");

【讨论】:

    猜你喜欢
    • 2016-10-23
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    相关资源
    最近更新 更多