0
votes

I’m writing a customization to add records to a timecard and I’m trying to create a new record to add to the timecard. Using the logic in T230 I’m creating a variable and I’m being told by the compiler that EPTimecardDetail cannot be found.

I’ve added using PX.Objects.EP and PX.Objects.PM but I figure that if TimeCardMaint can be found then EPTimecardDetail should be able be found as well. I’ve included my using code as well but I think I’m missing something else.

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();

}
}}

The error I'm getting is "The type or namespace name 'EPTimecardDetail' could not be found (are you missing a using directive or an assembly reference?)".

EPTimecardDetail is defined within PX.Objects.EP so I'm not sure why I'm having a problem there. Or, perhaps this is not the way to add records to the Details tab of the Employee Time Card screen?

1
EPTimecardDetail is a PXProjection. It uses a static declaration. Be sure to update your using declarations. using static PX.Objects.EP.TimeCardMaint;Chris H
@ChrisH - thank you! If you want to make your response an answer I'll be able to close this off and give you some more reputation points.Customizer

1 Answers

1
votes

For the namespace issue you can declare using PX.Object.EP and refer to the type as TimeCardMaint.EPTimecardDetail

Or you can declare using static PX.Objects.EP.TimeCardMaint and refer to the type as EPTimecardDetail


For inserting the record check the source code in file TimeCardMaint.cs There are examples on how to insert this DAC record.

Make sure the fields used for SQL joins like OrigNoteID and RefNoteID have the proper value (non null).

This example is from the Correct action in 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();
}