Endlich wieder da: Gefilterte Lookups mit MSCRM 4.0

20.04.2008 12:14 von JuergenBeck

George Dubinski hat in seinem Blog eine Lösung von Adi Katz zusammengefasst, um in Microsoft CRM 4.0 voneinander abhängige Lookups, bzw. gefilterte Lookups zur Verfügung zu stellen:

http://crm.georged.id.au/post/2008/02/16/Filtering-lookup-data-in-CRM-4.aspx

Dazu muss zuerst serverseitig die Datei "<CRM site folder>\_controls\lookup\lookupsingle.aspx" angepasst werden. Das ist zwar unsupportet aber meines Erachtens recht unkritisch.

Danach kann man über den Parameter "search" eines Lookups dessen Filter mit einer FetchXml-Suche gesteuert werden. Ohne die obige Anpassung der aspx-Datei funktioniert das auch mit allgemeinen Suchanfragen, beispielsweise nach dem Firmennamen.

Hier der relevante Auszug aus dem Blog:

For example, to make primary contact lookup for an account record to show contacts from this account only, the following customizations are required:

Form OnLoad script

The script looks almost identical to the original one except for one very important change. We have to pass fetch xml string using one of the parameters recognised by the server otherwise exception is thrown (there is a way to disable parameters check through the registry setting DisableParameterFilter, but it's easier without yet another undocumented setting). Since we want to disable search functionality it makes sense to re-use search parameter.

var field = crmForm.all.primarycontactid;
if(crmForm.ObjectId == null)
{
   
// Disable lookup for new account record as there can be no contacts
    field.Disabled = true;
}
else
{
   
// Ensure that search box is not visible in a lookup dialog
    field.lookupbrowse = 1;
   
   
// Pass fetch xml through search value parameter
    field.AddParam("search",
     "<fetch mapping='logical'><entity name='contact'>"
    + "<filter><condition attribute='parentcustomerid' operator='eq' value=
'"
    + crmForm.ObjectId
    + "'
/></filter></entity></fetch>");
}

Field properties

If automatic resolution for the field is enabled and user types something in the field, it causes direct web service call that would ignore our fetch xml. In other words, user would be able to set the field value to any of the contacts in the database by simply typing contact's name. Disabling automatic resolution solves the issue:

Field properties dialog

Lookup dialog

Turns out, grid control in version 4 still recognises fetch xml, the challenge was to pass it. Kudos to Adi for finding a very clever workaround to inject fetch xml directly. The following code needs to be inserted anywhere in the <CRM site folder>\_controls\lookup\lookupsingle.aspx file.

<script runat="server">

protected override void OnLoad( EventArgs e )
{
      base.OnLoad(e);
      crmGrid.PreRender += new EventHandler( crmgrid_PreRender );
}

void crmgrid_PreRender( object sender , EventArgs e )
{
   
// As we don't want to break any other lookups, ensure that we use workaround only if
   
// search parameter set to fetch xml.
    if (crmGrid.Parameters["search"] != null && crmGrid.Parameters["search"].StartsWith("<fetch"))
    {
        crmGrid.Parameters.Add("fetchxml", crmGrid.Parameters["search"]); 

        // searchvalue needs to be removed as it's typically set to a wildcard '*'
        crmGrid.Parameters.Remove("searchvalue"); 

        // Icing on a cake - ensure that user cannot create new contact outside of the account
       
// and then select it.
        this._showNewButton = false;
    }
}

</script>

Viel Spaß beim Testen!!! Bei mir klappt es jedenfalls.

Diesen Beitrag eintragen: Delicious Stumbleupon Digg

Kommentare

Was denken Sie über diesen Beitrag? Lassen Sie es uns wissen! Kommentar hinzufügen

ArnoLenz 4/25/2008 - 9:41 AM
Endlich wieder da: Gefilterte Lookups mit MSCRM 4.0 - Endlich ???

Es ist völlig unverständlich, daß in der neuen CRM-Version solche grundsätzliche Funktion wie der gefilterte Lookup nicht realisiert wurde. Die alte Workaround-Lösung kann nicht mehr eingesetzt werden.
Die Methode nach Adi Katz/Dubinski hat leider zwei Nachteile:
1. Änderungen an Systemscripten sind notwendig, Schwierigkeiten bei zukünftigen Rollups sind vorhersehbar.
2. Suche in der gefilterten Teilmenge sind nicht möglich. (z.B. bei 500 Kontakten einer Firma - einen Kontakt als prim. Kontakt festlegen)

Kritisch wird die Situation bei der Erstellung von Angeboten unter Verwendung des Produktkatalogs:
( Zitat aus meinem Beitrag in
http://groups.google.de/group/microsoft.public.de.crm/browse_thread/thread/2b185f49fa0800d9?hl=de )

Der Lookup bei Zuweisung eines neuen Angebotsprodukts zeigt ALLE Produkte, also auch die fremder Preislisten, an.
Warum werden die Produkte nicht auf Basis der bereits festgelegten Preisliste vorselektiert?
Fügt man dem Angebot jetzt ein Preislistenfremdes Produkt zu, wird man nach Angabe der weiteren Angebotsprodukt-Attribute mit der FEHLER-Meldung "Product with the specified unit does not exist in price
list" (ist klar...) belohnt!

Als einzig brauchbare Lösung kann derzeit nur FilteredLookup vonn www. stunnware.com empfohlen werden!

A. Lenz

Kommentar schreiben

Name:

E-Mail: (erforderlich, wird nur Anzeige eines Gravatar verwendet.)

Webseite: (e.g. http://www.mscrm-community.de)

Ihr Kommentar: Sicherheitscode:
Captcha
Geben Sie den Sicherheitscode ein: