Direkt zum Hauptbereich

Posts

Es werden Posts vom 2014 angezeigt.

Salesforce.com Certified Advanced Administrator (WI15)

Im Vergleich zu den beiden Consultants Zertifizierungen war die Advanced Admin ein Spaziergang! Allerdings ganz ohne Vorbereitung schafft man die Prüfung auch nicht. Hier sind einige Fragen/Antworten aus der aktuellen Prüfung. 1. Capabilities of collaborative forecasting? - Rename categories - Forecast using opportunity splits - Overlay Quota - Add categories - Select a default forecast currency setting 2. We have four Sales Regions. Each of the region's VPs wants to have a dashboard emailed every Monday. - Create a separate dashboard for each VP - Create one dashboard using Visualforce - Create one dashboard that includes a filter for each region - Create a reporting snapshot 3. User is trying to access content in a library, but receiving an insufficent privileges message. How to troubleshoot? - has the user's profile the CRM content permission enabled - user has been granted permission "Viewer" to the library - user's record has the CR

Noch mehr Visualforce (Fehlermeldungen)

Wieder mal ein interessantes Phänomen in Verbindung mit Visualforce Pages.  Kurze Erläuterung: * eine Visualforce Page gibt Daten einer MAP in einer Tabelle aus  * map<Integer, list<myObject>>() * falls die  list<myObject>  leer ist, wird die entsprechende Spalte nicht angezeigt (rendered=false) Problem: beim Abfragen der Größe  <apex:outputPanel rendered="{!myMap[selectedYear].size > 0}> erscheint die folgende Fehlermeldung: Incorrect parameter type for subscript. Expected Number, received Text Lösung: den Inhalt der MAP in eine Variable auslagern: <apex:variable value="{!myMap[selectedYear]}"  var="listMyObjects" /> und anschließend die Größe abfragen <apex:outputPanel rendered="{! listMyObjects .size > 0}>

Visualforce Component: DML currently not allowed

Eine Visualforce Seite enthält eine Visualforce Komponente mit eigenem Controller.   Der "Save" Button dieser Komponente soll einen neuen Datensatz erstellen. Die Erstellung des Datensatzes schlägt fehl. Fehlermeldung: Visualforce Error System.LimitException: DML currently not allowed Lösung: <apex:component controller="myController" allowDML="true" >

Wochentagberechnung mit APEX

Das folgende Beispiel zeigt, wie man den Wochentag eines bestimmten Datums unabhängig von der Zeitzone mit APEX berechnet. Berechnung Weihnachtstag: Date dChristmas = date.newInstance(date.today().year(), 12, 24); Date dStart = date.newInstance(1900, 1, 7); Integer iWeekDayChristmas = math.mod(dStart.daysBetween(dChristmas), 7); Ergebnis: iWeekDayChristmas = 3  --> Weihnachtstag 24.12.2014 am Mittwoch 0 = Sonntag 1 = Montag 2 = Dienstag 3 = Mittwoch 4 = Donnerstag 5 = Freitag 6 = Samstag Nur so nebenbei, Buß und Bettag kann dann basierend auf dem Konstrukt wie folgt berechnet werden: Date dNew = dChristmas.addDays(-32-iWeekDayChristmas); Ergebnis: dNew = Buß und Bettag am 19.11.2014

CSS Spielereien

Um die Schaltfläche einer Dropdown-Liste zu entfernen, muss das HTML Element mit den folgenden CSS Eigenschaften ausgestattet werden. .selectUserName{     moz-appearance: none !important;     text-indent: 0.01px !important;     text-overflow: "" !important;     -moz-appearance: window !important;     cursor: pointer; } Auf der Visualforce Seite ist die Dropdown Liste wie folgt implementiert: <apex:selectList size="1" value="{!IdUser}" styleClass=" selectUserName "> <apex:selectOptions value="{!Users}"/> </apex:selectList>

Visualforce mit Filter

Interessantes Systemverhalten stellte ich heute beim Entwickeln einer Visualforce Seite fest. Die in die Visualforce implementierten Charts können gefiltert werden. Der Filter enthält unter anderem eine Liste mit Checkboxen. Werden mehrere Filtereinstellungen gleichzeitig gesetzt (wie auf dem folgenden Video zu sehen ist), wird die aufgerufene Filter-Funktion nicht ausgeführt. Keine Fehlermeldung, keine Ausgabe im Log. Nur "rerender" aktualisiert den Chart. Wird die Filterung mit einer einzigen Einschränkung und anschließend wieder in Kombination vorgenommen, funktioniert die Filter-Funktion. Im Controller ist die Liste wie folgt deklariert:     public list<String> ResourceTypeSelected{get; set;} Um dieses Problem zu lösen, muss die Liste im Constructor initialisiert werden:    ResourceTypeSelected = new list<String>();

Benutzung von Tabs in Visualforce

Seit einiger Zeit beschäftige ich mich wieder etwas intensiver mit Visualforce. Eine neue Visualforce Seite muss die Konfiguration von 10 verschiedenen Objekte ermöglichen. Die einfachste Lösung ist die Benutzung von  apex:tabPanel  - was im Endeffekt eine Tabelle mit mehreren Tabs darstellt. Unter jedem Tab wird jeweils ein List View ausgegeben, was mit APEX Mitteln ebenfalls ganz einfach funktioniert. Eine einzige große Schwachstelle in diesem Konstrukt ist das kurzzeitige Verlassen der Seite. Das passiert immer dann, wenn ein neuen Datensatz erstellt oder ein bestehender Datensatz gelöscht wird. Nach der Aktion wird zwar die Visualforce Seite automatisch geöffnet, aber der falsche Tab ist aktiv. Mit einer kleinen Anpassung bringt man der Visualforce Seite bei, den richtigen Tab beim Öffnen der Seite zu aktivieren. Das Ergebnis ist im folgenden Videoschnitt zu sehen. Hier sieht man einen Ausschnitt einer Visualforce Seite mit diversen Tabs und das Verhalten der Seite beim Lösc

Batch per Trigger starten

Salesforce stellt eine mächtige Platform für eigene Entwicklungszwecke zur Verfügung. Doch auch diese Platform duldet keinen schlampigen Umgang mit Ressourcen. Ein Trigger ist vielleicht ganz schnell programmiert, aber sobald er viele Daten verarbeiten muss, und deswegen länger als 10 Sekunden beansprucht, wird er von Salesforce gekillt. Es ist aus dem Grund zwingend erforderlich, sich mit Salesforce Limits zu beschäftigen. Außerdem muss man sich zwangsweise mit Techniken der asynchronen Datenverarbeitung auseinandersetzen. Vor ein paar Tagen habe ich einen Trigger programmiert, der hunderte von Datensätzen erstellt. Der Trigger funktioniert problemlos, solange ein einziger Datensatz (oder eine überschaubare Menge) vom Typ "A" (s. Bild) gespeichert wird. Es kommt allerdings öfters vor, dass eine große Menge von Typ "A" Datensätzen innerhalb einer Transaktion gespeichert wird. In diesem Fall ist der Trigger nicht in der Lage, die gesamte Menge zu ver