пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Добавление и удаление записей в технологии ODBC.

 

Когда мы включим в создаваемое прилож-е возм-ть добавлять и удалять записи в таблице БД, оно превратится в полнофункц-ю программу обработки однофайловой (но не реляционной) БД. В нашем случае в роли однофайловой базы данных выступает таблица Employee реляционной базы данных универмага. Добавление и удаление записей в таблице базы данных реализуется достаточно просто благодаря существованию в Visual C++ классов CRecordView и CRecordset, предоставляющих все необходимые методы для выполнения этих стандартных операций. Необходимо будет добавить в приложение несколько команд меню.

1.Щелкните на корешке вкладки ResourceView. откройте папку Menu и сделайте двойной щелчок на меню IDR_MAINFRAME.

2.Щелкните в меню Record, выберите команду View->Properties. В поле ID введите значение ID _RECORD_ADD, а в поле Caption введите значение &Add Record.

3.В следующий пустой элемент меню внесите команду удаления, имеющую идентификатор ID_RECORD_DELETE (поле ID) и заголовок &Delete Record (поле Caption).

Далее необходимо добавить на панель инструментов пару новых пиктограмм и связать с ними эти команды: В дереве ресурсов в окне Resource View откройте папку Toolbar и сделайте двойной щелчок на идентификаторе IDR_MAINFRAME.

Щелкнув на пустой пиктограмме панели инстр-в, выберите ее, а затем с пом-ю инструм-в графич-го редактора нарисуйте на ней голубой знак «плюс».

Сделайте двойной щелчок на новой пиктограмме панели инструментов. В списке ID выберите значение ID_RECORD_ADD.

Снова выделите пустую пиктограмму панели инструментов и нарисуйте на красный знак “-”; присвойте пиктограмме идентификатор ID_RECORD_DELETE.

Выполните следующие операции:Раскройте окно Class Wizard и выберите в нем вкладку Message Maps. В списке Class Name выберите значение CEmployeeView, а в списке Object Ids выберите значение ID_RECORD_ADD, после чего сделайте двойной щелчок на значении COMMAND в списке Messages. Раскроется диалоговое окно Add Member Function.

4.В окне ClassView, дважды щелкнув на элементе CEmployeeView, откройте файл EmployeeView.h. В объявлении класса добавьте следующие строки в раздел Attributes:

 

protected:

          BOOL m_bAdding;

5.В окне ClassView сделайте двойной щелчок на конструкторе класса CEmployeeView и добавьте следующую строку в конец этой функции:

 

m_bAdding = FALSE;

 

6.Сделайте двойной щелчок на функции OnRecordAdd() и отредактируйте ее, добавив отработчики.

7.В окне ClassView щелкните правой кнопкой мыши на элементе CEmployeeView и выберите в раскрывшемся контекстном меню команду Add Virtual Function. В левом списке выберитe значение OnMove, а затем щелкните на кнопке Add and Edit. В результате в класс будет добавлена функция и можно будет немедленно отредактировать заготовку ее текста.

8.Отредактируйте функцию OnMove() так, чтобы она содержала текст программы, приведенный ниже.

9.Сделайте двойной щелчок на функции OnRecordDelete() и отредактируйте.

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

Функция OnRecordAdd() начинает свою работу с вызова метода AddNew() класса CEmployeeSet, производного от класса CRecordset. Вызванная ф-ция формирует пустую запись, предназначенную для заполнения пользователем. Однако эта запись не появится на экране до тех пор, пока не будет вызван метод UpdateData() класса представл-я. После того как польз-ль создаст новую запись, необходимо будет обновить БД. Установка в данной подпрогр-ме опред-го флажка позволит подпрограмме пересылки определить, какое именно действие польз-ля имеет место: перемещение к следующей записи БД от существовавшей ранее записи базы или же от вновь добавленной. Именно с этой целью переменной m_bAdding присваивается значение TRUE.

В данный момент, когда польз-лю предоставл-ся возм-ть ввести новую запись, необх-мо изменить статус поля кода служащего Employee ID, обычно имеющего атрибут "только чтение". Для снятия этого атрибута прогр-ме прежде всего необх-мо с пом-ю ф-ции GetDlgltem() получить ук-ль на соотв-й элемент упр-я, а затем вызвать метод SetReadOnly() для присвоения значения FALSE атрибуту "только чтение" этого элемента управления.

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

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

При вызове ф-ция OnMove() прежде всего проверяет значение логич-ской перемен-й m_bAdding и т.о. выясняет, от какой записи происходит переход: от существовавшей или от вновь добавл-й. Если значение m_bAdding равно FALSE, то основное тело оператора if пропускается и выполняется фрагмент программы, следующий за else. При этом программа вызывает метод OnMove() базового класса (CRecordView), который выполняет обычный переход на следующую запись.

Если переменная m_bAdding имеет значение TRUE, выполняется основное тело оператора if. Здесь программа прежде всего сбрас-т флаг m_bAdding, а затем вызывает ф-цию UpdateData() для передачи данных из полей окна представления в буфер выбранных записей. Вызов функции CanUpdate() класса выборки данных определяет, можно ли обновлять источник данных, и, если можно, вызов ф-ции Update(), явл-ся членом этого же класса, добавляет новую запись к источнику данных.

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

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

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

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

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

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

 


18.01.2020; 20:40
хиты: 48
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь