Кастомизация
13
Ноя
15

Приемы работы с Представлением

Подборка несколько полезных примеров получения данных из представления в CRM. Код приведенный здесь можно использовать в кнопках, которые выведены на панель инструментов какого-либо представления. Делается это в ISV.confige.

Кое-что из этого материала передается автоматически, когда Вы определяете параметр PassParams = 1 для кнопки (также в ISV.confige), но часто приходится с помощью JavaScript создавать динамические ссылки, и использование данного параметра не подходит.

«Введение в специальность»

Сначала немножко теории… Чтобы получить список записей можно воспользоваться таким кодом:

var a = document.all['crmGrid'].InnerGrid.SelectedRecords;

В этом коде, в переменную «a» записываются выделенные в представлении записи. Причем в виде двумерного массива. В первом измерение хранятся отдельные строки, а во втором параметры каждой строки. Вот их перечень (здесь i – номер строки):

  • a[i][0] – возвращает guid записи;
  • a[i][1] – возвращает код типа объекта каждой конкретной записи. Полезно если в представлении содержится несколько типов объектов (например, в представлении Действий могут находиться Задачи, Письма и т.д.);
  • a[i][2] – возвращает отсчитываемый от нуля порядковый номер записи. Если Вы выбрали первую запись, то вернется «0». если вторую, то «1» и т.д. ;
  • a[i][3] – возвращает ссылку на текущий элемент строки таблицы представления. Это довольно полезно, потому что позволяет получить значение различных столбцов представления.

Получение GUID массива записей

Следующий код позволит Вам получать массив, содержащий guid выбранных записей в представлении:

// получение массива записей выделенных в представлении
var a = document.all['crmGrid'].InnerGrid.SelectedRecords;
var selectedItems = new Array(a.length);
for (var i=0; i < a.length; i++) {
	selectedItems[i] = a[i][0];
}
alert(selectedItems);

Значение произвольного столбца

Текстовое поле

Предположим, что мы хотим получить значение столбца FullName для выбранной строки. Во-первых, мы должны будем получить объекты строки:

// получаем массив выделенных строк
var a = document.all['crmGrid'].InnerGrid.SelectedRecords;
var rows= new Array(a.length);

// перебираем строки
for (var i=0; i < a.length; i++) {

	// обращаемся к четвертому параметру [3]
    rows[i] = a[i][3];
	
    // выводим заголовок третьего столбца, являющегося в стандартной настройке FullName’ом
    var nameCell = rows[i].cells[2];
    alert(nameCell.childNodes[0].title);
    
}

Обратите внимание на то как происходит получение FullName’а – это третий столбец в представлении (первые 2 столбца всегда будут столбцами чекбокса и рисунка со стрелкой). Поэтому мы обращаемся к 3-ьей ячейкой ([2] потому что отчет начинается с нуля) в строке как с объектом, названным nameCell. Если посмотреть на HTML ячейки FullName, то можно найти там следующее:

<NOBR title="Ежик">Ежик</NOBR>

Атрибут title элемента NOBR равен тому же значению, которое отображается в столбце. Поэтому, чтобы получить значение, мы можем сделать одну из двух вещей:

nameCell.childNodes[0].title

или

nameCell.childNodes[0].innerText

Лукап

Надо заметить, что innerHTML (и таким образом, дочерние узлы) ячеек в строке являются различными в зависимости от типа полей отображаемых столбце. Поэтому, чтобы добраться до значения, например, Lookup’а Вам, вероятно, придется переместиться через несколько дополнительных childNodes:

// получение GUID’а и кода типа объекта столбца имеющего тип лукап
var lookupCol= rows[i].cells[3].childNodes[0].childNodes[0];
var id = lookupCol.oid;
var otc = lookupCol.otype;

Структуру остальных типов полей можно посмотреть в HTML-коде.

ID представления и код типа объекта

Во-первых, вот, как получить Id отображенного представления и Object Type Code записи, которые он возвращает:

// получаем GUID и код типа объекта представлении (не записей в представлении, а самого представления; например, 1039 это savedquery)
var sViewId = document.all['crmGrid'].GetParameter('viewid');
var sViewType = document.all['crmGrid'].GetParameter('viewtype');

Чтобы получить Object Type Code записей, которые находятся в представлении, используйте следующее:

var sOtc = document.all['crmGrid'].GetParameter('otc');

ID и тип кода объекта основного объекта

Если представление, с которым Вы работаете, отображается в связанных записях, то чтобы с его панели инструментов получит код типа объекта и GUID основного объекта:

// получение GUID и код типа объекта основной записи (когда представление находится в связанных записях)
var oId = document.all['crmGrid'].GetParameter('oId');
var oType = document.all['crmGrid'].GetParameter('oType');

Все записи представления

Получение всех записей представления (но только на текущей странице):

// массив всех записей на текущей странице
var iTotal = document.all['crmGrid'].InnerGrid.NumberOfRecords;
var o = document.all['crmGrid'].InnerGrid;
var allItems = new Array;
var ii = 0;
for (var i=0; i &lt; iTotal; i++)
{
    allItems[ii] = o.rows[i].oid;
    ii++;
}
alert(allItems);

Представление в XML

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

var gridXml = document.all['crmGrid'].gridXml;

Обновление представлния

Чтобы обновить список записей в представлении воспользуйтесь этим кодом:

crmGrid.Refresh();

А теперь посмотрим как сделать что-нибудь полезное…

Передача параметров в URL

В данном примере попробуем из представления инициировать создание связи с помощью объекта Отношения (Customer Relationship). Обычно это делается из связанного представления, объекта Отношение (например, карточки Бизнес-партнер).

Чисто «технически», записи не будут связываться непосредственно в представлении. Это будет происходить на форме. Но мы уменьшим количество шагов для этой операции, посредством предзаполнения части данных. А передаваться данные на форму будут с помощью строки URL.

Если Вы попытаетесь создать объект Отношений через связанное представление, например Бизнес-партнера, то увидите в строке URL следующие:

http://crm2008/superfirma/sfa/customerrelationships/edit.aspx?_CreateFromType=1&amp;_CreateFromId=%7bBBFF77D3-94C5-DE11-A985-000C298F544B%7d

Т.е. передается тип основной записи и ее GUID.

Скрипт по формированию урла имеет такой вид:

var a = document.all['crmGrid'].InnerGrid.SelectedRecords; 
//проверяем что выделена только одна запись
if(a.length == 1) {

	guid = a[0][0];
	type = a[0][1];
   
    // собираем все параметры в одной строке
	var url = '/sfa/customerrelationships/edit.aspx?_CreateFromType=' + type + '&_CreateFromId=' + guid;
    
    // открываем модальное окно и передаем в него URL
	window.showModalDialog(url,'','dialogHeight:500px;dialogWidth:700px;status:no;resizable:yes');

} else {

	alert('Вы должны выделить только одну запись!');

}

Осталось подставить этот код в кнопку представления в ISV.Config’е, например, для объекта Бизнес-партнер (заметьте, что при этом мы заменили & на &amp;):

<Entity name="account">
	<Grid>
		<MenuBar>
			<Buttons>
				<Button Icon="/_imgs/ico_18_debug.gif" JavaScript="
					var a = document.all['crmGrid'].InnerGrid.SelectedRecords; 
					//проверяем что выделена только одна запись
					if(a.length == 1) {

						guid = a[0][0];
						type = a[0][1];
                     
					// собираем все параметры в одной строке
					var url = '/sfa/customerrelationships/edit.aspx?_CreateFromType=' + type + '&amp;_CreateFromId=' + guid;
                      
					// открываем модальное окно и передаем в него URL
					window.showModalDialog(url,'','dialogHeight:500px;dialogWidth:700px;status:no;resizable:yes');

					} else {

						alert('Вы должны выделить только одну запись!');

					}

					">
					<Titles>
						<Title LCID="1049" Text="Отношение" />
						</Titles>
				</Button>
			</Buttons>
		</MenuBar>
	</Grid>
</Entity>

Импортируете ISV.Config в CRM, переходите к представлению Бизнес-партнера, выделяете запись и жмете новый батон – откроется окно создания отношений с предзаполненным полем «Сторона 1».


Лирическое отступление

В этом примере происходит автоматическое подставление передаваемых параметров в поле с помощью стандартного функционала. Если же Вы хотите передавать свои собственные параметры и обрабатывать особым образом Вам нужно будет во-первых разрешить их, а во-вторых парсить строку URL, чтобы вытащить эти саамы параметры. Боле подробно можете ознакомится в статье Передача кастомных параметров в строке запроса CRM 4.

Комментарии (15)
  • Дмитрий 13.11.2009

    Добрый день!

    подскажите пожалуйста, существует ли возможность окрашивать строки в представлении в разные цвета в зависимости от значения одного из столбцов?

  • slivka_83 13.11.2009

    Здрасьте 🙂

    Ну, вот пример http://blog.odynia.org/archives/14-Colourising-Microsoft-CRM-Grids.html

    Хотя я бы на Вашем месте использовал бы jQuery http://mmcrm.ru/?p=681

  • R3d 13.11.2009

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

  • slivka_83 13.11.2009

    Думаю что возможно… для этого нужно воспользоваться не поддерживаемой кастомизацией и подправить один из главных файлов. Например, HomePage.aspx, bar_Top.aspx, loader.aspx. В которых повесить функцию, которая будет обращатся к представлению в дочернем айфреме и обновлять его. Это код будет представлять собой замкнутую на себе функцию setTimeout (http://javascript.ru/setTimeout).

  • R3d 13.11.2009

    Да, примерно так и сделал, только правил файл, который непосредственно за поведение грида отвечает.
    Еще один оффтоп вопросик нарисовался по поводу autoresolve в partylist’ах. При получении емэйла, если адрес принадлежит и клиенту и контакту, црм не может сделать авторезолв, и предлагает привязать мэйл к существующему объекту или к новому. Так вот можно ли при привязке к существующему в форму лукапа передавать значение этого емэйла для поиска?

  • slivka_83 13.11.2009

    Я не совсем понял вопроса… Вы хотите с помощью скрипта разрезолвить e-mail адрес?

  • R3d 13.11.2009

    Либо так, либо чтобы при ручном резолве в поле поиска автоматически подставлялся этот адрес, поскольку среди всех клиентов и контактов искать проблематично.

  • Дмитрий 13.11.2009

    Добрый день!

    подскажите каким способом можно передать массив данных (нужно передавать несколько выделенных строк)

  • slivka_83 13.11.2009

    Передать куда? и как? с помощью скрипта? и о каком массиве идет речь?

  • slivka_83 13.11.2009

    >R3d

    Ну пати лист пердтсавляет собой массив
    crmForm.all.patylist.DataValue[0]
    crmForm.all.patylist.DataValue[1]
    crmForm.all.patylist.DataValue[2]
    и т.д.

    Думаю его надо перебрать и найти какое-нибудь из не заполненных полей лукапа: id и/или typename
    Что то вроде:
    crmForm.all.patylist.DataValue[0].id
    crmForm.all.patylist.DataValue[1].id
    crmForm.all.patylist.DataValue[2].id

    А после того как найдем искать в контактах или бизнес-партнерах (в зависимости от того что вам нужно) с помощью соап запроса эти недостающие данные и подставить.

    А чтобы задать строку поиска для диалогового окна поиска лукапа посмотрите тут http://mmcrm.ru/?p=513

  • Анатолий 13.11.2009

    Подскажите — а таким образом можно создать из одной карточки определенной кустомной сущности клон этой карточки.

  • slivka_83 13.11.2009

    Если не в терпеж, то можете посмотреть http://mmcrm.ru/?p=849 или это http://mmcrm.ru/?p=699… еще можно написать бизнес-процесс.
    Но я сейчас как раз готовлю большую статью на эту тему и если подождете немного, то получите большую свободу выбора (планирую на выходных выложить — сейчас комп в ремонте, вот жду его «выздоровления»).

  • slivka_83 13.11.2009

    Готово 🙂 можете смотреть 🙂 http://mmcrm.ru/?p=899

  • Константин 13.11.2009

    А можно ли как-то определить номер текущей записи на форме в данном представлении представлении?

  • slivka_83 13.11.2009

    Вопрос не понятен. Что такое номер? Поле? GUID? Так на форме ил в представлении? Откуда определяем?

*

code