Добавление дополнительного поля фильтра для технологических отгрузок

Я добавил новое настраиваемое поле в SOShipment и SOShipmentFilter. Я пытаюсь использовать его для фильтрации сетки для обработки отгрузок, и у меня возникают проблемы с кодом. Я выполнил другие настройки, в которых я расширил код, но я смог сначала вызвать baseHandler, а затем выполнить свой фрагмент, когда он вернется. Однако, когда я переопределяю функцию делегата, он просто устанавливает шаблон с возвратом к baseMethod. Когда я вставляю свой код для включения нового поля фильтра, я получаю ошибки компиляции для неопределенных полей / ссылок. Нужно ли мне копировать весь исходный код из исходного делегата и включать его в мою функцию переопределения? Ниже мой текущий код переопределения:

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
  }
}

person Jerry Welliver    schedule 11.06.2015    source источник


Ответы (1)


cmd - это переменная местоположения, и вы не можете получить к ней доступ из своего расширения. Я вижу два способа добиться желаемого результата:

  1. Скопируйте всю функцию делегата в свое расширение. Это не идеально, потому что его нужно будет проверять и обновлять с каждой новой версией Acumatica.
  2. Отфильтруйте данные на стороне клиента после того, как они будут возвращены исходным делегатом, но до того, как они будут отображены на экране. Это не так эффективно, как фильтрация на 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 для переопределения делегата представления; к сожалению, инструменты настройки генерируют неправильную сигнатуру метода, когда вы пытаетесь переопределить делегат, и это будет улучшено. Дополнительную информацию об этом типе настройки можно найти в учебном курсе T300, доступном здесь (см. для "Объявление или изменение делегата просмотра данных BLC").

person Gabriel    schedule 12.06.2015
comment
Эта концепция хорошо сработала для меня в 2019R1. Но в 2020R2 мне пришлось изменить выражение Orders.SetProcessTarget(null, null, null, filter.Action, parameters); на Orders.SetProcessWorkflowAction(filter.Action, parameters);. - person Ben Rothe; 25.06.2021