CRM 2011 – Custom View/Lookup aufbauen und filtern

Wenn man etwas mit CRM arbeitet, stößt man zwangsläufig auf einige Limitierungen. Einfaches Beispiel: Man hat eine Verkaufschance und darunter eine Entität, z.B. Produkt (1:n). Dieses Produkt hat jedoch eine weitere Entität darunter, z.B. Produktpositionen (wieder 1:n). Auf der Form für Produktpositionen möchte ich jetzt als Lookup das Produkt auswählen. CRM listet in diesem Fall nun sämtliche Produkte auf und nicht nur jene, die unter der Verkaufschance hängen.

In so einem Fall kann man einen eigenen View (Stichwort CustomView) zur Laufzeit erstellen und dem Lookup zuordnen.
Hierfür habe ich mir eine Helper-Funktion geschrieben, welcher man u.a. die dynamisch die Spalten des Lookups erstellt, Filter/Ordering setzt und die Auswahl eines anderen Views im Lookup unterbindet.


function SetViewForProjektProdukt() {
    var lookupEntity = "lookupentity"; // Name der Entität, die im Lookup angezeigt werden soll
    var lookupEntityPK = "lookupEntityPK "; // PrimaryKey der Entität, die im Lookup angezeigt werden soll
    var lookupFieldId = "lookupFieldId "; // ID des Lookups im Formular, für das der CustomView eingerichtet werden soll
    var lookupName = "lookupName"; // Bezeichnung des Lookups

    var lookupFormColumns = new Array(); // Spalten welche im Lookup angezeigt werden sollen, müssen Teil der Entität "lookupentity" sein
    lookupFormColumns[0] = "new_attr1";
    lookupFormColumns[1] = "new_attr2";

    var filterAttribute = "new_attr1";
    var filterValue = '{GUID}';
    
    var orderAttribute = "createdon"; // Feld, nach dem sortiert werden soll
    var orderDescending = "true";  // asc/desc


    SetLookupForm(lookupFieldId, lookupEntity, lookupEntityPK, lookupFormColumns, lookupName, filterAttribute, filterValue, orderAttribute, orderDescending);
}

function SetLookupForm(lookupFieldId, lookupEntity, lookupEntityPK, lookupFormColumns, lookupName, filterAttribute, filterValue, orderAttribute, orderDescending) {

        if (Utils.StringIsNullOrEmpty(orderAttribute)) {
            orderAttribute = "createdon";
        }

        if (Utils.StringIsNullOrEmpty(orderDescending)) {
            orderDescending = "false";
        }


        //Note: in the form designer make sure the lookup field is set to "Show all views" in its "View Selector" property 
        //Set parameters values needed for the creation of a new lookup view...
        var viewId = Xrm.Page.context.getUserId();   // Your new lookup views needs a unique id. It must be a GUID. Here I use the GUID of the current user id.
        var entityName = lookupEntity;           // The entity your new lookup view relates to
        var viewDisplayName = lookupName;  // A name for new lookup view
        var viewIsDefault = true;            // Whether your new lookup view should be the default view displayed in the lookup or not

        //Define the Fetch XML query your new lookup view will use. You can create this via Advanced Find. You'll need to massage the syntax a little though
        var fetchXml =
       "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>" +
       "<entity name='" + lookupEntity + "'>";

        for (var i = 0; i < lookupFormColumns.length; i++) {
            fetchXml = fetchXml + "<attribute name='" + lookupFormColumns[i] + "' />";
        }

        fetchXml = fetchXml +
       "<filter type='and'>" +
       "<condition attribute='" + filterAttribute + "' operator='eq' value='" + filterValue + "' />" +
       "</filter>" +
       "<order attribute='" + orderAttribute + "' decending='" + orderDescending + "' />" +
       "</entity>" +
       "</fetch>";

        //Define the appearance of your new lookup view
        var layoutXml =
          "<grid name='resultset' object='1' jump='name' select='1' icon='1' preview='1'>" +
          "<row name='result' id='" + lookupEntityPK + "'>";  // id = the GUID field from your view that the lookup should return to the CRM form

        for (var i = 0; i < lookupFormColumns.length; i++) {
            layoutXml = layoutXml + "<cell name='" + lookupFormColumns[i] + "' width='100' />";
        }

        layoutXml = layoutXml +
          "</row>" +
          "</grid>";

        //Add your new view to the Lookup's set of availabe views and make it the default view
        $("#" + lookupFieldId).attr("disableViewPicker", "0");
        Xrm.Page.getControl(lookupFieldId).addCustomView(viewId, entityName, viewDisplayName, fetchXml, layoutXml, viewIsDefault);
        $("#" + lookupFieldId).attr("disableViewPicker", "1");

    }

Ich hoffe, ich kann euch damit ein paar Stunden eurer kostbaren Zeit sparen 😉

Cheers,
Chris

Advertisements

Über Christian

Ich komme aus Wien, wo ich gemeinsam mit meiner Lebensgefährtin und unserem brummenden Cocker-Spaniel Chewbacca lebe. Derzeit arbeite ich bei einem größeren Konzern, welcher in den Bereichen öffentlicher Verkehr, Energie, Telekommunikation, bis hin zur Bestattung tätig ist. Im Rahmen meiner Tätigkeit liegt der Fokus stark auf Eigenentwicklungen mittels div. .NET/Microsoft-Technologien. Derzeit arbeite ich hauptsächlich mit/am Microsoft Dyncamics CRM 2011, mit dem Ziel Geschäftsprozesse abzubilden.
Dieser Beitrag wurde unter Dynamics CRM, Javascript abgelegt und mit , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

5 Antworten zu CRM 2011 – Custom View/Lookup aufbauen und filtern

  1. Pingback: CRM 2011 – Custom View für Subgrid | Programmers Horror

  2. ostermeier schreibt:

    Hallo,
    wenn ich das richtig verstanden habe kann ich mit Hilfe des Codes nun endlich auf eine related Entity und deren Felder zugreifen die ueber eine related Entity angebunden ist. Bsp. (Kundenstaemme-> Kunden-> Grosskunden und davon das Feld x)
    Das wuerde mir sehr weiterhelfen.
    Wie baue ich diesen Code ins CRM ein?

  3. Christian schreibt:

    Prinzipiell macht diese Javascript-Methode nichts anderes als ein Fetch-XML und ein Layout-XML aufzubauen und dieses dem Lookup als View zuzuordnen. Das Layout-XML ist, wie der Name schon sagt, nur für den Aufbau des Layouts (= angezeigte Spalten) zuständig. Das Fetch-XML bestimmt, welche Daten angezeigt werden. Und ja, damit lässt sich wohl dein Beispiel umsetzen.

    Ich gehe jetzt davon aus, dass es sich bei „Kundenstaemme“, „Kunden“ und „Großkunden“ um Entitäten handelt. Wenn das so ist, kannst du die Entitäten im Fetch-XML mit „link-entity“ verbinden.

    Du kannst dir dieses Fetch-XML auch ganz einfach vom CRM selbst aufbauen lassen, in dem du auf eine Ansicht/View gehest, z.B. von „Kundenstaemme“ und dort dann auf „Erweiterte Suche“ klickst. Bau dort im unteren Teil des Fensters die Suche entsprechend auf und klicke dann rechts oben auf „Fetch XML herunterladen“. Nun musst du das XML nur noch entsprechend ins Javascript bringen…

    Cheers,
    Christian

  4. Jobengaru schreibt:

    Hallo Christian,

    Deine Methode würde mir sehr weiterhelfen, wenn ich die zum laufen bekommen könnte. Ich habe konkret die Frage, was Du mit „var lookupFieldId = „lookupFieldId „; // ID des Lookups im Formular, für das der CustomView eingerichtet werden soll“ meinst. Ist das der Feldname des Lookups (was ist dann mit “ var lookupName = „lookupName“; // Bezeichnung des Lookups“ gemeint? Das Label?) oder ist das die ID des Feldes Lookup auf der Form. Wenn ja, wie kann ich die richtige ID ermitteln? Geht das mit „Xrm.Page.getControl(„customerid“);“ Ich bin etwas verwirrt…

    • Christian schreibt:

      Hi,

      das ist ganz einfach, ich muss jedoch etwas ausholen. Am einfachsten mit Hilfe des folgenden Beispiels:

      var lookupEntity = „new_entity“; // Name der Entität, die im Lookup angezeigt werden soll
      var lookupEntityPK = „new_entityid“; // PrimaryKey der Entität, die im Lookup angezeigt werden soll
      var lookupFieldId = „id_des_feldes_am_formular“;

      Wenn du dir das im CRM direkt ansiehst, findest du im Form-Designer den „Name“ des Feldes, siehe Screenshot:

      Lösung

      LG
      Christian

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

w

Verbinde mit %s