27.02.2011

CRM on the Fast Lane: Recently Visited

Ein neues Feature von CRM 2011, durch dessen Nutzung man die Klickrate drastisch reduzieren kann, ist "Recently Visited". Dabei handelt es sich um eine Liste der zuletzt geöffneten CRM Objekte und Ansichten. Es werden die letzten 40 CRM Objekte und die letzten 10 Ansichten gespeichert. Geleert werden kann diese Liste nicht - CRM Objekte bzw. Ansichten werden automatisch entfernt, sobald die jeweilige maximale Anzahl erreicht ist und neue CRM Objekte bzw. Ansichten hinzukommen. Dabei arbeitet Recently Visited nach dem First-In-First-Out-Prinzip.

Damit ein Eintrag nicht aus der Recently Visited Liste rutscht, kann man ihn durch einen Klick auf den Pin rechts neben dem Eintrag fixieren.

CRM Objekte und Ansichten, welche im Microsoft Dynamics CRM Mobile Express Client geöffnet werden, werden nicht von Recently Visited nicht verfolgt.

CRM Objekte und Ansichten, welche im Webclient oder im Outlook Client geöffnet werden, werden verfolgt.

Die Einträge in Recently Visited werden serverseitig gespeichert und sind auch über eine Session hinweg verfügbar.

#1: Recently Visited im CRM Webclient
Um Recently Visited im Webclient zu öffnen, genügt ein Klickt auf das Icon am oberen rechten Rand der Navigation Pane.

1.1 Recently Visited im CRM Webclient


Zusätzlich werden die Recently Visited Einträge gefiltert nach Entitäten im Shortcut Menü einer Entität unter den Ansichten angezeigt. Hier ist die maximale Anzahl auf 6 beschränkt und CRM Objekte können nicht fixiert werden.

1.2 Recently Visited im Shotcut Menü der Leads

#2: Recently Visited im CRM Outlook Client
Im CRM Outlook Client ist Recently Visited ebenfalls unter "File/CRM Recent" verfügbar. Allerdings werden hier nur die zuletzt geöffneten CRM Objekte angezeigt und keine Ansichten.


2.1 Recently Visited im CRM Outlook Client

ACHTUNG:
Die Einträge unter Recently Visited werden nicht validiert, d.h. gelöschte CRM Objekte verbleiben so lange auf der Liste, bis sie auf natürliche Weise unten "herausfallen". Man sollte also darauf achten, dass gelöschte CRM Objekte nicht unter Recently Visited mit dem Pin fixiert sind.

Three Kinds of "Default Views"

(System) Default Views oder auch Standardansichten gab es schon in CRM 4. Allerdings waren diese pro Entität für alle Benutzer identisch. In CRM 2011 sind zwei weitere Arten von Ansichten hinzugekommen: User Selected Default Views und Sticky Views.

#1: System Default Views
Diese können pro Entität vom Administrator unter "Settings/Customization/Customize the System" geändert werden. Unter "Entities" die entsprechende Entität auswählen und dort in die "Views" gehen. Nun selektiert man die Ansicht, die neue Standardansicht werden soll, und wählt unter "More Actions" den Punkt "Set Default".
System Default Views werden in der Datenbank gespeichert.

1.2 Eine Ansicht zum System Default View machen
#2: User Selected Default Views
In CRM 2011 hat jeder Benutzer die Möglichkeit einen Standardansicht für jede Entität zu speichern. Dazu öffnet man die Ansicht, welche neue Standardansicht werden soll, öffnet das Ribbon "View" und klickt auf "Set As Default View". Natürlich ist es auf diese Weise auch möglich eine Ansicht, welche über die erweiterte Suche erstellt wurde, als Standardansicht zu verwenden.
User Selected Default Views werden in der Datenbank gespeichert.

2.1 Eine Ansicht zum User Selected Default View machen

#3: Sticky Views
Ein Sticky View ist die Ansicht, welche zuletzt unter einer Entität geöffnet wurde.
Sticky Views werden außerdem pro Menüpunkt in der Navigation Pane gespeichert, d.h. die Accounts unter Workplace können einen anderen Sticky View als die Accounts unter Sales haben.
Sticky Views werden nur clientseitig innerhalb einer Session gespeichert.

Sticky View -> User Selected Default View -> System Default View
Öffnet ein Benutzer eine Entität, wird zuerst überprüft ob es in der aktuellen Session einen Sticky View gibt. Ist keiner vorhanden, wird überprüft, ob es für den aktuellen Benutzer einen User Selected Default View gibt.
Ist auch dieser nicht vorhanden, wird der System Default View geöffnet.

26.02.2011

Three Ways to remove the "Get Started Pane"

"Get Started Pane" der Account Entität
Ein neues Feature von CRM 2011 ist die "Get Started Pane", welche sich auf fast jeder Seite wiederfindet. Der Inhalt wird standardmäßig vom "Microsoft Dynamics CRM User Experience Team" kontrolliert, kann aber vom Administrator über die Sitemap angepasst werden.

Da die "Get Started Pane" nicht für jeden CRM Benutzer relevant ist, gibt es verschiedene Möglichkeiten diese auszublenden.

#1: Ausblenden für eine Entität
Über den kleinen "Pfeil-nach-oben" direkt unter der "Get Started Pane" kann jeder Benutzer diese für jede Entität ausblenden. Diese Art der Ausblendung wird nur innerhalb einer Session gespeichert. Mit einem erneuten Klick auf den Pfeil, kann man die "Get Started Pane" natürlich auch wieder einblenden.

1.1 Ein Klick auf den kleinen Pfeil, der sich mittig unter der "Get Started Pane" befindet...

1.2 ... blendet die "Get Started Pane" aus.
#2: Ausblenden für einen Benutzer
Unter "File/Options" kann jeder CRM Benutzer alle "Get Started Panes" auf einen Schlag ausblenden, sollte er diese nicht benötigen. Diese Einstellung wird auch über eine Session hinaus gespeichert.

2.1 Einstellung in den Options zum Ausblenden der "Get Started Pane"

#3: Ausblend für alle Benutzer
Unter "Settings/Administration/System Settings" kann ein Administrator die "Get Started Pane" systemweit für alle CRM Benutzer ausblenden. Diese Einstellung wird auch über eine Session hinaus gespeichert.

3.1 Einstellung in den System Settings zum Ausblenden der "Get Started Pane"

20.02.2011

CRM 2011 Installation: Setup Prerequisites

Während der CRM-Installation versucht das Setup einige Dateien aus dem Internet zu laden und diese zu installieren. Sollte der CRM-Server in spe keine Verbindung zum Internet haben, bricht das Setup die Installation ab.

Darum sollte man für eine Offline-Installation folgende Dateien im Gepäck haben:
  1. Microsoft Visual C++ 2010 x64 Redistributable
  2. Windows Identity Foundation
  3. Windows Azure platform AppFabric SDK V1.0
  4. Microsoft SQL Reporting Service Report Viewer Control

Pfad zur Logging-Datei von SetupServer
{User} ist durch den Benutzer zu ersetzen, der die Installation ausführt.

C:\Users\{User}\AppData\Roaming\Microsoft\MSCRM\Logs\crm50svrsetup.log

31.01.2011

Advanced Google Maps Integration

Dieses Beispiel zeigt, wie sich Google Maps in das Kontakt, Firmen- und Lead-Formular integrieren lässt um die Route vom Benutzer zum Kunden anzuzeigen.

Umgebung:
Microsoft Dynamics CRM 2011 RC
(vanilla/Out-Of-The-Box)

Deployment:
onpremise

Achtung:
In CRM Online funktioniert das ganze leider nicht. Das Problem ist, den Internet Explorer dazu zubringen, einen iFrame mit HTTP-Content in einer Webseite mit HTTPS-Content anzuzeigen. Google Maps ist leider nicht über HTTPS verfügbar.


Grundlagen:

Anforderungen:
  • auf den Formularen von Firma, Kontakt und Lead soll jeweils eine neue Bereich "Navigation Map" eingeblendet werden
  • in diesem neuen Formularbereich soll ein iFrame mit Google Maps angezeigt werden
  • es wird automatische die Route vom aktuellen Benutzer zum Kunden angezeigt
  • sollte beim aktuellen Benutzer keine Adresse hinterlegt sein, wird die Adresse der BU herangezogen
  • sollte auch hier keine Adresse gefunden werden, wird die Kundenadresse als Standord angezeigt
  • die Karte auf dem Formular wir eingebettet dargestellt
  • am Formular-Ribbon soll ein Button "Map" angefügt werden
  • dieser öffnet die jeweilige Route bzw. den Standort in einem neuen Fenster mit "Google-Map-Controls"

#1: Lösung erstellen und Entitäten hinzufügen
Der neuen Lösung "Google Maps Navigation" werden die Entitäten Account, Contact und Lead hinzugefügt.

#2: Icons hinzufügen
Der Lösung werden zwei Icons als Web Resource hinzugefügt.

GoogleMapsNavigationIcon16.png





GoogleMapsNavigationIcon32.png






#3: JavaScript-Bibliothek hinzufügen
Der Lösung wird die Datei "navmaplib.js" als Web Resource mit folgendem Inhalt hinzugefügt:

var fromAddress;
var isEmbedded = true;

function formLoad() {   
    retrieveCrmObject("SystemUser", Xrm.Page.context.getUserId());
   
}

function retrieveCrmObject(entityName, entityId)
{
    // Build REST Endpoint
    var url = Xrm.Page.context.getServerUrl()
            + "/xrmservices/2011/organizationdata.svc/"
            + entityName + "Set(guid'" + entityId + "')";

    // Create CRM Request
    var request = new XMLHttpRequest();
    request.open("GET", url, true);
    request.setRequestHeader("Accept", "application/json");
    request.setRequestHeader("Content-Type",
                             "application/json; charset=utf-8");
    request.onreadystatechange = function () {
        if (request.readyState == 4) {
            if (request.status == 200) {
                var crmObject = eval('(' + request.responseText + ')').d;
                fromAddressRetrieved(crmObject);
            }
        }
    }

    // Send Crm Request
    request.send();
}

function fromAddressRetrieved(crmObject) {
    fromAddress = "";
    if (typeof (crmObject.SystemUserId) != "undefined") {
        if (crmObject.Address1_Line1 != null) {
            fromAddress = crmObject.Address1_Line1;
            fromAddress += addAddressItem(crmObject.Address1_PostalCode);
            fromAddress += addAddressItem(crmObject.Address1_City);
            fromAddress += addAddressItem(crmObject.Address1_Country);
           
            loadMap();
        }

       
        if (fromAddress == "") {
            retrieveCrmObject("BusinessUnit", crmObject.BusinessUnitId.Id);
        }       
    }
    else {
        if (crmObject.Address1_Line1 != null) {
            fromAddress = crmObject.Address1_Line1;
            fromAddress += addAddressItem(crmObject.Address1_PostalCode);
            fromAddress += addAddressItem(crmObject.Address1_City);
            fromAddress += addAddressItem(crmObject.Address1_Country);                    }
    }
    loadMap();
}

function addAddressItem(crmAttribute)
{
    if(crmAttribute != null)
        return "," + crmAttribute;
    else return "";
}

function loadMap() {
    var url = getUrl();
    var embedded = "";
    if(isEmbedded)
        embedded = "&output=embed";
    if (url != "") {
        // Set iFrame source to google maps url
        Xrm.Page.ui.controls.get("IFRAME_navigationmap").setSrc(url + embedded);
    }
    else {
        Xrm.Page.ui.controls.get("IFRAME_navigationmap").setSrc("about:blank");
    }
}

function getUrl() {
    // Get address data from form
    var toAddress = "";
    if (Xrm.Page.getAttribute("address1_line1").getValue() != null) {
        toAddress = Xrm.Page.getAttribute("address1_line1").getValue();
        toAddress += addAddressItem(Xrm.Page.getAttribute("address1_postalcode").getValue());
        toAddress += addAddressItem(Xrm.Page.getAttribute("address1_city").getValue());
        toAddress += addAddressItem(Xrm.Page.getAttribute("address1_country").getValue());
    }
   
    // Build google maps url   
    var url = "";
    if (toAddress != "") {
        if (fromAddress == "") {
            url = "http://maps.google.de/maps?q=" + toAddress;
        }
        else {
            url = "http://maps.google.de/maps?q=from: " + fromAddress + " to:" + toAddress;
        }
    }

    return url;
}

function openMap() {
    var url = getUrl();
    if(url != "") {
         window.open(url, "mywindow", "width=800,height=600,resizable=Yes");
    }
    else
    {
        alert("No Addresses found.");
    }
   
}
 
#4: JavaScript-Bibliothek im Formular registrieren
In den Formularen von Firma, Kontakt und Lead ist die JavaScript-Bibliothek sowie die Funktion "buttonClick" im "OnLoad"-Ereignis zu registrieren.

4.1 JavaScript-Bibliothek und -Funktion im Formular registrieren


#5: Button-XML (RibbonDiffXml) in die Lösung einfügen
Dieses Arbeitspaket wurde detailliert in der Post "Simple Form-Button w/ JavaScript-Function" beschrieben.
Folgende Änderungen werden zusätzlich gemacht:
  • der neue XML-Knoten wird jeweils einmal in den Entities account, contact und lead hinterlegt
  • die Namender Web Resourcen werden angepasst
  • der FunctionName wird auf "openMap" gesetzt
--
:: Links / Weiterführende Information:

08.12.2010

Write to Windows EventLog

In Plug-In- oder Workflows-Assemblys steht man oft vor dem Problem Fehler oder auch nur allgemeine Information protokollieren zu müssen. Bisher war mein Königsweg zur Lösung die Anlage von "C:\Temp", Vollzugriff für jeden auf diesen Ordner um dann die Information in einfachen Textdateien abzulegen.

Funktioniert prinzipiell gut, bis darauf, dass man daran denken muß das Protokollieren auszukommentieren bzw. abzuschalten bevor man den Code in eine produktive Umgebung deployt. Viel naheliegender ist es, das Ereignisprotokoll von Windows zu benutzen.

Für diesen Zweck hier zwei kleine Methoden, über die man genau das realisieren kann.

Eine Nachricht in die Ereignisanzeige schreiben:
Log("Info Item");

Eine Nachricht als bestimmten Typ in die Ereignisanzeige schreiben:
Log("Warning Item", System.Diagnostics.EventLogEntryType.Warning);

Folgende Ereignistypen gibt es:
- Error
- FailureAudit
- Information
- SuccessAudit
- Warning

logName:
Der Protokollname, unter dem die Einträge auf der linken Seite in der Baumansicht der Ereignisanzeige gruppiert werden.

sourceName:
Der Name Quelle in der Ereignisanzeige.

Hier der Quelltext:

public static void Log(string logMessage)
{
    Log(logMessage, System.Diagnostics.EventLogEntryType.Information);
}


public static void Log(string logMessage, System.Diagnostics.EventLogEntryType logEventType)
{
    string logName = "My Log Name";
    string sourceName = "My Source Name";

    if (!System.Diagnostics.EventLog.SourceExists(sourceName))
        System.Diagnostics.EventLog.CreateEventSource(sourceName, logName);


    System.Diagnostics.EventLog appLog = new System.Diagnostics.EventLog();
    appLog.Source = sourceName;
    appLog.WriteEntry(logMessage, logEventType);
}


Achtung:
Unter Windows 7 muss man das Visual Studio bzw. die Anwendung, welche die oben aufgeführten Methoden integriert, als Administrator starten, um in die Ereignisanzeige schreiben zu können.

21.11.2010

Retrieve CRM data in Form Events

Nachdem ich unter CRM 4 gerade erst XmlHttpRequest gebändigt hatte um in Form Events Daten aus dem CRM auslesen zu können, zeigt eine kurze Recherche im neuen SDK, dass bei CRM 2011 alles wieder ganz anders ist.

REST? JSON? WTF? Zum Glück konnte Google mich hier schnell auf den neusten Stand aktueller Webtechnologien bringen. REST ist so eine Art Mini-Internet auf einer Datenbank und mit JSON kann man JavaScript Objekte in einen String serialisieren/deserialisieren um das ganz über HTTP durch die Gegend zu schicken.

Mit diesem neu erworbenen Wissen wollte ich nun via JavaScript im OnLoad Event (Kontakt-Formular) einen Datenssatz auslesen und einige Datenfelder zur Anzeige bringen. Für diese Beispiel soll die Adresse des Besitzer in einer Alert-Box angezeigt werden.

Umgebung:
Microsoft Dynamics CRM 2011 Beta
(vanilla/Out-Of-The-Box)

Deployment:
onpremise

#1: Herausgeber und Lösung erstellen
Um das Beispiel exportieren zu können und die Anpassungen vom CRM Standard getrennt zu halten, sollte man zuerst einen Herausgeber und eine Lösung im CRM anlegen.


1.1 Erstellen eines neuen Herausgebers


2.1 Erstellen einer neuen Lösung

#2: Kontakt-Entität hinzufügen
Der eben erstellten Lösung fügen wir nun die (bereits existierende) Entität "Kontakt" hinzu. Dadurch werden der Lösung auch noch die Entitäten "Price List" und "Service" hinzugefügt.


2.1 Neue Lösung mit Kontakt-Entität

#3: JavaScript Bibliothek erstellen
Da der Aufruf des REST Webservice asynchron erfolgt, benötigen wir diesmal zwei Funktionen: eine, die im OnLoad Event aufgerufen wird und den Request absetzt und eine, die die Daten verarbeitet, wenn diese im Client angekommen sind.

In einer dritten Funktion habe ich versucht die eigentlichen Funktionalität zu kapseln. Allerdings fehlt eine Fehlerbehandlung noch komplett.

Folgenden Quelltext benötigen wir in einer Datei:

function retrieveOwnerAddress()
{
    // Get Owner Guid from Form
    var ownerId = Xrm.Page.getAttribute("ownerid").getValue()[0].id;


    // Retrieve Owner data
    retrieveCrmObject("SystemUser", ownerId);
}


function output(crmObject)
{
    alert
    (
        "Name: " + crmObject.FullName + "\n" +
        "Address: " + crmObject.Address1_Line1 + "\n" +
        "ZIP: " + crmObject.Address1_PostalCode + "\n" +
        "City: " + crmObject.Address1_City + "\n" +
        "Country: " + crmObject.Address1_Country
    );
}


///////////////////////////////////////////////
/*                                           */
/*              GENERIC                      */
/*                                           */
///////////////////////////////////////////////

function retrieveCrmObject(entityName, entityId)
{
    // Build REST Endpoint
    var url = Xrm.Page.context.getServerUrl()
            + "/xrmservices/2011/organizationdata.svc/"
            + entityName + "Set(guid'" + entityId + "')";


    // Create CRM Request
    var request = new XMLHttpRequest();
    request.open("GET", url, true);
    request.setRequestHeader("Accept", "application/json");
    request.setRequestHeader("Content-Type",

                             "application/json; charset=utf-8");
    request.onreadystatechange = function ()
    {     
        if(request.readyState == 4) 
        {
            if(request.status == 200)
            {
                var crmObject = eval('(' + request.responseText + ')').d;
                output(crmObject);
            }
        }
    }


    // Send Crm Request
    request.send();   
}


#4: JavaScript Bibliothek bereitstellen
Diese Datei fügen wir der in Schritt #1 erstellten Lösung als neue Web Resource hinzu.

4.1 Die JavaScript Bbliothek als neue Web Resource der Solution hinzufügen

#5: JavaScript Bibliothek aktivieren
Nun müssen wir nur noch unsere JavaScript Bibliothek aus den Schritten #3 und #4 auf dem Kontakt-Formular im OnLoad Ereignis aktivieren. Dazu öffnen wir im Bearbeitungmodus (Kontakt Formular) die "Form Properties" und fügen unsere Bibliothek den Formular Bibliotheken hinzu.

5.1 Retrieve Owner JS-Bibliothek den Formular Bibliotheken hinzufügen

Jetzt erstellen wir einen Event Handler, der die Funktion retrieveOwnerAddress beim OnLoad des Formulars ausführt.

5.2 Event Handler, der retrieveOwnerAddress im OnLoad ausführt
#6: Anpassungen veröffentlichen
Abschließend müssen wir unsere Solution bzw. die gemachten Anpassungen noch veröffentlichen.

6.1 Solution/Anpassungen veröffentlichen

#7: Ergebnis überprüfen
 Öffnet man nun einen Kontakt, wird die Adresse des Besitzers in einer Alert-Box angezeigt.

6.1 Adresse des Besitzers wird in Alert-Box angezeigt

Damit das ganze überhaupt funktioniert müssen die Felder Street 1, City, ZIP/Postalcode, Country/Region der Mailing Address vom entsprechenden Benutzer natürlich gefüllt sein.
6.2 Benutzer mit gefüllten Adress-Feldern
--
:: Links / Weiterführende Informationen:

19.11.2010

Simple Google Maps Integration

Dieses Beispiel zeigt, wie sich Google Maps auf einfache Weise in das Kontakt-Formular integrieren lässt.



Umgebung:
Microsoft Dynamics CRM 2011 Beta
(vanilla/Out-Of-The-Box)

Deployment:
onpremise

Achtung:
In CRM Online funktioniert das ganze leider nicht. Das Problem ist, den Internet Explorer dazu zubringen, einen iFrame mit HTTP-Content in einer Webseite mit HTTPS-Content anzuzeigen. Google Maps ist leider nicht über HTTPS verfügbar.

#1: Herausgeber und Lösung erstellen
Um die Funktionalität exportieren zu können und die Anpassungen vom CRM Standard getrennt zu halten, sollte man zuerst einen Herausgeber und eine Lösung im CRM anlegen.

1.1 Erstellen eines neuen Herausgebers

1.2 Erstellen einer neuen Lösung
#2: iFrame auf dem Formular einfügen
Der eben erstellten Lösung fügen wir nun die (bereits existierende) Entität "Kontakt" hinzu. Dadurch werden der Lösung auch noch die Entitäten "Price List" und "Service" hinzugefügt. Dem Kontakt-Formular spendieren wir einen neuen Registerkarte inklusiv iFrame.
2.1 Auf dem Kontakt Formular ein neues iFrame einfügen - unter "Formatting" kann man optional noch die "Number of Rows" erhöhen (z.B. auf 15), um die angezeigte Karte zu vergrößern.

#3: JavaScript Bibliothek erstellen
Nun benötigen wir eine JavaScript Datei mit folgendem Inhalt:

function loadMap()
{
    // Get address data from form
    var strasse = Xrm.Page.getAttribute("address1_line1").getValue();
    var plz = Xrm.Page.getAttribute("address1_postalcode").getValue();
    var ort = Xrm.Page.getAttribute("address1_city").getValue();
    var land = Xrm.Page.getAttribute("address1_country").getValue();
   
    // Build google maps url
    var url = "
http://maps.google.de/maps?output=embed&q="
            + strasse + "," + plz + " " + ort + "," + land;
    // Set iFrame source to google maps url
    Xrm.Page.ui.controls.get("IFRAME_googlemapsdemo").setSrc(url);
} 

#4: JavaScript Bibliothek bereitstellen
Diese Datei fügen wir der in Schritt #1 erstellten Lösung als neue Web Resource hinzu.


4.1 Die JavaScript Bbliothek als neue Web Resource der Solution hinzufügen


#5: JavaScript Bibliothek aktivieren
Nun müssen wir nur noch unsere JavaScript Bibliothek aus den Schritten #3 und #4 auf dem Kontakt-Formular im OnLoad Ereignis aktivieren. Dazu öffnen wir im Bearbeitungmodus (Kontakt Formular) die "Form Properties" und fügen unsere Bibliothek den Formular Bibliotheken hinzu.
5.1 Google Maps JS-Bibliothek den Formular Bibliotheken hinzufügen

Jetzt erstellen wir einen Event Handler, der unser Funktion beim OnLoad des Formulars ausführt.
5.2 Event Handler, der loadMap im OnLoad ausführt

#6: Anpassungen veröffentlichen
Abschließend müssen wir unsere Solution bzw. die gemachten Anpassungen noch veröffentlichen.

6.1 Solution/Anpassungen veröffentlichen

#7: Ergebnis überprüfen
Nun wird auf dem Kontatformular der Standort auf einer Karte angezeigt - vorausgesetzt man hat eine valide Adresse eingetragen.

7.1 Eine valide Adresse in das Kontakt Formular eintragen und speichern

7.2 Die Adresse wird direkt im Kontakt Formular als Location auf einer Google Map angezeigt

--
:: Links / Weiterführende Information:

18.11.2010

JavaScript Common Snippets (Form)

GET: Auslesen eines Wertes
var x = Xrm.Page.getAttribute("attributeName").getValue();

SET: Setzen eines Wertes
Xrm.Page.getAttribute("attributeName").setValue("attributeValue");

GET: Selektierten Wert einer Pickliste auslesen
Xrm.Page.getAttribute("attributeName").getSelectedOption().text;

HIDE TAB: Verbergen einer Registerkarte
Xrm.Page.ui.tabs.get(tabNumber).SetVisible(false);

SET iFRAME URL: iFrame URL setzen
Xrm.Page.getControl("IFRAME_name").setSrc("http://google.com");

GET: GUID des aktuellen Benutzer auslesen
var userId = Xrm.Page.context.getUserId();

SET: Feld den Fokus geben
Xrm.Page.getControl("attributeName").setFocus(true);

FIRE: OnChange-Ereignis auslösen
Xrm.Page.getAttribute("attributeName").fireOnChange();

BREAK: Speichern eines Forms abbrechen
event.returnValue = false;

SET: Requirement Level setzen
var level = "none":
//var level = "required":
//var level = "recommended":
Xrm.Page.getAttribute("attributeName").setRequiredLevel(level);


CUSTOM: getServerURL
var customServerURL = document.location.protocol + “//” + document.location.host + “/” + Xrm.Page.context.getOrgUniqueName();

--
:: Links / Weiterführende Informationen

04.10.2010

Discovery Service

IDE: Microsoft Visual C# 2010 Express

1) Neue Visual C# Konsolenanwendung erstellen

2) Unter Eigenschaften/Projekt Zielframwork in ".NET Framework 4" ändern

3) Verweise hinzufügen - Assemblys aus dem SDK:
  • Microsoft.Xrm.Sdk.dll
4) Verweise hinzufügen - .NET
  • System.ServiceModel
  • System.Runtime.Serialization

Quellcode:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel.Description;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Discovery;
namespace Discovery_Service_Test
{
    class Program
    {
        static void Main(string[] args)
        {
            // Connection Data
            string crmServer = "devsrv";
            string crmUser = "Administrator";
            string crmPassword = "kennwort";
            string crmDomain = "devel";
            // Create Credentials
            ClientCredentials credentials = new ClientCredentials();
            credentials.Windows.ClientCredential =

                new System.Net.NetworkCredential(crmUser, crmPassword, crmDomain);
            // Retrieve Organization Data
            Uri discoveryServiceUrl = new Uri("http://" + crmServer + "/XRMServices/2011/Discovery.svc");
            DiscoveryServiceProxy crmService =

                new DiscoveryServiceProxy(discoveryServiceUrl, null, credentials, credentials);                       
            RetrieveOrganizationsRequest request = new RetrieveOrganizationsRequest();
            RetrieveOrganizationsResponse response = (RetrieveOrganizationsResponse)crmService.Execute(request);
            // Output first Organization
            if (response.Details.Count > 0)
            {
                OrganizationDetail org = response.Details[0];
                Console.WriteLine("WebApplication: " + org.Endpoints[EndpointType.WebApplication]);
                Console.WriteLine("OrganizationService: " + org.Endpoints[EndpointType.OrganizationService]);
                Console.WriteLine("OrganizationDataService: " + org.Endpoints[EndpointType.OrganizationDataService]);
                Console.WriteLine("FriendlyName: " + org.FriendlyName);
                Console.WriteLine("UniqueName: " + org.UniqueName);
                Console.WriteLine("UrlName: " + org.UrlName);
                Console.WriteLine("State: " + org.State.ToString());
                Console.WriteLine("OrganizationVersion: " + org.OrganizationVersion);
                Console.WriteLine("OrganizationId: " + org.OrganizationId.ToString());               
            }
            Console.WriteLine("Press <Enter> to exit.");
            Console.ReadLine();
        }
    }
}