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

时间:2019-05-10 20:31:57

标签: acumatica

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

1 个答案:

答案 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;
}