Архив метки: CRM

[CRM] Как получить все данные, если CRM 2011 имеет лимит 5000 записей на ответ

Приходится работать с все большим объемом данных, столкнулся с тем, что CRM имеет ограничение на получение данных через Fetch-запросы. 5000 записей. Многие наверное замечали, к примеру, что на гридах сущностей CRM, имеющих больше 5000 записей в поле количество под гридом обычно указано просто 5000+.

Для того чтобы избавиться от этого ограничение можно просто установить в реестре ключ, который убирает этот лимит, делается это довольно просто и описание можно найти в интернете, к примеру здесь:

  1. Click Start, click Run, type regedit in the Open box, and then click OK.
  2. Locate and then select the following registry subkey:HKEY_LOCAL_MACHINE\Software\Microsoft\MSCRM
  3. On the Edit menu, point to New, and then click DWORD Value.
    image
  4. Type TurnOffFetchThrottling, and then press ENTER.
    image
  5. Right-click TurnOffFetchThrottling, and then click Modify.
    image
  6. Type a number other than 0 in the Value data box, and then click OK.
    imageimage
    Note Step 6 lets you retrieve the number of records specified in the Count attribute of your fetch statement.
  7. On the File menu, click Exit.
    image

Но это не правильный подход, т.к, во первых такое решение тормозит работу, во вторых не гарантирует что Вы таки получите все результаты.

А теперь по порядку — как стоит решать эту задачу:

Читать далее

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.

[CRM] JavaScript в CRM 2011

Привычка полагаться на IntelliSense приводит к тому, что когда его нет, начинаешь забывать как делать какие-то простые вещи. До сих пор регулярно сталкиваюсь с тем, что для написания банальных действий с CRM 2011 из JavaScript открываю Google.

Поэтому немного полезной информации, чтобы больше не забывать:

Работа с полями

Во-первых, чтобы скрипт работал на форме его необходимо добавить в веб-ресурс и добавить этот веб-ресурс непосредственно на форму.

Получить значение текстового поля «Action Code»

Xrm.Page.data.entity.attributes.get("actioncode").getValue();

Сохранить значение «AC231» в текстовое поле «telephone»

Xrm.Page.data.entity.attributes.get("actioncode").setValue("AC231");

Получить значение пиклиста «type»

Xrm.Page.data.entity.attributes.get("type").getValue(); //Цифровое значение
Xrm.Page.data.entity.attributes.get("type").getText(); //Текстовое значение

«undefined» если значение не выбрано.

Установить значение 2 пиклиста «type»

Xrm.Page.data.entity.attributes.get("type").setValue(2);
Текстовое значение на листе будет выбрано автоматически.

Установить значение поля с датой «scheduled» на сегодня

var today = new Date();
Xrm.Page.data.entity.attributes.get("scheduled").setValue(today);

Узнать завтрашную дату можно так

var tomorrow = new Date();tomorrow.setDate(tomorrow.getDate() + 1);

К моему стыду я дико не люблю работу с датой в JavaScript и не люблю когда возникают такие задачи.

Отключить (Disable) поле «name»

Xrm.Page.ui.controls.get("name").setDisabled(true);

Скрыть (Hide) поле «name»

Xrm.Page.ui.controls.get("name").setVisible(false);

Скрыть (Hide) секцию в табе

Xrm.Page.ui.tabs.get("tabname").sections.get("sectionname").setVisible(false);

Работа с формой

Сохранить форму

Xrm.Page.data.entity.save();

Сохранить и закрыть форму

Xrm.Page.data.entity.save("saveandclose");

Остановить сохранение формы
Вешаемся на событие формы OnSave.

function formOnSave(context)
{
  var shouldSave = true;
  if (shouldSave) {
    alert("Unable to save because of some reason or the other.");
    context.getEventArgs().preventDefault();
  }
}

При настройке события необходимо поставить галочку в поле «Pass execution context as first parameter».

Закрыть форму

Xrm.Page.ui.close();
Если пользователь вносил какие-либо изменения он увидит сообщение для подтверждения.

Тип формы
CRM предлагает следующие типы форм:

Create — 1, открыта форма для создания новой записи
Update — 2, открыта форма существующей записи
Read Only — 3, форма только на чтение
Disabled — 4, неактивная форма
Bulk Edit — 6, форма массового редактирования.

Xrm.Page.ui.getFormType();

Получить GUID текущей записи

Xrm.Page.data.entity.getId();

Получить GUID текущего пользователя

Xrm.Page.context.getUserId();

Получить LCID текущего пользователя и организации

Xrm.Page.context.getUserLcid(); //For User
Xrm.Page.context.getOrgLcid(); //For Organization

Список LCID на MSDN здесь.

Получить URL сервера CRM

Xrm.Page.context.getServerUrl();

Лукапы

Получить GUID значение лукапа «accountid»

Xrm.Page.data.entity.attributes.get("accountid").getValue()[0].id;

Получить текстовое значение лукапа «accountid»

Xrm.Page.data.entity.attributes.get("accountid").getValue()[0].name;

Открыть диалоговое окно
В CRM 2011 есть обертка для window.showModalDialog(), функция называется openStdDlg().

openStdDlg(sPath, oArgs, iWidth, iHeight, bResizable, bModeless, sCustomWinParams);

где:
sPath — ссылка на окно,
oArgs — объект с параметрами,
iWidth — ширина окна,
iHeight — высота окна,
bResizable — можно ли изменять размер окна,
bModeless — ,
sCustomWinParams — пользовательские параметры, передаваемые в окно.

Открыть форму сущности
Следующий пример открывает форму существующей сущности incident с GUID = 47c2bb7b-ba62-4afb-9b10-1a24c7a2799e в новом окне.

window.open(Xrm.Page.context.getServerUrl() +
"/main.aspx?etn=incident&pagetype=entityrecord&id=" +
encodeURIComponent("{47c2bb7b-ba62-4afb-9b10-1a24c7a2799e}"),
"_blank",
"location=no,menubar=no,status=no,toolbar=no",
false);

На мой взгляд стоит использовать функции, появившиеся в 8 Rollup, но в специфичных случаях приходится использовать стандартные.

Обновить состояние рибон

Xrm.Page.ui.refreshRibbon();

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.

[CRM] Проект для Бухгалтерской компании

Начали работу над кастомизацией CRM для компании предоставляющей бухгалтерские услуги. Интересно поработать в новой команде и посмотреть как мы сработаемся.

Первый релиз должен состоятся в середине декабря, поэтому времени очень мало, а работы предостаточно. Предметная область мне хорошо известна и понятна, поэтому надеюсь мы сможем сделать конфетку за этот срок. Буду отписываться по результатам.

P.S> Какой-то ад на хостинге parking.ru слишком медленно работают базы данных, постараюсь в ближайшие выходные подобрать достойную замену. Мне не нравится когда я должен ждать того, что должно работать за доли секунды.

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.

[CRM] Новые функции в Xrm.Utility появившиеся в Update Rollup 8 для Microsoft Dynamics CRM 2011

Вообще Update Rollup 8 для Microsoft Dynamics CRM вышел еще в мае, но разработчики никаким образом не заостряли внимание на изменениях в SDK. В результате мимо меня прошел тот факт, что появились JavaScript функции, недоступные ранее. И честно говоря факт их отсутствия меня порядком огорчал.

Функции были добавлены, т.к. сценарии использующие windows.open, например, из Outlook чтобы открыть форму или веб-ресурс сталкивались с тем что пользователь вынужден был повторно авторизоваться. Проблема заключалась в том что функция по сути запускала новый процесс, который не был авторизован. В обновлении были добавлены некоторые функции обертки, который во первых упростили и сделали использование таких сценариев более корректным, а во вторых исключили проблему с необходимостью повторной авторизации.

Пока что описание вызовов можно найти только на блогах разработчиков, но скоро они должны попасть в обновление SDK.

Xrm.Utility Reference

Xrm.Utility это контейнер для полезных функций, не связанных непосредственно с текущей страницей. Эти функции доступны для сценариев и для ленты (Ribbon). Для HTML веб-ресурсов, они будут доступны после подключения ClientGlobalContext.js.aspx.

Функции

Функция Описание
openEntityForm Открывает форму сущности.
openWebResource Открывает HTML веб-ресурс.

openEntityForm

Открывает форму сущности.

Xrm.Utility.openEntityForm(name,id,parameters)

Параметры

  • name (название)
    • Тип: String
    • Требует: Логическое имя сущности.
  • id
    • Тип: String
    • Опционально: Строка с уникальным идентификатором (Guid) записи, для открытия формы редактора сущности. Если оставить пустым откроется форма создания записи.
  • parameters
    • Тип: Object
    • Опционально: Объект-словарь, позволяющий передавать дополнительные параметры строки запроса. Если строка запроса будет не верна это может вызвать ошибки.Допустимые дополнительные параметры запроса:
      • Form id: Для установки идентификатора формы, когда необходимо использовать конкретную, из нескольких доступных. Параметр formid.
      • Default field ids: Устанавливает значения по умолчанию для новой записи формы. Подробнее здесь Set Field Values Using Parameters Passed to a Form.
      • Custom query string parameters: Форма может быть настроена на получение дополнительных параметров строки запроса. Подробнее здесь Configure a Form to Accept Custom Querystring Parameters.

Возвращаемое значение: Window object.

Примечание: Данная функция обесперичает наилучший способ разработки, чем простое манипалирование URL адресами через windows.open описанным здесь. Использование данной функции также позволит гарантировать отсутствие повторного окна для авторизации пользователя.

Примеры:

Открытие новой записи «Организации»

Xrm.Utility.openEntityForm("account");

Открытие существующей записи «Организации»

Xrm.Utility.openEntityForm("account","A85C0252-DF8B-E111-997C-00155D8A8410");

Открытие новой записи «Организации» с установкой значений по умолчанию и использование конкретной формы из нескольких доступных.

var parameters = {};
parameters["formid"] = "b053a39a-041a-4356-acef-ddf00182762b";
parameters["name"] = "Test";
parameters["telephone1"] = "(425) 555-1234";
Xrm.Utility.openEntityForm("account", null, parameters);

Открытие новой записки «Контакта», перемещение в верхний левый угол экрана и установка необходимого размера окна.

Примечание

Нельзя использовать методы объекта windows, такие как moveTo или resizeTo в скриптах, так как они могут быть запущены через Microsoft Dynamics CRM для Microsoft Office Outlook

var newWindow = Xrm.Utility.openEntityForm("contact");
newWindow.moveTo(0,0);
newWindow.resizeTo(800,600);

openWebResource

Открывает HTML веб-ресурс.

Xrm.Utility.openWebResource(webResourceName,webResourceData,width, height)

Параметры

  • webResourceName
    • Тип: String
    • Требует: Название HTML веб-ресурса, который необходимо открыть.
  • webResourceData
    • Тип: String
    • Опционально: Значение которые необходимо передать в параметре data.
  • width
    • Тип: Number
    • Опционально: Ширина открываемого окна в пикселях.
  • height
    • Тип: Number
    • Опционально: Высота открываемого окна в пикселях.

Возвращаемое значение: Window object.

Примечание: HTML веб-ресур может принмать параметры описанные в Passing Parameters to HTML Web Resources .Данная функция только опеспечиваем передачу значений в параметр  data. Для передачи значений других допустимых параметров необходимо добавить их к параметру webResourceName.

Примеры:

Открытие HTML веб-ресурса под названием “new_webResource.htm”:

Xrm.Utility.openWebResource("new_webResource.htm");

Открытие HTML веб-ресурса с включением одного значение в параметр data.

Xrm.Utility.openWebResource(«new_webResource.htm»,»dataItemValue»);

Открытие  HTML веб-ресурса получающего несколько значений через параметр data.

var customParameters = encodeURIComponent("first=First Value&second=Second Value&third=Third Value");
Xrm.Utility.openWebResource("new_webResource.htm",customParameters);

Примечание

Эти значения должны быть извлечены из параметра data. Подробнее здесь Sample: Pass Multiple Values to a Web Resource Through the Data Parameter.

Открытие HTML веб-ресурса с дополнительными параметрами

Xrm.Utility.openWebResource("new_webResource.htm?typename=account&userlcid=1033");

Подробнее Passing Parameters to HTML Web Resources .

Открытие веб-ресурса с указанием ширины и высоты:

Xrm.Utility.openWebResource("new_webResource.htm", null, 300,300);

 

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.

Магия дат в CRM 2011, DateTime, UTC

Поначалу я нигде не встретил такой ремарки и не обращал на этот факт внимания, пока время тестирования решения не совпало с ранним утром.

Суть заключается в том, что, выбирая на форме в поле типа Дата и Время, например, 1 мая 2012, Вы рассчитываете, что в БД так и запишется: 1 мая 2012. Но все не так просто.

CRM хранит Дату и Время в UTC, таким образом, выходит, что, если Ваш сервер находится где-то за Уралом, то время в БД будет отличаться уже более чем на 6 часов с тем, что Вы указали. Так, у меня, к примеру, получалось, что если установить дату 1 мая, то в автосгенерированном через плагин договоре ставилось 30 апреля.

В моем случае разница между DateTime, которое я ожидал получить и реальным составила 6 часов, это как раз часовой пояс Екатеринбурга.

Если бы я сразу был внимателен, то MSDN прямым текстом говорит «Specifies the attribute value in UTC format.». Сам CRM так и будет показывать в веб-форме ту дату, что Вы выбрали, но если Вы работаете с датами через плагин, то не забывайте возвращать дату из UTC в ваш часовой пояс.

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.