Acumatica 在流程装运上添加其他筛选器字段

Acumatica 在流程装运上添加其他筛选器字段,acumatica,Acumatica,我向SoShipping和SoShippmentFilter添加了一个新的自定义字段。我正试图使用它来过滤网格中的进程装运,但代码有问题。我还做过其他定制,其中扩展了代码,但我能够首先调用baseHandler,然后在代码段返回时执行它。但是,当我重写委托函数时,它只是设置了一个带有returntobasemethod的模板。当我将代码放入以包含新的过滤器字段时,会出现未定义字段/引用的编译错误。我是否需要从原始委托复制所有原始代码并将其包含在重写函数中?以下是我当前的覆盖代码: using S

我向SoShipping和SoShippmentFilter添加了一个新的自定义字段。我正试图使用它来过滤网格中的进程装运,但代码有问题。我还做过其他定制,其中扩展了代码,但我能够首先调用baseHandler,然后在代码段返回时执行它。但是,当我重写委托函数时,它只是设置了一个带有returntobasemethod的模板。当我将代码放入以包含新的过滤器字段时,会出现未定义字段/引用的编译错误。我是否需要从原始委托复制所有原始代码并将其包含在重写函数中?以下是我当前的覆盖代码:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using PX.Data;
using PX.Objects.CS;
using PX.Objects.IN;
using PX.Objects.AR;
using PX.Objects.CM;
using POReceipt = PX.Objects.PO.POReceipt;
using POReceiptLine = PX.Objects.PO.POReceiptLine;
using POLineType = PX.Objects.PO.POLineType;
using PX.Objects;
using PX.Objects.SO;

namespace PX.Objects.SO
{
  public class SOInvoiceShipment_Extension:PXGraphExtension<SOInvoiceShipment>
  {
    #region Event Handlers
    public delegate IEnumerable ordersDelegate();
    [PXOverride]
    public IEnumerable orders(ordersDelegate baseMethod)
    {
      if (filter.usrTruckNbr != null)
      {
        ((PXSelectBase<SOShipment>)cmd).WhereAnd<Where<SOShipment.usrTruckNbr, GreaterEqual<Current<SOShipmentFilter.usrTruckNbr>>>>();
      }
      return baseMethod();
    }
    protected virtual void SOShipmentFilter_UsrTruckNbr_CacheAttached(PXCache cache)
    {

    }
    #endregion
  }
}
cmd是一个位置变量,您无法从扩展访问它。我认为有两种方法可以实现您想要的结果:

将整个委托函数复制到扩展中。这并不理想,因为每一个新版本的Acumatica都必须对其进行验证和更新。 从原始代理返回数据后,在屏幕上显示之前,在客户端筛选数据。这不如在SQL上进行过滤有效,但至少可以消除将太多代码复制到扩展的需要。这是一个完整的示例,它将过滤装运列表,以仅返回装运数量为偶数的文档:

public class SOInvoiceShipment_Extension : PXGraphExtension<SOInvoiceShipment>
{
    [PXFilterable]
    public PXFilteredProcessing<SOShipment, SOShipmentFilter> Orders;

    protected IEnumerable orders()
    {
        // Filter the list of shipments to return only documents where shipment quantity is even
        foreach (SOShipment shipment in Base.Orders.Select())
        {            
            if(shipment.ShipmentQty % 2 == 0)
            {
                yield return shipment;
            }
        }
    }

    public void SOShipmentFilter_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
    {
        if (e.Row == null) return;

        SOShipmentFilter filter = e.Row as SOShipmentFilter;
        if (filter != null && !string.IsNullOrEmpty(filter.Action))
        {
            Dictionary<string, object> parameters = Base.Filter.Cache.ToDictionary(filter);
            Orders.SetProcessTarget(null, null, null, filter.Action, parameters);
        }
    }
}
在所有情况下,都不应使用PXOverride来替代视图委托;不幸的是,当您尝试重写委托时,定制工具生成了错误的方法签名,这将得到改进。有关声明或更改BLC数据视图委托的此类自定义查找的更多信息,请参阅T300培训