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
orph351orph351 

Question of Lists, Sets, and For loops

I have an Apex class that runs on a daily schedule. The goal is that it will kepp track of which users have recorded a votew for a specific opportunity. Other than the code not being optimized, I currently have two issues:

1.The For loop seems to only make it to the first ElseIf statement. It doesn't seem to matter what I change on the opportunity, the For loop exits at the first ElseIf.

2. The For loop does not seem to be looping through all opportunities from the list. It seems like it is only evaluating the first item in the list.
 
global class DocketCronJ implements Schedulable{
    global void execute(SchedulableContext SC) {
        datetime t = System.now();
        date d = Date.newInstance(t.year(),t.month(),t.day());
        
        List <Opportunity> opp = [Select GC_Online_Vote_Status__c, Id, Request_Name_Used_for_Workflow__c,CampaignId, StageName, Budget_Committee__c 
                                  From Opportunity 
                                  Where StageName = 'Committee Review' 
                                  	and GC_Online_Vote_Status__c != 'Complete' 
                                  	and Docket_Name__c LIKE'GC Online Docket_%'];
        
            for(Opportunity o: opp){
                List<Campaign> camp = [Select GC_Vote_Overdue_End_Date__c 
                                       from Campaign 
                                       where Id = :o.CampaignId];
                
                List<TrusteeVotes__c> vote = [Select Id, Vote_Response__c, Trustee_Name_del__c 
                                              From TrusteeVotes__c 
                                              Where Request_Name__c = :o.Id];
                    
                	Integer Size = vote.size();
                        
                    If (Size >= 4) {
                        opp[0].GC_Online_Vote_Status__c = 'Complete';
                        update(opp);
                    }
                    else if (Size < 4 && camp[0].GC_Vote_Overdue_End_Date__c < d) {
                        opp[0].GC_Online_Vote_Status__c = 'In Progress';
                        update(opp);
                    }
                    else if (Size < 4 && camp[0].GC_Vote_Overdue_End_Date__c >= d) {
                        opp[0].GC_Online_Vote_Status__c = 'Complete';
                        update(opp);
                        
                        String voters = [Select Trustee_Name_del__c 
                                         From TrusteeVotes__c 
                                         Where Id in :vote].Trustee_Name_del__c;
                        	If (voters.contains('005A0000001lvws')) {
    							System.debug ('User1 voted');
							}
                            Else
                            	{TrusteeVotes__c voteNew = new TrusteeVotes__c(Trustee_Name_del__c = '005A0000001lvws', 
                                                                         Request_Name__c = o.Id, 
                                                                         Vote_Response__c = 'Yes',
                                    									 Vote_Type__c = 'System');
        																 insert voteNew;
                                 
                                Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
						        String emailAddr = 'user1@email.com';
								String[] toAddresses = new String[] {emailAddr};
        						mail.setToAddresses(toAddresses);
                                mail.setSubject('System Auto Vote on Request - ' + o.Id);
								mail.setPlainTextBody('Voting Close Date: ' + camp[0].GC_Vote_Overdue_End_Date__c + 
                                                      '\n Request Id: ' + o.Id + 
                                                      '\n  Request Name: ' + o.Request_Name_Used_for_Workflow__c +
                                                     '\n Vote Cast for: User 1 (https://na11.salesforce.com/005A0000001lvws)');
        						mail.setHtmlBody('<b>Voting Close Date:</b> ' + camp[0].GC_Vote_Overdue_End_Date__c + 
                                                 '\n <b>Request Id:</b> ' + o.Id + 
                                                 '\n  <b>Request Name:</b> ' + o.Request_Name_Used_for_Workflow__c);
								Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
                                }
                            If (voters.contains('005G0000003uzCu')) {
    							System.debug ('User 2 voted');
							}
                        	Else
                            	{TrusteeVotes__c voteNew = new TrusteeVotes__c(Trustee_Name_del__c = '005G0000003uzCu', 
                                                                         Request_Name__c = o.Id, 
                                                                         Vote_Response__c = 'Yes',
                                    									 Vote_Type__c = 'System');
        																 insert voteNew;
                                 
                                 Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
						        String emailAddr = 'user2@email.com';
								String[] toAddresses = new String[] {emailAddr};
        						mail.setToAddresses(toAddresses);
                                mail.setSubject('System Auto Vote on Request - ' + o.Id);
								mail.setPlainTextBody('Voting Close Date: ' + camp[0].GC_Vote_Overdue_End_Date__c + 
                                                      '\n Request Id: ' + o.Id + 
                                                      '\n  Request Name: ' + o.Request_Name_Used_for_Workflow__c +
                                                     '\n Vote Cast for: User 2 (https://na11.salesforce.com/005G0000003uzCu)');
        						mail.setHtmlBody('<b>Voting Close Date:</b> ' + camp[0].GC_Vote_Overdue_End_Date__c + 
                                                 '\n <b>Request Id:</b> ' + o.Id + 
                                                 '\n  <b>Request Name:</b> ' + o.Request_Name_Used_for_Workflow__c);
								Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
                                }
                            If (voters.contains('005G0000001pgd5')) {
    							System.debug ('User3 voted');
							}
                        	Else
                            	{TrusteeVotes__c voteNew = new TrusteeVotes__c(Trustee_Name_del__c = '005G0000001pgd5', 
                                                                         Request_Name__c = o.Id, 
                                                                         Vote_Response__c = 'Yes',
                                    									 Vote_Type__c = 'System');
        																 insert voteNew;
                                 
                                 Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
						        String emailAddr = 'user3@email.com';
								String[] toAddresses = new String[] {emailAddr};
        						mail.setToAddresses(toAddresses);
                                mail.setSubject('System Auto Vote on Request - ' + o.Id);
								mail.setPlainTextBody('Voting Close Date: ' + camp[0].GC_Vote_Overdue_End_Date__c + 
                                                      '\n Request Id: ' + o.Id + 
                                                      '\n  Request Name: ' + o.Request_Name_Used_for_Workflow__c +
                                                     '\n Vote Cast for: User 3 (https://na11.salesforce.com/005G0000001pgd5)');
        						mail.setHtmlBody('<b>Voting Close Date:</b> ' + camp[0].GC_Vote_Overdue_End_Date__c + 
                                                 '\n <b>Request Id:</b> ' + o.Id + 
                                                 '\n  <b>Request Name:</b> ' + o.Request_Name_Used_for_Workflow__c);
								Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
                                }
                            If (voters.contains('005A0000000jRh1')) {
    							System.debug ('User 4 voted');
							}
                        	Else
                            	{TrusteeVotes__c voteNew = new TrusteeVotes__c(Trustee_Name_del__c = '005A0000000jRh1', 
                                                                         Request_Name__c = o.Id, 
                                                                         Vote_Response__c = 'Yes',
                                    									 Vote_Type__c = 'System');
        																 insert voteNew;
                                 
                                 Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
						        String emailAddr = 'user4@email.com';
								String[] toAddresses = new String[] {emailAddr};
        						mail.setToAddresses(toAddresses);
                                mail.setSubject('System Auto Vote on Request - ' + o.Id);
								mail.setPlainTextBody('Voting Close Date: ' + camp[0].GC_Vote_Overdue_End_Date__c + 
                                                      '\n Request Id: ' + o.Id + 
                                                      '\n  Request Name: ' + o.Request_Name_Used_for_Workflow__c +
                                                     '\n Vote Cast for: User 4 (https://na11.salesforce.com/005A0000000jRh1)');
        						mail.setHtmlBody('<b>Voting Close Date:</b> ' + camp[0].GC_Vote_Overdue_End_Date__c + 
                                                 '\n <b>Request Id:</b> ' + o.Id + 
                                                 '\n  <b>Request Name:</b> ' + o.Request_Name_Used_for_Workflow__c);
								Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
                                }
                        
                                } 
                           
                        }
            }
    }

Any thoughts or suggestions?
Ajay K DubediAjay K Dubedi
Hey,
In my view i think that the mistake that you are doing is that you are quering the list in the for loop :
for(Opportunity o: opp){
List<Campaign> camp = [Select GC_Vote_Overdue_End_Date__c from Campaign where Id = :o.CampaignId];
                      
List<TrusteeVotes__c> vote = [Select Id, Vote_Response__c, Trustee_Name_del__c  From TrusteeVotes__c Where Request_Name__c = :o.Id];
                                                  
       }
Rather then using this you must query the list outside of the for loop.
orph351orph351
The issue is that I need to check each opportunity that is returned in the original list to see if it has been voted on. How can I re-write it so that I query outside of the For loop?
orph351orph351
Any ideas on how to handle the List inside of a For loop?