2016-11-03 3 views
0

Я пытаюсь добавить поле Alternate ID в селектор поиска в сетке SOLine details. Мой код выглядит следующим образом:Добавить поле альтернативного идентификатора в селектор идентификатора инвентаря на SOLine grid

[PXNonInstantiatedExtension] 
public class SO_SOLine_ExistingColumn : PXCacheExtension<PX.Objects.SO.SOLine> 
{ 
    #region InventoryID 
[PXMergeAttributes(Method = MergeMethod.Append)] 
[PXSelector(typeof(Search2<InventoryItem.inventoryCD, LeftJoin<INItemXRef, On<InventoryItem.inventoryID, Equal<INItemXRef.inventoryID>>>>), 

     typeof(PX.Objects.IN.InventoryItem.inventoryCD), 
     typeof(PX.Objects.IN.INItemXRef.alternateID), 
     typeof(PX.Objects.IN.InventoryItem.descr), 
     typeof(PX.Objects.IN.InventoryItem.itemClassID), 
     typeof(PX.Objects.IN.InventoryItem.itemStatus), 
     typeof(PX.Objects.IN.InventoryItem.itemType), 
     typeof(PX.Objects.IN.InventoryItem.baseUnit), 
     typeof(PX.Objects.IN.InventoryItem.salesUnit), 
     typeof(PX.Objects.IN.InventoryItem.purchaseUnit), 
     typeof(PX.Objects.IN.InventoryItem.basePrice))] 
    public int? InventoryID { get; set; } 
    #endregion 
} 
    public void SOLine_InventoryID_CacheAttached(PXCache sender) 
{ 
} 

Это добавляет Alternate поля идентификатора к селектору и кратко, возможно, в течение секунды, возвращает правильный Inventory компакт-диск, когда выбрано, но затем Инвентарный компакт изменяет целое число ID, которое, конечно, повышает индикатор ошибки, поскольку идентификатор не распознается.

ответ

0

Джордж, есть один-ко-многим между InventoryItem и DACs INItemXRef - добавление PX.Objects. IN_INItemXRef.alternateID BQL-поле в объявление PXSelectorAttribute недостаточно для выполнения задачи.

  1. Declare несвязанных текстовое поле для InventoryItem DAC для хранения альтернативных идентификаторов для каждого инвентарного объекта:

    public class InventoryItemExt : PXCacheExtension<InventoryItem> 
    { 
        #region AlternateIDs 
        public abstract class alternateIDs : IBqlField { } 
    
        [PXString] 
        [PXUIField(DisplayName = "Alternate IDs")] 
        public virtual string AlternateIDs { get; set; } 
        #endregion 
    } 
    
  2. Подписаться на RowSelecting событие (с обязательным использованием PXConnectionScope установить еще одно соединение с базой данных) в пределах расширение SOOrderEntry BLC для объединения альтернативных идентификаторов для каждой строки и заполнения несвязанного поля AlternateIDs с вычисленным строковым значением:

    public class SOOrderEntryExtension : PXGraphExtension<SOOrderEntry> 
    { 
        public override void Initialize() 
        { 
         Base.RowSelecting.AddHandler<InventoryItem>((sender, e) => 
         { 
          InventoryItem item = e.Row as InventoryItem; 
          if (item == null) return; 
    
          string alternateIDs = string.Empty; 
          using (new PXConnectionScope()) 
          { 
           foreach (INItemXRef crossRef in PXSelect<INItemXRef, 
            Where<INItemXRef.inventoryID, Equal<Required<InventoryItem.inventoryID>>>>.Select(Base, item.InventoryID)) 
           { 
            alternateIDs = string.IsNullOrEmpty(alternateIDs) ? 
             crossRef.AlternateID : alternateIDs + "; " + crossRef.AlternateID; 
           } 
          } 
          item.GetExtension<InventoryItemExt>().AlternateIDs = alternateIDs; 
         }); 
        } 
    } 
    
  3. Launch Layout Editor для экрана продаж Заказы (SO301000) и выберите опцию Edit ASPX в меню Действия: enter image description here

  4. В ASPX файле найти объявление селектора InventoryID:

    <px:PXSegmentMask CommitChanges=“True" ID="edInventoryID" runat="server" DataField="InventoryID" AllowEdit="True" /> 
    
  5. Для селектор InventoryID, установите свойство FastFilterFields на AlternateIDs и добавьте столбцы, объявив столбец AlternateIDs, затем нажмите «Сгенерировать сценарий настройки»:

    <px:PXSegmentMask CommitChanges="True" ID="edInventoryID" runat="server" DataField="InventoryID" AllowEdit="True" > 
        <GridProperties FastFilterFields="AlternateIDs"> 
         <Columns> 
          <px:PXGridColumn DataField="AlternateIDs" AutoGenerateOption="Add" Width="250px" /> 
         </Columns> 
        </GridProperties> 
    </px:PXSegmentMask> 
    
+0

Спасибо вам за ответы. Patrick - ключ-заменитель возвращает правильный InventoryCD, но затем я получаю сообщение об ошибке, поскольку InventoryID не существует в системе. Руслан - Для целей моих клиентов мне нужно, чтобы InventoryID повторялся с отдельным AlternateID для каждой записи в селекторе. Я неоднократно пытался, но, как я уверен, вы уже знаете, я не смог изменить код, который вы предоставили, чтобы сделать это. – GeorgeM

+0

Джордж, ваша первоначальная попытка (даже если она обновлена ​​в соответствии с предложением Патрика) не работает из-за дублированный PXSelectorAttribute. На самом деле не совсем правильно декорировать InventoryID с помощью PXSelectorAttribute из-за того, что CD Inventory является сегментированным ключом - для сегментированных ключей разрешен только PXDimensionSelectorAttribute. – RuslanDev

+0

Дополнительный комментарий: повторение InventoryID с отдельным AlternateID для каждой записи в селекторе не позволит вам достичь ожидаемых результатов и будет только путать пользователей, поскольку селектор всегда выделяет сначала обнаруженный CD-диск Inventory, несмотря на выбранный AlternateID. Создание настраиваемого поля селектора против ЦАП INItemXRef и заполнение идентификатора Inventory в коде также не представляется возможным: InventoryID является одним из 5! которые определены для ЦАП INItemXRef.Предлагаемое ранее решение представляется единственным приемлемым вариантом, чтобы как можно ближе подойти к тому, что запрашивал клиент. – RuslanDev

0

Вам нужно, чтобы ваш селектор выполнил поиск InventoryID, а затем добавьте опцию «SubstituteKey», которая покажет InventoryCD в пользовательском интерфейсе для селектора. Пример: [PXSelector (TypeOf (InventoryItem.inventoryID), SubstituteKey = TypeOf (InventoryItem.inventoryCD))]