Несколько запросов AggregateResult - PullRequest
1 голос
/ 13 апреля 2020

Привет, ребята,
В настоящее время я пытаюсь объединить два объекта в одном запросе или результате.
У меня вопрос, возможно ли показать или отладить сумму ПОЛЯ А ОТ ВЕДЕНИЯ + сумму ПОЛЯ Б ИЗ двух разных объектов. Вот пример, над которым я работаю:
Кстати, я очень ценю ваше время и комментарии, и если я делаю ошибку, пожалуйста, дайте мне знать, спасибо.

public static void example() {

   String sQueryOne;
   String sQueryTwo;
   AggregateResult[] objOne;
   AggregateResult[] objTwo;

   //I tried to save the following querys into a sObject List
   List<SObject> bothObjects = new List<SObject>();

   sQueryOne = 'Select Count(Id) records, Sum(FieldA) fieldNA From Lead';
   objOne = Database.query(sQueryOne);
   sQueryTwo = 'Select Count(Id) records, Sum(FieldA) fieldNB From Opportunity';
   objTwo = Database.query(sQueryTwo);

   bothObjects.addAll(objOne);
   bothObjects.addAll(objTwo);

   for(sObject totalRec : bothObjects) {
       //There's a Wrapper(className) I created which contains some variables(totalSum)
       className finalRes = new className();
       finalRes.totalSum = (Integer.valueOf(fieldNA)) + (Integer.valueOf(fieldNB));
       System.debug('The sum is: '+finalRes.totalSum);

Например, если я вызываю системную отладку с предыдущей переменной finalRes.totalSum, она просто показывает дублированное первое значение (fieldNA).

Следующая отладка показывает текущие значения списка объектов sObject, которые я хочу суммировать, например, FIELD0 = от потенциальных клиентов, FIELD0 = от потенциальных возможностей.

Debug bothObjects variable

   }
}

1 Ответ

1 голос
/ 13 апреля 2020

Вы получаете доступ к столбцам в AggregateResult, вызывая get('columnAlias'). Если вы не указали псевдоним, они будут автоматически пронумерованы SF как expr0, expr1 ... Если вы сомневаетесь, вы всегда можете go System.debug(results);

Дополнительная информация: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/langCon_apex_SOQL_agg_fns.htm

Это может дать вам несколько идей:

List<AggregateResult> results = new List<AggregateResult>{
    [SELECT COUNT(Id) records, SUM(NumberOfEmployees) fieldA, SUM(AnnualRevenue) fieldB FROM Account],
    [SELECT COUNT(Id) records, SUM(Amount) fieldA, SUM(TotalOpportunityQuantity) fieldB FROM Opportunity],
    [SELECT COUNT(Id) records, SUM(NumberOfEmployees) fieldA, SUM(AnnualRevenue) fieldB FROM Lead]
    /* hey, not my fault these are only 2 standard numeric fields on Lead. 
    It doesn't matter that they're identical to Account fields, what matters is what their SUM(...) aliases are
    */
};

List<Decimal> totals = new List<Decimal>{0,0,0};

for(AggregateResult ar : results){
    totals[0] += (Decimal) ar.get('records');
    totals[1] += (Decimal) ar.get('fieldA');
    totals[2] += (Decimal) ar.get('fieldB');
}

System.debug(totals); // (636, 8875206.0, 9819762558.0) in my dev org

(я не говорю, что это идеально, ваш класс-обертка звучит как лучшая идея или, возможно, даже Map<String, Decimal>. Зависит от того, что вы собираетесь делать с результатами)

...