首页 > 解决方案 > PMTimeActivity 用户字段

问题描述

我迷路了,不确定我是否以正确的方式去做。我在 EP305000 屏幕上放置了一个 PXAction 按钮。

EP305000 屏幕

当按下按钮时,我想在 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);

但从未找到任何记录。我究竟做错了什么?

标签: acumatica

解决方案


错误消息归结为: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;  

推荐阅读