Как решить "Изменения не могут быть сохранены в базе данных из обработчика событий"? - PullRequest
0 голосов
/ 16 октября 2019

В POOrderEntry при создании или удалении POLine мне нужно отправить ссылку обратно на пользовательский ЦАП, который создает линию PO. Например, если строка PO удалена, мой пользовательский ЦАП удалил ссылку в Events.RowDeleted через:

using (PXTransactionScope ts = new PXTransactionScope())
{
    Base.Caches[typeof(MyDAC)].SetValueExt<MyDAC.pOType>(row, null);
    Base.Caches[typeof(MyDAC)].SetValueExt<MyDAC.pONbr>(row, null);
    Base.Caches[typeof(MyDAC)].SetValueExt<MyDAC.pOLineNbr>(row, null);
    Base.Caches[typeof(MyDAC)].Update(row);
    Base.Caches[typeof(MyDAC)].Persist(PXDBOperation.Update);
    ts.Complete(Base);
}

Я пытался разрешить обычному Persist сохранять значения, но это не такесли я не позвоню Persist (последняя строка моего примера выше). Результатом является ошибка через Acuminator «Изменения не могут быть сохранены в базе данных из обработчика событий». Когда я смотрю на это, мне интересно, должно ли это быть в длительной операции, а не в области транзакций, но ошибка Acuminator говорит мне, что я делаю это неправильно. Как правильно вернуться к «MyDAC» для каждой линии PO?

Я также попытался инициализировать экземпляр графа для графа MyDAC, но я получаю предупреждение о создании PXGraph в обработчике событий. поэтому я не могу «легально» вызвать граф, в котором поддерживается MyDAC.

Мой код компилируется и функционирует так, как нужно, но ошибка в Acuminator говорит мне, что для этого должен быть более правильный способ.

1 Ответ

1 голос
/ 16 октября 2019

Вы можете добавить представление к расширению графа.

Затем в удаленной строке вы будете использовать ваш view.Update (строку) для обновления своего пользовательского ЦАП.

Во время базового графикасохраняйте ваши записи будут фиксироваться до тех пор, пока в других событиях не будут обнаружены другие ошибки.

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

Также с этим изменением нет необходимости использовать PXTransactionScope.

Пример может выглядеть примерно так ...

public class POOrderEntryExtension : PXGraphExtension<POOrderEntry>
{
    public PXSelect<MyDac> MyView;

    protected virtual void _(Events.RowDeleted<POLine> e)
    {
        //get your row to update from e.Row
        var myRow = PXSelect...

        myRow.pOType = null;
        myRow.pONbr = null;
        myRow.pOLineNbr = null;

        MyView.Update(myRow);
    }
}
...