Вставьте SO строку после того, как пользователь подтвердит это в диалоговом окне - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь добавить строку в сетке «Транзакции» после ввода Клиента, но только если пользователь принимает ее - для этого подтверждения отображается диалоговое окно.

Я сократил логику до очень простой вставки 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 назначается

1 Ответ

0 голосов
/ 13 сентября 2018

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

Обычно метод DataView Ask () используется в контексте обработчика событий PXAction .

Если этот метод неПохоже, что он работает правильно в текущем контексте вызова, попробуйте переместить его в обработчик событий Action.

...