Я пытаюсь добавить строку в сетке «Транзакции» после ввода Клиента, но только если пользователь принимает ее - для этого подтверждения отображается диалоговое окно.
Я сократил логику до очень простой вставки SOLine.
С этим кодом результат успешен:
protected virtual void SOOrder_RowUpdated(PXCache sender, PXRowUpdatedEventArgs e)
{
if (e.Row == null)
{
return;
}
SOOrder record = (SOOrder)e.Row;
if (!sender.ObjectsEqual<SOOrder.customerID>(e.Row, e.OldRow)
&& record.CustomerID != null)
{
SOLine sOLineNewRow = new SOLine();
sOLineNewRow = this.Base.Transactions.Insert(sOLineNewRow);
SOLineExt sOLineExtRow = PXCache<SOLine>.GetExtension<SOLineExt>(sOLineNewRow);
sOLineNewRow.InventoryID = 311;
this.Base.Transactions.Update(sOLineNewRow);
sOLineNewRow.OrderQty = (decimal)7;
this.Base.Transactions.Update(sOLineNewRow);
sOLineNewRow.CuryUnitPrice = (decimal)8;
this.Base.Transactions.Update(sOLineNewRow);
}
}
Однако, когда я включаю диалоговое окно с методом Ask (), логика не выполняется. После отладки я заметил, что логика в операторе if даже не доступна.
protected virtual void SOOrder_RowUpdated(PXCache sender, PXRowUpdatedEventArgs e)
{
if (e.Row == null)
{
return;
}
SOOrder record = (SOOrder)e.Row;
if (!sender.ObjectsEqual<SOOrder.customerID>(e.Row, e.OldRow)
&& record.CustomerID != null)
{
if (this.Base.Document.Ask("Confirmation",
"The selected customer will have the default line. Do you want to insert it?",
MessageButtons.YesNo,
MessageIcon.Question) == WebDialogResult.Yes)
{
SOLine sOLineNewRow = new SOLine();
sOLineNewRow = this.Base.Transactions.Insert(sOLineNewRow);
SOLineExt sOLineExtRow = PXCache<SOLine>.GetExtension<SOLineExt>(sOLineNewRow);
sOLineNewRow.InventoryID = 311;
this.Base.Transactions.Update(sOLineNewRow);
sOLineNewRow.OrderQty = (decimal)7;
this.Base.Transactions.Update(sOLineNewRow);
sOLineNewRow.CuryUnitPrice = (decimal)8;
this.Base.Transactions.Update(sOLineNewRow);
}
}
}
Кто-нибудь знает, почему это может происходить?
ОБНОВЛЕННЫЙ ВОПРОС
Я повторил логику в действии, и результат там успешен:
public PXAction<SOOrder> ChangeAmount;
[PXUIField(DisplayName = "Action Test", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select)]
[PXButton(CommitChanges = true)]
public virtual void changeAmount()
{
PXTrace.WriteInformation("BeforeAskAction");
if (this.Base.Document.Ask("Confirmation",
"The selected customer will have the default line. Do you want to insert it?",
MessageButtons.YesNo,
MessageIcon.Question) == WebDialogResult.Yes)
{
PXTrace.WriteInformation("AfterAskAction");
SOLine sOLineNewRow = new SOLine();
sOLineNewRow = this.Base.Transactions.Insert(sOLineNewRow);
sOLineNewRow.InventoryID = 311;
this.Base.Transactions.Update(sOLineNewRow);
sOLineNewRow.OrderQty = (decimal)7;
this.Base.Transactions.Update(sOLineNewRow);
sOLineNewRow.CuryUnitPrice = (decimal)8;
this.Base.Transactions.Update(sOLineNewRow);
}
}
Регистрировались и трассировки "BeforeAskAction" и "AfterAskAction".
В моем исходном сценарии с обработчиком событий вводится только трассировка «До».
Я тестировал со следующими камерами данных:
- Документ
- CurrentDocument
- Транзакции
- Макетная марка, которую я создал с помощью SOLine DAC.
Во всех этих сценариях результат успешен в действии, но завершается неудачно в обработчике событий.
ОБНОВЛЕНИЕ 2
Изначально у меня была логика в SOOrder_CustomerID_FieldUpdated.
В этом случае запись вставляется, однако я не мог продолжать использовать ее, потому что CuryUnitPrice не назначал сумму, указанную в коде. Он назначил цену товара по умолчанию.
Я использовал эту статью в качестве справочного материала ( Обновление продажной цены каждые два раза ), но результат по-прежнему показывал сумму по умолчанию.
Когда используется событие RowUpdated, а метод Ask () не реализован, моей сумме CuryUnitPrice назначается