Skip to main content
Answer

Override button Complete

  • November 21, 2025
  • 4 replies
  • 58 views

Forum|alt.badge.img+1

public delegate IEnumerable CompleteDelegate(PXAdapter adapter);

        public PXAction<DailyFieldReport> complete;
        [PXButton(CommitChanges = true), PXUIField(DisplayName = "Complete")]
        protected virtual IEnumerable Complete(PXAdapter adapter)
        {
            OnDailyFieldReportCompleting();
            return adapter.Get();
        }

        // DailyFieldReportEntryEmployeeActivityExtension.OnDailyFieldReportCompleting
        protected virtual void OnDailyFieldReportCompleting() {}

I need override this button. But I need save base functional. 
In DailyFieldReportEntryEmployeeActivityExtension this button was already override:
 

[PXOverride]
        public virtual void OnDailyFieldReportCompleting(Action baseHandler)
        {
            baseHandler();
            CompleteAllActivities();
        }

        protected virtual void CompleteAllActivities()
        {
            foreach (EPActivityApprove activity in EmployeeActivities.Select().FirstTableItems.Where(x => x.ApprovalStatus == ActivityStatusAttribute.Open))
            {
                activity.Hold = false;
                activity.ApprovalStatus = ActivityStatusAttribute.Completed;
                EmployeeActivities.Update(activity);
            }
        }

I need save this logic. And add my

Best answer by aleksandrsechin

Hi ​@bihalivan15 
For your purpose, you need to create a second-level graph extension (where you pass both the extension and the base graph to the PXGraphExtension) and override the method there:

public class DailyFieldReportEntryEmployeeActivityExtensionExt : PXGraphExtension<PX.Objects.PJ.DailyFieldReports.PJ.GraphExtensions.DailyFieldReportEntryEmployeeActivityExtension, PX.Objects.PJ.DailyFieldReports.PJ.Graphs.DailyFieldReportEntry>
{
[PXOverride]
public virtual void OnDailyFieldReportCompleting(Action baseHandler)
{
baseHandler?.Invoke();

// My logic.
}
}

 

4 replies

jinin
Pro I
Forum|alt.badge.img+11
  • Pro I
  • November 21, 2025

Hi ​@bihalivan15 ,

Your code looks correct. I made a few modifications for better structure.
Please try the approach below.

public delegate void DailyFieldReportCompletingDelegate();

[PXOverride]
public virtual void OnDailyFieldReportCompleting(DailyFieldReportCompletingDelegate baseHandler)
{
    // Call base
    baseHandler?.Invoke();

    // Custom logic
    CompleteAllActivities();
}

protected virtual void CompleteAllActivities()
{
    foreach (EPActivityApprove activity in EmployeeActivities
        .Select()
        .FirstTableItems
        .Where(x => x.ApprovalStatus == ActivityStatusAttribute.Open))
    {
        activity.Hold = false;
        activity.ApprovalStatus = ActivityStatusAttribute.Completed;

        EmployeeActivities.Update(activity);
    }
}
 


Forum|alt.badge.img+1
  • Author
  • Semi-Pro II
  • November 21, 2025

Hi ​@bihalivan15 ,

Your code looks correct. I made a few modifications for better structure.
Please try the approach below.

public delegate void DailyFieldReportCompletingDelegate();

[PXOverride]
public virtual void OnDailyFieldReportCompleting(DailyFieldReportCompletingDelegate baseHandler)
{
    // Call base
    baseHandler?.Invoke();

    // Custom logic
    CompleteAllActivities();
}

protected virtual void CompleteAllActivities()
{
    foreach (EPActivityApprove activity in EmployeeActivities
        .Select()
        .FirstTableItems
        .Where(x => x.ApprovalStatus == ActivityStatusAttribute.Open))
    {
        activity.Hold = false;
        activity.ApprovalStatus = ActivityStatusAttribute.Completed;

        EmployeeActivities.Update(activity);
    }
}
 

It’s default code and default extension. I add +1 extension. End need override this method. But other extension is already override him. I need save base logic, logic other extension and add my new logic. My extension is extension for base graph


jinin
Pro I
Forum|alt.badge.img+11
  • Pro I
  • November 21, 2025

Hi ​@bihalivan15 ,

Did you implement it and check the functionality?

When you override the method in your extension, Acumatica automatically creates an execution chain. This means your override does not replace the previous ones — it gets added to the end of the pipeline.

So when the method runs:

  1. Base graph method executes first.

  2. Then the first-level extension override runs (the one that already exists in the system).

  3. Finally, your override executes.

 

public class DailyFieldReportEntryMyExtension : PXGraphExtension<DailyFieldReportEntry>
{
    public delegate void DailyFieldReportCompletingDelegate();

    [PXOverride]
    public virtual void OnDailyFieldReportCompleting(DailyFieldReportCompletingDelegate baseHandler)
    {
        // Calls:
        // 1. Base graph logic
        // 2. All previous extension overrides
        baseHandler?.Invoke();

        // 3. Your additional logic
        yourLogic();
    }

    protected virtual void yourLogic()
    {
        // Add your custom logic here
    }
}
 


Forum|alt.badge.img+3
  • Jr Varsity I
  • Answer
  • November 24, 2025

Hi ​@bihalivan15 
For your purpose, you need to create a second-level graph extension (where you pass both the extension and the base graph to the PXGraphExtension) and override the method there:

public class DailyFieldReportEntryEmployeeActivityExtensionExt : PXGraphExtension<PX.Objects.PJ.DailyFieldReports.PJ.GraphExtensions.DailyFieldReportEntryEmployeeActivityExtension, PX.Objects.PJ.DailyFieldReports.PJ.Graphs.DailyFieldReportEntry>
{
[PXOverride]
public virtual void OnDailyFieldReportCompleting(Action baseHandler)
{
baseHandler?.Invoke();

// My logic.
}
}