Допускается не более 2 вложенных элементов полуобъединения (Salesforce).

Довольно новичок в APEX (разработка Salesforce), и я обнаружил проблему с одним из операторов SOQL...

Сообщение об ошибке

Это код, который создает проблему. Я провел некоторое исследование и обнаружил, что мне нужно создать набор идентификаторов вместо использования другого оператора выбора для OpportunityId, а затем просто сослаться на него в запросе...

String sumAvgQuery = 'SELECT StageName, COUNT(ID) opps, SUM(Amount) total, AVG(SVC_Svc0StageAge__c) Svc0, AVG(SVC_Svc1StageAge__c) Svc1, ' +
                                'AVG(SVC_Svc2StageAge__c) Svc2, AVG(SVC_Svc3StageAge__c) Svc3, AVG(SVC_Svc4StageAge__c) Svc4, ' + 
                                'AVG(SVC_Svc5StageAge__c) Svc5, AVG(SVC_Svc6StageAge__c) Svc6, AVG(SVC_Svc7StageAge__c) Svc7, ' +
                                'AVG(SVC_Svc8StageAge__c) Svc8, AVG(SVC_Svc9StageAge__c) Svc9 ' +
                                'FROM Opportunity ' +
                                'WHERE StageName in (' + BTG_Utility.OPPORTUNITY_STAGES + ') ' +
                                'AND ID in (SELECT OpportunityId FROM OpportunityTeamMember WHERE UserId = \'' + String.escapeSingleQuotes(userId) + '\') ' +
                                ((cluster != null && cluster != '') ? 'AND SVC_AccountCluster__c = \'' + String.escapeSingleQuotes(cluster) + '\' ' : '') +
                                ((region != null && region != '') ? 'AND SVC_AccountRegion__c = \'' + String.escapeSingleQuotes(region) + '\' ' : '') +
                                ((country != null && country != '') ? 'AND CARE_AccountCountry__c = \'' + String.escapeSingleQuotes(country) + '\' ' : '') +                                                            
                                ((product != null && product != '') ? ' AND Id in (SELECT OpportunityId FROM OpportunityLineItem Where Product2.Name = \'' + String.escapeSingleQuotes(product) + '\' and Opportunity.IsClosed = FALSE) ' : '') +
                                'GROUP BY StageName)';

Не могли бы вы помочь мне, как это сделать? Очень ценю помощь!


person JeyJim    schedule 16.10.2014    source источник


Ответы (1)


Если вы хотите использовать коллекцию, подобную набору в Apex, вам необходимо сначала заполнить набор, а затем вы можете использовать имя переменной в своем запросе SOQL с : перед ним.

Так, например:

// First populate the Set with ID's using SOQL
set<Account> inputSet = new set<Account>([SELECT Id FROM Account LIMIT 5]);

//Alternatively manually populate the set
// set<String> inputSet = new set<String>();
// List<Account> accounts = new List<Account>([SELECT custom_id__c FROM Account LIMIT 5]);
// for (Account acc : accounts) {
//      inputSet.add(acc.custom_id__c);
// }
System.debug('inputSet: ' + inputSet);

// Use the set with the data 

List<Contact> contacts = [SELECT id FROM Contact where custom_id__c in :inputSet];
System.debug('contacts: ' + contacts);

Надеюсь, это поможет.

Мохамед Имран

person Mohamed Imran Noorgat    schedule 22.10.2014