Acumatica 如何使用自定义选择器字段自定义时间条目和活动
Acumatica How to customize Time Entries and Activities with Custom Selector Field
我们想要自定义时间条目和活动逻辑,以拥有一个自定义选择器字段,该字段从系统中设置的属性中提取信息。如果 TimeSpent 和 BilledTime 不匹配,则它必须是必填字段,条目被标记为可计费,并且项目有客户加载。我已经成功地让它在“员工时间活动”屏幕上运行,但我试图在“活动”弹出对话框中使用相同的自定义字段。将 Activity 直接添加到项目时,我也遇到错误,指出时间条目需要原因代码,但我无权将其添加到列表以显示在活动 Panel/Dialog 中.
请参阅下面的屏幕截图:
忽略 Activity 原因代码,这是我添加的附加自定义字段以测试自定义。
我想在这里添加我的自定义字段:
下面是扩展class DAC。
using PX.Data;
using PX.Objects.CS;
using PX.Objects.PM;
using iPlanReasonCode.Helpers;
namespace PX.Objects.CR
{
public class PMTimeActivityExt : PXCacheExtension<PX.Objects.CR.PMTimeActivity>
{
#region UsrReasonCode
[PXDBString]
[PXUIField(DisplayName = "Reason Code")]
[PXDefault]
[PXSelector(typeof(Search<CSAttributeDetail.valueID, Where<CSAttributeDetail.attributeID.IsEqual<ReasonCodeAttributeID>>>),
typeof(CSAttributeDetail.valueID), typeof(CSAttributeDetail.description), SubstituteKey = typeof(CSAttributeDetail.valueID), DescriptionField = typeof(CSAttributeDetail.description))]
[PXUIRequired(typeof(Where<PMTimeActivity.isBillable.IsEqual<True>.And<PMTimeActivity.timeSpent.IsNotEqual<PMTimeActivity.timeBillable>>.And<Where<Selector<PMTimeActivity.projectID, PMProject.customerID>, IsNotNull>>>))]
public virtual string UsrReasonCode { get; set; }
public abstract class usrReasonCode : PX.Data.BQL.BqlString.Field<usrReasonCode> { }
#endregion
}
}
下面是辅助常量 class 以将其指向正确的属性代码。
using PX.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace iPlanReasonCode.Helpers
{
public class ReasonCodeAttributeID : PX.Data.BQL.BqlString.Constant<ReasonCodeAttributeID>
{
public ReasonCodeAttributeID()
: base("CUSTREASON")
{ }
}
}
所以这个有点棘手,由于某种原因,自定义项目浏览器上 Acumatica 的“添加数据字段”无法识别“TimeActivity”视图,这是您的字段添加到的视图(在 PMTimeActivity 上).
如果您想保留此记录中的字段,您应该做的是手动编辑 ASPX,找到您看到字段引用 Datafield="TimeActivity.***" 的页面区域,然后手动添加 XML 以相同的方式标记和引用时间活动数据视图,例如DataField="TimeActivity.UsrYourCustomField"
文本框:
<px:PXTextEdit ID="chkYourField" runat="server" DataField="TimeActivity.UsrYourCustomField" />
复选框:
<px:PXCheckBox ID="chkYourField" runat="server" DataField="TimeActivity.UsrYourCustomField" />
手动添加标签后,您就可以使用 UI
移动标签
如果您想跳过所有这些并让它变得简单,请将您的自定义字段移至 CRActivity DAC
我们想要自定义时间条目和活动逻辑,以拥有一个自定义选择器字段,该字段从系统中设置的属性中提取信息。如果 TimeSpent 和 BilledTime 不匹配,则它必须是必填字段,条目被标记为可计费,并且项目有客户加载。我已经成功地让它在“员工时间活动”屏幕上运行,但我试图在“活动”弹出对话框中使用相同的自定义字段。将 Activity 直接添加到项目时,我也遇到错误,指出时间条目需要原因代码,但我无权将其添加到列表以显示在活动 Panel/Dialog 中. 请参阅下面的屏幕截图:
忽略 Activity 原因代码,这是我添加的附加自定义字段以测试自定义。
我想在这里添加我的自定义字段:
下面是扩展class DAC。
using PX.Data;
using PX.Objects.CS;
using PX.Objects.PM;
using iPlanReasonCode.Helpers;
namespace PX.Objects.CR
{
public class PMTimeActivityExt : PXCacheExtension<PX.Objects.CR.PMTimeActivity>
{
#region UsrReasonCode
[PXDBString]
[PXUIField(DisplayName = "Reason Code")]
[PXDefault]
[PXSelector(typeof(Search<CSAttributeDetail.valueID, Where<CSAttributeDetail.attributeID.IsEqual<ReasonCodeAttributeID>>>),
typeof(CSAttributeDetail.valueID), typeof(CSAttributeDetail.description), SubstituteKey = typeof(CSAttributeDetail.valueID), DescriptionField = typeof(CSAttributeDetail.description))]
[PXUIRequired(typeof(Where<PMTimeActivity.isBillable.IsEqual<True>.And<PMTimeActivity.timeSpent.IsNotEqual<PMTimeActivity.timeBillable>>.And<Where<Selector<PMTimeActivity.projectID, PMProject.customerID>, IsNotNull>>>))]
public virtual string UsrReasonCode { get; set; }
public abstract class usrReasonCode : PX.Data.BQL.BqlString.Field<usrReasonCode> { }
#endregion
}
}
下面是辅助常量 class 以将其指向正确的属性代码。
using PX.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace iPlanReasonCode.Helpers
{
public class ReasonCodeAttributeID : PX.Data.BQL.BqlString.Constant<ReasonCodeAttributeID>
{
public ReasonCodeAttributeID()
: base("CUSTREASON")
{ }
}
}
所以这个有点棘手,由于某种原因,自定义项目浏览器上 Acumatica 的“添加数据字段”无法识别“TimeActivity”视图,这是您的字段添加到的视图(在 PMTimeActivity 上).
如果您想保留此记录中的字段,您应该做的是手动编辑 ASPX,找到您看到字段引用 Datafield="TimeActivity.***" 的页面区域,然后手动添加 XML 以相同的方式标记和引用时间活动数据视图,例如DataField="TimeActivity.UsrYourCustomField"
文本框:
<px:PXTextEdit ID="chkYourField" runat="server" DataField="TimeActivity.UsrYourCustomField" />
复选框:
<px:PXCheckBox ID="chkYourField" runat="server" DataField="TimeActivity.UsrYourCustomField" />
手动添加标签后,您就可以使用 UI
移动标签如果您想跳过所有这些并让它变得简单,请将您的自定义字段移至 CRActivity DAC