代码之家  ›  专栏  ›  技术社区  ›  John

付款和应用程序屏幕上需要的输入

  •  0
  • John  · 技术社区  · 6 年前

    有谁能帮我一下吗,这个“截止日期”字段中的场景值将被填充,.aspx看起来像这样,它来自SoorderDAC。

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

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  0
  •   Hugues Beauséjour    6 年前

    双下划线符号“uuuuuu”是一种Acumatica约定,表示字段来自已联接的DAC,而不是数据视图的主DAC。

    使用Acumatica Inspect Element 功能在网格中,您可以找到数据视图名称“soadjustments”,并使用按钮操作->查看业务逻辑源…要获取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的主DAC是BQL查询:soadjust中出现的第一个DAC。

    在leftjoin bql子句中,soorder dac被联接到查询中。屏幕上显示的DueDate字段是该查询的Joined Soorder DAC。

    soorder.duedate字段解析为soorder数据库表的duedate字段。它是一个标准的db字段,这意味着显示的值只是从数据库中获取的。

    在您的情况下,我认为该值最初是由soorder.termsid字段上的[terms(_)]属性设置的:

    #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.calcttermsdata方法的一部分:

    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;
            }
        }           
    }