Часто нам приходится работать с данными из других систем или баз данных. Для получения информации обычно используем сервис ADODataset. Единственная проблема, которая уменьшала область его применения - это отсутствие сортировки. Если необходимо создать сортировку, мы прописываем или подставляем в SQL тексте запроса явным образом:
Если выборка используется для интеграции и не требует отображения в гриде, то такое решение подходит. Но что делать если отображаем данные в гриде и при этом нужна сортировка?
Предлагаю простое решение, которое позволит сэкономить Ваше время и реализовать сортировку в гриде при использования в качестве источника данных ADODataset.
Что нужно сделать:
Создать сервис ADODataset
В сервисе указать соединение (1) и ввести текст запроса (2) без указания сортировки:
Выбрать в левой части дизайнера узел всех полей DataFields и в контекстном меню по правой кнопке выбрать пункт "Добавить все поля":
Если соединение верно, то в дизайнере будут добавлены все поля из запроса:
Создадим сервис окна wnd_ADOTest. В окно добавим компонент DataGrid. На созданном компоненте создадим представление DataGridView и сразу выберем его в свойство ActiveView. На представлении (DataGridView) правой кнопкой выбираем пункт меню "Определить колонки" и выбираем две колонки Name и Address, для которых включаем галочку "Видимая". Подтверждаем выбор.
На закладке "Невизуальные компоненты" добавим компонент DatasetLink и в его свойствах выберем имя датасета который мы создали. Для DataGrid необходимо выбрать свойство DatasetLink на созданный датасет.
На закладке "События" для невизуального компонента DatasetLink создать обработчик события OnDatasetBeforeOpen(двойным кликом на поле события) и ввести текст обработчика события:
// wnd_ADOTestScript
//-----------------------------------------------------------------------------
var ADOTestScript = new Object();
function DatasetLinkOnDatasetBeforeOpen(Dataset, DoOpen) {
SortADODatasetByViewColumns(ADOTestScript, Dataset, DataGridView);
}
В созданный сервис скрипта подключите скрипт scr_DB (3), добавьте строку для определения глобального объекта скрипта (4) и в текст обработчика поместите строку (5):
В параметрах функции ADOTestScript - это глобальный объект скрипта, Dataset - ссылка на датасет а DataGridView - это имя компоненты представления реестра (грида).
Осталось добавить саму функцию, которую хотим вызвать в скрипт scr_DB (для его открытия из дизайнера текущего сервиса скрипта необходимо нажать двойной клик мышкой на включении в скрипт (3). В открывшемся сервисе scr_DB в самом низу добавляем новую функцию:
function SortADODatasetByViewColumns(GlobalObject, ADODataset, DataGridView) {
var ViewAlias = DataGridView.Name;
if (!GlobalObject[ViewAlias + 'IsAssignedSQLText']) {
GlobalObject[ViewAlias + 'SQLText'] = ADODataset.SQLText;
GlobalObject[ViewAlias + 'IsAssignedSQLText'] = true;
}
var SortColumns = new Array();
for (var i = 0; i DataGridView.Count; i++) {
var Column = DataGridView.Items(i);
if (Column.OrderPosition > 0) {
var SortColumn = new Object();
SortColumn.OrderPosition = Column.OrderPosition;
SortColumn.OrderType = Column.OrderType;
SortColumn.DataFieldName = Column.DataFieldName;
SortColumns.push(SortColumn);
}
}
for (var i = 0; i SortColumns.length - 1; i++) {
var LColumn = SortColumns[i];
for (var j = i + 1; j SortColumns.length; j++) {
var RColumn = SortColumns[j];
if (LColumn.OrderPosition > RColumn.OrderPosition) {
SortColumns[j] = LColumn;
SortColumns[i] = RColumn;
}
}
}
var OrderByClause = '';
for (var i = 0; i SortColumns.length; i++) {
var Column = SortColumns[i];
if (OrderByClause == '') {
OrderByClause = ' ORDER BY ';
} else {
OrderByClause = OrderByClause + ', ';
}
var LDataField = ADODataset.DataFields.ItemsByName(
Column.DataFieldName);
for (var j = 0; j ADODataset.DataFields.Count; j++) {
var RDataField = ADODataset.DataFields.Items(j);
if (LDataField.Name == RDataField.Name) {
var Index = j + 1;
OrderByClause = OrderByClause + Index;
break;
}
}
if (Column.OrderType == otDesc) {
OrderByClause = OrderByClause + ' DESC';
}
}
ADODataset.SQLText = GlobalObject[ViewAlias + 'SQLText'] + OrderByClause;
}
Для запуска тестового окна добавляем событие OnPrepare:
DatasetLink.Dataset.Open();
}
Где DatasetLink - это имя невизуального компонента DatasetLink.
Сохраняем все сервисы.
Запускаем в командной строке:
TSCRM.exe /wnd=wnd_ADOTest
Получаем результат: