Domanda

Sto cercando di scrivere un trigger "dopo l'aggiornamento" che fa un aggiornamento batch su tutti i record figlio del record che è stato appena aggiornato. Questo deve essere in grado di gestire 15k + record figlio in un momento. Purtroppo, il limite sembra essere 100, che è così ben al di sotto i miei bisogni non è nemmeno vicino a accettabili. Non ho provato la divisione dei record in lotti di 100 ciascuno, dal momento che questo sarà ancora mi ha messo in un tappo di 10k aggiornamenti al esecuzione del trigger. (Forse potrei semplicemente trigger daisy-chain insieme? Ugh).

Qualcuno sa che serie di cerchi posso saltare attraverso per superare questa limitazione?

Edit: Ho provato a chiamare seguente funzione @future nel mio grilletto, ma non è mai aggiorna i record figlio:

global class ParentChildBulkUpdater
{
    @future 
    public static void UpdateChildDistributors(String parentId) {
        Account[] children = [SELECT Id FROM Account WHERE ParentId = :parentId];

        for(Account child : children)
            child.Site = 'Bulk Updater Fired';
        update children;

    }
}
È stato utile?

Soluzione

E 'peggio di quello, hai nemmeno intenzione di essere in grado di ottenere quei 15k record, in primo luogo, perché c'è un limite di query 1.000 riga all'interno di un trigger (Questo scala per il numero di righe il trigger è essere chiesto, ma che aiutano probabilmente doesnt)

Credo che il tuo unico modo per farlo è con il tag @future - leggere su che nella documentazione. Ti dà limiti molto più alti. Anche se, è possibile chiamare solo così tanti di coloro che in un giorno -. Quindi potrebbe essere necessario per tenere in qualche modo traccia di quali oggetti principali hanno i loro figli l'aggiornamento, e quindi elaborare che offline

Un ultima opzione potrebbe essere quella di utilizzare le API tramite qualche strumento esterno. Ma avrai ancora per assicurarsi che tutto nel codice è in batch su.

ho pensato questi limiti erano draconiane in un primo momento, ma in realtà si può fare un inferno di una partita al loro interno se in batch le cose correttamente, aggiorniamo regolarmente 1,000 's di righe da trigger. E da un punto di vista architettonico, molto di più e si sta davvero parlando elaborazione batch in ogni caso che costerà normalmente attivato da un trigger. Una cosa di sicuro - ti fanno salti mortali per farlo

.

Altri suggerimenti

Il meglio (e più facile) strada da prendere a questo problema è quello di utilizzare Batch Apex , è possibile creare una classe batch e sparare dal grilletto. Come @future viene eseguito in un thread separato, ma è in grado di elaborare fino a 50.000.000 di record!

Avrai bisogno di passare alcune informazioni per la classe in batch prima di utilizzare database.executeBatch in modo che abbia l'elenco di ID genitore con cui lavorare, o si può solo ottenere tutti i conti, ovviamente;)

Ho appena notato quanti anni questa domanda è, ma speriamo che questa risposta sarà aiutare gli altri.

Credo Codek è giusto, va l'API / percorso strumento esterno è un buon modo per andare. I limiti di governatore sono ancora validi, ma sono molto meno severi con chiamate API. Salesforce ha recentemente rinnovato il loro strumento DataLoader, in modo che possa essere qualcosa di guardare in.

Un'altra cosa che si potrebbe provare sta utilizzando una regola del flusso di lavoro con un messaggio in uscita per chiamare un servizio web da parte vostra. Basta inviare sopra l'oggetto principale e lasciare che un processo da parte vostra di gestire gli aggiornamenti dei record figlio tramite l'API. Una cosa da tenere presente, con i messaggi in uscita, è meglio fare la coda il processo da parte vostra in qualche modo, e rispondere immediatamente a Salesforce. In caso contrario, sarà Salesforce inviare nuovamente il messaggio.

@future non funziona (non aggiorna record a tutti)? Strano. Hai provato di utilizzare la funzione di test automatizzato? Dovrebbe funzionare ed e l'annotazione deve essere ignorato (durante il test verrà eseguito immediatamente, i metodi di prova hanno limiti più alti). Vi suggerisco di indagare su questo un po 'di più, sembra che la migliore soluzione per ciò che si vuole realizzare.

Inoltre -? Magari cercare di chiamarlo dalla classe, non il grilletto

Daisy-chain trigger insieme non funziona, ho provato in passato.

La tua ultima opzione potrebbe essere il gruppo Apex (dal rilascio Winter'10 così tutte le organizzazioni dovrebbero avere ormai). E 'pensato per l'aggiornamento dei dati di massa / posti di lavoro di validazione, cose che in genere eseguite durante la notte in banche dati normali (può essere programmata). Vedere http: //www.salesforce .com / comunità / winter10 / custom-cloud / programma-cloud-logica / batch code.jsp note di rilascio e PDF.

Credo nella versione 18 del API del limite di 1000 è stato rimosso. (Così la documentazione dice ma in alcuni casi ho ancora colpito un limite)

Quindi, si può essere in grado di utilizzare all'apice batch. Con una sola istruzione di aggiornamento APEX

Qualcosa di simile:

  

Elenco bambini = new List {};

     

per (childObect__c c: [SELEZIONE ....]) {

     
    

c.foo__c = 'bar';

         

children.add (c);

  
     

}   aggiornamento (bambini) ;;

besure si bulkify tua Tigger anche vedere http : //sfdc.arrowpointe.com/2008/09/13/bulkifying-a-trigger-an-example/

Forse un cambiamento al modello di dati è l'opzione migliore qui. Pensare di creare una formula sull'oggetto bambini in cui si accede ai dati da parte del genitore. Questo sarebbe molto più efficiente, probabilmente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top