Direkt zum Hauptbereich

Posts

Es werden Posts vom März, 2014 angezeigt.

"AggregateResult" als Unterstützung im Service Bereich

Eine sehr hilfreiche Funktionalität bieten die sogenannten APEX Aggregate Functions (hier etwas ausführlicher dargestellt http://www.salesforce.com/us/developer/docs/apexcode/Content/langCon_apex_SOQL_agg_fns.htm)

Mit dem Einsatz der entsprechenden Funktion lässt sich z.B. die Anzahl offener Tickets pro Queue berechnen, ohne dabei die aufwändigen Schleifen zu drehen.

COUNT(id)cnt Anzahl Tickets
MIN(CreatedDate)lmd das Datum des ältesten Tickets

SELECT OwnerId, COUNT(id)cnt, MIN(CreatedDate)lmd FROMCaseWHERE isClosed = falseGROUPBY OwnerId

Verpackt in eine Funktion sieht der Code wie folgt aus.
Die Sortierung von Ergebnissen sortResultsByQueueName habe ich auskommentiert, da diese im letzten Post "Sortieren von Listeneinträgen einfach gemacht" ausführlich beschrieben wurde.

     /***************      getQueues      **/ public PageReference getQueues(){ // get number of tickets per queue sorted       lstQueueDetails = newlist<QueueDetail>(); for (AggregateResult ar : [SELECT Owner…

Sortieren von Listeneinträgen einfach gemacht

Im letzten Blog-Post habe ich beschrieben, wie die Gruppenzugehörigkeit eines Salesforce-Benutzers per APEX berechnet werden kann. Die berechneten Gruppen und Queues lassen sich auf einer Visualforce Seite darstellen. Wie kann ich die Ergebnisse sortiert darstellen?

Der folgende Code-Ausschnitt zeigt eine Lösung basierend auf dem rekursiven Aufruf der Sortierfunktion.
INPUT - die unsortierte Liste mit eigenen Objekten
OUTPUT - die nach QueueName sortierte Liste

/*------------------

Gruppenzugehörigkeit mit APEX berechnen

Eine Visualforce Page zeigt alle Queues, die den aktuell angemeldeten User enthalten. Das ist die Aufgabe. Es ist nicht besonders schwer, die entsprechende SOQL Abfrage zu bilden. Etwas komplizierter wird es dann, wenn einige Queues verschachtelte Gruppen enthalten, zu deren Mitgliedern unter anderem der aktuelle User gehört.
Die folgende Klasse enthält eine Methode, welche die Gruppenzugehörigkeit eines Salesforce Benutzers berechnet.
Die Methode computeUserGroups wird rekursiv aufgerufen, bis oberste Ebene, z.B. Queue erreicht ist.
Das Set setGIds enthält alle für den angemeldeten Benutzer relevanten Gruppen und Queue IDs.

publicwithoutsharingclass userGroups{ publicSet<Id> setGIds; /* CONSTRUCTOR  */ publicuserGroups(ApexPages.StandardSetController stdController){ uId = UserInfo.getUserId(); //*** User's queue membership **************/ setGIds = newset<Id>(); computeUserGroups(newSet<Id>{uId}); }
/*----------------------------  computeUserGroups */ publicvoid computeUserGro…

Batch - Aufbau

Hin und wieder kommt es vor, dass viele Daten im Hintergrund aktualisiert werden müssen. Es ist keine Zauberei, einen Batch dafür zu schreiben. Viel mehr kommt es auf die Technik an. Schließlich muss jeder Batch auch getestet werden. Da Batches asynchron laufen, also zeitversetzt, und nicht unmittelbar nach dem Start, wird die Überprüfung der Testergebnisse nicht einfach sein.
Daher ist es empfehlenswert, die komplette Logik in eine weitere Klasse auszulagern. So können die einzelnen Methoden und Funktionen dieser Klasse sowohl vom Batch benutzt, als auch im Testlauf geprüft werden.

Schematisch dargestellt sieht der Aufbau wie folgt aus:


Batch - Löschen von Daten (f42_Batch_DeleteData) globalclass f42_Batch_DeleteData implements Database.Stateful, Database.Batchable<SObject>, Schedulable{ public f42_Batch_DeleteDataHelper batchHelper; public String soql;
 /* Constructor */  /*********************/  public f42_Batch_DeleteData(){   batchHelper = new f42_Batch_DeleteDataHelper(); …