function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Todd KadasTodd Kadas 

how to fetch opportunity fields on nested query including process instance and steps and work items

I've been struggling for quite some time now to figure out a way to provide the approvers within my company with a list of opportunities that are pending approval and by whom (we have two parallel approval processes in place). The way I'm currently doing it is manually (running a SOQL query in dev console, pushing that to Excel, running an opportunity report, exporting that to Excel, and then merging the files together. Below, gets details from process instance into a visualforce page which is good but doesn't include any fields from opportunity object and also doesn't let me export to Excel.
Would anyone be able to assist me in updating this wrapper class by showing me how to query the opportunity object and including selected fields in VF output? Thanks in advance.
 
public class getWrapData{

    List<wrapperclass> wrapList = new List<wrapperclass>();
    public List<wrapperclass> getWrapList() {

        for (ProcessInstance pi: [SELECT Id, Status, TargetObjectId, TargetObject.Name, 
                (SELECT Id, ActorId, Actor.Name, OriginalActorId, OriginalActor.Name, StepStatus, Comments, ProcessNode.Name, CreatedDate FROM StepsAndWorkitems WHERE StepStatus =: 'Pending') 
                FROM ProcessInstance WHERE Status =: 'Pending' ORDER BY TargetObjectId] ) {

                   for (ProcessInstanceHistory pih : pi.StepsAndWorkItems) {
                       wrapperClass pendingApprovalWrap = new wrapperClass();
                       pendingApprovalWrap.Status = pih.StepStatus;
                       pendingApprovalWrap.RecordName = String.valueOf(pi.TargetObject.Name);
                       pendingApprovalWrap.RecordId = String.valueOf(pi.TargetObjectId);
                       pendingApprovalWrap.RecordObject = String.valueOf(pi.TargetObjectId.getSObjectType()).split('__')[0];
                       pendingApprovalWrap.AssignedToName = String.valueOf(pih.OriginalActor.Name);
                       pendingApprovalWrap.ApproverName = pih.Actor.Name;
                       pendingApprovalWrap.CreatedDate = String.valueOf(pih.CreatedDate);

                       wrapList.add(pendingApprovalWrap);
                       }          
                   }

                   return wrapList;
    }

    public class wrapperClass{
        public String Status {get; set;}
        public String RecordName {get; set;}
        public String RecordId {get; set;}
        public String RecordObject {get; set;}
        public String AssignedToName {get; set;}
        public String ApproverName {get; set;}
        public String CreatedDate {get; set;}
    }
}