SOAP Message und XML Req anders als bei 4.0?

29. August 2011 14:53

Moin moin,

ich versuche ein Skript zu schreiben, welches es mir ermöglicht automatisch Felder mit entsprechenden Werten einer Entität zu füllen. Ich wähle eine Firma (durch ein Lookupfield) und im nächsten Schritt sollte dazu die Adresse, also Straße, PLZ, Ort automatisch in die Formularfelder eingetragen werden.

Bisher hab ich gehofft es durch ein paar Codeschnippsel selbst hinzubiegen aber für CRM 2011 finde ich nicht das Richtige. Bisher sieht mein Code folgendermaßen aus:

Code:
var msg; // ist die zu übermittelnde Nachricht
var resultSet; // ist die Antwort auf die SOAP-Nachricht
var results; // Speichert die Ergebnisse der Antwort im Array
// ----------------------------------------------------------------------------
// Methoden
// ----------------------------------------------------------------------------
// Setzt bei Neuauswahl alle zur Firma gehörigen Felder
// ----------------------------------------------------------------------------

SetAccountFields = function() {
    //ID des Lookup-Feldes holen
    var lookupID = GetLookupId(Xrm.Page.getAttribute("new_kundeid").getValue());
    alert(lookupID);

    msg = BuildSoapMsg(1, lookupID); // Aufbau der SOAP-Nachricht die gesendet werden soll (1 = Typ der Nachricht)
    resultSet = SendSoap(msg, 1); // Sendet die SOAP-Nachricht und speichert die Antwort in resultSet

    if (resultSet != null) {
        alert(resultSet.getElementsByTagName('result'));
        results = resultSet.getElementsByTagName('result');
       
        if (results.length > 0) {
            alert("Test2");
        }
    }
}


GetLookupId = function(source) {

    var result = '';
    if (source[0] != null) {
        result = source[0].id;
    }   
    return result;
}

// Baut die SOAP-Nachricht je nach type zusammen
// Nachrichtentyp: Account = 1, Contact = 2, UserId = 3, UserRollen = 4
BuildSoapMsg = function(type, param) {
    var soapmsg = "<?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'>" +
   GenerateAuthenticationHeader() +
   "<soap:Body>";
    switch (type) {
        case 1:
            soapmsg += FetchAccount(param);
            break;
        case 2:
            soapmsg += FetchContact(param);
            break;
        case 3:
            soapmsg += GetUserId();
            break;
        case 4:
            soapmsg += GetUserRoles();
            break;
        default:
            alert("Fehler\n--------------------\nKein gültiger Nachrichtentyp!\n\nMethod: BuildSoapMsg)");
            break;
    }
    soapmsg += "</soap:Body></soap:Envelope>"; // Der Nachricht wird geschlossen
    return soapmsg;
}

// case 1
// Setzt die Abfrage für eine Firma zusammen
FetchAccount = function(accountid) {
    var soapbody = "<Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>" +
   "<fetchXml>" +
   "<fetch mapping='logical'>" +
   "<entity name='account'>" +
   "<attribute name='name'/>" +
   "<attribute name='address1_city'/>" +
   "<attribute name='address1_line1'/>" +
   "<attribute name='address1_line2'/>" +
   "<attribute name='address1_postalcode'/>" +
   "<attribute name='accountnumber'/>" +
   "<attribute name='primarycontactid'/>" +
   "<filter type='and'>" +
   "<condition attribute='accountid' operator='eq' value='" + accountid + "'/>" +
   "</filter>" +
   "</entity>" +
   "</fetch>" +
   "</fetchXml>" +
   "</Fetch>";
    return soapbody;
}

// case 2
// Setzt die Abfrage für einen Kontakt zusammen
FetchContact = function(contactid) {
    var soapbody = "<Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>" +
   "<fetchXml>" +
   "<fetch mapping='logical'>" +
   "<entity name='contact'>" +
   "<attribute name='new_anrede'/>" +
   "<attribute name='lastname'/>" +
   "<attribute name='firstname'/>" +
   "<filter type='and'>" +
   "<condition attribute='contactid' operator='eq' value='" + contactid + "'/>" +
   "</filter>" +
   "</entity>" +
   "</fetch>" +
   "</fetchXml>" +
   "</Fetch>";
    return soapbody;
}

// Senden eines CRM-Statements zur Datenabfrage und Rückgabe des Ergebnisses
// Statement: Fetch = 1, Execute = 2, RetrieveMultiple = 3
SendSoap = function(soapmsg, stmt) {
    var xHReq = new ActiveXObject("Msxml2.XMLHTTP");
    xHReq.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
    switch (stmt) {
        case 1:
            xHReq.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Fetch");
            break;
        case 2:
            xHReq.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Execute");
            break;
        case 3:
            xHReq.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple");
            break;
        default:
            alert("Fehler\n--------------------\nKein gültiges CRM Statement!\n\nMethod: SendSoap)");
            break;
    }
    xHReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
    xHReq.setRequestHeader("Content-Length", soapmsg.length);
    xHReq.send(soapmsg);
    var xHResult = xHReq.responseXML;
    var errorCount = xHResult.selectNodes('//error').length;
    if (errorCount != 0) {
        var msg = xHResult.selectSingleNode('//description').nodeTypedValue;
        alert("Fehler\n--------------------\nWebService meldet folgenden Fehler:\n" + msg + "!\n\nMethod: SendSoap)");
        return null;
    } else {
        var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        oXmlDoc.async = false;
        if (stmt == 2 || stmt == 3) {
            oXmlDoc.loadXML(xHResult.xml);
        } else {
            oXmlDoc.loadXML(xHResult.text);
        }
        return oXmlDoc
    }
    var nodeNumber = xHResult.selectNodes("./address1_city");
    if (nodeNumber.length == 1) {
        alert(nodeNumber[0].text);
    }
    else {
        alert("Kein Inhalt");
    }
}



Beim Ausführen komme ich bis zum alert("Kein Inhalt");, was mich wundert, da die Firmen entsprechende Werte enthalten.

Also am Code kann ich es mir nicht mehr erklären wieso es nicht funktioniert. Gibt es eventuell Unterschiede bei der Verarbeitung von SOAP Messages und XML Requests zwischen 4.0 und 2011?

Re: SOAP Message und XML Req anders als bei 4.0?

30. August 2011 14:54

Hab das Problem nun lösen können.

Folgende Seite gibt einen guten Lösungsansatz und es funktioniert:

http://crm2011kb.blogspot.com/