Acumatica - Состояние товара на SOLine - PullRequest
0 голосов
/ 11 июня 2018

Я создал настройку для добавления статуса элемента в SOLine.Код графика и ЦАП компилируются просто отлично и не дают ошибок.Когда я проверяю новое поле статуса, оно просто пустое.Вот как я это сделал:

Первый ЦАП:

public class SOLineExt : PXCacheExtension<PX.Objects.SO.SOLine>
  {
    #region ItemStatus
    public abstract class itemStatus : PX.Data.IBqlField
    {
    }
    protected string _ItemStatus;

    [PXString()]
    [PXDefault()]
    [PXUIField(DisplayName = "Status", IsReadOnly = true)]
    public virtual string ItemStatus
    {
      get
      {
        return this._ItemStatus;
      }
      set
      {
        this._ItemStatus = value;
      }
    }
    #endregion
  }

График:

  public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry>
  {
    #region Event Handlers
protected void SOLine_RowSelecting(PXCache cache, PXRowSelectingEventArgs e,PXRowSelecting InvokeBaseHandler)
    {
if(InvokeBaseHandler != null)
           InvokeBaseHandler(cache, e);
            var row = (SOLine)e.Row;
            if (row == null) return;

                    InventoryItem item = PXSelect<InventoryItem, Where<InventoryItem.inventoryID, Equal<Required<SOLine.inventoryID>>>>.Select(Base, row.InventoryID);
                    if(item != null){
                      SOLineExt soLinesExt = row.GetExtension<SOLineExt>();
                    if (soLinesExt != null){
                       if (item.ItemStatus == 'AC')
                        soLinesExt.ItemStatus = "Active";
                     if (item.ItemStatus == 'NS')
                      soLinesExt.ItemStatus = "No Sales"; 
                      if (item.ItemStatus == 'NP')
                      soLinesExt.ItemStatus = "No Purchases"; 
                      if (item.ItemStatus == 'NR')
                      soLinesExt.ItemStatus = "No Request"; 
                      if (item.ItemStatus == 'IN')
                      soLinesExt.ItemStatus = "Inatctive"; 
                      if (item.ItemStatus == 'DE')
                      soLinesExt.ItemStatus = "Marked for Deletion"; 

                    }  
                    }


    }
    #endregion
  }

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

1 Ответ

0 голосов
/ 11 июня 2018

Опция # 1

Вы можете использовать PXDBScalar и PXDefault, как показано ниже, для достижения своей цели.Вы можете ссылаться на комментарий для каждого атрибута, оформленного для этого настраиваемого поля.

public class SOLineExt : PXCacheExtension<PX.Objects.SO.SOLine>
{
    #region UsrItemStatus
    public abstract class usrItemStatus : PX.Data.IBqlField
    {
    }
    protected string _UsrItemStatus;

    [PXString()]
    [PXUIField(DisplayName = "Status", IsReadOnly = true)]
    //Sub-Select or Sub Query - required to get value for Saved SO Lines
    [PXDBScalar(typeof(Search<InventoryItem.itemStatus, 
             Where<InventoryItem.inventoryID, Equal<SOLine.inventoryID>>>))]
    //StringList Attribute so that you don’t need to convert value to display text
    [InventoryItemStatus.List]
    //Defaulted when inserting new SO Line
    [PXDefault(typeof(Search<InventoryItem.itemStatus, 
             Where<InventoryItem.inventoryID, Equal<Current<SOLine.inventoryID>>>>),
               PersistingCheck = PXPersistingCheck.Nothing)]
    //Triggering default assignment upon changing Inventory ID in SO Line 
    [PXFormula(typeof(Default<SOLine.inventoryID>))]
    public virtual string UsrItemStatus
    {
        get
        {
            return this._UsrItemStatus;
        }
        set
        {
            this._UsrItemStatus = value;
        }
    }
    #endregion
}

Параметр # 2

Включить InventoryItem ЦАП в представлении данных (Transactionsв данном конкретном случае) работа с Document Details Grid.И добавьте поле InventoryItem__ItemStatus в Grid.Готовый SOOrderEntry Graph имеет реализацию делегата представления данных для Transactions, поэтому нам придется изменить это также.

public class SOOrderEntryPXDemoExt : PXGraphExtension<SOOrderEntry>
{
    public override void Initialize()
    {
        Base.Transactions.Join<InnerJoin<InventoryItem, On<InventoryItem.inventoryID, Equal<SOLine.inventoryID>>>>();
    }

    [PX.Api.Export.PXOptimizationBehavior(IgnoreBqlDelegate = true)]
    protected virtual IEnumerable transactions()
    {
        PXSelectBase<SOLine> query =
            new PXSelectJoin<SOLine,
                    LeftJoin<INItemCost, On<INItemCost.inventoryID, Equal<SOLine.inventoryID>>,
                    InnerJoin<InventoryItem, On<InventoryItem.inventoryID, Equal<SOLine.inventoryID>>>>,
                    Where<SOLine.orderType, Equal<Current<SOOrder.orderType>>,
                        And<SOLine.orderNbr, Equal<Current<SOOrder.orderNbr>>>>,
                    OrderBy<Asc<SOLine.orderType, Asc<SOLine.orderNbr, Asc<SOLine.lineNbr>>>>>(Base);

        var ret = new List<PXResult<SOLine, INItemCost, InventoryItem>>();
        int startRow = PXView.StartRow;
        int totalRows = 0;
        foreach (PXResult<SOLine, INItemCost, InventoryItem> record in query.View.Select(
            PXView.Currents, PXView.Parameters, PXView.Searches, PXView.SortColumns,
            PXView.Descendings, PXView.Filters, ref startRow, PXView.MaximumRows, ref totalRows))
        {
            SOLine line = (SOLine)record;
            INItemCost itemCost = (INItemCost)record;

            Base.initemcost.StoreCached(new PXCommandKey(new object[] { line.InventoryID }), new List<object> { itemCost });

            ret.Add(record);
        }
        PXView.StartRow = 0;
        return ret;
    }
}

enter image description here

...