Требуется ввод данных на экране «Платежи и приложения» - PullRequest
0 голосов
/ 05 сентября 2018

Может ли кто-нибудь помочь мне, при каком значении сценария в этом поле «Дата исполнения» будет заполнено, .aspx выглядит так, оно поступает из ЦАП SOOrder.

<px:PXGridColumn DataField="SOOrder__DueDate" Label="Due Date" Width="90px" ></px:PXGridColumn>

enter image description here

1 Ответ

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

Обозначение с двойным подчеркиванием '__' является соглашением Acumatica, которое означает, что поле приходит из объединенного ЦАП вместо основного ЦАП DataView.

Используя Acumatica Проверка элемента в сетке, вы можете найти имя DataView 'SOAdjustments' и использовать кнопку Actions-> View Business Logic Source ..., чтобы получить объявление DataView:

PXSelectJoin<SOAdjust,

LeftJoin<SOOrder, On<SOOrder.orderType, Equal<SOAdjust.adjdOrderType>,
                  And<SOOrder.orderNbr, Equal<SOAdjust.adjdOrderNbr>>>>,

Where<SOAdjust.adjgDocType, Equal<Current<ARPayment.docType>>,
      And<SOAdjust.adjgRefNbr, Equal<Current<ARPayment.refNbr>>>>> SOAdjustments;

Основным ЦАП DataView является первый ЦАП, появляющийся в запросе BQL: в данном случае SOAdjust.

В предложениях LeftJoin BQL ЦАП SOOrder присоединяется к запросу. Поле DueDate, отображаемое на экране, является объединенным ЦАП SOOrder этого запроса.

Поле SOOrder.DueDate преобразуется в поле DueDate таблицы базы данных SOOrder. Это стандартное поле БД, которое означает, что отображаемое значение просто берется из базы данных.

В вашем случае я считаю, что значение изначально устанавливается атрибутом [Terms (…)] в поле SOOrder.TermsID:

#region TermsID
public abstract class termsID : PX.Data.IBqlField
{
}
protected String _TermsID;
[PXDBString(10, IsUnicode = true)]
[PXDefault(typeof(Search<Customer.termsID, Where<Customer.bAccountID, Equal<Current<SOOrder.customerID>>>>), PersistingCheck = PXPersistingCheck.Nothing)]
[PXUIField(DisplayName = "Terms", Visibility = PXUIVisibility.Visible)]
[PXSelector(typeof(Search<Terms.termsID, Where<Terms.visibleTo, Equal<TermsVisibleTo.all>, Or<Terms.visibleTo, Equal<TermsVisibleTo.customer>>>>), DescriptionField = typeof(Terms.descr), Filterable = true)]
[Terms(typeof(SOOrder.invoiceDate), typeof(SOOrder.dueDate), typeof(SOOrder.discDate), typeof(SOOrder.curyOrderTotal), typeof(SOOrder.curyTermsDiscAmt))]
public virtual String TermsID
{
    get
    {
        return this._TermsID;
    }
    set
    {
        this._TermsID = value;
    }
}
#endregion

Алгоритм вычисления DueDate является частью метода PX.Objects.CS.TermsAttribute.CalcTermsDates:

public static void CalcTermsDates(Terms terms, DateTime? docDate, out DateTime? dueDate, out DateTime? discDate)
{
    dueDate = null;
    discDate = null;
    if (docDate != null && terms != null)
    {
        DateTime DocDate = docDate.Value;
        switch (terms.DueType)
        {
            case TermsDueType.FixedNumberOfDays:
                dueDate = DocDate.AddDays((double)terms.DayDue00);
                break;
            case TermsDueType.Prox:
                DateTime sameDayOfNextMonth = DocDate.AddMonths(1);
                DateTime firstDayOfNextMonth = new DateTime(sameDayOfNextMonth.Year, sameDayOfNextMonth.Month, 1);
                dueDate = firstDayOfNextMonth.AddDays((double)terms.DayDue00);
                break;
            case TermsDueType.DayOfNextMonth:
                dueDate = new PXDateTime(DocDate.Year, DocDate.Month, (int)terms.DayDue00).AddMonths(1);
                break;
            case TermsDueType.DayOfTheMonth:
                int monthShift = DocDate.Day > (int)terms.DayDue00 ? 1 : 0;
                dueDate = new PXDateTime(DocDate.Year, DocDate.Month, (int)terms.DayDue00).AddMonths(monthShift);
                break;
            case TermsDueType.Custom:
                int nextmonth = 0;
                if (DocDate.Day >= terms.DayFrom00 && DocDate.Day <= terms.DayTo00)
                {
                    if (terms.DayDue00 <= terms.DayTo00)
                    {
                        nextmonth = 1;
                    }
                    dueDate = new PXDateTime(DocDate.Year, DocDate.Month, (int)terms.DayDue00).AddMonths(nextmonth);
                }
                if (DocDate.Day >= terms.DayFrom01 && DocDate.Day <= terms.DayTo01)
                {
                    if (terms.DayDue01 <= terms.DayTo01)
                    {
                        nextmonth = 1;
                    }
                    dueDate = new PXDateTime(DocDate.Year, DocDate.Month, (int)terms.DayDue01).AddMonths(nextmonth);
                }
                break;
            case TermsDueType.EndOfMonth:
                dueDate = new DateTime(DocDate.Year, DocDate.Month, 1).AddMonths(1).AddDays(-1);
                break;
            case TermsDueType.EndOfNextMonth:
                dueDate = new DateTime(DocDate.Year, DocDate.Month, 1).AddMonths(2).AddDays(-1);
                break;
            default:
                break;
        }

        if (terms.InstallmentType == TermsInstallmentType.Multiple)
        {
            discDate = dueDate;
        }
        else
        {
        switch (terms.DiscType)
        {
            case TermsDueType.FixedNumberOfDays:
                discDate = DocDate.AddDays((double)terms.DayDisc);
                break;
            case TermsDueType.Prox:
                DateTime sameDayOfNextMonth = DocDate.AddMonths(1);
                DateTime firstDayOfNextMonth = new DateTime(sameDayOfNextMonth.Year, sameDayOfNextMonth.Month, 1);
                discDate = firstDayOfNextMonth.AddDays((double)terms.DayDisc);
                break;
            case TermsDueType.DayOfNextMonth:
                discDate = new PXDateTime(DocDate.Year, DocDate.Month, (int)terms.DayDisc).AddMonths(1);
                break;
            case TermsDueType.DayOfTheMonth:
                int monthShift;

                    if (terms.DueType == TermsDueType.DayOfNextMonth && DocDate.Day <= (int)terms.DayDue00)
                        monthShift = DocDate.Day >= (int)terms.DayDisc ? 1 : 0;
                else if (terms.DueType == TermsDueType.EndOfNextMonth)
                    monthShift = DocDate.Day >= (int)terms.DayDisc ? 1 : 0;
                else
                    monthShift = DocDate.Day > (int)terms.DayDue00 ? 1 : 0;
                discDate = new PXDateTime(DocDate.Year, DocDate.Month, (int)terms.DayDisc).AddMonths(monthShift);
                break;
            case TermsDueType.EndOfMonth:
                discDate = new DateTime(DocDate.Year, DocDate.Month, 1).AddMonths(1).AddDays(-1);
                break;
            case TermsDueType.EndOfNextMonth:
                discDate = new DateTime(DocDate.Year, DocDate.Month, 1).AddMonths(2).AddDays(-1);
                break;
            default:
                break;
        }
        }

        if (discDate > dueDate)
        {
            discDate = dueDate;
        }
    }           
}
...