【问题标题】:Acumatica - MoveNext error, creating buttons for reports on Kit Assembly screenAcumatica - MoveNext 错误,在套件组装屏幕上创建报告按钮
【发布时间】:2018-04-19 13:25:08
【问题描述】:

我认为我之前列出的一个问题运行良好,直到我注意到我需要的是 InventoryCD 而不是 InventoryID。在 KitAssembly 屏幕 (IN307000) 或 DAC 上找不到inventoryCD。因此,我创建了一个名为 UsrInventoryCD 的新 Usr 字段,并在填充 KitAssemblyID 字段时提取相同的 InventoryCD。这工作正常。接下来,我想获取此字段并将值从按钮传递到报告参数中。这是我目前所拥有的:

protected void INKitRegister_UsrInventoryCD_FieldSelecting(PXCache cache, PXFieldSelectingEventArgs e)
        {
            var item = (INKitRegister)e.Row;
            if (item == null) return;
            var invitem = (InventoryItem)PXSelect<InventoryItem,
            Where<InventoryItem.inventoryID, Equal<Current<INKitRegister.kitInventoryID>>>>.Select(Base, item.InventoryID);
            if (invitem != null)
            {
                e.ReturnValue = invitem.InventoryCD;
            }
        }

public class KitAssemblyEntry_Extension:PXGraphExtension<KitAssemblyEntry>
  {
  public override void Initialize()
    {
        Report.AddMenuAction(Report1);
        Report.AddMenuAction(Report2);
        Report.AddMenuAction(Report3);
        Report.AddMenuAction(Report5);
        Report.AddMenuAction(Report6);
        Report.MenuAutoOpen = true;
    }

    #region Event Handlers

    public PXAction<INKitRegister> Report;
    [PXButton]
    [PXUIField(DisplayName = "Go To", MapEnableRights = PXCacheRights.Select)]
    protected void report()
    { }

    public PXAction<INKitRegister> Report1;
    [PXUIField(DisplayName = "Report1", MapEnableRights = PXCacheRights.Select)]
    [PXLookupButton]
    public virtual IEnumerable report1(PXAdapter adapter)
    {
      INKitRegister item = Base.Document.Current;
  var style = item.GetExtension<INKitRegisterExt>().UsrInventoryCD;
  INKitRegister doc = Base.Document.Current;
        if (doc != null)
        {
        Dictionary<string, string> parameters = new Dictionary<string, string>();
        parameters["ItemNumber"] = style.ToString();
        throw new PXReportRequiredException(parameters, "IN610002", "Report1");
        }
     return adapter.Get();
    }

      public PXAction<INKitRegister> Report2;
    [PXUIField(DisplayName = "Report2", MapEnableRights = PXCacheRights.Select)]
    [PXLookupButton]
    public virtual IEnumerable report2(PXAdapter adapter)
    {
      INKitRegister item = Base.Document.Current;
  var style = item.GetExtension<INKitRegisterExt>().UsrInventoryCD;
  INKitRegister doc = Base.Document.Current;
        if (doc != null)
        {
        Dictionary<string, string> parameters = new Dictionary<string, string>();
        parameters["ItemNumber"] = style.ToString();
        throw new PXReportRequiredException(parameters, "IN610003", "Report2");
        }
     return adapter.Get();
    }


      public PXAction<INKitRegister> Report3;
    [PXUIField(DisplayName = "Report3", MapEnableRights = PXCacheRights.Select)]
    [PXLookupButton]
    public virtual IEnumerable report3(PXAdapter adapter)
    {
      INKitRegister item = Base.Document.Current;
  var style = item.GetExtension<INKitRegisterExt>().UsrInventoryCD;
  INKitRegister doc = Base.Document.Current;
        if (doc != null)
        {
        Dictionary<string, string> parameters = new Dictionary<string, string>();
        parameters["ItemNumber"] = style.ToString();
        throw new PXReportRequiredException(parameters, "IN610001", "Report3");
        }
     return adapter.Get();
    }

      public PXAction<INKitRegister> Report4;
    [PXUIField(DisplayName = "Report4", MapEnableRights = PXCacheRights.Select)]
    [PXLookupButton]
    public virtual IEnumerable report4(PXAdapter adapter)
    {
      INKitRegister item = Base.Document.Current;
  var style = item.GetExtension<INKitRegisterExt>().UsrInventoryCD;
  INKitRegister doc = Base.Document.Current;
        if (doc != null)
        {
        Dictionary<string, string> parameters = new Dictionary<string, string>();
        parameters["ItemNumber"] = style.ToString();
        throw new PXReportRequiredException(parameters, "IN610005", "Report4");
        }
     return adapter.Get();
    }

      public PXAction<INKitRegister> Report5;
    [PXUIField(DisplayName = "Report5", MapEnableRights = PXCacheRights.Select)]
    [PXLookupButton]
    public virtual IEnumerable report5(PXAdapter adapter)
    {
      INKitRegister item = Base.Document.Current;
  var style = item.GetExtension<INKitRegisterExt>().UsrInventoryCD;
  INKitRegister doc = Base.Document.Current;
        if (doc != null)
        {
        Dictionary<string, string> parameters = new Dictionary<string, string>();
        parameters["ItemNumber"] = style.ToString();
        throw new PXReportRequiredException(parameters, "IN610006", "Report5");
        }
     return adapter.Get();
    }
    #endregion

  }

它编译得很好,但是当我尝试单击已添加到屏幕上的报告按钮之一时出现此错误。

An unhandled exception has occurred in the function 'MoveNext'. Please see the trace log for more details.

这是跟踪日志:

An unhandled exception has occurred in the function 'MoveNext'. Please see the trace log for more details. 

System.NullReferenceException: Object reference not set to an instance of an object. 
   at PX.Objects.IN.KitAssemblyEntry_Extension.report1(PXAdapter adapter) 
   at PX.Data.PXAction`1.a(PXAdapter A_0) 
   at PX.Data.PXAction`1.d__31.MoveNext() 
   at PX.Data.PXAction`1.d__31.MoveNext() 
   at PX.Data.PXAction`1.d__31.MoveNext() 
   at PX.Data.PXAction`1.d__31.MoveNext() 
   at PX.Web.UI.PXBaseDataSource.tryExecutePendingCommand(String viewName, String[] sortcolumns, Boolean[] descendings, Object[] searches, Object[] parameters, PXFilterRow[] filters, DataSourceSelectArguments arguments, Boolean& closeWindowRequired, Int32& adapterStartRow, Int32& adapterTotalRows) 
   at PX.Web.UI.PXBaseDataSource.ExecuteSelect(String viewName, DataSourceSelectArguments arguments, PXDSSelectArguments pxarguments) 

这是我问过的上一个问题是否与任何可能有用的信息有关:Acumatica - Add Reports dropdown to Kit Assembly Screen

【问题讨论】:

  • 我已经更改了上面的代码以适应我在一些文档中找到的更好的 DAC 扩展拉取。但是我仍然遇到同样的错误,我不知道我错过了什么,我知道这通常发生在它想要返回 null 或找不到它时。这不是从数据库本身中提取的,我的意思是如果保存被击中,它可以是,但它没有任何区别。无论哪种方式,我仍然会遇到相同的错误。

标签: customization acumatica


【解决方案1】:

我采取了不同的方向来解决这个问题,但只是使用 PXSelect 而不是自定义字段。我删除了自定义字段并使用了下面的代码。答案如下并且有效:

public class KitAssemblyEntry_Extension:PXGraphExtension<KitAssemblyEntry>
  {
  public override void Initialize()
    {
        Report.AddMenuAction(Report1);
        Report.AddMenuAction(Report2);
        Report.AddMenuAction(Report3);
        Report.AddMenuAction(Report5);
        Report.AddMenuAction(Report6);
        Report.MenuAutoOpen = true;
    }

    #region Event Handlers

    public PXAction<INKitRegister> Report;
    [PXButton]
    [PXUIField(DisplayName = "Go To", MapEnableRights = PXCacheRights.Select)]
    protected void report()
    { }

    public PXAction<INKitRegister> Report1;
    [PXUIField(DisplayName = "Report1", MapEnableRights = PXCacheRights.Select)]
    [PXLookupButton]
    public virtual IEnumerable report1(PXAdapter adapter)
    {
      INKitRegister item = Base.Document.Current;
      var invitem = (InventoryItem)PXSelect<InventoryItem,
            Where<InventoryItem.inventoryID, Equal<Current<INKitRegister.kitInventoryID>>>>.Select(Base, item.InventoryID);
      INKitRegister doc = Base.Document.Current;
        if (doc != null)
        {
        Dictionary<string, string> parameters = new Dictionary<string, string>();
        parameters["ItemNumber"] = invitem.InventoryCD.ToString();
        throw new PXReportRequiredException(parameters, "IN610002", "Report1");
        }
     return adapter.Get();
    }

      public PXAction<INKitRegister> Report2;
    [PXUIField(DisplayName = "Report2", MapEnableRights = PXCacheRights.Select)]
    [PXLookupButton]
    public virtual IEnumerable report2(PXAdapter adapter)
    {
      INKitRegister item = Base.Document.Current;
      var invitem = (InventoryItem)PXSelect<InventoryItem,
            Where<InventoryItem.inventoryID, Equal<Current<INKitRegister.kitInventoryID>>>>.Select(Base, item.InventoryID);
      INKitRegister doc = Base.Document.Current;
        if (doc != null)
        {
        Dictionary<string, string> parameters = new Dictionary<string, string>();
        parameters["ItemNumber"] = invitem.InventoryCD.ToString();
        throw new PXReportRequiredException(parameters, "IN610003", "Report2");
        }
     return adapter.Get();
    }


      public PXAction<INKitRegister> Report3;
    [PXUIField(DisplayName = "Report3", MapEnableRights = PXCacheRights.Select)]
    [PXLookupButton]
    public virtual IEnumerable report3(PXAdapter adapter)
    {
      INKitRegister item = Base.Document.Current;
      var invitem = (InventoryItem)PXSelect<InventoryItem,
            Where<InventoryItem.inventoryID, Equal<Current<INKitRegister.kitInventoryID>>>>.Select(Base, item.InventoryID);
      INKitRegister doc = Base.Document.Current;
        if (doc != null)
        {
        Dictionary<string, string> parameters = new Dictionary<string, string>();
        parameters["ItemNumber"] = invitem.InventoryCD.ToString();
        throw new PXReportRequiredException(parameters, "IN610001", "Report3");
        }
     return adapter.Get();
    }

      public PXAction<INKitRegister> Report4;
    [PXUIField(DisplayName = "Report4", MapEnableRights = PXCacheRights.Select)]
    [PXLookupButton]
    public virtual IEnumerable report4(PXAdapter adapter)
    {
      INKitRegister item = Base.Document.Current;
      var invitem = (InventoryItem)PXSelect<InventoryItem,
            Where<InventoryItem.inventoryID, Equal<Current<INKitRegister.kitInventoryID>>>>.Select(Base, item.InventoryID);
      INKitRegister doc = Base.Document.Current;
        if (doc != null)
        {
        Dictionary<string, string> parameters = new Dictionary<string, string>();
        parameters["ItemNumber"] = invitem.InventoryCD.ToString();
        throw new PXReportRequiredException(parameters, "IN610005", "Report4");
        }
     return adapter.Get();
    }

      public PXAction<INKitRegister> Report5;
    [PXUIField(DisplayName = "Report5", MapEnableRights = PXCacheRights.Select)]
    [PXLookupButton]
    public virtual IEnumerable report5(PXAdapter adapter)
    {
      INKitRegister item = Base.Document.Current;
      var invitem = (InventoryItem)PXSelect<InventoryItem,
            Where<InventoryItem.inventoryID, Equal<Current<INKitRegister.kitInventoryID>>>>.Select(Base, item.InventoryID);
      INKitRegister doc = Base.Document.Current;
        if (doc != null)
        {
        Dictionary<string, string> parameters = new Dictionary<string, string>();
        parameters["ItemNumber"] = invitem.InventoryCD.ToString();
        throw new PXReportRequiredException(parameters, "IN610006", "Report5");
        }
     return adapter.Get();
    }
    #endregion

  }

【讨论】:

    猜你喜欢
    • 2018-09-06
    • 2018-11-22
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    相关资源
    最近更新 更多