我迷路了,不确定我会以正确的方式进行操作。 我在EP305000屏幕上放置了一个PXAction按钮。
当按下按钮时,我想在PMTimeActivity表中搜索具有UsrPIXIClockIn NOT null和UsrPIXIClockOut Null的当前用户的任何记录。 如果找到,则需要将其值设置为当前时间。如果找不到,请使用UsrPIXIClockIn字段将当前时间设置为新记录。
但是,我第一次尝试读取Usr字段的第一次尝试是创建一个错误。当我尝试解析PXResultSet时,包含我的Usr字段的代码行在编译时抛出错误。 出现错误:“ 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);
但是没有找到任何记录。我在做什么错了?
答案 0 :(得分:0)
错误消息归结为:PMTimeActivity不包含UsrPIXIClockIn。
PMTimeActivity
是基础DAC,用户字段位于扩展DAC PMTimeActivityExt
中。
您首先需要使用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;