包括多个网格上的默认供应商库存ID



我的任务是将默认的供应商库存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;
}

最新更新