none
Dynmaics CRM 2011 - Mustertexte RRS feed

  • Frage

  • Hallo zusammen.

    Ich verzweifle bald ...

    Ich möchte z.B. im Angebot das Feld Beschreibung mit einem Mustertext befüllen lassen.
    Wunsch wäre: User macht ein neues Angebot auf und es sollte gleich der Mustertext hinterlegt sein, den er dann sichtbar verändern kann.

    Per Workflow geht's, aber der Text wird nicht gleich sichtbar. Je nach dem wie schnell der Prozess durchgelaufen ist und zu dem muss man das Angebot das aktualisieren. Macht also nicht wirklich Sinn.
    Per JavaScript komme ich einfach nicht weiter. Habe schon mal eine Entität "Angebotsbausteine" angelegt mit hinterlegten Standardtexten.
    Die könnte man jetzt hernehmen und damit das Feld befüllen.

    Problem: zwei Entitäten und keine Ahnung wie so ein Script ausschauen sollte. XrmSvcToolkit habe ich schon installiert.

    Wer kann mir da auf die Sprünge helfen?

    Gruß Wolfi


    Wolle39

    Montag, 3. Juni 2013 13:57

Antworten

  • ich seh gerade, dass der Parameter deiner id auch noch nicht ganz stimmt.. Wenn du die URL deines Datensatzes kopierst, bekommst du ja sowas in der Art:

    http: //domain:port/org_name/main.aspx?etc=1&extraqs=%3f_gridType%3d1%26etc%3d1%26id%3d%257b58F90084-FC3C-E111-9A7A-001CC41F0B32%257d%26rskey%3d63145471&pagetype=entityrecord

    %257b steht für das Zeichen {
    und %257d für das Zeichen }

    Dazwischen steht die id. 257b muss bei dir also auch noch weg, damit du die "reine" id hast.

    das wäre dann das Resultat:

     id: "{618F38DE-9FA2-E211-B1AE-00505684165B}",

    • Als Antwort vorgeschlagen Andreas Buchinger Montag, 17. Juni 2013 13:31
    • Als Antwort markiert Wolle39 Montag, 17. Juni 2013 13:32
    Dienstag, 4. Juni 2013 09:57

Alle Antworten

  • Hallo Wolfi,

    also mit Javascript sollte das auf jeden Fall gehen. Die Frage ist nur, ob du die zusätzliche Entität brauchst bzw. verwenden möchtest.

    Hier findest du einige Informationen und Beispiele, wie du mit JS auf eine andere Entität zugreifen kannst:

    http://msdn.microsoft.com/en-us/library/gg309549.aspx

    Und hier noch ein paar generelle Infos zum Setzen von Werten:

    http://msdn.microsoft.com/en-us/library/6881e99b-45e4-4552-8355-2eef296f2cd8#BKMK_setValue

    Ich würde dann beim onLoad prüfen, ob das Feld gefüllt ist, und wenn es leer ist, entsprechend vorbelegen.

    Schöne Grüße,

    Nils Frohloff

    http://www.strategic-it.de

    Montag, 3. Juni 2013 14:28
  • Soweit bin ich damit.

    XrmSvcToolkit.retrieve({

         entityName: "Angebot Baustein Standardtext",
         id: 257b618F38DE-9FA2-E211-B1AE-00505684165B,
         select: ["new_baustein6"],
         expand: [""],
         async: false,
         successCallback: function (result) {
         if (!IsNull(result.new_baustein6)) {
          Xrm.Page.getAttribute("new_baustein6").setValue(result.new_baustein1);
         }
         },
        errorCallback: function (error) {
          throw error;
          }
        });


    Wolle39

    Montag, 3. Juni 2013 14:52
  • Hi Wolfi,

    das sieht soweit eigentlich schon ganz gut aus.
    Du musst nur darauf achten, dass alle übergebenen Parameter auch das passende Format haben

    XrmSvcToolkit.retrieve({
         //entityName ist der Logical Name der Entität (nicht der Anzeigename)
         entityName: "new_angebotbausteinstandardtext",
         //geschweifte Klammern und Anführungszeichen nicht vergessen
         id: "{257b618F38DE-9FA2-E211-B1AE-00505684165B}",
         select: ["new_baustein6"],
         expand: [""],
         async: false,
         successCallback: function (result) {
         if (!IsNull(result.new_baustein6)) {
          Xrm.Page.getAttribute("new_baustein6").setValue(result.new_baustein1);
         }
         },
        errorCallback: function (error) {
          throw error;
          }
        });

    Beim entityName hab ich natürlich geraten... wie er bei dir wirklich heißt, findest du unter Anpassungen > deine Entität > Entitätsdefinitionen > Name.

    Und nicht vergessen: die XrmSvcToolkit-Bibliothek im Formular hinterlegen, sonst kann nicht darauf zugegriffen werden.

    Gruß


    • Bearbeitet Sarah Ho Montag, 3. Juni 2013 15:21
    Montag, 3. Juni 2013 15:20
  • Danke für die Tipps :-)

    Soweit eingearbeitet kommt leider immer noch ein Fehler.


    Wolle39

    Dienstag, 4. Juni 2013 06:21
  • Hallo Wolle39!

    Heist deine Entität new_standardtext oder new_angebotbausteinstandardtext?
    Der EntityName im Script muss mit dem Namen aus der Entitätsdefinition deiner Entität übereinstimmen.


    Ich hoffe das bringt weiter. Andreas(a)Donaubauer.com www.crmfaq.de

    Dienstag, 4. Juni 2013 06:42
  • XrmSvcToolkit.retrieve({

         entityName: "new_angebotstandarttexte",
         id: "{257b618F38DE-9FA2-E211-B1AE-00505684165B}",
         select: ["new_baustein6"],
         expand: [""],
         async: false,
         successCallback: function (result) {
         if (!IsNull(result.new_baustein6)) {
          Xrm.Page.getAttribute("new_baustein6").setValue(result.new_baustein1);
         }
         },
        errorCallback: function (error) {
          throw error;
          }
        });

    ------------------------------------------------------------------------------------------

    Feld new_baustein6 ist in der Entität Angebot Baustein Standardtext.
    ID: Habe ich aus der URL rauskopiert.
    Feld new_baustein1 befindet sich in der Entität Angebote.

    Script ist auf OnChange bei Angebote, Name gesetzt sowie bei den Angebot Baustein Standardtext


    Wolle39

    Dienstag, 4. Juni 2013 06:53
  • Hi Wolfi,

    so wie's aussieht willst du deinen Code im onChange-Event von new_standardtextid ausführen?
    Hast du alles nochmal in eine Funktion gepackt, die du dann im onChange-Event hinterlegen kannst?

    Also z.B.

    getMustertext(){
       
       //dein Code von oben
    }

    und dann einfach getMustertext aufrufen...

    LG :-)

    Dienstag, 4. Juni 2013 06:56
  • HallO Sarah,

    meinst Du so?

    getMustertext(){

    XrmSvcToolkit.retrieve({

         entityName: "new_angebotstandarttexte",
         id: "{257b618F38DE-9FA2-E211-B1AE-00505684165B}",
         select: ["new_baustein6"],
         expand: [""],
         async: false,
         successCallback: function (result) {
         if (!IsNull(result.new_baustein6)) {
          Xrm.Page.getAttribute("new_baustein6").setValue(result.new_baustein1);
         }
         },
        errorCallback: function (error) {
          throw error;
          }
        });
    }


    Wolle39

    Dienstag, 4. Juni 2013 07:12
  • Genau.. kommt noch eine Fehlermeldung?

    Update: sorry, da fehlt natürlich noch function vor dem Funktionsnamen ;)

    function getMustertext(){
    XrmSvcToolkit.retrieve({
         entityName: "new_angebotstandarttexte",
         id: "{257b618F38DE-9FA2-E211-B1AE-00505684165B}",
         select: ["new_baustein6"],
         expand: [""],
         async: false,
         successCallback: function (result) {
         if (!IsNull(result.new_baustein6)) {
          Xrm.Page.getAttribute("new_baustein6").setValue(result.new_baustein1);
         }
         },
        errorCallback: function (error) {
          throw error;
          }
        });
    }

    • Bearbeitet Sarah Ho Dienstag, 4. Juni 2013 07:29
    Dienstag, 4. Juni 2013 07:24
  • Den Code muss ich aber dann im XrmSvcToolkit eintragen?

    Das ist der Code vom XrmSvcToolkit:

    var XrmSvcToolkit = (function (window, undefined) {
     
        var odataEndpoint = "/XRMServices/2011/OrganizationData.svc",
            soapEndpoint = "/XRMServices/2011/Organization.svc/web";

        // Type sniffering
        var toString = Object.prototype.toString,
            isFunction = function (o) {
                return toString.call(o) === "[object Function]";
            },
            isInteger = function (o) {
                return !isNaN(parseInt(o));
            },
            isString = function (o) {
                return toString.call(o) === "[object String]";
            },
            isArray = function (o) {
                return toString.call(o) === "[object Array]";
            },
            isNonEmptyString = function (o) {
                if (!isString(o) || o.length === 0) {
                    return false;
                }

                // checks for a non-white space character
                return /[^\s]+/.test(o);
            };

        var isoDateExpr = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})\.?(\d*)?(Z|[+-]\d{2}?(:\d{2})?)?$/,
            jsonDateExpr = /^\/Date\(([-+]?\d+)\)\/$/;

        var context = (function () {
            if (isFunction(window.GetGlobalContext)) {
                return GetGlobalContext();
            } else if (Xrm != undefined) {
                return Xrm.Page.context;
            } else {
                throw new Error("CRM context is not available.");
            }
        })();

        var clientUrl = (function () {
            if (context.getClientUrl !== undefined){
                return context.getClientUrl();
            }

            var localServerUrl = window.location.protocol + "//" + window.location.host;
            if (context.isOutlookClient() && !context.isOutlookOnline()) {
                return localServerUrl;
            } else {
                var crmServerUrl = context.getServerUrl();
                crmServerUrl = crmServerUrl.replace(/^(http|https):\/\/([_a-zA-Z0-9\-\.]+)(:([0-9]{1,5}))?/, localServerUrl);
                crmServerUrl = crmServerUrl.replace(/\/$/, "");
            }

            return crmServerUrl;
        })();

        var restErrorHandler = function (req) {
            var errorMessage;

            try {
                errorMessage = JSON.parse(req.responseText).error.message.value;
            } catch (err) {
                // Ignore any error when parsing the error message.
                errorMessage = req.responseText;
            }

            errorMessage = errorMessage.length > 0
                ? "Error: " + req.status + ": " + req.statusText + ": " + errorMessage
                : "Error: " + req.status + ": " + req.statusText;

            return new Error(errorMessage);
        };

        var soapErrorHandler = function (req) {
            var errorMessage = req.responseText.length > 0
                ? "Error: " + req.status + ": " + req.statusText + ": " + req.responseText
                : "Error: " + req.status + ": " + req.statusText;

            return new Error(errorMessage);
        };

        var dateReviver = function (key, value) {
            if (typeof value === 'string') {
                if (value.match(jsonDateExpr)) {
                    var dateValue = value.replace(jsonDateExpr, "$1");
                    return new Date(parseInt(dateValue, 10));
                }
            }
            return value;
        };

        var xmlEncode = function (input) {
            if (input == null) {
                return null;
            }

            if (input == '') {
                return '';
            }

            var c;
            var result = '';

            for (var pos = 0; pos < input.length; pos++) {
                c = input.charCodeAt(pos);

                if ((c > 96 && c < 123) ||
                    (c > 64 && c < 91) ||
                    (c > 47 && c < 58) ||
                    (c == 32) ||
                    (c == 44) ||
                    (c == 46) ||
                    (c == 45) ||
                    (c == 95)) {
                    result = result + String.fromCharCode(c);
                } else {
                    result = result + '&#' + c + ';';
                }
            }

            return result;
        };

        var parseIsoDate = function (s) {
            if (s == null || !s.match(isoDateExpr))
                return null;

            var dateParts = isoDateExpr.exec(s);
            return new Date(Date.UTC(parseInt(dateParts[1], 10),
                parseInt(dateParts[2], 10) - 1,
                parseInt(dateParts[3], 10),
                parseInt(dateParts[4], 10) - (dateParts[8] == "" || dateParts[8] == "Z" ? 0 : parseInt(dateParts[8])),
                parseInt(dateParts[5], 10),
                parseInt(dateParts[6], 10)));
        };

        var getAttribute = function (xmlNode, attrName){
            for (var i = 0; i < xmlNode.attributes.length; i++)
            {
                var attr = xmlNode.attributes[i];
                if (attr.name == attrName){
                    return attr.value;
                }
            }
        };

        var getNodeText = function (node){
            return node.text !== undefined
                ? node.text
                : node.textContent;
        }

        var getTypedValue = function (fieldType, valueNode) {
            switch (fieldType) {
                case "c:string":
                case "c:guid":
                    return getNodeText(valueNode);
                case "c:boolean":
                    return getNodeText(valueNode) === "true";
                case "c:int":
                    return parseInt(getNodeText(valueNode));
                case "c:decimal":
                case "c:double":
                    return parseFloat(getNodeText(valueNode));
                case "c:dateTime":
                    return parseIsoDate(getNodeText(valueNode));
                case "a:OptionSetValue":
                    valueNode = getChildNode(valueNode, "a:Value");
                    return {
                        Value: parseInt(getNodeText(valueNode))
                    };
                case "a:Money":
                    valueNode = getChildNode(valueNode, "a:Value");
                    return {
                        Value: getNodeText(valueNode)
                    };
                case "a:EntityReference":
                    return getEntityReference(valueNode);
                case "a:EntityCollection":
                    return getEntityCollection(valueNode);
                case "a:AliasedValue":
                    valueNode = getChildNode(valueNode, "a:Value");
                    fieldType = getAttribute(valueNode, "i:type");
                    return getTypedValue(fieldType, valueNode);

                default:
                    throw new Error("Unhandled field type: \"" + fieldType + "\", please report the problem to the developer. ");
            }
        };

        var concatOdataFields = function (fields, parameterName) {
            if (isArray(fields) && fields.length > 0) {
                return fields.join(',');
            } else if (isString(fields)) {
                return fields;
            }
            else if (parameterName != undefined) {
                throw new Error(parameterName + " parameter must be either a delimited string or an array. ");
            }
            else {
                return "";
            }
        };

        // Get a list of entities from an EntityCollection XML node.
        var getEntityCollection = function (entityCollectionNode) {
            var entityName, moreRecords, pagingCookie, totalRecordCount, entitiesNode;

            // Try to get all child nodes in one pass
            for (var m = 0; m < entityCollectionNode.childNodes.length; m++) {
                var collectionChildNode = entityCollectionNode.childNodes[m];
                switch (collectionChildNode.nodeName){
                    case "a:EntityName":
                        entityName = getNodeText(collectionChildNode);
                        break;
                    case "a:MoreRecords":
                        moreRecords = getNodeText(collectionChildNode) === "true";
                        break;
                    case "a:PagingCookie":
                        pagingCookie = getNodeText(collectionChildNode);
                        break;
                    case "a:TotalRecordCount":
                        totalRecordCount = parseInt(getNodeText(collectionChildNode));
                        break;
                    case "a:Entities":
                        entitiesNode = collectionChildNode;
                        break;
                }
            }

            var result = {
                entityName: entityName,
                moreRecords: moreRecords,
                pagingCookie: pagingCookie,
                totalRecordCount: totalRecordCount,
                entities: []
            };

            for (var i = 0; i < entitiesNode.childNodes.length; i++) {
                var entity = { formattedValues: [] };
                var entityNode = entitiesNode.childNodes[i];
                var attributes = getChildNode(entityNode, "a:Attributes");
                for (var j = 0; j < attributes.childNodes.length; j++) {
                    var attr = attributes.childNodes[j];

                    var fieldName = getNodeText(getChildNode(attr, "b:key"));
                    var valueNode = getChildNode(attr, "b:value");
                    var fieldType = getAttribute(valueNode, "i:type");

                    entity[fieldName] = getTypedValue(fieldType, valueNode);
                }

                var formattedValues = getChildNode(entityNode, "a:FormattedValues");

                for (var k = 0; k < formattedValues.childNodes.length; k++) {
                    var valuePair = formattedValues.childNodes[k];
                    entity.formattedValues[getNodeText(getChildNode(valuePair, "b:key"))] = getNodeText(getChildNode(valuePair, "b:value"));
                }

                result.entities.push(entity);
            }

            return result;
        };

        // Get an EntityReference from an XML node. For performance reason, we try to
        // get the entity reference in one pass, instead of multiple.
        var getEntityReference = function (xmlNode){
            var id, logicalName, name;
            for (var i = 0; i < xmlNode.childNodes.length; i++)
            {
                var childNode = xmlNode.childNodes[i];

                switch (childNode.nodeName){
                    case "a:Id":
                        id = getNodeText(childNode);
                        break;
                    case "a:LogicalName":
                        logicalName = getNodeText(childNode);
                        break;
                    case "a:Name":
                        name = getNodeText(childNode);
                        break;
                }
            }

            return {
                Id: id,
                LogicalName: logicalName,
                Name: name
            };
        }

        // Get a single child node that matches the specified name.
        var getChildNode = function (xmlNode, nodeName){
            for (var i = 0; i < xmlNode.childNodes.length; i++)
            {
                var childNode = xmlNode.childNodes[i];

                if (childNode.nodeName == nodeName){
                    return childNode;
                }
            }
        }

        var getSoapError = function(soapXml){
            try {
                var bodyNode = soapXml.firstChild.firstChild;
                var faultNode = getChildNode(bodyNode, "s:Fault");
                var faultStringNode = getChildNode(faultNode, "faultstring");
                return new Error(getNodeText(faultStringNode));
            }
            catch(e){
                return new Error("An error occurred when parsing the error returned from CRM server: " + e.message);
            }
        }

        var processSoapResponse = function (responseXml, successCallback, errorCallback) {
            try {
                var executeResult = responseXml.firstChild.firstChild.firstChild.firstChild; // "s:Envelope/s:Body/ExecuteResponse/ExecuteResult"
            } catch (err) {
                errorCallback(err);
                return;
            }
           
            return successCallback(executeResult);
        };

        var getFetchResults = function (resultXml) {
            // For simplicity reason, we are assuming the returned SOAP message uses the following three namespace aliases
            //   xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts"
            //   xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
            //   xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic"
            // however it is possible that the namespace aliases returned from CRM server could be different, in which
            // case, the fetch function will not work properly
            // For future reference, XPath to the entity collection node:
            // a:Results/a:KeyValuePairOfstringanyType/b:value[@i:type='a:EntityCollection']
            var resultsNode = getChildNode(resultXml, "a:Results"); // a:Results
            var entityCollectionNode = getChildNode(resultsNode.firstChild, "b:value"); // b:value
            return getEntityCollection(entityCollectionNode);
        };
     
     var processRestResult = function(req, successCallback, errorCallback) {
      if ((req.status >= 200 && req.status < 300) || req.status === 304 || req.status === 1223) {
       try {
        var result = (!!req.responseText)
           ? JSON.parse(req.responseText, dateReviver).d
           : null;
       } catch (err) {
        errorCallback(err);
        return;
       }
       
                return successCallback(result);
               
      } else {
       errorCallback(restErrorHandler(req));
      }
     };

        var doRestRequest = function (restReq, successCallback, errorCallback) {
            var req = new XMLHttpRequest();
            req.open(restReq.type, restReq.url, restReq.async);
            req.setRequestHeader("Accept", "application/json");
            req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
            if (!!restReq.method) {
                req.setRequestHeader("X-HTTP-Method", restReq.method);
            }

            var erred = false;

            if (restReq.async) {
                req.onreadystatechange = function () {
                    if (req.readyState == 4 /* complete */) {
         processRestResult(req, successCallback, errorCallback);
                    }
                };

                if (!!restReq.data) {
                    req.send(restReq.data);
                } else {
                    req.send();
                }
            } else {
                try {
                    //synchronous: send request, then call the callback functions
                    if (!!restReq.data) {
                        req.send(restReq.data);
                    } else {
                        req.send();
                    }

                    return processRestResult(req, successCallback, errorCallback);
        
                } catch (err) {
                    errorCallback(err);
                }
            }
        };

        var doSoapRequest = function (soapBody, async, successCallback, errorCallback) {
            var req = new XMLHttpRequest();

            req.open("POST", clientUrl + soapEndpoint, async);
            req.setRequestHeader("Accept", "application/xml, text/xml, */*");
            req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
            req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");

            var soapXml = [
    '<s:Envelope xmlns:s="'">http://schemas.xmlsoap.org/soap/envelope/"><s:Body>',
        soapBody,
    '</s:Body></s:Envelope>'].join('');

            if (async) {
                req.onreadystatechange = function () {
                    if (req.readyState == 4) { // "complete"
                        if (req.status == 200) { // "OK"
                            processSoapResponse(req.responseXML, successCallback, errorCallback);
                        } else {
                            errorCallback(soapErrorHandler(req));
                        }
                    }
                };

                req.send(soapXml);
            } else {
                var syncResult;
                try {
                    //synchronous: send request, then call the callback function directly
                    req.send(soapXml);
                    if (req.status == 200) {
                        return processSoapResponse(req.responseXML, successCallback, errorCallback);
                    }
                    else {
                        var syncErr = getSoapError(req.responseXML);
                        errorCallback(syncErr);
                        return;
                    }
                } catch (err) {
                    errorCallback(err);
        return;
                }

                successCallback(syncResult);
            }
        };

        var execute = function (opts) {

            if (!isNonEmptyString(opts.executeXml)) {
                throw new Error("executeXml parameter was not provided. ");
            }

            var async = !!opts.async;

            return doSoapRequest(opts.executeXml, async, function (result) {
                if (isFunction(opts.successCallback)) {
                    opts.successCallback(result);
                }
               
                if (!async) {
                    return result;
                }
            }, function (err) {
                if (isFunction(opts.errorCallback)) {
                    opts.errorCallback(err);
                }
                else {
                    throw err;
                }
            });
        };

        var setState = function (opts) {

            if (!isNonEmptyString(opts.id)) {
                throw new Error("id parameter was not provided. ");
            }

            if (!isNonEmptyString(opts.entityName)) {
                throw new Error("entityName parameter was not provided. ");
            }

            if (!isInteger(opts.stateCode)) {
                throw new Error("stateCode parameter must be an integer. ");
            }

            if (opts.statusCode == null) {
                opts.statusCode = -1;
            }

            var request = [
    '<Execute xmlns="'">http://schemas.microsoft.com/xrm/2011/Contracts/Services">',
        '<request i:type="b:SetStateRequest"',
                ' xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts" ',
                ' xmlns:b="http://schemas.microsoft.com/crm/2011/Contracts" ',
                ' xmlns:c="http://schemas.datacontract.org/2004/07/System.Collections.Generic" ',
                ' xmlns:i="'">http://www.w3.org/2001/XMLSchema-instance">',
            '<a:Parameters>',
                '<a:KeyValuePairOfstringanyType>',
                    '<c:key>EntityMoniker</c:key>',
                    '<c:value i:type="a:EntityReference">',
                        '<a:Id>', opts.id, '</a:Id>',
                        '<a:LogicalName>', opts.entityName, '</a:LogicalName>',
                        '<a:Name i:nil="true" />',
                    '</c:value>',
                '</a:KeyValuePairOfstringanyType>',
                '<a:KeyValuePairOfstringanyType>',
                    '<c:key>State</c:key>',
                    '<c:value i:type="a:OptionSetValue">',
                        '<a:Value>', opts.stateCode, '</a:Value>',
                    '</c:value>',
                '</a:KeyValuePairOfstringanyType>',
                '<a:KeyValuePairOfstringanyType>',
                    '<c:key>Status</c:key>',
                    '<c:value i:type="a:OptionSetValue">',
                        '<a:Value>', opts.statusCode, '</a:Value>',
                    '</c:value>',
                '</a:KeyValuePairOfstringanyType>',
            '</a:Parameters>',
            '<a:RequestId i:nil="true"/>',
            '<a:RequestName>SetState</a:RequestName>',
        '</request>',
    '</Execute>'].join("");

            var async = !!opts.async;

            return doSoapRequest(request, async, function (result) {
                if (isFunction(opts.successCallback)) {
                    opts.successCallback(result);
                }
               
                if (!async) {
                    return result;
                }
            }, function (err) {
                if (isFunction(opts.errorCallback)) {
                    opts.errorCallback(err);
                }
                else {
                    throw err;
                }
            });
        };

        var fetch = function (opts) {
            if (!isNonEmptyString(opts.fetchXml)) {
                throw new Error("fetchXml parameter was not provided. ");
            }

            var request = [
    '<Execute xmlns="'">http://schemas.microsoft.com/xrm/2011/Contracts/Services">',
        '<request i:type="a:RetrieveMultipleRequest"',
                ' xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts" ',
                ' xmlns:i="'">http://www.w3.org/2001/XMLSchema-instance">',
            '<a:Parameters xmlns:c="'">http://schemas.datacontract.org/2004/07/System.Collections.Generic">',
                '<a:KeyValuePairOfstringanyType>',
                    '<c:key>Query</c:key>',
                    '<c:value i:type="a:FetchExpression">',
                        '<a:Query>', xmlEncode(opts.fetchXml), '</a:Query>',
                    '</c:value>',
                '</a:KeyValuePairOfstringanyType>',
            '</a:Parameters>',
            '<a:RequestId i:nil="true"/>',
            '<a:RequestName>RetrieveMultiple</a:RequestName>',
        '</request>',
    '</Execute>'].join("");

            var async = !!opts.async;

            return doSoapRequest(request, async, function (result) {
                var fetchResults = getFetchResults(result);

                if (isFunction(opts.successCallback)) {
                    opts.successCallback(fetchResults);
                }
               
                if (!async) {
                    return fetchResults;
                }
            }, function (err) {
                if (isFunction(opts.errorCallback)) {
                    opts.errorCallback(err);
                }
                else {
                    throw err;
                }
            });
        };

        var retrieve = function (opts) {
            if (!isNonEmptyString(opts.entityName)) {
                throw new Error("entityName parameter was not provided. ");
            }

            if (!isNonEmptyString(opts.id)) {
                throw new Error("id parameter was not provided. ");
            }

            var select = opts.select == null
                ? ""
                : concatOdataFields(opts.select, "select");

            var expand = opts.expand == null
                ? ""
                : concatOdataFields(opts.expand, "expand");

            var odataQuery = "";

            if (select.length > 0 || expand.length > 0) {
                odataQuery = "?";
                if (select.length > 0) {
                    odataQuery += "$select=" + select;
        
                    if (expand.length > 0) {
                        odataQuery += "&";
                    }
                }
       
       if (expand.length > 0) {
                    odataQuery += "$expand=" + expand;
                }
            }

            var restReq = {
                url: clientUrl + odataEndpoint + "/" + opts.entityName + "Set(guid'" + opts.id + "')" + odataQuery,
                type: "GET",
                async: !!opts.async
            };

            return doRestRequest(restReq, function (result) {
                if (isFunction(opts.successCallback)) {
                    opts.successCallback(result);
                }
               
                if (!opts.async) {
                    return result;
                }
     usw.

    Und da kommt der Code rein! Oder? Und wo?

    Entschuldige die blöden Frage. Ist Neuland für mich.
    Danke


    Wolle39

    Dienstag, 4. Juni 2013 08:12
  • Hallo Wolfi,

    Hast du die Webressource XrmSvcToolkit in deinem Formular eingebunden? Nullverweis horcht sich für mich an als ob die Funktion nicht gefunden werden kann...

    Liebe Grüße,

    Andreas


    Andreas Buchinger
    Microsoft Dynamics Certified Technology Specialist
    MCPD: SharePoint Developer 2010

    Dienstag, 4. Juni 2013 08:18
  • Ist in beiden Formularen eingebunden. Muss ich den Code nun in das XrmSvcToolkit reinkopieren oder reicht hier das Separate Script. Ich will einfach die zusammenhänge richtig verstehen.

    Lg Wolfi


    Wolle39


    • Bearbeitet Wolle39 Dienstag, 4. Juni 2013 08:40
    Dienstag, 4. Juni 2013 08:25
  • ein separates Script reicht. XrmSvcToolkit.js bleibt unverändert. Im onChange-Event von "new_standardtextid" die Funktion getMustertext deiner separaten Bibliothek hinterlegen.

    Das müsste ausreichen. Mit XrmSvcToolkit.retrieve greifst du ja direkt auf die XrmSvcToolkit-Bibliothek zu. D.h. alle Funktionalitäten die du in deinem Fall aus der XrmSvcToolkit-Bibliothek benötigst, sind dadurch automatisch in deinem separaten Script enthalten.

    LG

    Dienstag, 4. Juni 2013 08:42
  • OK. Verstanden :-)

    Der Fehler kommt leider noch


    Wolle39

    Dienstag, 4. Juni 2013 09:02
  • Hallo Wolfi,

    Du musst die Parameter bei retrieve-Aufruf mit den Schemanamen und nicht den Namen befüllen (Bsp.: Parameter "Account" -> Name: accountid -> Schemaname: AccountId) - Schemanamen sind case-sensitive!

    Carsten hat das in seinem Blog noch ausführlicher beschrieben: http://carstengroth.wordpress.com/2012/11/13/microsoft-dynamics-crm-2011-xrmsvctoolkitretrieve-funktion/

    Liebe Grüße,

    Andreas


    Andreas Buchinger
    Microsoft Dynamics Certified Technology Specialist
    MCPD: SharePoint Developer 2010

    Dienstag, 4. Juni 2013 09:15
  • ich seh gerade, dass der Parameter deiner id auch noch nicht ganz stimmt.. Wenn du die URL deines Datensatzes kopierst, bekommst du ja sowas in der Art:

    http: //domain:port/org_name/main.aspx?etc=1&extraqs=%3f_gridType%3d1%26etc%3d1%26id%3d%257b58F90084-FC3C-E111-9A7A-001CC41F0B32%257d%26rskey%3d63145471&pagetype=entityrecord

    %257b steht für das Zeichen {
    und %257d für das Zeichen }

    Dazwischen steht die id. 257b muss bei dir also auch noch weg, damit du die "reine" id hast.

    das wäre dann das Resultat:

     id: "{618F38DE-9FA2-E211-B1AE-00505684165B}",

    • Als Antwort vorgeschlagen Andreas Buchinger Montag, 17. Juni 2013 13:31
    • Als Antwort markiert Wolle39 Montag, 17. Juni 2013 13:32
    Dienstag, 4. Juni 2013 09:57
  • Einwandfrei. Genau das war der Springende punkt.

    Anbei noch der Code für alle anderen. Das Ganze ist nun auch kombiniert mit einem Optionssatz.

    function getConfiguration(bausteinId) {
       bausteinId = ''+bausteinId
       switch(bausteinId) {
       case "1":
        return {id: "{618F38DE-9FA2-E211-B1AE-00505684165B}", name: "new_angebotstext_1"};
        break;
      case "2":
         return {id: "{618F38DE-9FA2-E211-B1AE-00505684165B}", name: "new_angebotstext_2"};
        break;
      default:
        return {};
        break;
      }

    }


    function getMustertext(){
        var selectedBaustein =  Xrm.Page.getAttribute("new_auswahlangebotstext").getValue();
        if (selectedBaustein && selectedBaustein > 0) {
            var cfg = getConfiguration(selectedBaustein);
     
    XrmSvcToolkit.retrieve({
         entityName: "new_angebotstandarttexte",
         id: cfg.id,
         select:[cfg.name],
         expand: [""],
         async: false,
         successCallback: function (result) {

        if (!IsNull(result[cfg.name])) {
          var textNeu = result[cfg.name];
          var textIst = Xrm.Page.getAttribute("new_baustein1").getValue();
          if (!IsNull(textIst)) {
               textNeu = textIst + " " + textNeu;
          }
          Xrm.Page.getAttribute("new_baustein1").setValue(textNeu);
         }
         },
        errorCallback: function (error) {
          throw error;
          }
        });

       // select zurücksetzen auf leer
       Xrm.Page.getAttribute("new_auswahlangebotstext").selectedIndex = 0;

        }


    Wolle39


    • Bearbeitet Wolle39 Dienstag, 4. Juni 2013 12:41
    Dienstag, 4. Juni 2013 12:40