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
Mitesh Saparia 8Mitesh Saparia 8 

System.QueryException: unexpected token: <EOF>: Trigger.ProductDetail: line 52, column 1

trigger ProductDetail on Design_Selected_Junction__c (After insert) {
    if(Trigger.isInsert){
        Set<Id> designTemplateSet = new Set<Id>();
        Set<Id> oppSet = new Set<Id>();
        for(Design_Selected_Junction__c desiSele : trigger.new){
            designTemplateSet.add(desiSele.Design_Template__c);  
            oppSet.add(desiSele.Opportunity__c);  
            //System.debug('ID --->' +designTemplateSet);
            //System.debug('ID --->' +oppSet);
        }
        // sObject types to describe
        Map<String, Schema.SObjectField> fields = Schema.getGlobalDescribe().get('Design_Item__c').getDescribe().fields.getMap();
        List<String> listFields = new List<String>();
        for(Schema.SObjectField fieldRef : fields.values()){
            Schema.DescribeFieldResult parentfieldResult = fieldRef.getDescribe();
            if(parentfieldResult.isUpdateable()) {
                listFields.add(parentfieldResult.getName());
            }
        }
        String query = '';
        query =  'Select Id,' + String.join(listFields,',') + ',';
        System.debug('Query --->' +query);  
        String dynamicQuery = '';
        List<String> fieldNames;
        Set<String> childString = new Set<String>{
        'Handles__r','Prints__r','Linings__r','Closures__r','Inserts__r','Patches__r','Insulation_Padding__r','Tags__r'
        };
        String childStringQuery = '';
        String finalQuery = '';
        for(ChildRelationship childRel : Schema.getGlobalDescribe().get('Design_Item__c').getDescribe().getChildRelationships()){                       
            if(childString.contains(childRel.getRelationshipName())){
                DescribeSObjectResult describeResult = childRel.getChildSObject().getDescribe();
                System.debug('Child Relationship Name --->' +childRel.getRelationshipName());
                Map <String, Schema.SObjectField> fieldsMap = describeResult.fields.getMap();
                fieldNames = new List<String>();
                for(Schema.SObjectField sObjectField : fieldsMap.values()){
                    Schema.DescribeFieldResult fieldResult = sObjectField.getDescribe();                    if(fieldResult.isUpdateable()){
                        fieldNames.add(fieldResult.getName());
                    }
                    dynamicQuery +='(select Id,' + String.join(fieldNames, ',')
                     + ' from ' + String.valueOf(childRel.getRelationshipName())+'),'; 
                }
            }
        }
        dynamicQuery = dynamicQuery.removeEnd(',');
        childStringQuery += dynamicQuery;
        System.debug('Check dynamic ---> '+childStringQuery);
        String condition = 'Where Parent_template__c In:designTemplateSet'; 
        query += query + childStringQuery+' FROM Design_Item__c '+ condition;    
        //String finalQuery = query +','+ dynamicQuery +' from  Design_Item__c '+ condition;
        System.debug('Check final ---> '+query);
        List<Design_Item__c> designRecords = Database.query(finalQuery);
        System.debug('Check List ---> '+designRecords);
    }
}
DheerajKumar@SalesforceDheerajKumar@Salesforce
Hi Mitesh,

Looking through the code I observe one problem which may be the root cause.

On Below line(Line Number 49) :
 
query += query + childStringQuery+' FROM Design_Item__c '+ condition;
Replace with :
query = query + childStringQuery+' FROM Design_Item__c '+ condition;
If above will not help then could you provide the final query string from debug log which is executing on below statement :

System.debug('Check final ---> '+query);

This will help us to find the root cause in query.

Thanks
Dheeraj Kumar
Anant KamatAnant Kamat
Looking at the code, there are 2 changes that needs to be done.

1.  Don't have to again pass query when you are using += in the line 49. Make the below changes in line 49.

query +=  childStringQuery+' FROM Design_Item__c '+ condition; 

2. You have commented the string finalQuery at line 50 but passing it to line 52. Instead change line 52 to below one

List<Design_Item__c> designRecords = Database.query(query);

Let me know if it works after making these 2 changes.
 
Mitesh Saparia 8Mitesh Saparia 8
trigger ProductDetail on Design_Selected_Junction__c (After insert) {
    if(Trigger.isInsert){
        Set<Id> designTemplateSet = new Set<Id>();
        Set<Id> oppSet = new Set<Id>();
        for(Design_Selected_Junction__c desiSele : trigger.new){
            designTemplateSet.add(desiSele.Design_Template__c);  
            oppSet.add(desiSele.Opportunity__c);  
            //System.debug('ID --->' +designTemplateSet);
            //System.debug('ID --->' +oppSet);
        }
        // sObject types to describe
        Map<String, Schema.SObjectField> fields = Schema.getGlobalDescribe().get('Design_Item__c').getDescribe().fields.getMap();
        List<String> listFields = new List<String>();
        for(Schema.SObjectField fieldRef : fields.values()){
            Schema.DescribeFieldResult parentfieldResult = fieldRef.getDescribe();
            if(parentfieldResult.isUpdateable()) {
                listFields.add(parentfieldResult.getName());
            }
        }
        String query = '';
        query =  'Select Id,' + String.join(listFields,',') + ',';
        System.debug('Query --->' +query);  
        String dynamicQuery = '';
        List<String> fieldNames;
        Set<String> childString = new Set<String>{
        'Handles__r','Prints__r','Linings__r','Closures__r','Inserts__r','Patches__r','Insulation_Padding__r','Tags__r'
        };
        for(ChildRelationship childRel : Schema.getGlobalDescribe().get('Design_Item__c').getDescribe().getChildRelationships()){                       
            if(childString.contains(childRel.getRelationshipName())){
                DescribeSObjectResult describeResult = childRel.getChildSObject().getDescribe();
                System.debug('Child Relationship Name --->' +childRel.getRelationshipName());
                Map <String, Schema.SObjectField> fieldsMap = describeResult.fields.getMap();
                fieldNames = new List<String>();
                for(Schema.SObjectField sObjectField : fieldsMap.values()){
                    Schema.DescribeFieldResult fieldResult = sObjectField.getDescribe(); 
                    if(fieldResult.isUpdateable()){
                        fieldNames.add(fieldResult.getName());
                    }
                    dynamicQuery +='(select Id,' + String.join(fieldNames, ',')
                     + ' from ' + String.valueOf(childRel.getRelationshipName())+'),'; 
                }
            }
        }
        dynamicQuery = dynamicQuery.removeEnd(',');
        query += dynamicQuery;
        System.debug('Check dynamic ---> '+query);
        String condition = 'Where Parent_template__c In : designTemplateSet'; 
        //query = query +' FROM Design_Item__c '+ condition;    
        String finalQuery = query  +' from  Design_Item__c '+ condition;
        System.debug('Check final ---> '+finalQuery);
        List<Design_Item__c> designRecords = Database.query(finalQuery);
        System.debug('Check List ---> '+designRecords);
    }
}
DheerajKumar@SalesforceDheerajKumar@Salesforce
Hi Mitesh,

Try to replace the code with below code :
 
trigger ProductDetail on Design_Selected_Junction__c (After insert) {
    if(Trigger.isInsert){
        Set<Id> designTemplateSet = new Set<Id>();
        Set<Id> oppSet = new Set<Id>();
        for(Design_Selected_Junction__c desiSele : trigger.new){
            designTemplateSet.add(desiSele.Design_Template__c);  
            oppSet.add(desiSele.Opportunity__c);  
            //System.debug('ID --->' +designTemplateSet);
            //System.debug('ID --->' +oppSet);
        }
        // sObject types to describe
        Map<String, Schema.SObjectField> fields = Schema.getGlobalDescribe().get('Design_Item__c').getDescribe().fields.getMap();
        List<String> listFields = new List<String>();
        for(Schema.SObjectField fieldRef : fields.values()){
            Schema.DescribeFieldResult parentfieldResult = fieldRef.getDescribe();
            if(parentfieldResult.isUpdateable()) {
                listFields.add(parentfieldResult.getName());
            }
        }
        String query = '';
        query =  'Select Id,' + String.join(listFields,',') + ',';
        System.debug('Query --->' +query);  
        String dynamicQuery = '';
        List<String> fieldNames;
        Set<String> childString = new Set<String>{
        'Handles__r','Prints__r','Linings__r','Closures__r','Inserts__r','Patches__r','Insulation_Padding__r','Tags__r'
        };
        String childStringQuery = '';
        String finalQuery = '';
        for(ChildRelationship childRel : Schema.getGlobalDescribe().get('Design_Item__c').getDescribe().getChildRelationships()){                       
            if(childString.contains(childRel.getRelationshipName())){
                DescribeSObjectResult describeResult = childRel.getChildSObject().getDescribe();
                System.debug('Child Relationship Name --->' +childRel.getRelationshipName());
                Map <String, Schema.SObjectField> fieldsMap = describeResult.fields.getMap();
                fieldNames = new List<String>();
                for(Schema.SObjectField sObjectField : fieldsMap.values()){
                    Schema.DescribeFieldResult fieldResult = sObjectField.getDescribe();
					if(fieldResult.isUpdateable()){
                        fieldNames.add(fieldResult.getName());
                    }
                }
				dynamicQuery +='(select Id,' + String.join(fieldNames, ',')
                     + ' from ' + String.valueOf(childRel.getRelationshipName())+'),'; 
            }
        }
        dynamicQuery = dynamicQuery.removeEnd(',');
        childStringQuery += dynamicQuery;
        System.debug('Check dynamic ---> '+childStringQuery);
        String condition = 'Where Parent_template__c In:designTemplateSet'; 
        query += query + childStringQuery+' FROM Design_Item__c '+ condition;    
        //String finalQuery = query +','+ dynamicQuery +' from  Design_Item__c '+ condition;
        System.debug('Check final ---> '+query);
        List<Design_Item__c> designRecords = Database.query(finalQuery);
        System.debug('Check List ---> '+designRecords);
    }
}

So the problem is for each field for child object adding the query in the inner query. Below code was in loop which needs to be out of loop of fieldMap.
 
dynamicQuery +='(select Id,' + String.join(fieldNames, ',') + ' from ' + String.valueOf(childRel.getRelationshipName())+'),';

Hit Kudos if this solve you problem and if this is what you are looking for then please mark it as a solution.

Thanks
Dheeraj Kumar