Нужна помощь в управлении селектором - PullRequest
2 голосов
/ 10 июля 2019

Я создал селекторный элемент управления, который отображает список всех серийных # из таблицы INItemLotSerial, он работает нормально, проблема в том, что в поле описания отображается InventoryID, как показать InventoryCD.Пожалуйста, посмотрите на приведенный ниже пример кода.

[PXSelector(typeof(Search<INItemLotSerial.lotSerialNbr>),
    new Type[] { typeof(INItemLotSerial.lotSerialNbr), typeof(INItemLotSerial.inventoryID) },
    SubstituteKey = typeof(INItemLotSerial.lotSerialNbr), DescriptionField = typeof(INItemLotSerial.inventoryID))]

// Я также присоединился к InventoryItem, но это не работает.

[PXSelector(typeof(Search2<INItemLotSerial.lotSerialNbr,
        LeftJoinSingleTable<InventoryItem, On<InventoryItem.inventoryID,Equal<INItemLotSerial.inventoryID>>>>),
    new Type[] { typeof(INItemLotSerial.lotSerialNbr), typeof(INItemLotSerial.inventoryID) },
    SubstituteKey = typeof(INItemLotSerial.lotSerialNbr), DescriptionField = typeof(InventoryItem.inventoryCD))]

enter image description here

1 Ответ

2 голосов
/ 11 июля 2019

Основная проблема со свойством DescriptionField состоит в том, что он ожидает получения поля из той же таблицы, для которой записано Selector.Но в случае ID / CD обычно, CD не присутствует в таблице, где присутствует ID, кроме основной таблицы.

ОБНОВЛЕНО Я удалил предыдущий код (реализация с использованием пользовательскихАтрибуты и обработчик события FieldSelecting) из-за проблем с производительностью, которые он приносит с собой.Приведенный ниже код приводит к тому же поиску, но получает данные с одним внутренним объединением вместо всех запросов, которые выполнял предыдущий код.

Чтобы получить этот поиск с описанием, можно сделать следующее:

  1. Создайте PXProjection для таблиц INItemLotSerial и InventoryItem, как показано ниже:

    [PXCacheName("Lot Serials with Inventory CD")]
    [PXProjection(typeof(Select2<INItemLotSerial,
        InnerJoin<InventoryItem,
                On<INItemLotSerial.inventoryID, Equal<InventoryItem.inventoryID>>>>))]
    public class INItemLotSerialWithInventoryItem : IBqlTable
    {
        [PXDBInt(BqlField = typeof(INItemLotSerial.inventoryID))]
        [PXUIField(DisplayName = "Inventory ID", Visibility = PXUIVisibility.Visible, Visible = false)]
        public virtual int? InventoryID { get; set; }
    
        public abstract class inventoryID : IBqlField { }
    
        [PXDBString(InputMask = "", IsUnicode = true, BqlField = typeof(InventoryItem.inventoryCD))]
        [PXUIField(DisplayName = "Inventory ID")]
        public virtual string InventoryCD { get; set; }
        public abstract class inventoryCD : IBqlField { }
    
        [PXDBString(InputMask = "", IsUnicode = true, BqlField = typeof(INItemLotSerial.lotSerialNbr))]
        [PXUIField(DisplayName = "Lot/Serial Nbr")]
        public virtual string LotSerialNbr { get; set; }
        public abstract class lotSerialNbr : IBqlField { }
    }
    
  2. Настройте селектор для использования этого PXProjectionкак показано ниже:

    [PXSelector(typeof(Search<INItemLotSerialWithInventoryItem.lotSerialNbr>),
    new Type[] { typeof(INItemLotSerialWithInventoryItem.lotSerialNbr) }, 
        SubstituteKey = typeof(INItemLotSerialWithInventoryItem.lotSerialNbr), 
        DescriptionField = typeof(INItemLotSerialWithInventoryItem.inventoryCD))]
    

В результате вы получите поиск, как показано ниже: enter image description here

...