Aufrufen von APEX-Code per Button

Ich möchte hier beschreiben, wie man ganz simpel Apex-Code durch einen ‚Knopfdruck‘ ausführen kann. Mit Hilfe solcher Buttons („Benutzerdefinierte Schaltfläche“) können dem User lästige Aufgaben, die sich automatisieren lassen, abgenommen werden. Ein oft genutztes Einsatzgebiet ist das Anlegen von Datensätzen, Versenden von E-Mails oder Anstoßen eines Workflows.

Das Vorgehen als Checkliste

  • Apex-Klasse und Methode(n) schreiben
  • Button anlegen
  • Button zunächst in ein Test Page Layout aufnehmen und testen
  • Sicherheitseinstellungen des Buttons anpassen (für Profile freischalten)
  • Button in alle gewünschten Page Layouts aufnehmen

Im Detail

Der Button sollte mit den folgenden Einstellungen angelegt werden:

Mit den hier gezeigten Einstellungen kann man den Button später an der Detailansicht des Datensatzes positionieren, also z.B. neben „Bearbeiten“ und „Löschen“. Möchte man einen Button an einer Related List haben, so muss der „List Button“ („Schaltfläche für Liste“) ausgewählt werden und der Button muss bei dem entsprechenden Unterobjekt angelegt werden. Soll beispielsweise ein Button an der Related List für Aktivitäten am Account eingebunden werden, so muss der Button auch am Aktivitäten-Objekt angelegt werden;

[Zum vergrößern Bild anklicken]

Als Aufruf für den Button wird nun folgender Javascript code in das große Feld eingefügt:

{!requireScript("/soap/ajax/18.0/connection.js")}
{!requireScript("/soap/ajax/18.0/apex.js")}

if(confirm('Dies ist eine beliebige Sicherheitsabfrage.'))
sforce.apex.execute(
	'KlassenName',
	'MethodenName',
	{Id:'{!Account.Id}', ParameterZwei:'bla'});

Der Code Zeile für Zeile erklärt:

Die ersten beiden Zeilen stellen sicher, dass die benötigten Javascript-Bibliotheken geladen sind.

Anschließend wird eine einfache Sicherheitsabfrage mittels „Ok / Abbrechen“ Dialog durchgeführt. Diese ist natürlich optional und kann auch weggelassen werden. Ich benutze sie gerne, um ein versehentliches Auslösen der Aktion zu unterbinden.

Nun wird die eigentliche APEX Klasse aufgerufen. KlassenName und MethodenName sind dabei natürlich entsprechend dem eigenen Code anzupassen. Die zu übergebenen Parameter richten sich auch nach der aufgerufenen Methode.

Die APEX Klasse dazu sieht wie folgt aus:

global class KlassenName{
  Webservice static void MethodenName(String Id, String ParameterZwei) {
   //Programm-Logik....
  }
}

Wichtig ist, die Klasse als global und die Methode als Webservice zu deklarieren.

Bezieht sich die Programm-Logik auf ein konkretes sObject, so muss dieses ggf. erst per SOQL bereit gestellt werden.

Bevor nun der Button in das Page-Layout aufgenommen wird, ganz wichtig, nicht vergessen: Die Security-Einstellungen für die Klasse anpassen. D.h. alle User, die den Button benutzen möchten, müssen dafür freigeschaltet werden. Hierzu navigiert man im Setup zu „Develop“ -> „Apex Classes“ -> „Security“ und schiebt alle gewünschten Profile von links nach rechts;

Ein Anwendungsfall

Was z.B. mit einem solchen Button möglich ist: Eine Task mit vordefiniertem Inhalt anlegen. Hier genutzt um Anrufe zu protokollieren, bei denen der Agent auf der Mailbox gelandet ist. Der Button kann sowohl an einem Lead, Kontakt als auch Account angelegt werden. Es muss entsprechend mindestens eine whoID oder whatID oder auch beides übergeben werden.

Button Beispiel an einem Lead:

{!REQUIRESCRIPT("/soap/ajax/18.0/connection.js")}
{!REQUIRESCRIPT("/soap/ajax/18.0/apex.js")} 

if(confirm('Called and left VM?')){ 

sforce.apex.execute(
'TaskHandling',
'addTask',
{Status:'Completed',whoId:'{!Lead.Id}', Subject:'Called, left VM', Type:'Call'});

location.reload();}

Und die dazugehörige Apex-Klasse:

global class TaskHandling {

    Webservice static void addTask(String status, String whoId, String subject, String tipe, String whatId) {
        /*
        Creates a task for given lead or contact
        */

        // Build a new Task and insert it
        Task task = new Task(
            Status = status,
            Subject = subject,
            Type = tipe,
            ActivityDate = System.today()

        );
        if (whatId != '' && whatId != null) {
          task.WhatId = whatId;
        }
        if (whoId != '' && whoId != null) {
          task.WhoId = whoId;
        }
        insert task;

    }

}

Abschluss

Viel Spaß beim Ausprobieren! Ich freue mich über Erfahrungsberichte und Beispiele für weitere Anwendungsfälle

//Hannes

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.