Как переопределить PXFilteredProcessingJoin в расширении графа без изменения поведения базового графа? - PullRequest
0 голосов
/ 24 сентября 2019

Справочная информация:

В APPayBills (Payables - Prepare Payments) функциональность экрана предназначена для накопления всех платежей для денежного счета.Существует выбор для Филиала, но он фактически не ограничивает платежи для филиала, а скорее кассовые счета, определенные для филиала.

Наш вариант использования состоит в том, что у нас есть несколько «филиалов», которые работают несколько независимодля повседневной деятельности (инвентарь, выдача материала, квитанции о покупке и т. д.) Однако вся кредиторская задолженность обрабатывается через один банковский счет, а следовательно, и единый денежный счет.Платежи обрабатываются филиалом в соответствии с определенными бизнес-правилами.Очевидный способ справиться с этим в стандартном Acumatica - это использовать разные банковские счета, чтобы мы могли управлять отдельными денежными счетами внутри Acumatica.Наша база пользователей предпочитает единый банковский счет, поэтому перед нами стоит задача создать решение.У нас также есть некоторые обходные пути, но это необходимо упростить, чтобы облегчить нагрузку на персонал и уменьшить количество ошибок.Дело было открыто с помощью Acumatica, и ответ был таков: с нашей стороны это требует настройки.

Проблема:

APPayBill использует 2 представления (APDocuemntList и APExceptionsList) длязаполнить сетки на 2 вкладки.Стандартное поведение заключается в том, что сетка остается пустой до тех пор, пока пользователь не введет Филиал, Способ оплаты и Счет наличных денег.В этот момент результаты отображаются в таблицах в соответствии со всеми платежами с использованием указанного денежного счета.

Насколько я понимаю, вы можете переопределить представление в расширении графика, чтобы переопределить его.Однако, когда я это делаю, сетки заполняются еще до того, как будут сделаны какие-либо выборы.Данные сетки фильтруются так, как я хочу, но изменение в поведении пользовательского интерфейса для того, когда заполнять сетки, нежелательно.

До кода:

[PXFilterable]
public PXFilteredProcessingJoin<APAdjust, PayBillsFilter,
    InnerJoin<APInvoice, On<APInvoice.docType, Equal<APAdjust.adjdDocType>, And<APInvoice.refNbr, Equal<APAdjust.adjdRefNbr>>>,
    LeftJoin<APTran, On<APInvoice.paymentsByLinesAllowed, Equal<True>,
        And<APTran.tranType, Equal<APAdjust.adjdDocType>,
        And<APTran.refNbr, Equal<APAdjust.adjdRefNbr>,
        And<APTran.lineNbr, Equal<APAdjust.adjdLineNbr>>>>>>>
    > APDocumentList;

public PXSelectJoin<APAdjust,
    InnerJoin<APInvoice, On<APInvoice.docType, Equal<APAdjust.adjdDocType>, And<APInvoice.refNbr, Equal<APAdjust.adjdRefNbr>>>,
        LeftJoin<APTran, On<APInvoice.paymentsByLinesAllowed, Equal<True>,
            And<APTran.tranType, Equal<APAdjust.adjdDocType>,
            And<APTran.refNbr, Equal<APAdjust.adjdRefNbr>,
            And<APTran.lineNbr, Equal<APAdjust.adjdLineNbr>>>>>>>
    > APExceptionsList;

После кода:

[PXFilterable]
public PXFilteredProcessingJoin<APAdjust, PayBillsFilter,
    InnerJoin<APInvoice, On<APInvoice.docType, Equal<APAdjust.adjdDocType>, And<APInvoice.refNbr, Equal<APAdjust.adjdRefNbr>>>,
    LeftJoin<APTran, On<APInvoice.paymentsByLinesAllowed, Equal<True>,
        And<APTran.tranType, Equal<APAdjust.adjdDocType>,
        And<APTran.refNbr, Equal<APAdjust.adjdRefNbr>,
        And<APTran.lineNbr, Equal<APAdjust.adjdLineNbr>>>>>>>

    // BEG - Add branch filter
    ,Where<APAdjust.adjdBranchID, Equal<Current<PayBillsFilter.branchID>>>
    // END - Add branch filter

    > APDocumentList;

public PXSelectJoin<APAdjust,
    InnerJoin<APInvoice, On<APInvoice.docType, Equal<APAdjust.adjdDocType>, And<APInvoice.refNbr, Equal<APAdjust.adjdRefNbr>>>,
        LeftJoin<APTran, On<APInvoice.paymentsByLinesAllowed, Equal<True>,
            And<APTran.tranType, Equal<APAdjust.adjdDocType>,
            And<APTran.refNbr, Equal<APAdjust.adjdRefNbr>,
            And<APTran.lineNbr, Equal<APAdjust.adjdLineNbr>>>>>>>

    // BEG - Add branch filter
    ,Where<APAdjust.adjdBranchID, Equal<Current<PayBillsFilter.branchID>>>
    // END - Add branch filter

    > APExceptionsList;

Чтобы быть уверенным, что добавление оператора where не является причиной, я буквально скопировал и вставил точные представления из базового кода в расширение графа, чтобыне было бы абсолютно никаких изменений.Удивительно (для меня) расширение графа с представлениями замещения показало то же самое предварительное заполнение, которое было замечено с добавленными предложениями Where.

Очевидно, что есть что-то особенное для переопределения представлений таким образом.Я пытался с и без [PXOverride] украшать представления без различий в поведении.

Что заставляет экран обработки предварительно заполнять сетку, и как правильно применить мои переопределения к 2 видам?

1 Ответ

1 голос
/ 25 сентября 2019

В графе APPayBills представление данных APDocumentList определяется следующим образом:

    [PXFilterable]
    public PXFilteredProcessingJoin<APAdjust, PayBillsFilter, 
        InnerJoin<APInvoice, On<APInvoice.docType, Equal<APAdjust.adjdDocType>, And<APInvoice.refNbr, Equal<APAdjust.adjdRefNbr>>>>> APDocumentList;

Однако представление также имеет делегата:

protected virtual IEnumerable apdocumentlist()
        {
            PayBillsFilter filter = Filter.Current;

            if (filter?.PayDate == null || filter.PayTypeID == null || filter.PayAccountID == null)
                yield break;

            foreach (APAdjust adj in APDocumentList.Cache.Inserted)
            {
                APInvoice doc = PXSelect<APInvoice, Where<APInvoice.docType, Equal<Required<APInvoice.docType>>, And<APInvoice.refNbr, Equal<Required<APInvoice.refNbr>>>>>.Select(this, adj.AdjdDocType, adj.AdjdRefNbr);
                adj.SeparateCheck = (adj.SeparateCheck ?? doc.SeparateCheck);
                yield return new PXResult<APAdjust, APInvoice>(adj, doc);
                if (_copies.ContainsKey(adj))
                {
                    _copies.Remove(adj);
                }
                _copies.Add(adj, PXCache<APAdjust>.CreateCopy(adj));
            }

            PXSelectBase<APInvoice> cmd = ComposeBQLCommandForAPDocumentListSelect();

            int startRow = PXView.StartRow;
            int totalRows = 0;

            APDocumentListViewExecuteParamsBuilder.ViewExecutingParams viewExecutingParams =
                new APDocumentListViewExecuteParamsBuilder()
                    .BuildViewExecutingParams(APDocumentList.View);

            foreach (PXResult<APInvoice, CurrencyInfo> res in
                cmd.View.Select(new[] { filter },
                                ComposeParametersForAPDocumentListSelect(),
                                PXView.Searches,
                                viewExecutingParams.Sorts.ToArray(),
                                viewExecutingParams.Descendings.ToArray(),
                                viewExecutingParams.FilterRows.ToArray(),
                                ref startRow,
                                PXView.MaximumRows,
                                ref totalRows))
            {
                APInvoice doc = res;
                APAdjust adj = new APAdjust();
                adj.VendorID = doc.VendorID;
                adj.AdjdDocType = doc.DocType;
                adj.AdjdRefNbr = doc.RefNbr;
                adj.AdjgDocType = APDocType.Check;
                adj.AdjgRefNbr = AutoNumberAttribute.GetNewNumberSymbol<APPayment.refNbr>(Caches[typeof(APPayment)], new APPayment { DocType = APDocType.Check });
                adj.SeparateCheck = doc.SeparateCheck;

                if (APDocumentList.Locate(adj) == null)
                {
                    PXSelectJoin<APInvoice, InnerJoin<CurrencyInfo, On<CurrencyInfo.curyInfoID, Equal<APInvoice.curyInfoID>>>, Where<APInvoice.docType, Equal<Required<APInvoice.docType>>, And<APInvoice.refNbr, Equal<Required<APInvoice.refNbr>>>>>.StoreCached(this, new PXCommandKey(new object[] { adj.AdjdDocType, adj.AdjdRefNbr }), new List<object> { res });
                    PXSelectorAttribute.StoreCached<APAdjust.adjdRefNbr>(APDocumentList.Cache, adj, doc);
                    yield return new PXResult<APAdjust, APInvoice>(APDocumentList.Insert(adj), doc);

                    _copies.Add(adj, PXCache<APAdjust>.CreateCopy(adj));
                }
            }

            APDocumentList.Cache.IsDirty = false;
            APDocumentList.View.RequestRefresh();
        }

Когда делегат определен явно (например, в этом случае), информация, заполненная на экране, является той, которая определена в делегате.

В этом случае это условие не заполняет сетку до тех пор, покаВведены параметры фильтра:

if (filter?.PayDate == null || filter.PayTypeID == null || filter.PayAccountID == null)
                    yield break;

В вашем случае вам также необходимо переопределить делегат.

Примечание : это представление и определение делегата для 2018R2,Другие версии могут отличаться.Убедитесь, что вы используете тот, который подходит для вашей версии.

...