Как обновить стоимость на складе - PullRequest
1 голос
/ 21 января 2020

Можно ли вызвать процесс Обновление стоимости на экране обслуживания склада? В моем случае мой пользовательский код создает записи спецификации, а затем выполняет бросок стоимости спецификации. Последний шаг - выполнить Стоимость обновления, чтобы получить данные об ожидающих затратах. Я заметил, что процесс обновления стоимости на самом деле является методом в базовом графике, а не графиком обслуживания позиций запаса. Я не уверен, как выполнить кнопку действия в этом случае.

1 Ответ

0 голосов
/ 21 января 2020

Поскольку действие «Обновить стоимость» на складе содержит дополнительный параметр, нам необходимо выяснить, как получить доступ к действию с помощью следующего:

public PXAction<InventoryItem> action;
[PXUIField(DisplayName = "Actions", MapEnableRights = PXCacheRights.Select)]
[PXButton(SpecialType = PXSpecialButtonType.ActionsFolder)]
protected virtual IEnumerable Action(PXAdapter adapter,
    [PXInt]
    [PXIntList(new int[] { 1, 2, 3 }, new string[] 
    { 
            "Update Price",
            "Update Cost",
            "View Restriction Group"                    

    })]
    int? actionID
    )
{
    // button action code here...
}

Глядя на примеры в Acumatica, я смог выяснить, как предоставить параметры для PXAction, который требует больше, чем просто адаптер. В нашем случае нам нужно предоставить actionID значение.

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

var itemMaint = CreateInstance<InventoryItemMaint>();
var inventoryID = 151;
itemMaint.Item.Current = itemMaint.Item.Search<InventoryItem.inventoryID>(inventoryID);
// Must use this dummy view - actual view will not work
var view = PXView.Dummy.For<InventoryItem>(itemMaint);
var itemAdapter = new PXAdapter(view)
{
    Arguments = new Dictionary<string, object> { { "actionID", 2 } }
};
itemMaint.action.PressButton(itemAdapter);

Собрав все это вместе, что я и использовал для проверки примера, мы в итоге получили нечто подобное ...

  1. Стоимость спецификации Coll (список затрат)
  2. Обновление ожидающих затрат (список затрат)
  3. Стоимость обновления (элемент на складе)

Пример работы:

PXLongOperation.StartOperation(this, () =>
{
    var costRoll = CreateInstance<BOMCostRoll>();
    costRoll.Settings.Current.SnglMlti = RollupSettings.SelectOptSM.Multi;
    costRoll.Settings.Current.BOMID = "00000000000041";
    costRoll.Settings.Current.RevisionID = "A";

    // ROLL COSTS
    costRoll.start.Press();

    var inventoryIds = new HashSet<int>();
    foreach (AMBomCost costRollRec in costRoll.BomCostRecs.Select())
    {
        inventoryIds.Add(costRollRec.InventoryID.GetValueOrDefault());
    }

    // UPDATE PENDING
    costRoll.updpnd.Press();

    var itemMaint = CreateInstance<InventoryItemMaint>();

    foreach (var inventoryId in inventoryIds)
    {
        itemMaint.Clear();
        itemMaint.Item.Current = itemMaint.Item.Search<InventoryItem.inventoryID>(inventoryId);
        if (itemMaint.Item.Current == null)
        {
            continue;
        }

        // Must use this dummy view - actual view will not work
        var view = PXView.Dummy.For<InventoryItem>(itemMaint);
        var itemAdapter = new PXAdapter(view)
        {
            Arguments = new Dictionary<string, object> {{"actionID", 2}}
        };
        // UPDATE COST
        itemMaint.action.PressButton(itemAdapter);
    }
});
...