Импортировано / Скопировано Возможность сдвига на одну строку - PullRequest
0 голосов
/ 04 июня 2018

Линии смещены с настраиваемыми полями в сетке продуктов Opportunity на одну строку вниз на настроенном сайте.

Фон :

У нас есть настройка, которая обеспечивает поля единици% в шапке.PXFormula используется в ЦАП для любых зависимых от расчета значений.

У продуктов возможностей есть 4 добавленных поля:

  1. Последняя стоимость = Последняя стоимость из InventoryItem
  2. Общая стоимость= Кол-во * Последняя стоимость
  3. Маржа = ExtAmt - ExtCost
  4. Стоимость вручную, флажок, разрешающий ручную отмену последней стоимости

Возможность имеет 2 добавленных поля:

  1. Сумма маржи = Сумма маржи
  2. Маржа% = Сумма маржи / Общая сумма продаж

Проблема :

Существует проблема с возможностями настройки, когда строки смещаются на одну строку при копировании записи из существующей возможности или при импорте файла Excel.

Существующая запись Existing Record

После копирования/ Вставить или импортировать из Excel After Copy/Paste or Import from Excel

Код :

Мой текущий код:

public PXSelect<INItemCost, 
    Where<INItemCost.inventoryID, 
    Equal<Current<CROpportunityProducts.inventoryID>>>> Cost;

protected void CROpportunityProducts_RowInserting(PXCache cache, 
    PXRowInsertingEventArgs e, PXRowInserting InvokeBaseHandler)
{
  if(InvokeBaseHandler != null)
    InvokeBaseHandler(cache, e);
  var row = (CROpportunityProducts)e.Row;
  if (row == null) return;

  var rowExt = cache.GetExtension<CROpportunityProductsExt>(row);
  if (rowExt == null) return;

  var cost = Cost.SelectSingle();

  if (cache.GetValue(row, "usrManCost") == null) return;
  if (cost != null && (bool)cache.GetValue(row, "usrManCost") == false)
  {
    cache.SetValueExt<CROpportunityProductsExt.usrLastCost>(row, cost.LastCost);  
  }       
}

Что может быть причиной этого?У меня есть мысли, что событие RowInserting возвращает 0 для первой строки, поскольку оператор PXSelect <> возвращает 0, поскольку InventoryItem не находится в кэше до следующей строки.

Одним из возможных решений, которое я придумал, было использование RowInserted.Это решает проблему при использовании копирования / вставки.Однако это приводит к тому, что импорт из Excel неправильно рассчитывает общую маржу.

Ответы [ 2 ]

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

Ответ заключается в том, что события в этом случае должны выполняться в обработчике событий RowSelecting вместе с PXConnectionScope ().

Брендан был на правильном пути, перемещая PXSelect в обработчик.Мой код в вопросе становится ниже.Также обратите внимание на использование Обязательный <> в сравнении с Текущим <>.

    public void CROpportunityProducts_RowSelecting(PXCache cache,
        PXRowSelectingEventArgs e)
    {
        var row = (CROpportunityProducts)e.Row;
        if (row == null) return;

        using (new PXConnectionScope())
        {
            INItemCost cost = PXSelect<INItemCost, 
                Where<INItemCost.inventoryID, 
                Equal<Required<INItemCost.inventoryID>>>>.Select(Base, row.InventoryID);
            if (cost != null && (bool)cache.GetValue(row, "usrManCost") == false)
            {
                //decimal dbLastCost = (decimal)cost.LastCost;
                var lstCost = cache.GetValue(row, "usrLastCost");

                if ((decimal)cost.LastCost == (decimal)0.00)
                {
                    cache.SetValueExt<CROpportunityProductsExt.usrLastCost>(row, 
                        cost.LastCost);
                }
            }
        }
    }
0 голосов
/ 05 июня 2018

Может быть, Current<>, на ваш взгляд, на самом деле не тот ток, который вам нужен?

Что произойдет, если вы просто замените строку var cost = Cost.SelectSingle() на следующую, чтобы использовать Required<> в качестве прохода в ИнвентаризацииID ...

INItemCost cost = PXSelect<INItemCost,
    Where<INItemCost.inventoryID, Equal<Required<CROpportunityProducts.inventoryID>>>>
        .Select(Base, row.inventoryID);
...