logo
Конспект по ООПиП ч

37. Сортировка и фильтрация записей.

Часто при работе с БД треб-ся изменить порядок, в кот-м записи отображ-ся на экране, или же осущ-ть поиск записей, удовлетв-х опред-му критерию. Существующие в MFC классы работы с БД ODBC располагают методами, позвол-ми сортир-ть выбранные записи по любому из их полей. Кроме того, вызов опред-х мет-в этих классов предоставит возм-ть ограничить набор отображ-х записей только такими, поля кот-х содержат указ-ю инф-цию, например конкретное имя или идентиф-р. Данная операция назыв-ся фильтрацией.

1)Добавьте меню Sort (Сортировка) в основное меню приложения. Предоставьте VS автоматически определить идентификаторы команд.

2)С помощью мастера ClassWizard организуйте в классе CEmployeeView перехват четырех новых команд сортировки, используя имена функций, предложенные этим мастером. Окончательный вид окна ClassWizard показан.

3)Добавьте меню Filter (Фильтрация) в строку меню приложения. Предоставьте Visual Studio установить идентификаторы команд.

4)С пом-ю мастера ClassWizard организ-те в классе CEmployeeView перехват четырех новых команд фильтрации, используя имена функций, предложенные этим мастером.

Выберите команду InsertResource и создайте новое диалоговое окно, сделав двойной щелчок на элементе Dialоg, а затем отредакт-те диал.окно. Присвойте элементу упр-я — текстовому полю — идентификатор ID_FILTERVALUE.

5) Оставив новое диал.окно раскрытым на экране, запустите мастер ClassWizard. Раскроется диал.окно Adding a Class установите опцию Create a new class и щелкните на кнопке ОК.

6)Раскроется диал.окно New Class. В поле Name введите значение CFilterDlg.

7)В окне мастера ClassWizard щелкните на корешке вкладки Member Variables. Свяжите элемент упр-я IDC_FILTERVALUE с переменной-членом m_filterValue. Завершите работу с мастером ClassWizard, щелкнув на кнопке ОК.

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

Также и для всех.

В начало EmployeeView.cpp, после уже имеющихся директив #include,добавьте следующую строку: #include "FilterDlg.h"

Отредактируйте текст функций OnFilter…….

Все эти четыре ф-ции выз-т ф-цию DoFilter(). Далее необх-мо будет написать эту ф-цию, выполн-ю фильтрацию записей БД, представл-х в классе выборки данных. На панели ClassView щелкните правой кнопкой мыши на классе CEmployeeView и выберите в раскрывшемся контекстном меню команду Add Member Function. Укажите в раскрывшемся диалоговом окне тип функции void и введите ее объявление как DoFilter(CString col). Данный метод должен быть защищенным, так как он выз-ся только другими методами этого же класса CEmployeeView. На панели ClassView сделайте двойной щелчок на функции DoFilter() и поместите в нее текст программы.

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

Анализ функции OnSort()

Все ф-ции сортировки имеют одинаковую стр-ру. Они закрывают выборку данных, устан-т свои переменные-члены m_strSort и снова открывают выборку данных, а затем вызывают функцию UpdateData() для обновления окна представления данными из вновь полученной отсортир-й выборки данных. Однако в тексте ф-ций сортировки нет ни одного вызова ф-ции, в названии кот-й было бы слово Sort. Когда же выполн-ся сортировка? Она выполняется, когда выборка данных открывается заново.

Объект класса CRecordset исп-т спец-ю строковую переменную m_strSort для опред-я способа упорядоч-я записей. Объект анализ-т эту строковую переем-ю при формир-и выборки данных и соответственно упорядочивает выбранные из базы записи.

Анализ функции DoFilter()

Всякий раз, когда польз-ль выбирает команду из меню Filter, управляющая прог-ма вызывает соотв-й этой команде метод: OnFilterDept(), OnFilterID(), OnFilterName() или OnFilterRate(). Каждая из этих ф-ций ничего не делает, кроме вызова лок-го метода DoFilter(), передавая ему в кач-ве парам-ра строковую перем-ю, опред-ю поле, по кот-му треб-ся вып-ть фильтрацию.

Функция DoFilter() всегда отображает одно и то же диал.окно, создавая экземпляр объекта класса диалогового окна и вызывая его метод DoModal().

Если значение result не равно IDOK, значит, пользователь выполнил щелчок на кнопке Cancel и весь оператор if пропускается, а функции DoFilter() остается только закончить свою работу.

Внутри конструкции if прежде всего создается строковая перем-я, кот-я будет использ-ся для фильтрации записей БД. Строковая перем-я примен-ся для вып-я фильтрации записей так же, как это происходит при сорт-ке. В данном случае строковая перем-я наз-ся m_strFilter. Строка, кот-я исп-ся для фильтрации записей БД, д.иметь след. формат: ИдентификаторПоля = Значение

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

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

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

41. Доступ к данным в Visual C++. Технологии UDA, OLE DB.

Первоначально OLE была задумана как технология интеграции программных продуктов, входящих в комплект Microsoft Office. Предшественницей OLE является реализованная в Windows технология динамического обмена данными DDE (Dynamic Data Exchange), до сих пор широко применяемая в этой среде.

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

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

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

Низкая популярность DDE вынуждала Microsoft искать различные способы его усовершенствования.

Для решения этой проблемы архитекторы OLE создали группу технологий,область применения которых гораздо шире составных документов (DDE). Основу OLE 2 составляет важнейшая из этих технологий — Модель многокомпонентных объектов (Component Object Model — СОМ). Новая версия OLE не только

обеспечивает поддержку составных документов лучше, чем первая, но и, несомненно, идет куда дальше простого объединения документов, созданных в разных приложениях. OLE 2 позволяет по-новому взглянуть на взаимодействие

любых типов программ.

Новые возможности программных систем многим обязаны СОМ,

предоставившей общую парадигму взаимодействия программ любых типов: библиотек, приложений, системного программного обеспечения и др. Вот почему подход, предложенный СОМ, можно использовать при реализации практически любой программной технологии, и его применение дает немало существенных

преимуществ.

42. Основные методы класса CDatabase.

Объекты этого класса исп-ся для соед-я с БД, поср-м кот-го м. манипулир-ть источником данных.

1)Данные. Эти комп-ты класса CDatabase хранят инф-цию, исп-ю в том случае, когда вы хотите работать непосредственно с БД, к которой присоединен объект CDatabase.

2)Создание соединения. В эту категорию входят конструктор и методы для открытия/закрытия базы данных.

3)Атрибуты данных. Сюда отн-ся десять ф-ций, исп-х для получения инф-ции о БД, к кот-й присоединен объектов CDatabase.

4)Операциипять ф-ций, позволяющих обрабатывать транзакции и непосредственно выполнять команды SQL

5)Переопределяемые методы. Один метод, позвол-й прогр-ту более конкретно настроить функционирование объекта CDatabase.

2)Создание соединения

CDatabase::CDatabase {}

Служит для создания объекта CDatabase:

Class cPublDoc: public CDocument

{public: // Объявляем объект CDatabase в документе

CDatabase m_dbPubl; ... };

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

virtual BOOL CDatabase::Оpen

( LPCTSTR lpszDSN, BOOL bExclusive = FALSE,

BOOL bReadOnly = FALSE,LPCTSTR lpszConnect = "ODBC;",

BOOL bUseCursorLib = TRUE)

Параметр lpszDSN определяет имя источника данных, кот-е должно быть зарег-но с пом-ю прог-мы ODBC Administrator. Это значение д.б. равно NULL, если DSN (Data Source Name, Имя источника данных) определено в строке lpszConnect, или м.б. равно NULL, если необх-мо предост-ть польз-лю блок диалога для выбора источника данных.

Параметр bExclusive: источник данных всегда открыв-ся для совм-го использ-я, и знач-е парам-ра д.б. равно FALSE, в противном случае будет выдано сообщение об ошибке.

Параметр bReadOnly позв-т устан-ть соед-е с источником данных в режиме "только для чтения" (TRUE), что приводит к запрещению его обновл-я. После устан-я такого соед-я все зависимые результир-е множества наследуют этот атрибут.

Парам-р lpszConnect опред-т строку, описыв-ю соед-е, кот-я содержит инф-ю об источнике данных, идентиф-ре польз-ля, имеющего к нему доступ, пароль, если он треб-ся ист-ку данных, и другую инф-цию. Для совместимости с буд-ми версиями треб-ся, чтобы эта строка начиналась с подстроки "ODBC", указ-щей на то, что соединение устан-вается с источником данных ODBC.

Параметр bUseCursorLib указ-т на необх-ть (TRUE) или необязат-ть загрузки динамич-й библ-ки ODBC Cursor Library, позволяющей работать с курсорами БД.

Упрощенная версия рассмотренной функции имеет вид:

virtual BOOL CDatabase::OpenEx

( LPCTSTR lpszConnectString,DWORD dwOptions = 0)

Парам-р lpszConnectString опред-т строку соед-я с источником данных ODBC, кот-я включ-т его имя, а также доп-ю необязат-ю инф-цию, такую как идентиф-р и пароль пользователя, например,

"DSN=Publisher;USERID=sa;PWD=irishka".

Если в кач-ве парам-ра передается NULL, то выв-ся блок диалога Data Source, в кот-м польз-ль м.выбрать источник данных. Параметр dwOptions -- битовая маска, которая определяет комбинацию следующих значений:

CDatabase::openExclusive -- в VS C++ до версии 6.0 не поддерживается источник данных всегда открывается для совместного использования. При задании этой опции будет выдано сообщение об ошибке.

CDatabase::openReadOnly -- источник данных открывается в режиме “только для чтения”.

СDatabase::openUseCursorLib -- указывает на необходимость загрузки динамической библиотеки ODBC Cursor Library, позволяющей работать с курсорами.

CDatabase::noOdbcDialog -- не выводить блок диалога

CDatabase::forceOdbcDialog -- всегда выводить блок диалога соединения

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