[gelöst]Javascript m Odata als globale Funktion m Rückgabe

6. Dezember 2012 15:05

Hallo zusammen,

ich habe dank der Unterstützung hier im Forum ein Script gefunden, dass mit oData arbeitet und anhand einer GUID zum Beispiel aus einem Kontakt die Emailadresse auslesen kann. Ich hab das etwas umgewandelt, so dass ich dem Funktionsaufruf das selectstatement mitgeben kann um dann aus dem ganzen eine Globale Funktion machen zu können, damit ich die von jedem Formular aus aufrufen kann da wir diese Funktion öfter benötigen.

Code:
function GetAttributeValueWithOData(sSelectstatement){

    var serverUrl = "http://" + window.location.host + "/" + Xrm.Page.context.getOrgUniqueName();
    var kunde = Xrm.Page.getAttribute("customerid").getValue();
    var kundeid = kunde [0].id;

 // 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.onreadystatechange = function () { retrieveReqCallBack(this); };
    retrieveReq.send();
      
   function retrieveReqCallBack(retrieveReq) {
      if (retrieveReq.readyState == 4 /* complete */) {
         var retrieved = this.parent.JSON.parse(retrieveReq.responseText).d;
                                                                alert(retrieved.results[0].EmailAdress1);
       }
   }
}


Soweit so gut. Die gewünschte Information erscheint im Popup. Nun hätte ich aber eigentlich gerne, dass die Emailadresse nicht im Popup erscheint, sondern als Rückgabewert der Funktion "GetAttributeValueWithOData". Aber dadurch das retrieved.results nur in der untergeordneten Funktion retrieveReqCallBack zur Verfügung steht klappt das irgendwie nicht. Kenn mich da an der Stelle leider nicht gut genug aus, wie ich das umschreiben muss damit ich retrieved.results[0] mit der Funktion "GetAttributeValueWithOData" zurück geben kann. Kann mir da jemand helfen? Hab auch schon im SDK gesucht, bin da aber auch nicht wirklich fündig geworden. Mein Problem ist glaub ich auch eher allgemeinerer Javascript natur aber vielleicht kann mir da trotzdem jemand Hilfestellung geben.

Danke und viele Grüße
Nicole
Zuletzt geändert von Nicole Schmitz am 8. Januar 2013 11:27, insgesamt 1-mal geändert.

Re: Javascript mit Odata als globale Funktion mit Rückgabe

6. Dezember 2012 15:33

Hallo zusammen,

ich habe das Ganze jetzt selbst nochmal umgeschrieben und einfach diesen onreadystatechange Funktionsaufruf rausgenommen und statt dessen den Inhalt dieser Funktion direk unterhalb von retrieveReq.send() eingebaut.
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];
    }
}

Die Funktion macht jetzt für mich augenscheinlich das was sie soll. Ich kann mit dem folgenden Aufruf aus einem beliebigen Formula die Emailadresse des Kontakts abrufen.

Code:
var Kunde  = new Array();
Kunde = Xrm.Page.getAttribute("customerid").getValue();
var kundeid = Kunde[0].id;
var sSelectstatement = "/ContactSet?$select=EMailAddress1&$filter=ContactId eq guid'" + kundeid + "'";
var resultKunden = GetAttributeValueWithOData(sSelectstatement);
alert(resultKunden.EMailAddress1);


Jetzt bin ich aber trotzdem nicht sicher, dass ich das so machen kann. Ich meine die Emailadresse wird zurückgegeben, aber ich habe nicht ganz verstanden, wofür der Aufruf der Funktion in onreadystatechange gedacht gewesen ist und ob ich da jetzt ein Problem kriege was ich jetzt noch nicht sehe weil ich das rausgenommen habe.

Über kurze Hilfestellung wäre ich dankbar.

Viele Grüße
Nicole

Re: Javascript mit Odata als globale Funktion mit Rückgabe

6. Dezember 2012 16:04

Hallo Nicole,

bei dem Aufruf handelt es sich um einen asynchronen Prozess.
Da du die Funktion onreadystatechange herausgenommen hast kann es dir passieren, das du keine Daten zurückbekommst wenn der Aufruf langsamer abläuft als dein Script.
Durch die Einbindung der Funktion hast du eine Schleife die darauf wartet, das der richtige State erreicht wird und dir erst dann das Ergebnis liefert. Dieser Code ist also stabiler.

Re: Javascript mit Odata als globale Funktion mit Rückgabe

13. Dezember 2012 09:42

Hallo Michael,

stabiler ist natürlich schön, aber außer in einem alert bekomme ich den Rückgabewert damit nicht zurück. Also ich bekomme es jedenfalls nicht hin. Ich möchte ja die Funktion GetAttributeValueWithOData() aufrufen können und den Rückgabewert in eine Variable speichern.

Viele Grüße
Nicole