Получение «Предыдущая операция еще не завершена». исключение при использовании PXLongOperation в действии, которое вызывается через API-интерфейсы Contract Soap - PullRequest
0 голосов
/ 30 марта 2019

У меня есть пользовательский процесс, который должен произойти во время выставления счета. Поскольку этот процесс обращается к веб-службе, мне нужно обернуть этот код в PXLongOperation в соответствии с рекомендациями Acumatica. если я обертываю PXLongOperation в блоке try / finally, все работает нормально относительно пользовательского интерфейса, но если я запускаю интеграционный тест, который выполнил элемент действия, вызывающий PXLongOperation, я теперь получаю «Предыдущая операция еще не завершена». ошибка. где они прошли нормально перед добавлением длинной операции.

Спасибо за вашу помощь

        [PXOverride]
    public IEnumerable Release(PXAdapter adapter, ReleaseDelegate baseMethod)
    {
        //IEnumerable returnValue = null;

        try
        {



            ARInvoice invoice = Base.Document.Current;
            CtpARInvoiceExt invoiceExt = PXCache<ARInvoice>.GetExtension<CtpARInvoiceExt>(invoice);

            if (invoice.DocType == "CRM")
            {
                PXLongOperation.StartOperation(Base, () => { ProcessClickToPayCreditMemoInvoice(invoice, invoiceExt); });
            }

            return baseMethod(new PXAdapter(Base.CurrentDocument));
        }
        //todo: I did find that this is raising an error behind the scenes but if this is commented out 
        //      everything works as expected.
        //      I have found that even if this gets commented out the the integration tests that are using
        //      The Contract Bases Soap API are failing indicating that the process has not completed.
        //catch (Exception e)
        //{
        //    //todo: this is throwing an exception with message: The previous operation has not been completed yet.
        //    throw new PXException(e,CtpMessages.ClickToPayReleaseOverrideFailed, e.Message);
        //}
        finally
        {
            //... exit logic 
        }

    }

Сбой вызова API-интерфейса Contract Soap

InvokeResult invokeResult = SoapClient.Invoke(invoice, new ReleaseInvoice());

1 Ответ

1 голос
/ 01 апреля 2019

Этот шаблон проектирования можно использовать, чтобы заставить ваш метод ждать завершения длинной операции.

TimeSpan timespan;
Exception ex;
while (PXLongOperation.GetStatus(docgraph.UID, out timespan, out ex) == PXLongRunStatus.InProcess)
{ }

    // should be finished now
    // return baseMethod...
...