Добро пожаловать в мой блог! Изначально он не задумывался как блог CRM разработчика, но жизнь сама внесла нужные коррективы. Тут я публикою все свои наблюдения относительно обозначенных в заголовке систем. Если Вы найдете в нем что-то интересное для Вас, как для заказчика, то буду рад сотрудничать с Вами! В моей компетенции 100% задач по MS CRM 3.0/4.0/2011:


MVP 2010, 2011
- Консалтинг
- Проектирование
- Разработка
- Обучение
MVP 2010, 2011
Использование OData в CRM2011
Запись от Артем Enot Грунин размещена 21.09.2011 в 19:45
Обновил(-а) Артем Enot Грунин 21.09.2011 в 19:56
Обновил(-а) Артем Enot Грунин 21.09.2011 в 19:56
Теги java script, маразм
Многие из вас уже, наверно, успели поиграть с новым удобным End Point для работы с сервисом CRM. Соглашусь, примеры в блогах разработчиков и демонстрации в Hands On Labs впечатляют. Долой не читаемые портянки SOAP запросов и ура простой и четкой URL адресации.
К сожалению, ситуация омрачается тем, что CRM SDK все сильнее деградирует от версии к версии, так что получать информацию из этого ресурса становится все сложнее. В итоге, многие детали реализации механизмов системы либо пишутся между строк, либо вообще остаются неосвещенными. В этом посте я изложу основные тезисы, которые мне удалось вычленить.
Во-первых, использовать REST End Point, для манипуляции с данными, действительно удобно. Код получается более кратким и читаемым, хотя теперь, когда мы получили поддержку пользовательских JS библиотек, это уже не столь существенно. Дьявол и тут скрывается в деталях. Чтобы получить данные нужно построить запрос, но в SDK вы найдете больше ссылок на стандарт OData, нежели конкретных примеров синтаксиса. К счастью есть решение, которое позволяет строить запросы через удобный визуальный интерфейс: CRM 2011 OData Query Designer.
Минуса у решения ровно два:
1. Не работают фильтры по первичному ключу записи:
Вместо этого необходимо использовать синтаксис:
2. Параметры REST запросов чувствительны к регистру! Более того, имена полей в запросе - это не их схема, как это принято при работе через SOAP или объектную модель! По неясным причинам, в метаданные атрибута объекта в CRM 2011 вводится свойство Schema Name, которое чувствительно к регистру и, как и схема, не меняется после создания. На форме атрибута этого поля нет, но зато оно отражается в представлении:

Кроме этого, существуют ограничения на длину URL запроса, количество возвращаемых записей, поддерживаемые функции OData. Какие? - читайте в SDK!
Во-вторых, составить запрос - это еще пол беды. Нужно еще как-то его выполнить, а потом обработать результат. Вот тут-то нас подстригает второй неприятный момент. Готовых системных библиотек для этих целей не предусмотрено. Более того, все примеры в SDK написаны с применением свободных библиотек jQuery и JSON, которые придется подключать к формам, если вы хотите их использовать. И хотя поддержка JSON есть во всех современных браузерах включая IE версии 8 и выше, веб сервер CRM работает в режиме совместимости с IE 7, поэтому объекты JSON не будут созданы. Кроме этого, могут быть проблемы, если вы используете "чистый" jQuery.ajax. Для того, чтобы запрос вернулся в корректном формате рекомендуется установить дополнительные хидеры HTTP запроса при помощи свойства beforeSend:
Предупрежден - значит вооружен. Удачного скриптинга!
К сожалению, ситуация омрачается тем, что CRM SDK все сильнее деградирует от версии к версии, так что получать информацию из этого ресурса становится все сложнее. В итоге, многие детали реализации механизмов системы либо пишутся между строк, либо вообще остаются неосвещенными. В этом посте я изложу основные тезисы, которые мне удалось вычленить.
Во-первых, использовать REST End Point, для манипуляции с данными, действительно удобно. Код получается более кратким и читаемым, хотя теперь, когда мы получили поддержку пользовательских JS библиотек, это уже не столь существенно. Дьявол и тут скрывается в деталях. Чтобы получить данные нужно построить запрос, но в SDK вы найдете больше ссылок на стандарт OData, нежели конкретных примеров синтаксиса. К счастью есть решение, которое позволяет строить запросы через удобный визуальный интерфейс: CRM 2011 OData Query Designer.
Минуса у решения ровно два:
- Не умеет работать с решениями (solution) - данные тянутся только из солюшена по умолчанию.
- Кривовато работает с CRM Online.
1. Не работают фильтры по первичному ключу записи:
Код:
//error /xrmservices/2011/OrganizationData.svc/AccountSet?$filter=AccountId eq guid'{guid}'
Код:
xrmservices/2011/OrganizationData.svc/AccountSet(guid'{guid}')
Код:
//ok ../AccountSet?$select=Name //error ../AccountSet?$select=name
Во-вторых, составить запрос - это еще пол беды. Нужно еще как-то его выполнить, а потом обработать результат. Вот тут-то нас подстригает второй неприятный момент. Готовых системных библиотек для этих целей не предусмотрено. Более того, все примеры в SDK написаны с применением свободных библиотек jQuery и JSON, которые придется подключать к формам, если вы хотите их использовать. И хотя поддержка JSON есть во всех современных браузерах включая IE версии 8 и выше, веб сервер CRM работает в режиме совместимости с IE 7, поэтому объекты JSON не будут созданы. Кроме этого, могут быть проблемы, если вы используете "чистый" jQuery.ajax. Для того, чтобы запрос вернулся в корректном формате рекомендуется установить дополнительные хидеры HTTP запроса при помощи свойства beforeSend:
Код:
$.ajax({ type: "POST", contentType: "application/json; charset=utf-8", datatype: "json", /* ... */ beforeSend: function (XMLHttpRequest) { //Specifying this header ensures that the results will be returned as JSON. XMLHttpRequest.setRequestHeader("Accept", "application/json"); } });
Всего комментариев 4
Комментарии
-
Запись от spectr размещена 19.10.2011 в 14:11
Обновил(-а) spectr 19.10.2011 в 14:33 -
Запись от Артем Enot Грунин размещена 02.12.2011 в 19:52 -
Запись от MikeR размещена 09.09.2012 в 12:27 -
Запись от Артем Enot Грунин размещена 09.09.2012 в 14:06