String userFields = 'user.id, user.profile.name';
String profileName = 'Regional CS Team Member';
String userObject = 'user, user.profile';
String userCondition = 'user.profile.name = "Regional CS Team Member"';
String userANDCondition = 'user.IsActive= TRUE ';
String userQuery = 'SELECT '+ userFields + ' FROM ' + userObject + ' WHERE '+ userCondition + ' AND ' + userANDCondition + ' ORDER BY name ASC ';
System.debug(userQuery);
//put the list for get the user id
List<User> lstOfUsers = Database.query(userQuery);
String oppFields = 'Id, Name, Amount ';
String oppObject = ' Opportunity ';
String oppCondition = ' CreatedById IN : ';
String oppANDCondition = ' AND Amount != Null AND Amount != 0 ';
String oppQuery = ' SELECT '+ oppFields+' FROM '+oppObject+' WHERE '+ oppCondition + lstOfUsers + oppANDCondition;
System.debug(oppQuery);
//get the records of opportunity
List<Opportunity> fetchAllRelatedOpp = Database.query(oppQuery);
///////////////////////////////////////////////////////////////////////
I am using here my dynamic query to found out the user records and opportunity records to get the data
I am going to provide link of my another question enter link description here
public with sharing class WeeklyEngagemnt{
static map<string,integer> weekDaysToNumber = new map<string,integer>{ 'Monday'=>0,
'Tuesday'=>1,
'Wednesday'=>2,
'Thursday'=>3,
'Friday'=>4,
'Saturday'=>5,
'Sunday'=>6};
//get the weeks from the method of 'getMyDates'
public static List<date> getMyDates(string dayOfWeekName, integer month, integer year){
List<date> returnList = new List<date>();
date d = date.newInstance(year,month,1);
d=d.addDays(math.mod(7-dayOfWeek(d)+weekDaysToNumber.get(dayOfWeekName),7));
do{
returnList.add(d);
d=d.addDays(7);
} while(d.month()==month);
return returnList;
}
public static integer dayOfWeek(date d){
return math.mod(date.newInstance(1900,1,8).daysBetween(d),7);
}
/*
public WeeklyEngagemnt(){
String userFields = 'user.profile.name';
String profileName = 'Regional CS Team Member';
String oppFields = 'Name,Amount';
} //how we can user the string varible inside our method fetchAllRelatedOpportunity
*/
public static void fetchAllRelatedOpportunity(){
//Create list of date
List<Date> lstOfDates = WeeklyEngagemnt.getMyDates('Monday',4,2023);
Decimal total = 0;
String userFields = 'user.id, user.profile.name';
String profileName = 'Regional CS Team Member';
String userObject = 'user, user.profile';
String userCondition = 'user.profile.name =: ';
String userANDCondition = 'user.IsActive= TRUE ';
String userQuery = 'SELECT '+ userFields + ' FROM ' + userObject + ' WHERE '+ userCondition + profileName + ' AND ' +
userANDCondition + ' ORDER BY name ASC ';
System.debug(userQuery);
//put the list for get the user id
List<User> lstOfUsers = Database.query(userQuery);
String oppFields = 'Id, Name, Amount ';
String oppObject = ' Opportunity ';
String oppCondition = ' CreatedById IN : ';
String oppANDCondition = ' AND Amount != Null AND Amount != 0 ';
String oppQuery = ' SELECT '+ oppFields+' FROM '+oppObject+' WHERE '+ oppCondition + lstOfUsers + oppANDCondition;
System.debug(oppQuery);
//get the records of opportunity
List<Opportunity> fetchAllRelatedOpp = Database.query(oppQuery);
//Updated opportuntiy list
List<Opportunity> lstOpp = new List<Opportunity>();
//Map of user Id with list of Dates
Map<Id,List<Date>> userByweekClosedWonValue = new Map<Id,List<Date>>();
for(User objUser: lstOfUsers){
if(lstOfUsers.size()>0){
userByweekClosedWonValue.put(objUser.Id, lstOfDates);
}
}
if(fetchAllRelatedOpp.size()>0){
for( Opportunity objOppo : fetchAllRelatedOpp){
total = total+objOppo.Amount;
lstOpp.add(objOppo);
}
}
system.debug('listOfOppo ===> ' + lstOpp);
System.debug('Total: '+total);
}
}
userCondition
to `String userCondition = 'user.profile.name = :profileName;'.CreatedById IN :lstOfUsers
to benefit from a binding, and not concatenate in thelstOfUsers
at all. It seems likely you should review SOQL on trailhead.