如何将 EPTimecardDetail 记录添加到考勤卡?

How do I add an EPTimecardDetail record to a timecard?

我正在编写自定义项以将记录添加到考勤卡,我正在尝试创建新记录以添加到考勤卡。使用 T230 中的逻辑,我正在创建一个变量,编译器告诉我找不到 EPTimecardDetail。

我已经使用 PX.Objects.EP 和 PX.Objects.PM 添加了,但我认为如果可以找到 TimeCardMaint,那么也应该可以找到 EPTimecardDetail。我也包含了我的使用代码,但我想我还遗漏了其他东西。

using System;
using System.Collections;
using PX.Data;
using PX.Data.BQL.Fluent;
using PX.Data.BQL;
using PX.Objects.CS;
using PX.Objects.PM;
using PX.Objects.EP;
using PX.Objects.CR;
using PX.Objects.AR;
using PX.Objects.CT;
using PX.Objects.GL.FinPeriods;
using PX.TM;
using System.Collections.Generic;

namespace TimecardImport
{
    public class NLTimecardLineEntry : PXGraph<NLTimecardLineEntry>
    {

private static void DoPopulateTimeCard(Int32 employeeID, DateTime startDate, NLTimecardLine record)
{
   TimeCardMaint graph = PXGraph.CreateInstance<TimeCardMaint>();
   Int32 cardWeekID = PXWeekSelector2Attribute.GetWeekID(graph, startDate);

   //look for an employee timecard with the current weekID  
   EPTimeCard card = PXSelectReadonly<EPTimeCard,
   Where<EPTimeCard.employeeID, Equal<Required<EPTimeCard.employeeID>>,
   And<EPTimeCard.weekId, Equal<Required<EPTimeCard.weekId>>>>>.SelectWindowed(graph, 0, 1, employeeID, cardWeekID);


   if (card == null) //if a card was not found, create one
   {
      card = (EPTimeCard)graph.Document.Cache.CreateInstance();
      card.WeekID = cardWeekID;
      card.EmployeeID = employeeID;
      card = graph.Document.Insert(card);
   }

   //at this point card is the card that we're going to work with 
   var detailLine = (EPTimecardDetail)graph.Activities.Cache.CreateCopy(
                                      graph.Activities.Insert());

   //detailLine.SetValueExt<detailLine.Date_Date>(record, record.InDate);
   //detailLine.EarningTypeID = "RG";

   //detailLine = graph.Activities.Update(detailLine);
   graph.Save.Press();

}
}}

我收到的错误是“找不到类型或名称空间名称 'EPTimecardDetail'(您是否缺少 using 指令或程序集引用?)”。

EPTimecardDetail 是在 PX.Objects.EP 中定义的,所以我不确定为什么我在那里遇到问题。或者,也许这不是将记录添加到“员工时间卡”屏幕的“详细信息”选项卡的方法?

对于命名空间问题,您可以声明 using PX.Object.EP 并将类型引用为 TimeCardMaint.EPTimecardDetail

或者您可以声明 using static PX.Objects.EP.TimeCardMaint 并将类型引用为 EPTimecardDetail


要插入记录,请查看文件中的源代码 TimeCardMaint.cs 有关于如何插入此 DAC 记录的示例。

确保用于 SQL 联接的字段,如 OrigNoteIDRefNoteID 具有正确的值(非空值)。

此示例来自 TimeCardMaint 中的正确操作:

[PXUIField(DisplayName = Messages.Correct)]
[PXButton(ImageKey = PX.Web.UI.Sprite.Main.Release)]
public virtual IEnumerable Correct(PXAdapter adapter)
{
    if (Document.Current != null)
    {
        EPTimeCard source = GetLastCorrection(Document.Current);

        if (source.IsReleased != true)
            return new EPTimeCard[] { source };


        EPTimeCard newCard = (EPTimeCard)Document.Cache.CreateInstance();
        newCard.WeekID = source.WeekID;
        newCard.OrigTimeCardCD = source.TimeCardCD;
        newCard = Document.Insert(newCard);
        newCard.EmployeeID = source.EmployeeID;
        PXNoteAttribute.CopyNoteAndFiles(Document.Cache, source, Document.Cache, newCard, true, true);

        bool failed = false;

        Dictionary<string, TimeCardSummaryCopiedInfo> summaryDescriptions = new Dictionary<string, TimeCardSummaryCopiedInfo>(); 
        foreach (EPTimeCardSummary summary in Summary.View.SelectMultiBound(new object[] { source }))
        {
            string key = GetSummaryKey(summary);
            if (!summaryDescriptions.ContainsKey(key))
            {
                string note = PXNoteAttribute.GetNote(Summary.Cache, summary);
                var info = new TimeCardSummaryCopiedInfo(summary.Description, note);
                summaryDescriptions.Add(key, info);
            }
        }

        foreach (EPTimecardDetail act in TimecardActivities.View.SelectMultiBound(new object[] { source }))
        {
            EPTimecardDetail newActivity = PXCache<EPTimecardDetail>.CreateCopy(act);
            newActivity.Released = false;
            newActivity.Billed = false;
            newActivity.NoteID = null;
            newActivity.TimeCardCD = null;
            newActivity.TimeSheetCD = null;
            newActivity.OrigNoteID = act.NoteID; //relation between the original activity and the corrected one.
            newActivity.Date = act.Date;
            newActivity.Billed = false;
            newActivity.SummaryLineNbr = null;
            newActivity.NoteID = null;
            newActivity.ContractCD = null;
            isCreateCorrectionFlag = true;
            try
            {
                newActivity = Activities.Insert(newActivity);
            }
            catch (PXSetPropertyException ex)
            {
                failed = true;
                Activities.Cache.RaiseExceptionHandling<EPTimecardDetail.summary>(act, act.Summary, new PXSetPropertyException(ex.MessageNoPrefix, PXErrorLevel.RowError));
                continue;
            }
            newActivity.TrackTime = act.TrackTime; //copy as is.
            isCreateCorrectionFlag = false;
            newActivity.ApprovalStatus = ActivityStatusAttribute.Completed;
            newActivity.RefNoteID = act.NoteID == act.RefNoteID ? newActivity.NoteID : act.RefNoteID;
            newActivity.ContractCD = act.ContractCD;

            PXNoteAttribute.CopyNoteAndFiles(Activities.Cache, act, Activities.Cache, newActivity);

            Activities.Cache.SetValue<EPTimecardDetail.isCorrected>(act, true);
            Activities.Cache.SetStatus(act, PXEntryStatus.Updated);
        }

        if (failed)
        {
            throw new PXException(Messages.FailedToCreateCorrectionTC);
        }

        foreach (EPTimeCardItem item in Items.View.SelectMultiBound(new object[] { source }))
        {
            EPTimeCardItem record = Items.Insert();
            record.ProjectID = item.ProjectID;
            record.TaskID = item.TaskID;
            record.Description = item.Description;
            record.InventoryID = item.InventoryID;
            record.CostCodeID = item.CostCodeID;
            record.UOM = item.UOM;
            record.Mon = item.Mon;
            record.Tue = item.Tue;
            record.Wed = item.Wed;
            record.Thu = item.Thu;
            record.Fri = item.Fri;
            record.Sat = item.Sat;
            record.Sun = item.Sun;
            record.OrigLineNbr = item.LineNbr;//relation between the original activity and the corrected one.
        }

        foreach (EPTimeCardSummary summary in Summary.Select())
        {
            string key = GetSummaryKey(summary);
            if (summaryDescriptions.ContainsKey(key))
            {
                PXNoteAttribute.SetNote(Summary.Cache, summary, summaryDescriptions[key].Note);
                Summary.Cache.SetValue<EPTimeCardSummary.description>(summary, summaryDescriptions[key].Description);
            }
        }

        return new EPTimeCard[] { newCard };
    }

    return adapter.Get();
}