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
Dan HardyDan Hardy 

Grouping table by stage in Visualforce without aggregate

This is my first attempt at a custom controller. I've got a list of 70 projects that are sorted by development stage. The SOQL query is this:

'SELECT Id, Name, Total_Units__c, City__c FROM RCD_Project__c ORDER BY Stage__c,Name ASC'

I want to be able to group by stage of project so the table will look like
Stage 1
  • Project 3
  • Project 9
  • etc
Stage 2
  • Project 5
  • Project 6
I don't want to aggregate the values. I just want a grouped list (like you can do in a Salesforce report by adding a field to the "Group Rows" box in the report builder). Is the grouping possible to do in a VF page or Lightning Data Table or do I have to do this in the controller?

Thanks much.
Dushyant SonwarDushyant Sonwar
HI Dan ,

You can do this by wrapper class.First you need to arrange your data in your controller.
 
public class StageController{
	private Map<String , list<Project__c>> mapOfProject;
	public list<StageWrapper> lstStageWrapper{get;set;}
	public StageController(){
        //filling parent child map of stageName and list of project
		for(Project__c projectObj : Database.query('SELECT Id, Name,Stage__c, Total_Units__c, City__c 
										FROM RCD_Project__c ORDER BY Stage__c,Name ASC')){
		
			list<Project__c> lstProject = new list<Project__c>();
			if(mapOfProject.containsKey(projectObj.Stage__c)){
				lstProject = mapOfProject.get(projectObj.Stage__c);
			}
			lstProject.add(projectObj);
			mapOfProject.put(projectObj.Stage__c , lstProject);
		}
		for(String stageName : mapOfProject.keyset()){
			StageWrapper stageWrapObj = new StageWrapper();
			stageWrapObj.lstProject = mapOfProject.get(stageName);
			stageWrapObj.stagename = stagename;
			lstStageWrapper.add(stageWrapObj);
		}
	}
	
	public class StageWrapper{
		public string stageName {get;set;}
		public list<Project__c> lstProject{get;set;}
		
		public StageWrapper(){
			lstProject = new list<Project__c>(); 
		}
	}
}

Then you can use the wrapper list to show the data.
 
<apex:page controller="StageController">
	<apex:repeat value="{!lstStageWrapper}" var="stageWrapObj">
	<div style="margin-left:12px">{!stageWrapObj.stagename}</div>
		<ul>
		<apex:repeat value="{!stageWrapObj.lstProject}"  var="projectObj" >
			<li>{!projectObj.Name}</li>
		</apex:repeat>
		</ul>
	</apex:repeat>
</apex:page>

Note :There may be typo error as it is a rough code .

Hope this helps.