PMTimeActivity Usr Fields - PullRequest
       8

PMTimeActivity Usr Fields

0 голосов
/ 03 января 2019

Я потерян и не уверен, что поступаю правильно.Я поместил кнопку PXAction на экран EP305000.

Экран EP305000

Когда кнопка нажата, я хотел найти любые записи в таблице PMTimeActivity для текущегопользователь с нулевым значением UsrPIXIClockIn и нулевым значением UsrPIXIClockOut.Если найдено, нужно установить его значение на текущее время.Если файл не найден, создайте новую запись с полем 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());
    }

  }

Что касается PXSelect для PXResultSet, я попробовал это:

PXResultset<PMTimeActivity> TimeActivity = PXSelect<PMTimeActivity, Where<Required<PMTimeActivity.ownerID>, Equal<Current<PMTimeActivity.ownerID>>>>.Select(this.Base, userID);

Но никаких записей не найдено.Что я делаю не так?

1 Ответ

0 голосов
/ 04 января 2019

Сообщение об ошибке сводится к следующему: PMTimeActivity не содержит UsrPIXIClockIn.

PMTimeActivity - базовый ЦАП, а поля пользователя находятся в расширенном ЦАП PMTimeActivityExt.

. Вам нужночтобы сначала получить расширение из базового ЦАП, используя метод GetExtension и получить доступ к полю пользователя в записи расширения 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;  
...