已请求不正确的扩展类型

时间:2017-08-01 09:28:00

标签: c# acumatica

我正在尝试在Acumatica中自定义销售订单的业务逻辑。这是我写的代码

protected void SOLine_InventoryID_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
{
  var row = (SOLine)e.Row;

  InventoryItem item = (InventoryItem)PXSelectorAttribute.Select<SOLine.inventoryID>(cache, row);

  if(item != null)
  {
    InventoryItemExt itemExt = orderitem.Cache.GetExtension<InventoryItemExt>(item);
    if(item.InventoryID == row.InventoryID && itemExt.GarmentType == true)
    {
      PXUIFieldAttribute.SetEnabled<SOLine.orderQty>(this.orderitem.Cache, null, false);
    }
  }
}

public PXSelect<InventoryItem> Inventory;

我得到的错误就是这个

Error Trace

我之前在其他图表中曾多次使用此代码,并且没有任何问题。我想知道这个图表我想念的是什么,是因为它的扩展图形还是其他东西,我不太确定

提前感谢您的帮助

修改 将事件更改为RowSelected事件后得到的错误 编辑后的代码在

之下
protected void SOLine_RowSelected(PXCache cache, PXRowSelectedEventArgs e)
{
  var row = (SOLine)e.Row;

  InventoryItem item = (InventoryItem)PXSelectorAttribute.Select<SOLine.inventoryID>(cache, row);

  if(item != null)
  {
    InventoryItemExt itemExt = Inventory.Cache.GetExtension<InventoryItemExt>(item);
    if(item.InventoryID == row.InventoryID && itemExt.GarmentType == true)
    {
      PXUIFieldAttribute.SetEnabled<SOLine.orderQty>(this.orderitem.Cache, null, false);
    }
  } 

是错误还是我的代码中存在问题?

The latest error trace

1 个答案:

答案 0 :(得分:0)

您发布的代码是SOLine.InventoryID:

的FieldUpdated事件处理程序
protected void SOLine_InventoryID_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
{
[...]

您发布的错误跟踪调用堆栈表示错误源自另一个事件处理程序: error trace

检查SOLine RowSelected事件处理程序而不是SOLine InventoryID字段更新处理程序。跟踪表示在SOOrderEntry.cs的第73行引发了异常

与您的错误无关:在创建扩展类时,建议提供与基类不同的文件名。 SOOrderEntry.cs是Acumatica中的基类文件,您可以将文件命名为SOOrderEntryExt.cs,以区别于基类。

编辑,您的DataView可能不是InventoryItem类型,请尝试:

Base.Caches[typeof(InventoryItem)].GetExtension<InventoryItemExt>(item)

编辑2 完整代码

public class InventoryItemExt : PXCacheExtension<PX.Objects.IN.InventoryItem>
{
    #region UsrCustomField
    [PXString]
    [PXUIField(DisplayName = "Custom Field")]
    public virtual string UsrCustomField { get; set; }
    public abstract class usrCustomField : IBqlField { }
    #endregion
}

public class SOOrderEntry_Extension : PXGraphExtension<SOOrderEntry>
{
    protected void SOLine_RowSelected(PXCache cache, PXRowSelectedEventArgs e)
    {
        SOLine soLine = e.Row as SOLine;

        if (soLine != null)
        {
            InventoryItem item = (InventoryItem)PXSelectorAttribute.Select<SOLine.inventoryID>(cache, soLine);

            if (item != null)
            {
                InventoryItemExt itemExt = Base.Caches[typeof(InventoryItem)].GetExtension<InventoryItemExt>(item);
                PXTrace.WriteInformation(string.Concat("Success = ", (itemExt != null).ToString()));
            }
        }
    }
}