Pergunta

Ei Salesforce especialistas,

Eu tenho uma pergunta sobre consulta de informações de conta de forma eficiente.Eu gostaria de consulta a contas com base nas atualizações em um activityHistory objeto.O problema que eu estou ficando é que todas as contas estão sendo recuperados, não importa se há "concluir" activeHistory ou não.Assim, existe uma maneira que eu possa escrever esta consulta para recuperar apenas as contas com activeHistory que tem status="completo" e Type_for_reporting='QRC'?

List<Account> AccountsWithActivityHistories = [    
    SELECT
         Id
        ,Name
        ,( SELECT
                ActivityDate
               ,ActivityType
               ,Type_for_Reporting__c
               ,Description
               ,CreatedBy.Name
               ,Status
               ,WhatId
            FROM ActivityHistories
            WHERE Status ='complete'  and Type_for_Reporting__c = 'QRC'
        )
    FROM Account
];
Foi útil?

Solução

Você tem uma cláusula WHERE em histórias, mas você ainda perder um no nível da Conta.

Por exemplo, este regresso de Contas que tenham Contactos:

SELECT Id, Name
FROM Account
WHERE Id IN (SELECT AccountId FROM Contact) // try with NOT IN too

Com Atividades é mais complicado, porque eles não gostam de ser usado em ONDE, em que forma.

http://www.salesforce.com/us/developer/docs/officetoolkit/Content/sforce_api_calls_soql_select.htm

Os seguintes objetos não são suportados no momento em subconsultas:

  • ActivityHistory
  • Anexos
  • Eventos
  • EventAttendee
  • Nota
  • OpenActivity
  • Tags (AccountTag, ContactTag, e todas as outras tag objetos)
  • Tarefa

Além disso, a boa impressão na parte inferior de ActivityHistory definição também é um pouco desanimador.

As seguintes restrições sobre os usuários que não têm "Exibir Todos os Dados" permissão de ajudar a evitar problemas de desempenho:

  • A principal cláusula do relacionamento de consulta, você pode fazer referência a apenas um registro.Por exemplo, você não pode filtrar todos os registros onde o conta nome começa com 'A';em vez disso, você deve fazer referência a um único registo de conta.
  • Você não pode usar o WHERE.
  • Você deve especificar um limite de 499 ou menos o número de linhas retornadas na lista.
  • Você deve ordenar ActivityDate em ordem crescente e LastModifiedDate em ordem decrescente;você pode exibir valores nulos último.Para exemplo:ORDEM POR ActivityDate ASC NULOS ÚLTIMO, LastModifiedDate DESC.

Parece que você vai precisar de várias consultas.Ir para Tarefa (ou Evento, dependendo, por que o campo personalizado é visível), compõe um conjunto de AccountIds e, em seguida, consulta a Contas?

Ou você pode filtrar manualmente através de lista a partir da consulta original, cópia contas para o gestor de lista:

List<Account> finalResults = new List<Account>();
for(Account a : [SELECT...]){
    if(!a.ActivityHistories.isEmpty()){
        finalResults.add(a);
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top