21.08.2013, 11:53 | #1 |
Участник
|
Нужно экспертное мнение по the REST SDK and JSON2
Добрый день!
Помогите прокомментировать скрипт и помочь разъяснить что не так. Нет рядом человека, кто мог бы помочь. Спасибо. У меня есть сущность new_request, на сущности есть Lookup new_bonus_malus, я повесил этот скрипт на событие Onchange new_bonus_malus, и хочу чтобы из Lookup new_bonus_malus копировались значения атрибута new_test и присваивалось полю new_testfield сущности new_request. Для реализации задачи надо подключить библиотеку json2.js - подключил. Хочется, чтобы вы на этом примере помогли мне понят в каком направлении двигаться дальше. Спасибо. function getServerUrl() { // From CrmRestKit.js var localServerUrl = window.location.protocol + "/" + window.location.host; var context = parent.Xrm.Page.context; 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; } function Lookup_Changed(new_test, new_bonus_malus, callbackId, columns) { var serverUrl = Xrm.Page.context.getServerUrl(); var ODataPath = serverUrl + "/XRMServices/2011/OrganizationData.svc"; var lookup = Xrm.Page.data.entity.attributes.get(new_bonus_malus).getValue(); if (lookup===null) { return false; } var id = lookup[0].id; if (id == null) { return false; } var retrieveReq = new XMLHttpRequest(); var url = ODataPath + "/"+entityName+"Set(guid'" + id + "')"; if (columns !== undefined && columns !== null) { url = url + "?$select=" + columns.join(','); } retrieveReq.open("GET", url, true); retrieveReq.setRequestHeader("Accept", "application/json"); retrieveReq.setRequestHeader("Content-Type", "application/json; charset=utf-8"); retrieveReq.onreadystatechange = function () { if (this.readyState == 4 /* complete */) { if (this.status == 200) { var data; var jData; jData = JSON.parse(this.responseText); if (jData && jData.d && jData.d.results && jData.d.results.length > 0) { data = jData.d.results[0]; } else if (jData && jData.d) { data = jData.d; } if (data == null) { return; } retrieveReqCallBack(callbackId, data); } } }; retrieveReq.send(); return true; } function retrieveReqCallBack(calltype, data) { var toLookup=function(data) { if (data==null || data=="" || (data.Id==null)) { return null; } var result=new Array(); result[0] = {}; result[0].id = data.Id; result[0].name = data.Name; result[0].entityType = data.LogicalName; return result; } switch (calltype) { case 'pricelookup': Xrm.Page.data.entity.attributes.get("new_pricecategorylookup").setValue(toLookup(data.new_pricecategorylookup); break; case 'new_bonus_maluslookup': Xrm.Page.data.entity.attributes.get("new_testfield").setValue(data.new_test); break; default: break; } } Вот ссылка на оригинальный сайт |
|
21.08.2013, 12:01 | #2 |
Участник
|
Вот:
Цитата:
function getServerUrl() {
// From CrmRestKit.js var localServerUrl = window.location.protocol + "/" + window.location.host; var context = parent.Xrm.Page.context; 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; } function Lookup_Changed(new_test, new_bonus_malus, callbackId, columns) { var serverUrl = Xrm.Page.context.getServerUrl(); var ODataPath = serverUrl + "/XRMServices/2011/OrganizationData.svc"; var lookup = Xrm.Page.data.entity.attributes.get(new_bonus_malus).getValue(); if (lookup===null) { return false; } var id = lookup[0].id; if (id == null) { return false; } var retrieveReq = new XMLHttpRequest(); var url = ODataPath + "/"+entityName+"Set(guid'" + id + "')"; if (columns !== undefined && columns !== null) { url = url + "?$select=" + columns.join(','); } retrieveReq.open("GET", url, true); retrieveReq.setRequestHeader("Accept", "application/json"); retrieveReq.setRequestHeader("Content-Type", "application/json; charset=utf-8"); retrieveReq.onreadystatechange = function () { if (this.readyState == 4 /* complete */) { if (this.status == 200) { var data; var jData; jData = JSON.parse(this.responseText); if (jData && jData.d && jData.d.results && jData.d.results.length > 0) { data = jData.d.results[0]; } else if (jData && jData.d) { data = jData.d; } if (data == null) { return; } retrieveReqCallBack(callbackId, data); } } }; retrieveReq.send(); return true; } function retrieveReqCallBack(calltype, data) { var toLookup=function(data) { if (data==null || data=="" || (data.Id==null)) { return null; } var result=new Array(); result[0] = {}; result[0].id = data.Id; result[0].name = data.Name; result[0].entityType = data.LogicalName; return result; } switch (calltype) { case 'pricelookup': Xrm.Page.data.entity.attributes.get("new_pricecategorylookup").setValue(toLookup(data.new_pricecategorylookup); break; case 'new_bonus_maluslookup': Xrm.Page.data.entity.attributes.get("new_testfield").setValue(data.new_test); break; default: break; } } |
|
21.08.2013, 13:53 | #3 |
Участник
|
Если Вы брали пример с той страницы, то почему не воспользовались примером с XrmServiceToolkit? Он ведь проще )
В скрипте явно что-то напутано с параметрами Lookup_Changed. Например есть строка var url = ODataPath + "/"+entityName+"Set(guid'" + id + "')"; переменная entityName нигде не определена С какими параметрами вызывается эта функция? |
|
21.08.2013, 18:37 | #4 |
Участник
|
var serverUrl = Xrm.Page.context.getServerUrl();
Для внешнего входа это работать не будет. необходимо пользоваться ф-ией getServerUrl, описанной выше. и с var url = ODataPath + "/"+entityName+"Set(guid'" + id + "')"; проблема тоже. и проще взять уже готовый механизм получения данных из того же RestKit |
|
22.08.2013, 10:23 | #5 |
Участник
|
А если использовать этот код
Цитата:
function setFieldValue()
{ if(Xrm.Page.data.entity.attributes.get("new_bonus_malusid").getValue()!=null) //заполнено ли поля луап { var id = Xrm.Page.data.entity.attributes.get("new_bonus_malusid").getValue()[0].id; id = id.replace("{", ""); id = id.replace("}", ""); retrieveRecord(id, "new_bonus_malusSet", retrieveBonus_malus, null, false); function retrieveBonus_malus(data, textStatus, XmlHttpRequest) { if(data.new_bonus_malus_coefficient_k7!=null) { Xrm.Page.data.entity.attributes.get("new_testfield").setValue(data.new_bonus_malus_coefficient_k7); } else { Xrm.Page.data.entity.attributes.get("new_testfield").setValue(null) } if(data.new_bonus_malus_coefficient_k7!=null) { Xrm.Page.data.entity.attributes.get("new_testfield").setValue(data.new_bonus_malus_coefficient_k7); } else { Xrm.Page.data.entity.attributes.get("new_testfield").setValue(null) } } } else { Xrm.Page.data.entity.attributes.get("new_testfield").setValue(null) } } Последний раз редактировалось Ion; 22.08.2013 в 10:39. |
|
22.08.2013, 10:37 | #6 |
Участник
|
Извините за мои глупые вопросы, но не могу понять, почему не срабатывает функция
Создал кастомную кнопку, сделал все как указано на скрине. Нажимаю на нее, а функция не вызывается. function OpenEnt( ) { var parameters = {}; parameters["new_name"] = Xrm.Page.getAttribute("new_name").getValue(); parameters["new_fortest"] = Xrm.Page.getAttribute("new_testfield").getValue(); Xrm.Utility.openEntityForm("new_insurance_policy", null, parameters); } Кпопку делал с помощью Ribbon workbench Вот сам скриншот http://smages.com/images/ribbon.png |
|
22.08.2013, 12:31 | #7 |
Участник
|
вот еще один пример:
Цитата:
function GetInfo() {
//Getting the Lookup object from the CRM Page var ProjectObject = Xrm.Page.getAttribute("new_bonus_malusid").getValue(); // Getting the GUID for the Project record var ProjectNoID= ProjectObject[0].id; //Stripping out the curly brackets ProjectNoID = ProjectNoID.replace('{', '').replace('}', ''); //Checking if we have a project GUID Value if (ProjectNoID != null) { //Let’s create the Web Service URL oDataPath = Xrm.Page.context.getServerUrl() + "/xrmservices/2011/organizationdata.svc"; //Call the project retrieve function RetrieveProjectRecord(ProjectNoID, oDataPath); } } function RetrieveProjectRecord(Id, ODataPath) { var retrieveReq = new XMLHttpRequest(); retrieveReq.open("GET", ODataPath + "/new_bonus_malusSet(guid'" + Id + "')", true); retrieveReq.setRequestHeader("Accept", "application/json"); retrieveReq.setRequestHeader("Content-Type", "application/json; charset=utf-8"); retrieveReq.onreadystatechange = function () { retrieveProjectReqCallBack(this); }; retrieveReq.send(); } function retrieveProjectReqCallBack(retrieveProjectReq) { if (retrieveProjectReq.status == 200) { var retrievedProject = this.parent.JSON.parse(retrieveProjectReq.responseText).d; var ProjectName = retrievedProject.new_test; Xrm.Page.getAttribute("new_testfield").setValue(ProjectName); } else { alert("Error in Fetching data"); } } |
|
22.08.2013, 14:31 | #8 |
Участник
|
спасибо. с этим вопросом разобрался.
Цитата:
Сообщение от Ion
Извините за мои глупые вопросы, но не могу понять, почему не срабатывает функция
Создал кастомную кнопку, сделал все как указано на скрине. Нажимаю на нее, а функция не вызывается. function OpenEnt( ) { var parameters = {}; parameters["new_name"] = Xrm.Page.getAttribute("new_name").getValue(); parameters["new_fortest"] = Xrm.Page.getAttribute("new_testfield").getValue(); Xrm.Utility.openEntityForm("new_insurance_policy", null, parameters); } |
|