AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.08.2013, 11:53   #1  
Ion is offline
Ion
Участник
 
332 / 16 (1) ++
Регистрация: 19.12.2012
Нужно экспертное мнение по 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  
Ion is offline
Ion
Участник
 
332 / 16 (1) ++
Регистрация: 19.12.2012
Вот:

Цитата:
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  
Anros is offline
Anros
Участник
 
54 / 28 (1) +++
Регистрация: 01.07.2009
Если Вы брали пример с той страницы, то почему не воспользовались примером с XrmServiceToolkit? Он ведь проще )

В скрипте явно что-то напутано с параметрами Lookup_Changed.
Например есть строка
var url = ODataPath + "/"+entityName+"Set(guid'" + id + "')";
переменная entityName нигде не определена

С какими параметрами вызывается эта функция?
Старый 21.08.2013, 18:37   #4  
g.Naukovych is offline
g.Naukovych
Участник
MCBMSS
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
405 / 130 (5) +++++
Регистрация: 23.03.2011
var serverUrl = Xrm.Page.context.getServerUrl();

Для внешнего входа это работать не будет.
необходимо пользоваться ф-ией getServerUrl, описанной выше.

и с
var url = ODataPath + "/"+entityName+"Set(guid'" + id + "')";
проблема тоже.

и проще взять уже готовый механизм получения данных из того же RestKit
__________________
Мой блог https://procrm.tv
Старый 22.08.2013, 10:23   #5  
Ion is offline
Ion
Участник
 
332 / 16 (1) ++
Регистрация: 19.12.2012
А если использовать этот код
Цитата:
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  
Ion is offline
Ion
Участник
 
332 / 16 (1) ++
Регистрация: 19.12.2012
Извините за мои глупые вопросы, но не могу понять, почему не срабатывает функция
Создал кастомную кнопку, сделал все как указано на скрине. Нажимаю на нее, а функция не вызывается.

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  
Ion is offline
Ion
Участник
 
332 / 16 (1) ++
Регистрация: 19.12.2012
вот еще один пример:

Цитата:
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 is offline
Ion
Участник
 
332 / 16 (1) ++
Регистрация: 19.12.2012
спасибо. с этим вопросом разобрался.
Цитата:
Сообщение от 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);

}
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
extraqs и JQuery+JSON2 на OnLoad spectr Dynamics CRM: Разработка 9 29.11.2012 17:38

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:22.