You need to sign in to do that
Don't have an account?
Compile Error: Loop variable must be of type Id
Hi ,
I am getting compile time error : Error: Compile Error: Loop variable must be of type Id at line 17 column 39
trigger Trg_Model on Opportunity_Platform_Model__c (after insert) {
Set<ID> Id1 = new Set<ID>();
For(Opportunity_Platform_Model__c OpMd: trigger.new){
Id1.add(OpMd.Opportunity_name__c);
Set<id> Id2 = New Set<id> ();
For(Opportunity Opp :Id1){
Id2.add(Opp.Program__r.Forecast__r.Forecast_Platform__c);
set<Id> Id3 = new Set<Id> ();
Set<ID> Id4 = new Set<Id> ();
For(Platform_Model__c Pm :Id2){
Id4.add(Pm.id);
Id3.add(Pm.Platform_Master__c);
For(Opportunity_Platform_Model__c OpMd1:Id4){
if(OpMd1.Platform_Model_Selected__c != Pm.Id){
System.debug('Test');
}
}
}
}
}
}
Thanks,
Mayank Joshi
You have declared id1/id2/4 as sets of ids. but then you try to iterate them with control variables of Opportunity, Platform_Model__c or Opportunity_Platform_Model__c.
I would have thought you need to query back lists of those sobjects based on the ids and then iterate the lists.
Thanks Bob ,
I was working on it and able to resolve that and below is updated code .Trigger is working fine with Else Statement but returning error on IF at line Insert Id5 ;
(Apex trigger Trg_Model caused an unexpected exception, contact your administrator: Trg_Model: execution of BeforeInsert caused by: System.SObjectException: DML statment cannot operate on trigger.new or trigger.old: Trigger.Trg_Model: line 32, column 1) :
Also on After insert :
( execution of AfterInsert caused by: System.FinalException: Record is read-only: Trigger.Trg_Model: line 30, column 1)
I want to update lookup field Platform_Model_Selected__c if meeting criteria . How to resolve Read only error .
-----------------------------------------------------------------------------------------------
trigger Trg_Model on Opportunity_Platform_Model__c (before insert) {
Set<ID> Id1 = new Set<ID>();
For(Opportunity_Platform_Model__c OpMd: trigger.new){
Id1.add(OpMd.Opportunity_name__c);
system.debug('test1'+OpMd.Opportunity_name__c);
List<Opportunity> o1 =[Select Id,Program__r.Forecast__r.Forecast_Platform__c from Opportunity where Id IN:Id1];
Set<id> Id2 = New Set<id> ();
For(Opportunity Opp :o1){
Id2.add(Opp.Program__r.Forecast__r.Forecast_Platform__c);
System.debug('Test2'+Opp.Program__r.Forecast__r.Forecast_Platform__c);
List<Platform_Model__c> P1 =[Select Id,Platform_Master__c,Platform_Master__r.Name from Platform_Model__c where Platform_Master__c IN:Id2 ];
set<Id> Id3 = new Set<Id> ();
Set<ID> Id4 = new Set<Id> ();
For(Platform_Model__c Pm :P1){
Id4.add(Pm.id);
Id3.add(Pm.Platform_Master__c);
System.debug('Test3'+Pm.id);
System.debug('Test4'+Pm.Platform_Master__c);
List<Opportunity_Platform_Model__c> Id5 = new List<Opportunity_Platform_Model__c>();
List<Opportunity_Platform_Model__c> OPM1 = [Select id,Platform_Model_Selected__c from Opportunity_Platform_Model__c where Platform_Model_Selected__c IN:Id4 ];
For(Opportunity_Platform_Model__c OpMd1: Trigger.new){
if(OpMd1.Platform_Model_Selected__c == Pm.Id){
System.debug('Test5'+OpMd1.Platform_Model_Selected__c);
OpMd1.Platform_Model_Selected__c = Pm.Id;
Id5.add(OpMd1);
Insert Id5 ;
}
else if(OpMd1.Platform_Model_Selected__c != Pm.Id){
OpMd1.addError('Test Error');
}
}
}
}
}
}
Thanks
As you are in a before insert, the records haven't been written to the database yet. You can therefore change the contents of the record and your changes will be persisted.