Как выполнить код с помощью кнопок Release / Release All на экране Release AR Documents

У меня есть настройка экрана Invoice & Memo, где я выполняю некоторый пользовательский код (вызовы веб-службы), когда активировано действие Release. Это прекрасно работает - я знал, как заменить код PXAction, и продолжил. Теперь я хочу использовать экран обработки Release AR Documents, чтобы сделать то же самое, но мне сложно понять, где / что переопределить или где разместить мой код.

Я вижу конструктор графа ARDocumentRelease с SetProcessDelegate в исходном коде, но я не уверен, что делать дальше - нужно ли мне это искать или нет. Мне нужно выполнить свой код для каждой выпускаемой строки, используя RefNbr в моем коде.


person pmfith    schedule 16.05.2016    source источник


Ответы (3)


Я думаю это функция

public static void ReleaseDoc(List<ARRegister> list, bool isMassProcess, List<Batch> externalPostList, ARMassProcessDelegate onsuccess)

в бизнес-логике ARDocumentRelease.

person Angelo Veloria    schedule 17.05.2016
comment
Вы не можете переопределить статические функции с помощью расширений графа. Я настоятельно рекомендую следовать подходу, описанному Александром на тренинге T300. - person Gabriel; 17.05.2016
comment
Я действительно нашел пример, созданный кем-то, в котором они переопределили вызов базового конструктора и переписали статические методы releaseDoc (назвав их 'conditionalReleaseDoc (...)') и поместив условную логику в основной метод. Это работает, как ожидалось. - person pmfith; 15.06.2016

Поскольку это статический метод, вы не можете его переопределить. Кроме того, вы не можете сделать так, как это сделано в T300, потому что вы находитесь на графике обработки, и вы не можете заменить кнопку спуска своей собственной. Я смог добиться этого, передав обратный вызов для каждого обработанного документа AR.

Вы можете вызвать метод Initialize графика ARDocumentRelease, чтобы переопределить логику, как вы сказали. После вам просто нужно вызвать ReleaseDoc, который использует параметр обратного вызова вместо параметра по умолчанию.

Вот код, с которым я пришел:

public class ARDocumentRelease_Extension : PXGraphExtension<ARDocumentRelease>
{
    public override void Initialize()
    {
        ARSetup setup = Base.arsetup.Current;

        Base.ARDocumentList.SetProcessDelegate(
            delegate (List<BalancedARDocument> list)
            {
                List<ARRegister> newlist = new List<ARRegister>(list.Count);
                foreach (BalancedARDocument doc in list)
                {
                    newlist.Add(doc);
                }
                AddAdditionalLogicToRelease(newlist);
            }
        );
        Base.ARDocumentList.SetProcessCaption("Release");
        Base.ARDocumentList.SetProcessAllCaption("Release All");
    }

    public delegate void PostPorcessing(ARRegister ardoc, bool isAborted);


    private void AddAdditionalLogicToRelease(List<ARRegister> newlist)
    {
        ARDocumentRelease.ReleaseDoc(newlist, true, null, delegate(ARRegister ardoc, bool isAborted) {
            //Add your logic to handle each document
            //Test to check if it was not aborted
        });
    }
}
person billybob    schedule 01.06.2016

Обратите внимание, что вы всегда должны вызывать статические методы из продолжительного процесса и создавать там необходимые объекты.

Логика делегата обработки реализована как длительный процесс, который создает рабочий поток для выполнения логики обработки.

У вас есть метод AddAdditionalLogicToRelease (), который требует экземпляра объекта для вызова и завершается ошибкой во время переключения контекста потока и, следовательно, проблемы. Итак, вы должны создать экземпляр объекта внутри контекста потока, а затем вызвать метод экземпляра.

В общем, метод, который вызывается из длительных процессов, объявляется статическим, и внутри этого статического метода создаются необходимые объекты / графы для выполнения некоторой работы. См. Ниже пример того, как правильно переопределить график ARDocumentRelease для этой цели:

public class ARDocumentRelease_Extension : PXGraphExtension<ARDocumentRelease>
{
    public override void Initialize()
    {

        Base.ARDocumentList.SetProcessDelegate(
            delegate (List<BalancedARDocument> list)
            {
                List<ARRegister> newlist = new List<ARRegister>(list.Count);
                foreach (BalancedARDocument doc in list)
                {
                    newlist.Add(doc);
                }



                // use override that allows to specify onsuccess routine
                ARDocumentRelease.ReleaseDoc(newlist, true, null, (ardoc, isAborted) =>
                {
                    //Custom code here, such as create your GL
                });
            }
        );

    }
}
person cbetabeta    schedule 02.06.2020