Acumatica - FieldDefaulting从DAC扩展更新ImageUrl

时间:2018-04-24 20:00:55

标签: acumatica

我正在尝试更新Inventory Item ImageUrl,如果在某些条件下发现它为null。我在Item Class画面中添加了一个名为UsrStyleImg的Usr字段。该字段用于项目的基本图像,并存储在数据库中。我想要的功能是如果Inventory Item在ImageUrl中没有图像,那么它将默认为与ItemClassID连接的UsrStyleImg。 ItemClassID也可以在Stock Item屏幕上找到。这是我在InventoryItemMaint图中的代码:

protected void InventoryItem_ImageUrl_FieldDefaulting(PXCache cache, PXFieldDefaultingEventArgs e)
    {

      var row = (InventoryItem)e.Row;
      if (row == null) return;
      var item = (INItemClass)PXSelect<INItemClass, Where<INItemClass.itemClassID, Equal<Current<InventoryItem.itemClassID>>>>.Select(Base, row.ItemClassID);
      var image = PXSelect<InventoryItem, Where<InventoryItem.imageUrl, Equal<Current<InventoryItem.imageUrl>>>>.Select(Base, row.ImageUrl);
      if (image != null)
        return;
      else {
        e.NewValue = item.GetExtension<INItemClassExt>().UsrStyleImg;
      }
    }

代码编译正常但是当我使用附加了Item类的Item测试时,INItemClass表中的图像名为UsrStyleImg,它不会填充到Inventory Item表或Stock Item屏幕中的imageUrl。我也尝试过使用FieldSelecting并使用e.ReturnValue,结果仍然相同。

如果我需要更多说明,请告诉我。

1 个答案:

答案 0 :(得分:0)

尝试使用RowSelecting事件

protected virtual void InventoryItem_RowSelecting(PXCache sender, PXRowSelectingEventArgs e)
{
    InventoryItem row = e.Row as InventoryItem;

    //Extra checks to prevent infinite loops
    if (row != null && !string.IsNullOrWhiteSpace(row.InventoryCD) && Base.Item.Cache.GetStatus(row) == PXEntryStatus.Notchanged)
    {
        if (!string.IsNullOrWhiteSpace(row.ItemClassID))
        {
            //You must always use a PXConnectionScope if Selecting during RowSelecting
            using (new PXConnectionScope())
            {
                //If you're going to pass in a value in .Select, use Required instead of Current.
                INItemClass itemClass = PXSelectReadonly<INItemClass, Where<INItemClass.itemClassID, Equal<Required<INItemClass.itemClassID>>>>.Select(Base, row.ItemClassID);

                if (itemClass != null && string.IsNullOrWhiteSpace(row.ImageUrl))
                {
                    INItemClassExt itemClassExt = itemClass.GetExtension<INItemClassExt>();

                    //To prevent unneeded update if it's blank
                    if (!string.IsNullOrWhiteSpace(itemClassExt.UsrStyleImg))
                    {
                        row.ImageUrl = itemClassExt .UsrStyleImg;

                        //Force set the status in the Cache, otherwise it infinite loops
                        Base.Item.Cache.SetStatus(row, PXEntryStatus.Updated);
                        Base.Item.Update(row);
                    }                        
                }
            }
        }
    }
}