Direkt zum Hauptbereich

Posts

Emails mit APEX | SINGLE_EMAIL_LIMIT_EXCEEDED

Email-Versand mit Visualforce und Apex kann schon manchmal Kopfschmerzen bereiten.... Entweder ist die Email zu groß, oder zu viele Attachments oder der HeapSize "beschwert sich" oder, wenn letztendlich alles läuft,  man wird von den Salesforce Limits zurück zum Ausgangspunkt katapultiert. Das kann doch nicht so schwer sein! Ist es auch nicht, wenn man das schon einmal gemacht hat ;-) Habe eine Visualforce Maske zum Versenden von HTML Emails programmiert. Diese werden als SingleEmailMessage gesendet: Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail }); Sobald die Anzahl der pro Tag gesendeten Emails den Salesforce Limit "knackt", wird dem User die entsprechende Meldung eingeblendet. Die auf die Org bezogene Limitierung lässt sich mit LIMITS.getLimitEmailInvocations() berechnen. Hier ein Auszug aus den "Execution Governors and Limits" https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_gov_limit...

Dynamic SOQL - Auswertung der Felder vom Related Object

Ein Custom Object ist mit dem Standard Account Object über ein Lookup-Feld verknüpft. Abhängig vom Country ISO Code auf dem Account wird die Sprache auf dem Projekt automatisch gesetzt. Da die oben beschriebene Konfiguration ein Teil eines Managed Packages ist, und die Country ISO Codes nicht in jeder Org konfiguriert sind, muss die Logik mit Einsatz von " dynamic soql " implementiert werden. Bei der Auswertung der ISO Codes erscheint die Fehlermeldung : Invalid field Account__r.BillingCountryCode for sf42_prfxpe__Project__c Lösung : zuerst Account über die Relation definieren, dann das entsprechende Feld auswerten sObject objRelAccount = objProject.getSObject('Account__r'); String sSoql = 'SELECT Id, Name, Account__c, Account__r. BillingCountryCode FROM Project__c'; for (Project__c p : Database.query(sSoql)){    sObject objRelAccount = objProject.getSObject('Account__r');    if(objRelAccount != null){        String sIsoCode = (S...

Sortieren einer APEX Liste mit Wrapper Objekten einfach gemacht

Eine Visualforce Seite zeigt alle Feiertage in diesem Jahr. Jeder Feiertag entspricht einem Salesforce Objekt. Die Liste wird dynamisch aufgebaut und ist somit unsortiert. Der entsprechende Code sieht ungefähr so aus: public list<HOLIDAYS> getHoliday(){   list<HOLIDAYS> lstHolidays = new list<HOLIDAYS>();   ...   lstHolidays.add(new HOLIDAYS(obj, true));   ...   return lstHolidays; } /****************************** *** HOLIDAYS ******************************  public class HOLIDAYS{   public Holiday__c objHoliday{get; set;}   public String holidayName{get; set;}   public Id holidayId{get; set;}   public String holidayDate{get; set;}   public Decimal duration{get; set;}   public Boolean isChecked{get; set;}   public HOLIDAYS(Holiday__c h, Boolean isChecked){    this.objHoliday = h;    this.holidayName = h.Name;    this.holidayId = h.id;    this.holidayD...

PDF - Dateiname

Sobald eine mit Visulaforce generierte PDF-Datei über die Standard Schaltfläche gespeichert werden soll, stellt man fest, dass der Dateiname automatisch vom System vergeben wurde, wie zum Beispiel "document.pdf". Leider bietet Salesforce keine entsprechende apex:page Eigenschaft für den Dateinamen. Der Name lässt sich allerdings über eine Header-Eigenschaft definieren. Diese wird wiederum von Controller gesetzt. Ich habe eine neue Funktion geschrieben, die von der Visualforce Seite aufgerufen wird. Genauso gut kann die Eigenschaft vom Constructor gesetzt werden. <apex:page controller="anyController" showheader="false" applyBodyTag="false" applyHtmlTag="false" renderAs="PDF" action=" {!setFileName} "> public void setFileName(){       String pdfName = 'Angebot_' + Date.now().format();       Apexpages.currentPage().getHeaders().put( 'content-disposition', 'inline; filename=' ...

Salesforce Community getContentAsPDF()

Ursachenforschung kann in manchen Fällen nicht nur zeitintensiv, sondern auch nervenraubend sein. Insbesondere dann, wenn sich die zu testende Funktion innerhalb eines komplexen Konstruktes befindet. Mit der folgenden Beschreibung kann ich vielleicht dem einen oder anderen Entwickler eine Menge Streß ersparen ;-) Funktion: Generierung einer PDF Datei per Button (aus einer VisualForce Seite heraus). Anschließend wird die PDF Datei als Attachment an einen Datensatz angehängt. Ausgangslage: Die oben beschriebene Funktion ist ein Teil eines in der Org installierten Managed Packages. Sie wird von einem Salesforce Community User ausgelöst. Weitere Informationen dazu gibt es in meinem letzten Beitrag Salesforce Community URL Settings . Problem: Kein Attachment nach der Funktionsausführung im System verfügbar. Die folgende Fehlerseite erscheint: Ursache identifizieren: Als erstes fange ich an, die Logs auszuwerten. Da die im managed Package implementierten Debug-Ausgaben in der T...

Salesforce Community URL Settings

Ich habe mich in den letzten Tagen etwas ausführlicher mit Salesforce Communities in Kombination mit der API beschäftigt. Ein Problem dabei war, den richtigen Endpoint zu berechnen, wie im letzten Beitrag beschrieben API im Salesforce Partner Portal. Um die Weichen im Code für Community Benutzer einzubauen, muss während der Laufzeit berechnet werden, in welchem Context sich der aktuell eingeloggte Benutzer befindet. Dabei muss man sich zwangsweise mit den Fragen folgender Art beschäftigen: ist der eingeloggte Benuter ein Community Benutzer? ob und welche Community ist gerade aktiv? wie sieht die definierte Community URL aus? Antwort auf die Frage 1: private Boolean isCommunityUser(){         Boolean bIsCommunityUser = false;         String sUserType = UserInfo.getUserType();         sUserType = sUserType.toUpperCase();         if(sUserTyp...

API im Salesforce Partner Portal

Eine von uns entwickelte Salesforce Applikation kommt im Partner Portal zum Einsatz. Diese beinhaltet unter anderem eine Visualforce Seite mit einer integrierten Flex-Applikation. Folgendes Abbild stellt das gesamte Konstrukt vereinfacht dar. Die Flex-Applikation bedient sich der Daten aus der aktuellen Salesforce-Instanz. Fehler im Partner-Portal kann trotz der aktivierten API-Einstellung keine Datenabfrage erfolgen Ursache der Controller der Visualforce-Seite übergibt den "falschen" Endpoint an die Flex App. Im Partner-Portal Context sieht die URL (in einer Sandbox) so aus: https://full-myorg-fullsb.cs80.force.com und wird wie folgt berechnet: System.URL.getSalesforceBaseUrl().getHost(); Lösung Statt Partner-Portal-URL muss die Salesforce-Instanz-URL eingesetzt werden: https://cs80.force.com Diese lässt sich wie folgt vom Controller berechnen ApexPages.currentPage().getHeaders().get('X-...