我的任务是将默认的供应商库存ID添加到Acumatica中多个屏幕中的网格中。该字段不需要绑定和禁用。我已经正确地显示了该字段,但仅在保存的记录上。添加一条新行,甚至刷新网格不会显示ID,我必须关闭屏幕或切换到另一个记录,然后在供应商ID显示之前返回,甚至单击"保存"按钮和刷新都不会导致它显示。客户端将此字段用作参考点,因此重要的是,一旦选择一个项目就可以显示。
以下是我为套件规范屏幕所拥有的代码,我需要找出一种使其更具反应性的方法,至少在刷新上显示正确。我尝试在Where语句中使用Current<>,但这只是完全打破它,总是什么都没有显示。
public class INKitSpecStkDetExt : PXCacheExtension<PX.Objects.IN.INKitSpecStkDet>
{
#region VendorInventoryCode
public abstract class vendorInventoryCode: IBqlField { }
[PXDBScalar(typeof(Search2<PO.POVendorInventory.vendorInventoryID,
InnerJoin<IN.InventoryItem,
On<PO.POVendorInventory.vendorID, Equal<IN.InventoryItem.preferredVendorID>, And<PO.POVendorInventory.inventoryID, Equal<IN.InventoryItem.inventoryID>>>>,
Where<IN.InventoryItem.inventoryID,Equal<IN.INKitSpecStkDet.compInventoryID>>,
OrderBy<Desc<PO.POVendorInventory.vendorInventoryID>>>))]
[PXString(40, IsUnicode = true)]
[PXUIField(DisplayName = "Vendor Inventory Code", Enabled=false)]
public string VendorInventoryCode{ get; set; }
#endregion
}
我将代码钉下来后,它将在其他几个地方使用。非常感谢!令人沮丧的是,它如此近,无法越过终点线...
根据HB_Acumatica的反馈进行跟进,工作代码在下面供参考:
public void INKitSpecStkDet_VendorInventoryCode_FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
{
var row = e.Row as INKitSpecStkDet;
if (e.Row != null)
{
PO.POVendorInventory vendorInventory = PXSelectReadonly2<PO.POVendorInventory,
InnerJoin<IN.InventoryItem,
On<PO.POVendorInventory.vendorID, Equal<IN.InventoryItem.preferredVendorID>, And<PO.POVendorInventory.inventoryID, Equal<IN.InventoryItem.inventoryID>>>>,
Where<IN.InventoryItem.inventoryID, Equal<Required<IN.INKitSpecStkDet.compInventoryID>>>,
OrderBy<Desc<PO.POVendorInventory.vendorInventoryID>>>.Select(Base, row.CompInventoryID);
e.ReturnValue = vendorInventory != null ? vendorInventory.VendorInventoryID : null;
}
}
PXDBScalar
属性本身不会刷新。也许明确调用RaiseFieldDefaulting
方法会刷新它:
object newValue = null;
base.Caches[typeof(INKitSpecStkDet)].RaiseFieldDefaulting<INKitSpecStkDetExt.vendorInventoryCode>(rowINKitSpecStkDet, out newValue);
如果可能的话,使用PXFormula
代替PXDBScalar
将产生更好的自动刷新行为,但也有自己的限制集。
如果您正在寻找在大多数上下文中起作用的最简单方法(除了在报告和通用查询中不使用图形时(,这将是fieldSelecting事件。您可以执行BQL并返回事件中的任何所需值。每次引用该字段时,它都会被调用。
public void INKitSpecStkDet_VendorInventoryCode_FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
{
PO.POVendorInventory vendorInventory = PXSelectReadonly2<Po.POVendorInventory […]>.Select(Base);
e.ReturnValue = vendorInventory != null ? vendorInventory.VendorInventoryCode : null;
}