Поскольку действие «Обновить стоимость» на складе содержит дополнительный параметр, нам необходимо выяснить, как получить доступ к действию с помощью следующего:
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);
Собрав все это вместе, что я и использовал для проверки примера, мы в итоге получили нечто подобное ...
- Стоимость спецификации Coll (список затрат)
- Обновление ожидающих затрат (список затрат)
- Стоимость обновления (элемент на складе)
Пример работы:
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);
}
});