acumatica - PMTimeActivity 用户字段
问题描述
我迷路了,不确定我是否以正确的方式去做。我在 EP305000 屏幕上放置了一个 PXAction 按钮。
当按下按钮时,我想在 PMTimeActivity 表中搜索当前用户的所有记录,该用户具有 UsrPIXIClockIn NOT null 和 UsrPIXIClockOut Null。如果找到,需要将其值设置为当前时间。如果未找到,则创建一条新记录,并将 UsrPIXIClockIn 字段设置为当前时间。
但是,我第一次尝试读取 Usr 字段时会产生错误。当我尝试解析 PXResultSet 时,包含我的用户字段的代码行在编译时会引发错误。错误是:“PX.Objects.CR.PMTimeActivity”不包含“UsrPIXIClockIn”的定义,并且没有扩展方法“UsrPIXIClockIn”接受“PX.Objects.CR.PMTimeActivity”类型的第一个参数
我不确定这个定义属于哪里或如何定义它。这是我的代码:
[Serializable]
public class PMTimeActivityExt : PXCacheExtension<PMTimeActivity>
{
public PXSelect<PMTimeActivity> PMTimeActivity;
#region UsrPIXIClockIn
[PXDBTime(DisplayMask = "t", UseTimeZone = false)]
[PXUIField (DisplayName="Clock In")]
public virtual DateTime? UsrPIXIClockIn { get; set; }
public abstract class usrPIXIClockIn : IBqlField { }
#endregion
#region UsrPIXIClockOut
[PXDBTime(DisplayMask = "t", UseTimeZone = false)]
[PXUIField (DisplayName="Clock Out")]
public virtual DateTime? UsrPIXIClockOut { get; set; }
public abstract class usrPIXIClockOut : IBqlField { }
#endregion
#region UsrPIXITotalHours
[PXDBDecimal]
[PXUIField (DisplayName="Total Hours")]
public virtual decimal? UsrPIXITotalHours { get; set; }
public abstract class usrPIXITotalHours : IBqlField { }
#endregion
}
public class TimeCardMaint_Extension : PXGraphExtension<TimeCardMaint>
{
public PXSelect<PMTimeActivity> PMTimeActivity;
public PXAction<EPTimeCard> PunchCard;
public PXAction<PX.Objects.EP.EPTimeCard> PunchTimeCard;
[PXButton(CommitChanges = true)]
[PXUIField(DisplayName = "Punch Time Card")]
protected void punchTimeCard(PXCache cache)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.AppendLine("Started...\n");
EPEmployee employeeByUserID = PXSelect<EPEmployee, Where<EPEmployee.bAccountID, Equal<Current<EPTimeCard.employeeID>>>>.Select(this.Base);
Guid userID = (Guid) employeeByUserID.UserID;
sb.AppendLine("user ID:" + userID.ToString() + "\n");
// This one returns all records.
PXResultset<PMTimeActivity> TimeActivity = PXSelect<PMTimeActivity>.Select(this.Base);
foreach (PMTimeActivity timeRecord in TimeActivity)
{
if (timeRecord.OwnerID == userID) {
sb.AppendLine("UsrPIXIClockIn:" + timeRecord.UsrPIXIClockIn + "\n");
}
}
sb.AppendLine("\nEnded...\n");
throw new PXException("Clicked Punch Time Card!\n" + sb.ToString());
}
}
至于 PXResultSet 的 PXSelect 我试过这个:
PXResultset<PMTimeActivity> TimeActivity = PXSelect<PMTimeActivity, Where<Required<PMTimeActivity.ownerID>, Equal<Current<PMTimeActivity.ownerID>>>>.Select(this.Base, userID);
但从未找到任何记录。我究竟做错了什么?
解决方案
错误消息归结为:PMTimeActivity 不包含 UsrPIXIClockIn。
PMTimeActivity
是基本 DAC,用户字段在扩展 DACPMTimeActivityExt
中。
您需要首先使用GetExtension
方法从基本 DAC 获取扩展名并访问扩展记录上的用户字段timeRecordExt.UsrPIXIClockIn
:
foreach (PMTimeActivity timeRecord in TimeActivity)
{
PMTimeActivityExt timeRecordExt = timeRecord.GetExtension<PMTimeActivityExt>();
if (timeRecordExt != null && timeRecord.OwnerID == userID) {
sb.AppendLine("UsrPIXIClockIn:" + timeRecordExt.UsrPIXIClockIn + "\n");
}
}
在您的问题中,我看到 DAC 扩展中有一个数据视图声明。也许这是一个错字,你应该删除它,因为 DAC 扩展应该只包含用户字段。这很重要,因为 Acumatica 会积极解析这些代码结构。所以从 PMTimeActivityExt 类中删除该行:
public PXSelect<PMTimeActivity> PMTimeActivity;
推荐阅读
- javascript - 如果 api 中没有更多信息,如何删除按钮
- python - 如何获取异常参数?
- java - 无法检索更新的布尔数据或在领域数据库中正确更新它
- php - PHP 7.1.14 APCu 在 Mac OSX High Sierra 中不工作
- python - 获取命令的退出代码
- java - Hibernate TableGenerator.getNextValue 在当前事务上调用挂起
- java - 通过 servlet/java 从 ajax 调用从 ftp 位置下载多个文件
- regex - 正则表达式匹配大于十进制值的数字
- php - WordPress中@opendir中的@字符有什么用
- r - 错误:“闪亮”的包或命名空间加载失败:部署闪亮的应用程序时