【问题标题】:Override default DateTime 12:00 AM or 12:00PM to current Time?将默认的 DateTime 上午 12:00 或下午 12:00 覆盖为当前时间?
【发布时间】:2016-08-04 09:10:47
【问题描述】:

在我的图片中,我有 SLA 的 DateTime 和 Finish Date,Finish Date 与 SLA 的值相同,但它允许用户添加或更改 DateTime。当我在完成日期更改 DateTime 时,它​​的默认时间值为 12:00 PM 或 12:00 AM。有没有办法将默认时间更改为当前时间?如果用户更改用户区域设置格式会有什么影响吗?

这是我的 UsrFinishDate 默认值:

UsrFinishDate(新字段)

 [PXDBDate(PreserveTime = true)]
 [PXUIField(DisplayName="Finish Date")]
protected void CRCase_UsrFinishDate_FieldDefaulting(PXCache cache, PXFieldDefaultingEventArgs e)
{
    CRCase row = e.Row as CRCase;
    CRCaseExt rowExt = PXCache<CRCase>.GetExtension<CRCaseExt>(row);

    if (row == null || row.AssignDate == null) return;

    if (row.ClassID != null && row.Severity != null)
    {
        var severity = (CRClassSeverityTime)PXSelect<CRClassSeverityTime,
                       Where<CRClassSeverityTime.caseClassID, Equal<Required<CRClassSeverityTime.caseClassID>>,
                       And<CRClassSeverityTime.severity, Equal<Required<CRClassSeverityTime.severity>>>>>
                       .Select(Base, row.ClassID, row.Severity);
        if (severity != null && severity.TimeReaction != null)
        {
            e.NewValue = row.SLAETA;
            e.Cancel = true;
        }
    }

    if (row.Severity != null && row.ContractID != null)
    {
        var template = (Contract)PXSelect<Contract, Where<Contract.contractID, Equal<Required<CRCase.contractID>>>>.Select(Base, row.ContractID);
        if (template == null) return;

        var sla = (ContractSLAMapping)PXSelect<ContractSLAMapping,
                  Where<ContractSLAMapping.severity, Equal<Required<CRCase.severity>>,
                  And<ContractSLAMapping.contractID, Equal<Required<CRCase.contractID>>>>>
                  .Select(Base, row.Severity, template.TemplateID);
        if (sla != null && sla.Period != null)
        {
            e.NewValue = row.SLAETA;
            e.Cancel = true;
        }
    }
}

这是我的另一个事件 rowSelected:

protected void CRCase_RowUpdated(PXCache cache, PXRowUpdatedEventArgs e)
{
    var row = e.Row as CRCase;
    var oldRow = e.OldRow as CRCase;
    CRCaseExt rowExt = PXCache<CRCase>.GetExtension<CRCaseExt>(row);

    if (row == null || oldRow == null) return;

    if (row.OwnerID == null)
    {
        row.AssignDate = null;
        row.SLAETA = null;
        rowExt.UsrFinishDate = null;
    }
    else if (oldRow.OwnerID == null)
    {
        row.AssignDate = PXTimeZoneInfo.Now;
        if (row == null || row.AssignDate == null) return;

        if (row.ClassID != null && row.Severity != null)
        {
            var severity = (CRClassSeverityTime)PXSelect<CRClassSeverityTime,
                                Where<CRClassSeverityTime.caseClassID, Equal<Required<CRClassSeverityTime.caseClassID>>,
                                And<CRClassSeverityTime.severity, Equal<Required<CRClassSeverityTime.severity>>>>>.
                                Select(Base, row.ClassID, row.Severity);
            if (severity != null && severity.TimeReaction != null)
            {
                row.SLAETA = ((DateTime)row.AssignDate).AddMinutes((int)severity.TimeReaction);
                rowExt.UsrFinishDate = ((DateTime)row.AssignDate).AddMinutes((int)severity.TimeReaction);
            }
        }

        if (row.Severity != null && row.ContractID != null)
        {
            var template = (Contract)PXSelect<Contract, Where<Contract.contractID, Equal<Required<CRCase.contractID>>>>.Select(Base, row.ContractID);
            if (template == null) return;

            var sla = (ContractSLAMapping)PXSelect<ContractSLAMapping,
                              Where<ContractSLAMapping.severity, Equal<Required<CRCase.severity>>,
                              And<ContractSLAMapping.contractID, Equal<Required<CRCase.contractID>>>>>.
                              Select(Base, row.Severity, template.TemplateID);
            if (sla != null && sla.Period != null)
            {
                row.SLAETA = ((DateTime)row.AssignDate).AddMinutes((int)sla.Period);
                rowExt.UsrFinishDate = ((DateTime)row.AssignDate).AddMinutes((int)sla.Period);
            }
        }
    }
}

【问题讨论】:

  • 当前时间是什么意思?当前时间像此时或当前时间与 SLA (3:58 PM) 相同?
  • @SimonML,我确实想要现在的时间。
  • 您要自定义哪个屏幕?
  • CRCase (ScreenId=CR306000)

标签: customization acumatica


【解决方案1】:

这是我添加到案例屏幕的字段的定义,请注意PreserveTime = true,我认为这可能是您所缺少的。

public class CRCaseExt : PXCacheExtension<PX.Objects.CR.CRCase>
{
    #region UsrFinishDate

    [PXDBDate(PreserveTime = true)]
    [PXUIField(DisplayName = "Finish Date")]
    public virtual DateTime? UsrFinishDate { get; set; }
    public abstract class usrFinishDate : IBqlField { }

    #endregion
}

当 UsrFinishDate 值更改时,这里有一个简单的方法来设置当前时间。不要忘记为该字段设置CommitChanges

protected virtual void CRCase_UsrFinishDate_FieldUpdating(PXCache sender, PXFieldUpdatingEventArgs e)
{
    CRCase currentCase = (CRCase)e.Row;
    var caseExt = PXCache<CRCase>.GetExtension<CRCaseExt>(currentCase);
    if (caseExt == null)
    {
        return;
    }

    e.NewValue = new DateTime(caseExt.UsrFinishDate.Value.Year,
                                                caseExt.UsrFinishDate.Value.Month,
                                                caseExt.UsrFinishDate.Value.Day,
                                                DateTime.Now.Hour,
                                                DateTime.Now.Minute,
                                                DateTime.Now.Second);
}

【讨论】:

  • 无论如何,如果来自 SLA 的 UsrFinishDate 的默认值,那么用户可以更改它。所以我应该把这个caseExt.UsrFinishDate.Value.Year改成case.SLAETA.Value.Year吧?
  • 所以您想为UsrFinishDate 选择一个日期,但保留SLA 中当前选择的同一年份,对吗?那么是的,您只需将caseExt.UsrFinishDate.Value.Year 替换为currentCase.SLAETA.Value.Year。检查msdn.microsoft.com/en-us/library/272ba130(v=vs.110).aspx 我使用的日期时间构造函数
  • 如果您的用户跨越时区,您可能需要在 PXDateTime 属性中设置 UseTimeZone = true。这样每个用户都应该看到与其当地时区设置相关的时间
  • 您仍然需要如 simon 所述的 preservetime = true,但我要确保您是否有多个时区的用户,以了解他们可能希望根据当地时区查看时间。否则,无论哪个时区查看您的日期字段,所有时区都会显示相同的时间。
  • 在您的页面中,您是否有 simon 提到的提交更改?对于 Acumatica 中的时间,您还可以使用 PX.Common.PXTimeZoneInfo.UtcNow 或 PX.Common.PXTimeZoneInfo.Now。只要页面将显示的时间转换为用户本地时区,我就会使用 UtcNow 来确保所有用户的时间一致
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 2013-02-28
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
相关资源
最近更新 更多