Results for tag "lookup"

CRM 2011 – Custom View – Filter auf N:M Relation

Folgendes Beispiel:

Ihr habt in eurem Projekt folgende Entitätshierarchie:

Adresse ( n:m ) Gebäude ( n: 1 ) Standort

Am Formular des Standorts soll der Benutzer nun zunächst in einem Lookup das entsprechende Gebäude auswählen können (kein Filter). Nach Auswahl des Gebäudes sollen nur noch jene Adressen ausgewählt werden können, welche eine Verknüpfung mit dem ausgewählten Gebäude haben. Vom Prinizp eine Funktionsweise wie bei einer dependend Dropdownlist.

Normalerweise greift man jetzt einfach zu einem „FetchXML“ und baut sich das Konstrukt entsprechend auf. Aber hier beginnts zu haken: Beim Einrichten des Filters merkt man schnell, dass sich eine N:M-Relation nicht, wie z.B. eine 1:1/1:n-Relation, an einem Fremdschlüssel „aufhängt“, es fehlt also das Filter-Attribut. Jetzt wird man im Internet relativ schnell fündig, dass man in solchen Fällen einfach eine „Linked-Entity“ in das Fetch-Xml einbauen kann/muss. Problem hierbei: die addCustomView-Methode erwartet eine Entität, keine Relation.

Die Lösung sieht nun wie folgt aus:

Zunächst baut man das Fetch-XML wie gewohnt auf und lässt es mittels „Linked Entity“ auf die Relation verweisen. Innerhalb der Linked Entity, welche ja eig. keine Entität sondern eine Relation ist, hat man Zugriff auf die beiden Primary-Key-Felder der Relation. In meinem Fall „Adressid“ und „Gebaeudeid“. Dort lässt sich dann der Filter entsprechend einrichten.

Das fertige Fetch-XML sieht nun in meinem Fall wie folgt aus:

[sourcecode language=“xml“]
<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">
<entity name="<strong>new_address</strong>">
<attribute name="new_name" />
<attribute name="new_line1" />
<attribute name="new_city" />
<attribute name="new_stateorprovince" />
<link-entity name="<strong>relationname</strong>" from="primarykey" to="primarykey" >
<all-attributes/>
<filter type="and">
<condition attribute="primarykey" operator="eq" value="{1BF2077D-B6F0-E011-8481-005056A20041}" />
</filter>
</link-entity>
<order attribute="createdon" decending="true" />
</entity>
</fetch>
[/sourcecode]

Happy programming!
Chris

CRM 2011 – Custom View für Subgrid

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:

[sourcecode language=“javascript“]
//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]
So funktionierts für ein Lookup…

[sourcecode language=“javascript“]
var grd = document.getElementById(lookupFieldId);
if (grd.readyState != "complete") {
setTimeout("SetLookupForm(…params…);", 500);
}

grd.control.setParameter("fetchXml", fetchXml);
grd.control.refresh();
[/sourcecode]
… und so für ein Subgrid.

Achtet besonders auf die Abfrage auf „readystate“. Wenn Ihr die Funktionalität im OnLoad-Event verwendet, muss das Grid noch nicht geladen sein!! In diesem Fall rufe ich die Funktion einfach erneut auf…

Viel Spaß beim Nachmachen!

CRM 2011 – Custom View/Lookup aufbauen und filtern

Christian Wagnsonner 4 Comments

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