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.

[sourcecode language=“javascript“]

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");

}
[/sourcecode]

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

Cheers,
Chris

Comments ( 4 )

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

    [...] In einem anderen Blog beschreibe ich, wie man einen Custom View zu einem Lookup hinzufügen kann. Heute habe ich die gleiche Funktionalität für ein Subgrid benötigt. Nachdem ich nicht gleich eine Lösung dafür gefunden habe, möchte ich euch meine nicht vorenthalten bzw. die Unterschiede zeigen: [...]

  2. ostermeier

    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

    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

    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...

Leave a reply