PMTimeActivity Usr字段

时间:2019-01-03 20:39:48

标签: acumatica

我迷路了,不确定我会以正确的方式进行操作。 我在EP305000屏幕上放置了一个PXAction按钮。

EP305000 Screen

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

但是没有找到任何记录。我在做什么错了?

1 个答案:

答案 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;  
相关问题