Публикация

Сортировка в гриде при использовании сервиса ADODataset

Часто нам приходится работать с данными из других систем или баз данных. Для получения информации обычно используем сервис ADODataset. Единственная проблема, которая уменьшала область его применения - это отсутствие сортировки. Если необходимо создать сортировку, мы прописываем или подставляем в SQL тексте запроса явным образом:

SELECT ID, Name, Code FROM Customers ORDER BY Name

Если выборка используется для интеграции и не требует отображения в гриде, то такое решение подходит. Но что делать если отображаем данные в гриде и при этом нужна сортировка?

Предлагаю простое решение, которое позволит сэкономить Ваше время и реализовать сортировку в гриде при использования в качестве источника данных ADODataset.

Что нужно сделать:
Создать сервис ADODataset
В сервисе указать соединение (1) и ввести текст запроса (2) без указания сортировки:

Создание сервиса ADODataset

Выбрать в левой части дизайнера узел всех полей DataFields и в контекстном меню по правой кнопке выбрать пункт "Добавить все поля":

Добавить все поля в ADODataset

Если соединение верно, то в дизайнере будут добавлены все поля из запроса:

Поля, добавленные в сервис ADODataset

Создадим сервис окна 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 в самом низу добавляем новую функцию:

// Sort ADODataset by View Columns
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:
function wnd_ADOTestOnPrepare(Window) {
        DatasetLink.Dataset.Open();
}

Где DatasetLink - это имя невизуального компонента DatasetLink.
Сохраняем все сервисы.

Запускаем в командной строке:
TSCRM.exe /wnd=wnd_ADOTest

Получаем результат:
Сортировка в окне при использовании ADODataset

Нравится

Поделиться

0 комментариев
Показать все комментарии