我的任务是将默认的供应商库存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;
}
}
答案 0 :(得分:1)
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;
}