[gelöst] Javascript FetchXML

4. Dezember 2012 12:03

Hallo zusammen,

ich habe in CRM 4.0 im Javascript eine FetchXML Funktion sehr häufig verwendet, die nun leider im neun CRM nicht mehr funktioniert. Kann mir da jemand helfen, was da im neuen CRM geändert werden muss? Hab schon gegoogelt aber irgendwie nicht wirklich was gefunden. Die Funktion ist damals auch nicht von mir geschrieben gewesen. Habe die meine ich in irgendeinem Blog gefunden weiß aber leider nicht mehr wo. Prinzipiell funktioniert FetchXML aber doch auch noch im neuen CRM was ist an dieser Funktion falsch?

Code:
function GetAttributeValueFromID(sEntityName, sGUID, sAttributeName)
{
    var sXml = "";
    var oXmlHttp = new ActiveXObject("Msxml2.XMLHTTP");

    // set up the SOAP message
    sXml += "<?xml version=\"1.0\" encoding=\"utf-8\" ?>";
    sXml += "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"";
    sXml += " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"";
    sXml += " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">";
    sXml += GenerateAuthenticationHeader()
    sXml += " <soap:Body>";
    sXml += " <entityName xmlns=\"http://schemas.microsoft.com/crm/2006/WebServices\">" + sEntityName + "</entityName>";
    sXml += " <id xmlns=\"http://schemas.microsoft.com/crm/2006/WebServices\">" + sGUID + "</id>";
    sXml += " <columnSet xmlns=\"http://schemas.microsoft.com/crm/2006/WebServices\"";
    sXml += " xmlns:q=\"http://schemas.microsoft.com/crm/2006/Query\"";
    sXml += " xsi:type=\"q:ColumnSet\"><q:Attributes><q:Attribute>" + sAttributeName + "</q:Attribute></q:Attributes></columnSet>";
    sXml += " </soap:Body>";
    sXml += " </soap:Envelope>";

    // send the message to the CRM Web service
    oXmlHttp.Open("POST", "/MsCrmServices/2006/CrmService.asmx", false);
    oXmlHttp.setRequestHeader("SOAPAction","http://schemas.microsoft.com/crm/2006/WebServices/Retrieve");
    oXmlHttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
    oXmlHttp.setRequestHeader("Content-Length", sXml.length);
    oXmlHttp.send(sXml);

    // retrieve response and find attribute value
    var result = oXmlHttp.responseXML.selectSingleNode("//q1:" + sAttributeName);
    if (result == null)
        return "";
    else
        return result.text;
}


Oder gibt es im CRM 2011 einen einfacheren Weg über Javascript an die Felder einer im Lookup verknüpften Entität zu kommen? Würde mir auch schon reichen.

Danke und viele Grüße
Nicole
Zuletzt geändert von Nicole Schmitz am 13. Dezember 2012 09:39, insgesamt 1-mal geändert.

Re: Javascript FetchXML

4. Dezember 2012 17:05

Hallo Nicole,

in CRM 2011 würde ich das immer mit oData lösen. Google einfach mal nach CRM2011 und oData, dann bekommst du hunderte von Beispielen.

Re: Javascript FetchXML

5. Dezember 2012 09:28

Hallo Nicole:

function Save(sEntity, sGuid, sColumn)
{
var entity = entity;
var select = "select="+sColumn;
var filter = "filter=entityid/value eq " + sGuid:
var retrieveRequest = new XmlHttpRequest();
retrieveRequest.open("GET", CRMSERVERURL + "/" + entity + "?$" + filter + "&$" + select , false);
retrieveRequest.setRequestHeader("Accept", "application/json");
retrieveRequest.setRequestHeader("Content-Type", "application/json; charset=utf-8");
retrieveRequest.onreadystatechange = function ()
{
if(retrieveRequest.readyState == 4)
{
if(retrieveRequest.status == 200)
{
ToDo Code.
}
}
}
}
retrieveRequest.onreadystatechange << Den Code den du hier aufrufst würde ich in eine eigene Funtion dann einbetten. Ich würde auch die Überprüfung auf readyState und status einbauen, da dieses onreadystatechange Asynch abläuft wird diese Mehtode mehrmals aufgerufen. Du willst schließlich erst wenn die Ganzen Daten ermittelt sind dass dein Code ausgeführt wird.

Grüße
gE3z

Re: Javascript FetchXML

13. Dezember 2012 09:38

Hallo zusammem,

erstmal danke für die Hilfe.

Für die die nach ähnlichem auf der Suche sind, ich habe das jetzt folgendermaßen gelöst:

Ich habe eine globale Funktion geschrieben in Global_Functions.js (Dieses Script lade ich jetzt in jedem Formular in dem ich es brauche vor dem eigentlichen Formularscript):
Code:
function GetAttributeValueWithOData(sSelectstatement){
    var serverUrl = "http://" + window.location.host + "/" + Xrm.Page.context.getOrgUniqueName();

 // Creating the Odata Endpoint
    var oDataPath = serverUrl + "/XRMServices/2011/OrganizationData.svc";
    var retrieveReq = new XMLHttpRequest();
    var Odata = oDataPath + sSelectstatement;
    retrieveReq.open("GET", Odata, false);
    retrieveReq.setRequestHeader("Accept", "application/json");
    retrieveReq.setRequestHeader("Content-Type", "application/json; charset=utf-8");
       retrieveReq.send();

    if (retrieveReq.readyState == 4 /* complete */) {
        var retrieved = this.parent.JSON.parse(retrieveReq.responseText).d;
        return retrieved.results[0];
    }
}

Und in jedem Formular in dem ich dieses globale Script vorher geladen habe kann ich nun im Hauptscript durch einen der folgenden Aufrufe Daten aus einer verknüpften Entität auslesen:
Code:
/*Möglicher Beispielaufruf, bei dem man danach auf ein bestimmtes Feld hier EMailAdress1 zugreifen kann*/
var Kunde  = new Array();
Kunde = Xrm.Page.getAttribute("customerid").getValue();
var kundeid = Kunde[0].id;
alert(GetAttributeValueWithOData("/ContactSet?$select=EMailAddress1&$filter=ContactId eq guid'" + kundeid + "'").EMailAddress1);

/*Möglicher Beispielaufruf, bei dem man danach auf alle Felder des Kontakts zugreifen kann*/
var Kunde  = new Array();
Kunde = Xrm.Page.getAttribute("customerid").getValue();
var kundeid = Kunde[0].id;
var resultKunden = GetAttributeValueWithOData("/ContactSet?$select=*&$filter=ContactId eq guid'" + kundeid + "'");
alert(resultKunden.EMailAddress1);
alert(resultKunden.FirstName);

/*Möglicher Beispielaufruf, bei dem man danach auf die Felder zugreien kann, die im Select angegeben sind.
Funktioniert aber bei uns im Moment nicht, obwohl das im SDK so als Aufruf angegeben*/
var Kunde  = new Array();
Kunde = Xrm.Page.getAttribute("customerid").getValue();
var kundeid = Kunde[0].id;
var resultKunden = GetAttributeValueWithOData("/ContactSet?$select=EMailAdress1,FirstName&$filter=ContactId eq guid'" + kundeid + "'");
alert(resultKunden.EMailAddress1);
alert(resultKunden.FirstName);


Viele Grüße
Nicole