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
DipthiDipthi 

Need help for Trigger - create child records for selected values in a Multiselect Picklist


Hi Awesome coders, I am new to programming and need help with this Trigger. Your help is greatly appreciated !!

I have two Objects, 
1. Package_Shipment_Order__c (Parent) , 
2.Package_Shipment_Delivery__c (Child) M_Detail relationship . 
Parent object has a multi select picklist field ‘States__c’ . When User selects a couple of states, child records to be created on Package_Shipment_Delivery__c. Error is highlighted in Bold

trigger PicklistCreateChild on Package_Shipment_Order__c (after insert , after update) {
List<Package_Shipment_Delivery__c> PkgShipDe = new List<Package_Shipment_Delivery__c>();
    for(Package_Shipment_Order__c PkgShipOr : Trigger.new){
        if (PkgShipOr.Shipment_States__c != Null){
            List<String> ShipStates = PkgShipOr.Shipment_States__c.Split(';');
            If(ShipStates != Null && ShipStates.size()>0){
                for (String ShipSt : ShipStates){
       Package_Shipment_Delivery__c PkShipDe = new Package_Shipment_Delivery__c();   
       PkShipDe.Package_Shipment_Orders__c = PkgShipOr.Id;
       PkShipDe.State__c = PkgShipDe.get(ShipSt);  
                    PkgShipDe.add(PkShipDe) ;
                }
            }
        }
    Insert PkgShipDe;
Best Answer chosen by Dipthi
Footprints on the MoonFootprints on the Moon
Use below code and let me know - 
trigger SelectedPicklistCreateChildOnDelivery on Package_Shipment_Order__c (after insert, after update) {
	
	List<Package_Shipment_Delivery__c> PkgShipDe = new List<Package_Shipment_Delivery__c>();
    
    for(Package_Shipment_Order__c PkgShipOr : Trigger.new) {
        if (PkgShipOr.Shipment_States__c != Null) {
            List<String> ShipStates = PkgShipOr.Shipment_States__c.Split(';');
            if(ShipStates != Null && ShipStates.size()>0) {
            
                for (String States : ShipStates ) {
                
					Package_Shipment_Delivery__c PkShipDeliv = new Package_Shipment_Delivery__c();   
                
					PkShipDeliv.Package_Shipment_Orders__c   = PkgShipOr.Id;
					PkShipDeliv.State__c                     = States;  
					PkgShipDe.add(PkShipDeliv) ;
                    
				}
            
			}
		}
    }
	Insert PkgShipDe;   
}

All Answers

Footprints on the MoonFootprints on the Moon
PkShipDe.State__c = PkgShipDe.get(ShipSt);
Here, you are using List's get method, which accepts index, whereas you are passing Shipping State's value (ShipSt).
List<Integer> myList = new List<Integer>();
myList.add(47);
Integer myNumber = myList.get(0);
system.assertEquals(47, myNumber);
To access elements from List<String> ShipStates, you can change the inner for loop as below instead of for (String ShipSt : ShipStates) -
for(int i=0 ; i < ShipStates.size() ; i++){

     Package_Shipment_Delivery__c PkShipDe = new Package_Shipment_Delivery__c();   
     PkShipDe.Package_Shipment_Orders__c = PkgShipOr.Id;
     PkShipDe.State__c = PkgShipDe.get(i);  
     PkgShipDe.add(PkShipDe) ;

}
For more reference - https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_methods_system_list.htm
Let me know if this helps.
DipthiDipthi
Hi Moon,
Thank you very much for guiding about List methods. Reference links are very helpful :)
I still see the error on the same line as 'Illegal assignment from Package_Shipment_Delivery__c to String'.

Here are the changes:   

//TODO - Need to create child records only for selected mutiselect values in Picklist 
trigger SelectedPicklistCreateChildOnDelivery on Package_Shipment_Order__c (after insert, after update) {
List<Package_Shipment_Delivery__c> PkgShipDe = new List<Package_Shipment_Delivery__c>();
    
    for(Package_Shipment_Order__c PkgShipOr : Trigger.new) {
        if (PkgShipOr.Shipment_States__c != Null) {
            List<String> ShipStates = PkgShipOr.Shipment_States__c.Split(';');
            If(ShipStates != Null && ShipStates.size()>0) {
            
                for (String States : ShipStates ) {
                for (integer i=0 ; i<ShipStates.size() ; i++) {

                
                Package_Shipment_Delivery__c PkShipDeliv = new Package_Shipment_Delivery__c();   
                
                PkShipDeliv.Package_Shipment_Orders__c   = PkgShipOr.Id;
         PkShipDeliv.State__c                     = PkgShipDe.get(i);  
                PkgShipDe.add(PkShipDeliv) ;
                    
             }
            }
        }
Insert PkgShipDe;
    }    
    }  } 
Footprints on the MoonFootprints on the Moon
Use below code and let me know - 
trigger SelectedPicklistCreateChildOnDelivery on Package_Shipment_Order__c (after insert, after update) {
	
	List<Package_Shipment_Delivery__c> PkgShipDe = new List<Package_Shipment_Delivery__c>();
    
    for(Package_Shipment_Order__c PkgShipOr : Trigger.new) {
        if (PkgShipOr.Shipment_States__c != Null) {
            List<String> ShipStates = PkgShipOr.Shipment_States__c.Split(';');
            if(ShipStates != Null && ShipStates.size()>0) {
            
                for (String States : ShipStates ) {
                
					Package_Shipment_Delivery__c PkShipDeliv = new Package_Shipment_Delivery__c();   
                
					PkShipDeliv.Package_Shipment_Orders__c   = PkgShipOr.Id;
					PkShipDeliv.State__c                     = States;  
					PkgShipDe.add(PkShipDeliv) ;
                    
				}
            
			}
		}
    }
	Insert PkgShipDe;   
}
This was selected as the best answer
DipthiDipthi

Hi Moon,

Thank you very much. It worked perfectly !!