Сообщений 1    Оценка 0        Оценить  
Система Orphus

Расширенная функциональность универсального класса Grid в VFP

Автор: Юлия Маринченко
Источник: RSDN Magazine #3-2005
Опубликовано: 08.10.2005
Исправлено: 22.12.2005
Версия текста: 1.0
Методы работы с удалёнными данными.
Использование обновляемых курсоров
Использование сквозных запросов
Функциональность модифицированного класса Grid.
Фильтрация
Поиск данных
Работа с обновляемыми курсорами
Заключение

Методы работы с удалёнными данными.

Основной задачей приложения для работы с базами данных, основанного на модели "Клиент-Сервер" (далее – просто приложение), является сохранение, удаление и редактирование данных, хранящихся на сервере (в данном случае имеется в виду SQL-сервер). Основным средством работы с данными является компонент класса Grid в Visual FoxPro.

Работа с объектом Grid может осуществляться в двух основных режимах:

Эти режимы значительно отличаются друг от друга, и имеют свои недостатки и преимущества. Рассмотрим подробнее режим использования обновляемых курсоров.

Использование обновляемых курсоров

Под обновляемыми курсорами понимают высокоуровневые конструкции, которые служат для непосредственного доступа к данным SQL-сервера. Рассматриваемые объекты содержат информацию о способе соединения с сервером, спектре требуемых данных (строка запроса), буферизации и многое другое. Главным достоинством обновляемых курсоров является существование встроенного механизма переноса изменённых данных на сервер (вставка, удаление, редактирование) или сброса изменённых данных (благодаря выбранному типу буферизации), что снимает эту задачу с программиста. В обновляемых курсорах также предусмотрен механизм импорта данных с сервера. Но следует быть внимательным при использовании обновляемых курсоров в том случае, если:

Преодолеть последний недостаток может помочь тот факт, что в Visual Fox Pro 8.0 появилась новая модель обновляемого курсора - объект CursorAdapter, в котором, кроме всех преимуществ уже существовавшей модели (объекта RemoteView) появилась возможность изменять программно спектр запрашиваемых с сервера данных.

Использование сквозных запросов

Режим использования сквозных запросов не имеет никаких ограничений в использовании и не требует больших временных затрат при импорте данных с сервера, но в данном случае на программиста ложится задача отслеживания изменённых данных и разработки механизма вставки, редактирования и удаления, а также задача обновления данных. В данном случае источником объекта Grid служит временная таблица (курсор), с которым производится вся работа.

Функциональность модифицированного класса Grid.

Нами был реализован модифицированный класс Grid, предоставляющий следующие дополнительные функции:

Главное преимущество данного класса Grid состоит в его универсальности, т.е. все предоставляемые функции могут быть эффективно использованы в любом приложении, разработанного в среде Visual Fox Pro, если базовым классом для Grid является рассматриваемый модифицированный класс.

Фильтрация

Эффективная организация – один из важнейших аспектов при разработке СУБД-приложения. Фильтрация записей – стандартная и распространенная операция, позволяющая пользователю выбирать нужные ему данные из всего объема данных. Пожалуй, нет таких СУБД-приложений, в которых бы не использовались различные модули фильтрации. На программном уровне это происходит с помощью SQL запросов или фильтров. По сути дела фильтр – это запрос к одной таблице.

Сейчас существует множество различных приложений, использующих свои средства построения запросов, и в каждом приложении существует свой собственный построитель фильтров (а в большинстве случаев и не один), ориентированный только под данную программу или экранную форму. В одних случаях это громоздкий модуль, в котором нужно произвести большое количество операций, прежде чем добиться нужного результата, даже если нужно всего лишь произвести простой запрос к БД, в другом случае наоборот. Зачастую разработчики конструируют фильтр, позволяющий использовать только ввод значений в поле вручную, чего, на мой взгляд, недостаточно для более опытного пользователя. Сравните два фильтра, показанных на рисунке 1 - универсальный (вверху) и не универсальный (внизу).


Рисунок 1. - Сравнение фильтров.

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

В форме фильтра пользователю необходимо выбрать поле, на которое налагается отношение, само отношение и значение (см. рисунок 2).


Рисунок 2. - Форма построения простого фильтра

Для построения нового условия необходимо выбрать поле, на которое налагается условие, предполагаемый тип условия (>,<,=<> и многое другое) значение того же типа данных, что и выбранное поле (см. Рисунок 3).


Рисунок 3. - Выбор параметров для генерации условия.

В данном модуле предусмотрено несколько вариантов определения значения, входящего в условие:

После нажатия на кнопку «…» на экране появляется форма, содержащая значения данного поля (Рисунок4).


Рисунок 4. - Форма просмотра различных значений.

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

Но не всегда одного условия в выражении фильтрации достаточно для отбора нужной информации. Это часто случается, когда фильтруемая таблица содержит множество полей. На этот случай в модуле фильтрации предусмотрен раздел «Сложный фильтр» (см рисунок 5).


Рисунок 5. - Форма построения сложного фильтра

Форма сложного фильтра предусматривает возможность составления условий, где значениями могут служить как другие однотипные поля источника объекта Grid, так и формулы, включающие однотипные поля.

Замечу, что все условия фильтрации генерируются на русском языке, что облегчает понимание для неопытных пользователей. Так же присутствует возможность сохранения и редактирования сложных фильтров для последующего использования определённым пользователем с определённой таблицей. Хранение сложных фильтров может производиться как на сервере (если есть доступ к удалённым данным), так и на локальной машине (в случае отсутствия доступа к серверу). Репозиторий фильтров создаётся автоматически.

Поиск данных

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

Работа с обновляемыми курсорами

Обновляемые курсоры можно создавать как программно, так и с использованием конструктора. Имеющиеся конструкторы для обновляемых курсоров в некоторых случаях работают некорректно.

При осуществлении работы с обновляемыми курсорами выявились следующие проблемы:

Была разработана собственная модель формирования RemoteView, которая включает в себя две программы. Одна из программ служит для создания в приложении удаленного представления по xml-спецификации, другая же предназначена для обратного действия – по существующему Remote View создать спецификацию в виде xml-файла. Xml-спецификации могут храниться как в одном, так и в разных файлах.

Модель создания адаптера курсора формирует CursorAdapter, который является точной копией RemoteView в соответствии со строкой запроса, способом соединения, списком автоматически обновляемых полей и помещает обновляемый курсор в DataInvironment экранной формы, удаляя при этом исходный RemoteView.

Обновление курсора осуществляется независимо от типа. Для RemoteView происходит просто перезагрузка данных с SQL-сервера с сохранением текущей записи курсора. Для CursorAdapter происходит загрузка информации с SQL-сервера с использованием нового условия, полученного путём использования модуля фильтрации.


Рисунок 6. - Форма для выбора параметров условия строки запроса

Интерфейс построения условия фильтрации аналогичен интерфейсу построения условия строки запроса (см. рисунки 2 и 6).

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

Программное изменение строки запроса программно основано на том, что исходная строка разбивается на смысловые части такие, как:

Изменение спектра запрашиваемых данных происходит путём формирования условия в экранной форме (см. Рисунок 6) и добавления этого условия к переменной части условия строки запроса.

При создании объекта CursorAdapter в общем случае переменная часть условия не содержит отношений, но существует возможность определения переменной части условия запроса при создании обновляемого курсора с помощью передачи значения в качестве параметра в процедуру создания адаптера курсора.

Заключение

Разработчику СУБД-приложения приходиться создавать множество фильтров для экранных форм. Эти модули выполняют одинаковые операции, но используются для разных таблиц и различных экранных форм, что не позволяет использовать один и тот же фильтр и вынуждает разработчика постоянно переписывать код фильтра.

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

В ходе работы был практически создан новый, расширенный класс объекта Grid с одним дополнительным методом – методом фильтрации данных. Параметры метода полностью определяются источником данных объекта Grid, и разработчику нет необходимости писать собственные программы фильтрации.

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

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

Также был реализован модуль динамической генерации объекта CursorAdapter по указанному RemoteView. Это позволило избежать трудностей, возникающих при создании объекта CursorAdapter с помощью конструктора:

Применение описанных технологий позволило:

Это позволило существенно оптимизировать загрузку данных с SQL-сервера, а, следовательно, повысить эффективность работы приложений.


Эта статья опубликована в журнале RSDN Magazine #3-2005. Информацию о журнале можно найти здесь
    Сообщений 1    Оценка 0        Оценить