Acumatica 字段默认处理程序

Acumatica 字段默认处理程序,acumatica,Acumatica,在处理页面上设置过滤器的默认值时遇到问题。我最初在RowSelected处理程序中有代码来设置默认值和默认结束日期,如下所示: //Local unbound filter DAC #region StartShipDate public abstract class startShipDate : PX.Data.IBqlField { } protected DateTime? _StartShipDate; [PXDate()] [PXUIField(DisplayName = "Star

在处理页面上设置过滤器的默认值时遇到问题。我最初在RowSelected处理程序中有代码来设置默认值和默认结束日期,如下所示:

//Local unbound filter DAC
#region StartShipDate
public abstract class startShipDate : PX.Data.IBqlField { }
protected DateTime? _StartShipDate;
[PXDate()]
[PXUIField(DisplayName = "Start Ship Date", Visibility = PXUIVisibility.SelectorVisible, Required = false)]
[PXDefault(PersistingCheck = PXPersistingCheck.Nothing)]
public virtual DateTime? StartShipDate { get; set; }
#endregion

#region EndShipDate
public abstract class endShipDate : PX.Data.IBqlField { }
protected DateTime? _EndShipDate;
[PXDate()]
[PXUIField(DisplayName = "End Ship Date", Visibility = PXUIVisibility.SelectorVisible)]
[PXDefault(typeof(AccessInfo.businessDate), PersistingCheck = PXPersistingCheck.Nothing)]
public virtual DateTime? EndShipDate { get; set; }
#endregion

#region StartImportDate
public abstract class startImportDate : PX.Data.IBqlField { }
protected DateTime? _StartImportDate;
[PXDate()]
[PXUIField(DisplayName = "Start Import Date", Visibility = PXUIVisibility.SelectorVisible, Required = false)]
[PXDefault(PersistingCheck = PXPersistingCheck.Nothing)]
public virtual DateTime? StartImportDate { get; set; }
#endregion

#region EndImportDate
public abstract class endImportDate : PX.Data.IBqlField { }
protected DateTime? _EndImportDate;
[PXDate()]
[PXUIField(DisplayName = "End Import Date", Visibility = PXUIVisibility.SelectorVisible)]
[PXDefault(typeof(AccessInfo.businessDate), PersistingCheck = PXPersistingCheck.Nothing)]
public virtual DateTime? EndImportDate { get; set; }
#endregion


//Excerpt from RowSelected handler
if (!filter.StartImportDate.HasValue && filter.EndImportDate.HasValue)
{
    DateTime endDate = DateTime.Today;
    DateTime begDate = endDate.AddMonths(-1);
    filter.StartImportDate = begDate;
    filter.EndImportDate = endDate;
}
if (!filter.StartShipDate.HasValue && filter.EndShipDate.HasValue)
{
    DateTime endDate = DateTime.Today.AddMonths(1);
    DateTime begDate = DateTime.Today.AddMonths(-1);
    filter.StartShipDate = begDate;
    filter.EndShipDate = endDate;
}
然后,我安装了最新的Acuminator,它警告我不要在RowSelected处理程序中设置DAC字段,因此我删除了代码,并尝试在FieldDefaulting处理程序中设置它。我似乎无法正确设置默认值

protected virtual void EDOrderReviewFilter_StartImportDate_FieldDefaulting(PXCache sender, PXFieldDefaultingEventArgs e)
{
    EDOrderReviewFilter row = e.Row as EDOrderReviewFilter;
    if (row != null)
    {
        if (!row.StartImportDate.HasValue && row.EndImportDate.HasValue)
        {
            e.NewValue = DateTime.Today.AddMonths(-1);
            e.Cancel = true;
        }
    }
}
protected virtual void EDOrderReviewFilter_StartShipDate_FieldDefaulting(PXCache sender, PXFieldDefaultingEventArgs e)
{
    EDOrderReviewFilter row = e.Row as EDOrderReviewFilter;
    if (row != null)
    {
        if (!row.StartShipDate.HasValue && row.EndShipDate.HasValue)
        {
            e.NewValue = DateTime.Today.AddMonths(-1);
            e.Cancel = true;
        }
    }
}

有没有办法在PXDefault属性中进行日期计算,或者我的默认处理程序有什么问题?

在Brendan的帮助下,这就是我最终得到的结果

    protected virtual void EDOrderReviewFilter_StartImportDate_FieldDefaulting(PXCache sender, PXFieldDefaultingEventArgs e)
    {
        e.NewValue = DateTime.Today.AddMonths(-1);
    }
    protected virtual void EDOrderReviewFilter_EndImportDate_FieldDefaulting(PXCache sender, PXFieldDefaultingEventArgs e)
    {
        e.NewValue = DateTime.Today;
    }
    protected virtual void EDOrderReviewFilter_StartShipDate_FieldDefaulting(PXCache sender, PXFieldDefaultingEventArgs e)
    {
        e.NewValue = DateTime.Today.AddMonths(-1);
    }
    protected virtual void EDOrderReviewFilter_EndShipDate_FieldDefaulting(PXCache sender, PXFieldDefaultingEventArgs e)
    {
        e.NewValue = DateTime.Today.AddMonths(1);
    }

由于列上没有默认属性,因此不需要取消。有时候越简单越好

如果从默认值中删除e.cancel=true行,是否有效?否。开始日期仍然显示为空。我将首先测试默认值中唯一的内容是newvalue集。由于这是字段默认值,因此它将只运行一次。您正在检查EndShipDate是否有一个值,但是在DAC中,它位于您正在检查其值的字段之后,该字段尚未具有默认值。字段事件通常按照DAC中字段的顺序运行。如果需要更改一个字段来触发另一个字段,则可以使用带有默认值的PXFormulaAttribute,在更改字段时再次触发默认事件。或者更改dacI中字段的顺序I changed my code仅根据当前日期而不是输入的结束日期设置默认日期。它现在似乎正在工作。它在不设置e.cancel=true的情况下工作。我已经读到,当覆盖默认值时,您需要这样做。什么时候需要?我不知道有必要。取消通常表示您不希望事件在事件链中继续。可能在字段defaulting中,它表示不处理任何其他默认事件。但这是个好问题。我自己没有将其用于字段默认事件。我认为这里的关键是知道字段在处理时的顺序,因为它们存在于DAC中。如果将字段位置移动到已有的代码周围,则可能适用于字段默认事件(只需删除取消)