AXForum  
Вернуться   AXForum > Блоги > CRM, SharePoint и Черная Магия
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

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


MVP 2010, 2011
Оценить эту запись

Использование OData в CRM2011

Запись от Артем Enot Грунин размещена 21.09.2011 в 19:45
Обновил(-а) Артем Enot Грунин 21.09.2011 в 19:56

Многие из вас уже, наверно, успели поиграть с новым удобным End Point для работы с сервисом CRM. Соглашусь, примеры в блогах разработчиков и демонстрации в Hands On Labs впечатляют. Долой не читаемые портянки SOAP запросов и ура простой и четкой URL адресации.
К сожалению, ситуация омрачается тем, что CRM SDK все сильнее деградирует от версии к версии, так что получать информацию из этого ресурса становится все сложнее. В итоге, многие детали реализации механизмов системы либо пишутся между строк, либо вообще остаются неосвещенными. В этом посте я изложу основные тезисы, которые мне удалось вычленить.

Во-первых, использовать REST End Point, для манипуляции с данными, действительно удобно. Код получается более кратким и читаемым, хотя теперь, когда мы получили поддержку пользовательских JS библиотек, это уже не столь существенно. Дьявол и тут скрывается в деталях. Чтобы получить данные нужно построить запрос, но в SDK вы найдете больше ссылок на стандарт OData, нежели конкретных примеров синтаксиса. К счастью есть решение, которое позволяет строить запросы через удобный визуальный интерфейс: CRM 2011 OData Query Designer.

Минуса у решения ровно два:
  1. Не умеет работать с решениями (solution) - данные тянутся только из солюшена по умолчанию.
  2. Кривовато работает с CRM Online.
Используете вы этот тул, или нет вы столкнетесь со следующими тонкостями:

1. Не работают фильтры по первичному ключу записи:
Код:
//error
/xrmservices/2011/OrganizationData.svc/AccountSet?$filter=AccountId eq guid'{guid}'
Вместо этого необходимо использовать синтаксис:
Код:
xrmservices/2011/OrganizationData.svc/AccountSet(guid'{guid}')
2. Параметры REST запросов чувствительны к регистру! Более того, имена полей в запросе - это не их схема, как это принято при работе через SOAP или объектную модель! По неясным причинам, в метаданные атрибута объекта в CRM 2011 вводится свойство Schema Name, которое чувствительно к регистру и, как и схема, не меняется после создания. На форме атрибута этого поля нет, но зато оно отражается в представлении:

Нажмите на изображение для увеличения
Название: metadata.png
Просмотров: 288
Размер:	34.3 Кб
ID:	161

Код:
//ok
../AccountSet?$select=Name


//error
../AccountSet?$select=name
Кроме этого, существуют ограничения на длину URL запроса, количество возвращаемых записей, поддерживаемые функции OData. Какие? - читайте в SDK!

Во-вторых, составить запрос - это еще пол беды. Нужно еще как-то его выполнить, а потом обработать результат. Вот тут-то нас подстригает второй неприятный момент. Готовых системных библиотек для этих целей не предусмотрено. Более того, все примеры в 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");
        }        
    });
Предупрежден - значит вооружен. Удачного скриптинга!
Размещено в CRM
Просмотров 36885 Комментарии 4
Всего комментариев 4

Комментарии

  1. Старый комментарий
    Аватар для spectr
    Код:
    //error
    /xrmservices/2011/OrganizationData.svc/AccountSet?$filter=AccountId eq guid'{guid}'
    вместо этого надо писать
    /xrmservices/2011/OrganizationData.svc/AccountSet?$filter=AccountId eq (guid'{guid}')
    и все пашет
    Запись от spectr размещена 19.10.2011 в 14:11 spectr is offline
    Обновил(-а) spectr 19.10.2011 в 14:33
  2. Старый комментарий
    Аватар для Артем Enot Грунин
    Спасибо! Учту!
    Запись от Артем Enot Грунин размещена 02.12.2011 в 19:52 Артем Enot Грунин is offline
  3. Старый комментарий
    Аватар для MikeR
    Еще такую вещь обнаружил, что при вставке параметром, у меня например, подцеплялся "\'" вместо "'" поборол этим
    %27 in hex.
    Запись от MikeR размещена 09.09.2012 в 12:27 MikeR is offline
  4. Старый комментарий
    Аватар для Артем Enot Грунин
    "При вставке параметром" - это как?
    Запись от Артем Enot Грунин размещена 09.09.2012 в 14:06 Артем Enot Грунин is offline
 


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