Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Анализ функции OnRecordDeleteO




Удаление записи выполняется достаточно просто. Функция OnRecordDelete()вызывает функцию Delete(), являющуюся членом класса выборки данных. После выполнения удаления вызов метода MoveNext() класса выборки данных позволяет организовать переход к отображению следующей записи таблицы.

Однако здесь может возникнуть проблема, если удаляемая запись была в таблице последнейили же единственной. Вызов метода IsEOF() класса CRecordset позволяет выяснить, достигнут ли конец последовательности записей. Если эта функция возвращает TRUE, то указатель записи нужно поместить на последнюю запись в текущей выборке. Для этого используется метод класса выборки данных MoveLast().

Когда все записи из текущей выборки данных будут удалены, указатель текущей записи будет находиться в начале выборки. Программа может проверить наличие такой ситуации посредством вызова метода IsBOF() класса CRecordset. Если эта функция возвращает TRUE, программа устанавливает значения полей текущей записи равными NULL.

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

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

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

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

Объект класса CRecordSet (как и объект любого другого класса, производного от CRecordSet, например объект класса CDBSet в этой программе) использует специальную стро­ковую переменную m_strSort для определения способа упорядочения записей. Объект анали­зирует эту строковую переменную при формировании выборки данных и соответственно упорядочивает выбранные из базы записи.

Анализ функции DoFilter().Всякий раз, когда пользователь выбирает команду из меню Filter, управляющая програм­ма вызывает соответствующий этой команде метод: OnFi lterDept(), OnFilterUserlD(), OnFiIterMiddleName() или OnFilterEMail(). Каждая из этих функций ничего не делает, кроме вызова метода DoFilter(), передавая ему в качестве параметра строковую переменную, опреде­ляющую поле, по которому требуется выполнить фильтрацию.

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

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

ИдентификаторПоля = Значение

Здесь ИдентификаторПоля является аргументом типа CString функции DoFiIter(), а Значе­ние вводится пользователем в диалоговом окне. Например, если пользователь выберет ко­манду фильтрации по полю отдела и введет в диалоговом окне значение фильтра hardware, функция DoFiIteг() должна будет создать строку.

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

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

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

 

Схема процесса обмена данными между источником данных и экранной формой с использованием классов CRecordSet и CRecordView. Режимы работы с наборами данных Snapshot и Dynaset.

Класс CRecordset

Все компоненты и методы этого класса можно разбить на семь категорий:   

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

· Конструирование. В эту категорию входят конструктор и методы для от-крытия/закрытия форм базы данных.

· Атрибуты результирующего набора. Функции, используемые для получе-ния информации о результирующем наборе, к которому присоединен объект класса CRecordset.

· Операции обновления результирующего набора. Четыре операции, предна-значенные для обработки транзакций.

· Операции перемещения по результирующему набору. Функции, позволяю-щие перемещаться по записям результирующего набора.

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

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

CRecordset::dynaset          Результирующий набор с возможностью двунаправленного просмотра. При этом режиме изме-нения, вносимые в базу данных другими пользователями, отображаются сразу же. К сожалению,

декларированное поведение результирующего    набора при этом режиме не поддерживается   

CRecordset::snapshot       Статический результирующий набор с возможностью двунаправленного просмотра. При этом режиме изменения, вносимые в базу данных другими пользователями, отображаются не сразу, а

только после закрытия и повторного открытия pe-зультирующего набора.

Класс CRecordView

Объекты этого класса предоставляют для изображения записей базы данных в элементах управления форму, которая непосредственно соединена с объектом CRecordset. Объекты CRecordView используют механизм DDX (Dialog Data Exchange, Обмен данными с блоком диалога) и RFX (Record Field Exchange, Обмен полями записей) для автоматического перемещения данных между элементами управления формы и полями результирующего набора. Кроме того, можно воспользоваться реализованными возможностям перемещения по записям и обновления текущей записи.

Вce компоненты и методы этого класса можно условно разбить на три категории.

· Создание объекта. Имеется только конструктор для создания объекта.

· Атрибуты данных. Три функции, используемые для получения информации результирующем наборе, к которому присоединена форма.

· Операции, Единственная функция, позволяющая программисту изменить указатель на текущую запись.

Ниже приведено описание каждой из этих категорий.

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 233.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...