Записки на лету

Всех с прошедшими праздниками.
Спешу рассказать, что за это праздники успел выйти очередной  Накопительный пакет обновления 8 для Microsoft Dynamics CRM 2011 (KB 2600644) (English version Microsoft Dynamics CRM Update Rollup 8)

К сожалению, это не, так называемый Q2 2012 Service Update, в котором нам обещали кроссбраузерность и много всего еще.

Для установки необходим накопительный пакет 6.

Изменений не много, но что-то они стали все чаще и чаще выходить. 🙂

Собственно сегодня окончательно решился и оплатил участие в Девконе.

Уж очень хочется пообщаться со Скоттом Хансельманом.

DevCon12

«Не удается выполнить программу из освобожденного сценария» («Can’t execute code from a freed script»)

Встретился вот с такой проблемой при работе с диалогом.
А конкретнее при использовании диалогового окна ServiceAppointment, которое должно вызываться по кнопке с нескольких сущностей я не смог получить даты.
Оказалось, что ссылочные типы переданные из диалога нельзя прочесть после закрытия диалога. И что самое удивительное, данные в дебаггере видно.
Большинство советов типа поменять браузер (это же MS Dymamics CRM) или передавать строки из диалога не работают, т.к. я использую диалоговое окно самой CRM и ничего с ним сделать не могу.
Решение оказалось простое.

Object.prototype.toString.call()

В моем случае с датой будет

Data.prototype.toString.call()

Stunnware Tools

Categories: Новости
Comments: 1

Если вдруг кто-то еще не знает такую замечательную программу как «Stunnware Tools» компании Stunnware, то очень советую скачать здесь  .

Программа это позволяет, подключившись к организации, мышкой (драг анд дропом) составить запрос, в результате чего генерируется фетч, который, в случае чего можно подправить, сразу же посмотреть результат, и еще сгенерить квери экспрешн, если надо.

Программа может еще много чего, но я использовал пока только этот функционал.
В общем, очень рекомендую.
Stunnware tools

Следующая функция создает заметку.
Входящие параметры:
entity — EntityReference сущности к которой привязывается записка
subject — Заголовок заметки
text — Текст заметки
Функция GetOrganizationService() возвращает объект работы с данными в CRM 2011, была написана ранее, использует FetchXml (см. пример здесь Execute Fetch from JavaScript in CRM 2011).

function _createAnnotation(entity, subject, text) {
var orgService = GetOrganizationService();
var annotation = {};
annotation.Name = "annotation";
annotation._properties = [];
annotation._propertyTypes = [];
annotation._properties['objectid'] = entity;
annotation._propertyTypes['objectid'] = 'lookup';
annotation._properties['subject'] = subject;
annotation._propertyTypes['subject'] = 'string';
annotation._properties['notetext'] = text;
annotation._propertyTypes['notetext'] = 'string';
annotation._properties['isdocument'] = 'false';
annotation._propertyTypes['isdocument'] = 'boolean';
annotation._properties['mimetype'] = 'text/html';
annotation._propertyTypes['mimetype'] = 'string';
orgService.Create(annotation);
}

Доступен накопительный пакет обновления 7 для Microsoft Dynamics CRM
http://support.microsoft.com/kb/2600643
Ссылка на скачивание http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=29221
Насколько я заметил, никаких нововведений нет, одни фиксы.
Что тоже не плохо.

Сегодня компания Microsoft объявила о том, что включает следующий сервисный апдейт для Microsoft Dynamics CRM 2011, кодовое название "R8" под заголовком "CRM Anywhere".

Апдейт  «R8» ожидается во втором квартале 2012 г. и будет основываться на шести базовых темах: Мобильность (Mobility), Браузерная гибкость (Browser Flexibility), Социальность (Social), Промышленные шаблоны (Industry Templates), SQL Server 2012, Сертификация (Certifications).

Особенно хочется отметить встроенную поддержку мобильных устройств (iPhone, iPad, Google Android, RIM Blackberry, Windows Phone) и кроссбраузерность (IE on Windows 7, Safari 5.11 + on Mac OSX and iPad 2, Firefox 6+, Google Chrome 13.x).

Для более подробного ознакомления можно:
Скачать «R8 Release Preview Guide» с сайта Microsoft Dynamics CRM: http://crmpublish.blob.core.windows.net/docs/ReleasePreviewGuide.pdf, копия на моем сайте

Почитать статью нового главного менеджера CRM Денниса Михалиса  (Dennis Michalis): https://community.dynamics.com/product/crm/crmnontechnical/b/crmconnection/archive/2012/02/06/crm-anywhere.aspx

Здравствуйте!
В данном посте я буду описывать маленькие программки, которые мне помогают и облегчают разрабатывать под MS Dynamics CRM 2011.

Рибоны (Ribbons)

Для работы с рибонами я использую CRM 2011 Visual Ribbon Editor, который я нашел на Codeplex где, кстати, много всего полезного найти можно.

Выглядит очень наглядно и удобно.

crmvisualribboneditor

Для работы с рибонами я также использую Ribbon Browser, он только показывает, но, работает быстро и показывает все, что есть на рибоне, что очень полезно если надо что-то хакнуть на стандартных кнопках, табах, групп и т.д.
Есть еще Ribbon Editor for Microsoft Dynamics CRM 2011 но он не визуальный и, к тому же, не совсем стабильно работает, что мне, конечно, не нравится.

Сайтмап (SiteMap)

Для работы с навигационной панелью я использую SiteMap Editor for Microsoft Dynamics CRM 2011.
SiteMap editor screenshot
Все просто понятно и удобно.

В этой статье я буду писать о своем опыте использования JavaScript в MS Dynamics CRM 2011.

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

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

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

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

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

Xrm.Page.data.entity.attributes.get("telephone1").setValue("123");

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

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

Имейте в виду, что если значение пиклиста не выбрано, то getValue()/getText() вернет «undefined».
Установить значение 2 пиклиста «address1_addresstypecode»

Xrm.Page.data.entity.attributes.get("address1_addresstypecode").setValue(2);

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

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

Для выражения Xrm.Page.data.entity.attributes.get() есть сокращенный вариант Xrm.Page.getAttribute().
Если поле помечено на форме, что оно доступно только для чтения (ReadOnly) чтобы его изменить необходимо выставить ему SubmitMode = Always.

Xrm.Page.getAttribute("fieldName").setSubmitMode("always");

Отключить (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.
Обязательно надо поставить галочку напротив «Pass execution context as first parameter». Без этого не сработает.

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

Закрыть форму
Пользователю будет показано напоминание если он не сохранил изменения.

Xrm.Page.ui.close();

Открыть форму создания
entityType — имя сущности (entity logical name).

Xrm.Utility.openEntityForm(entityType);

Открыть форму создания с заполненными полями
parameters — объект с параметрами,
entityType — имя сущности (entity logical name).

var entityType = "account";
var parameters = {};
// Заполняем лукап "accountid"
parameters["accountid"] = "b053a39a-041a-4356-acef-ddf00182762b";
parameters["accountidname"] = "Имя организации"
// Следующий параметр только для поля типа Клиент, где надо указать Контакт это или Организация
parameters["accountidtype"] = "account";
// Заполняем текстовое поле "name"
parameters["name"] = "Test";
// Заполняем пиклист "address1_addresstypecode"
parameters["address1_addresstypecode"] = "3";
// Заполняем булево поле Да/Нет  "donotemail"
parameters["donotemail"] = "1";
Xrm.Utility.openEntityForm(entityType, null, parameters);

Подробнее здесь Set Field Values Using Parameters Passed to a Form.
Открыть форму существующей сущности
id — GUID экземпляра сущности,
entityType — имя сущности (entity logical name).

Xrm.Utility.openEntityForm(entityType, id);

Определить тип формы
Значения тип форм (Form type codes):
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 здесь.

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

Xrm.Page.context.getServerUrl();

С выходом 12-го роллапа функция устарела и теперь рекоммендуется делать так

Xrm.Page.context.getClientUrl();

а чтобы работало всегда то так

var ORG_URL = (typeof(Xrm.Page.context.getClientUrl) == "function") ? Xrm.Page.context.getClientUrl() : Xrm.Page.context.getServerUrl();

Получить имя организации

Xrm.Page.context.getOrgUniqueName();

Лукапы

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

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

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

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

Функция, которая заполняет лукап
Параметры:
fieldName — название поля,
id — GUID экземпляра сущности,
name — название сущности, которое будет показано в лукапе,
entityType — имя сущности (entity logical name)

// Set the value of a lookup field
function SetLookupValue(fieldName, id, name, entityType) {
if (fieldName != null) {
var lookupValue = [];
lookupValue[0] = {};
lookupValue[0].id = id;
lookupValue[0].name = name;
lookupValue[0].entityType = entityType;
Xrm.Page.getAttribute(fieldName).setValue(lookupValue);
}
}

Данная функция заполняет первое и единственное значение лукапа. Если необходимо ввести несколько значений то следует добавить к массиву lookupValue необходимое количество объектов, по одному на каждый элемент в лукапе.

Тоже самое можно сделать с помощью JSON в одну строку, что выглядит, правда уже не так красиво.

Xrm.Page.data.entity.attributes.get(fieldName).setValue([{ id: id, name: name, entityType: entityType}]);

Открыть диалоговое окно
В 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);

Обновить рибон
Обновляет только состояние Enable/Disable Rule;

Xrm.Page.ui.refreshRibbon();

Статья еще не закончена и, скорее всего, вряд ли будет, так как я буду ее пополнять по мере расширения моего собственного опыта.
Ждите обновлений…

Сегодня сдал экзамен «MB2-866: Microsoft Dynamics CRM 2011 Customization and Configuration».
Сдавал в Специалисте, 75 вопросов, проходной бал 700.
Вопросы, на мой взгляд, совпадают с теми, что можно найти в нете на 100%.

А конкретнее см. ExamCollection