Microsoft Dynamics CRM 4.0 | Daten einer Entität manuell als XML Datei exportieren (2/4)

 

Wie schon im letzten Teil erwähnt, wollen wir uns heute mit der Methodik vertraut machen, die selektierten Datensätze einer Grid-Ansicht ausfindig zu machen und uns für jene Datensätze die einzelnen Attributswerte zusammenzustellen.

Die Funktion “listselecteditems()” findet sich als walkthrough-Beispiel im aktuellen SDK. Auch hier wird übrigens noch einmal erwähnt, wie sich ein Button in der Grid-Ansicht als ISV-Button hinzufügen lässt.

function listselecteditems()
         {
            var placeholder = document.getElementById("test");
            var sGUIDValues = "";
            var selectedValues;
            //Make sure window.dialogArguments is available.
            if (window.dialogArguments)
            {
               selectedValues = new Array(window.dialogArguments.length -1);
            }
            else
            {
               placeholder.innerText = "window.dialogArguments is not available.";
               return
            }
            selectedValues = window.dialogArguments;
            if (selectedValues != null)
            {
               for (i=0; i < selectedValues.length; i++)
               {
                  sGUIDValues += selectedValues[i] +"\n";
               }
               placeholder.innerText = sGUIDValues;
            }
            else
            {
               placeholder.innerText = "No records were selected.";
            }
         }

Die Funktion selbst ist schnell erklärt, denn mit Hilfe von window.dialogArguments werden die aktuell selektierten GUIDs zugänglich und können für den weiteren Gebrauch verwendet werden. Ihr müsst dazu wissen, dass window.dialogArguments die {}-Klammern beinhaltet. Wenn Ihr mit den GUIDs arbeiten wollt, solltet Ihr daher mit

var oIdstr = selectedValues[i];
    oIdstr = oIdstr.replace(/[{,}]/g, ""); 
    

die Klammernpaare entfernen und damit die GUIDs für den weiteren Gebrauch vorbereiten.

Doch bevor wir zur Modifizierung der im SDK vorgestellten Funktion “listselecteditems()” kommen, darf ich Euch zunächst eine weitere Hilfsfunktion vorstellen, mit deren Hilfe sich alle notwendigen Attributswerte auslesen lassen, die wir im späteren Verlauf in XML-Daten konvertieren wollen – GetAttributeValueFromID(sEntity,oIdstr,fieldToDisplay,fieldToDisplayIsText)

sEntity = Suchentität

oIdstr = aktuelle GUID des selektierten Datensatzes

fieldToDisplay = das gesuchte Attribut in der Suchentität

fieldToDisplayIsText = true oder false (je nachdem, ob wir z.B. ein Lookup-Wert auslesen wollen oder nicht)

 

function GetAttributeValueFromID(sEntityName, sGUID, sAttributeName, isTextField) { 

var xml = "" +
"<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
"<soap:Header>" +
"<CrmAuthenticationToken  xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">" +
"<AuthenticationType xmlns=\"http://schemas.microsoft.com/crm/2007/CoreTypes\">0</AuthenticationType>" +
// Change MicrosoftCRM for your Organization name here.
"<OrganizationName  xmlns=\"http://schemas.microsoft.com/crm/2007/CoreTypes\">MicrosoftCRM</OrganizationName>" +
"<CallerId xmlns=\"http://schemas.microsoft.com/crm/2007/CoreTypes\">00000000-0000-0000-0000-000000000000</CallerId>" +
"</CrmAuthenticationToken>" +
"</soap:Header>" +
" <soap:Body>" +
"  <Execute xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">" +
"   <Request xsi:type=\"RetrieveRequest\" ReturnDynamicEntities=\"false\">" +
"    <Target xsi:type=\"TargetRetrieveDynamic\">" +
"     <EntityName>" + sEntityName + "</EntityName>" +
"     <EntityId>" + sGUID + "</EntityId>" +
"    </Target>" +
"    <ColumnSet xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:ColumnSet\">" +
"     <q1:Attributes>" +
"      <q1:Attribute>" + sAttributeName + "</q1:Attribute>" +
"     </q1:Attributes>" +
"    </ColumnSet>" +
"   </Request>" +
"  </Execute>" +
" </soap:Body>" +
"</soap:Envelope>" +
"";

var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
xmlHttpRequest.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
xmlHttpRequest.setRequestHeader("SOAPAction","http://schemas.microsoft.com/crm/2007/WebServices/Execute");
xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlHttpRequest.setRequestHeader("Content-Length", xml.length);
xmlHttpRequest.send(xml); 

var result = null
try{
if(isTextField) {
 result = xmlHttpRequest.responseXML.selectSingleNode("//q1:" + sAttributeName).text;
} else {
 result = xmlHttpRequest.responseXML.selectSingleNode("//q1:" + sAttributeName).getAttribute('name');
} 

if (result == null) {
 return '';
} else
 return result;
}
catch(e){}
}

Wir können also mit Hilfe der obigen Funktion Attributswerte auslesen, die in unserer Entität platziert sind, die wiederum über ein Lookup-Feld mit unserer Selektion referenziert sind, z.B. eine Zusatzentität, die mit den Anfragen referenziert (n:1) ist.

Nachdem wir diese Funktion kennen, können wir unsere listselecteditems() – Funktion entsprechend modifizieren. Dazu gehen wir in die for-Schleife der 2. if-Abfrage und ersetzen sGUIDValues += selectedValues[i] +"\n";

Diese Zeile ersetze ich durch

var sEntity = 'Hier die Suchentität eintragen'
    var fieldToDisplay = 'mscrm_customattr'; //Hier eure Attribute, die Ihr auslesen wollt eintragen
    // Es können weitere fieldToDisplay Variablen deklariert werden
    var fieldToDisplayIsText = true; //sofern Ihr auch Lookup-Felder oder Picklist-Felder abfragt, solltet Ihr "false" als Standard-Wert vorgeben
    // Ich persönlich setzte den Standard-Wert immer nach der Verteilung an abgefragten Feldern, habe ich mehr Textfelder, dann "true", sonst "false"

    var myValue = GetAttributeValueFromID(sEntity,oIdstr,fieldToDisplay,fieldToDisplayIsText);
    if(myValue != '') {
     sGUIDValues+= myValue
    }

…und kann mir dadurch in diversen Variablen zunächst die Feldwerte zurückliefern lassen, die ich später in einen XML-Node übertragen möchte. Natürlich könnt Ihr auch mit Arrays arbeiten, je nach belieben.

In den nächsten beiden Teilen stelle ich Euch zwei XMLWriter-Objekte vor, mit deren Hilfe wir die Variablen in XML-Nodes umwandeln und uns somit ein schön formatiertes XML-Dokument erstellen, welches wir als Datei speichern.

 

Schreibe einen Kommentar

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

WordPress.com-Logo

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

Twitter-Bild

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

Facebook-Foto

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

Google+ Foto

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

Verbinde mit %s