Обозначение с двойным подчеркиванием '__' является соглашением 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;
}
}
}