Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекції_ІЗВП_укр.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
6.39 Mб
Скачать

2. Забезпечення видалення, редагування, додавання записів в бд

Додавання і видалення записів у таблиці бази даних реалізуються досить просто завдяки існуванню в Visual C + + класів CRecordView і CRecordset, що надають всі необхідні методи для виконання цих стандартних операцій. Необхідно буде додати в додаток кілька команд меню (див. створення меню). Для додавання до додатка команд Add (Додати) і Delete (Видалити) виконайте наступні дії:

1. Клацніть на корінці вкладки ResourceView, відкрийте папку Menu і зробіть подвійний Клацання на меню IDR_MAINFRAME. На екрані розкриється вікно редактора меню.

2. Клацніть у меню Record і тим самим відкрийте його, а потім клацніть на порожній області в нижній частині цього меню. Виберіть команду View \ Properties і перемістіть розкрилося діалогове вікно Properties на підходяще для нього місце.

 3. У полі ID введіть значення ID_RECORD_ADD, а в полі Caption введіть значення & Add Record. У результаті в меню Record буде додана нова команда.

4. У наступний порожній елемент меню внесіть команду видалення, що має ідентифікатор ID_RECORD_DELETE (поле ID) та заголовок Delete Record (поле Caption), як показано на рис.9.5.

Рис. 9.5. Додавання в меню команд додавання і видалення записів

Далі необхідно додати на панель інструментів пару нових піктограм (додаток 4) і пов'язати з командами меню. Виконайте наступні дії:

1. У дереві ресурсів у вікні ResourceView відкрийте папку Toolbar і зробіть подвійне клацання на ідентифікаторі IDR_MAINFRAME. Панель інструментів додатка буде відображена у вікні редактора ресурсів.

2. Клацнувши на порожній піктограмі панелі інструментів, виберіть її, а потім за допомогою інструментів графічного редактора намалюйте на ній блакитний знак "плюс", як показано на рис. 9.6.

3. Зробіть подвійне клацання на новій піктограмі панелі інструментів. Розкриється вікно властивостей Toolbar Button Properties. У списку ID виберіть значення ID_RECORD_ADD.

4. Знову виділіть порожню піктограму панелі інструментів і намалюйте на ній червоний знак "мінус", надайте піктограмі ідентифікатор ID_RECORD_DELETE аналогічно "плюса". Перетягніть піктограми додавання і видалення лівіше піктограми довідки, поміченої знаком питання.

Рис. 9.6. Додавання піктограми на панель інструментів

Тепер, коли в меню вже додані нові команди і на панель інструментів поміщені відповідні піктограми, необхідно сформувати програмний код, який буде обробляти командні повідомлення, що посилаються, коли користувач клацає на піктограмі або вибирає пункт меню.

Так як в нашому додатку з базою даних пов'язаний клас уявлення, в ньому слід організувати перехоплення цих повідомлень. Виконайте наступні операції:

1. Розкрийте вікно ClassWizard і виберіть у ньому вкладку Message Maps.

2. У списку Class Name виберіть CDBView, а в списку Object IDS - значення ID_RECORD_ADD, після чого зробіть подвійне клацання на значенні COMMAND в списку Messages. Розкриється діалогове вікно Add Member Function.

3. Клацніть на кнопці ОК, прийнявши для нової функції ім'я, запропоноване за замовчуванням. Ім'я нової функції з'явиться в списку Member Functions в нижній частині вікна ClassWizard.

4. Аналогічним чином додайте метод для обробки команди ID_RECORD_DELETE. Закрийте вікно майстра СIassWizard, клацнувши на кнопці ОК.

5. У вікні ClassView, двічі клацнувши на елементі CDBView, відкрийте файл DBView.h. В оголошенні класу додайте наступні рядки в розділ Attributes:

protected:

BOOL m_bAdding;

6. У вікні ClassView зробіть подвійне клацання на конструкторі класу CDBView і додайте наступний рядок в кінець цієї функції:

m_bAdding = FALSE;

7. Зробіть подвійне клацання на функції OnRecordAdd () і відредагуйте її текст так, як показано в лістингу:

Лістинг функції CDBView :: OnRecordAdd ():

void CDBView::OnRecordAdd()

{

m_pSet->AddNew();

m_bAdding = TRUE;

CEdit* pCtrl = (CEdit*)GetDlgltem(IDC_USERID);

int result = pCtrl->SetReadOnly(FALSE);

UpdateData(FALSE);

}

8. У вікні ClassView клацніть правою кнопкою миші на елементі CDBView і виберіть в розкрився контекстному меню команду Add Virtual Function.

У лівому списку виберіть значення OnMove, як показано на рис. 9.7, а потім клацніть на кнопці Add and Edit. У результаті в клас буде додана функція і можна буде негайно відредагувати заготівку її тексту.

9. Відредагуйте функцію OnMove () так, щоб вона містила текст програми, наведений у лістингу.

Рис. 9.7. Перевизначення функції OnMove

Лістинг функції CDBView :: OnMove ():

BOOL CDBView::OnMove(UNIT nIDMoveCommand)

{

if (m_bAdding) {

m_bAdding = FALSE;

UpdateData(TRUE);

if (m_pSet->CanUpdate())

m_pSet->Update();

m_pSet->Requery();

UpdateData(FALSE);

CEdit* pCtrl = (CEdit*)GetDlgltem(IDC_USERID);

pCtrI->SetReadOnIy(TRUE);

return TRUE;

} else

return CRecordView::OnMove(nIDMoveCommand);

}

10. Зробіть подвійне клацання на функції OnRecordDelete () і відредагуйте її так, щоб її код відповідав наведеному нижче лістингу. Пояснення до цього тексту будуть дані в наступному розділі.

Лістинг функції СDBView :: OnRecordDelete ():

void CDBView::OnRecordDelete()

{

m_pSet->Delete();

m_pSet->MoveNext();

if (m_pSet->lsEOF())

m_pSet->MoveLast();

if (m_pSet->lsBOF())

m_pSet->SetFieldNulI(NULL);

UpdateData(FALSE);

}

Ми модифікували додаток, і тепер воно здатне виконувати додавання і видалення записів, так само як і їх оновлення. Відкомпілюйте додаток і запустіть його на виконання, вибравши в меню Visual Studio команду Builds Execute або натиснувши клавіші <Ctrl+F5>. Коли додаток почне роботу, на екрані розкриється його головне вікно, зовнішній вигляд якого не зазнав ніяких змін у порівнянні з попередньою версією додатка. Однак тепер у вас з'явилася можливість додати в базу даних новий запис, клацнувши на піктограмі додавання запису на панелі інструментів (або вибравши команду Record \ Add Record), або видалити поточну запис з бази, клацнувши на піктограмі видалення запису на панелі інструментів (або вибравши команду Record \ Delete Record).

Після клацання на піктограмі додавання запису додаток відображає в екранній формі порожню запис. Заповніть поля нового запису. При переході до іншого запису програма автоматично внесе новий запис в базу даних.

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

Аналіз функції OnRecordAdd (). Ймовірно, вам буде цікаво дізнатися, як працюють підпрограми на C + +, додані в додаток. Функція OnRecordAdd () починає свою роботу з виклику методу AddNew () класу CDBSet, похідного від класу CRecordset. Викликана функція формує порожню запис, призначену для заповнення користувачем. Однак цей запис не з'явиться на екрані до тих пір, поки не буде викликаний метод UpdateData () класу уявлення. Але перш ніж здійснити виклик цього методу, необхідно проробити підготовчі дії.

Після того, як користувач створить новий запис, необхідно буде оновити базу даних. Установка в даній підпрограмі певного прапорця дозволить підпрограмі переcилкі визначити, яке саме дія користувача має місце: переміщення до наступного запису бази даних від існуючої раніше записи бази або ж від знов доданої. Саме з цією метою змінної m_bAdding присвоюється значення TRUE.

В даний момент, коли користувачеві надається можливість ввести новий запис, необхідно змінити статус поля коду службовця UserID, зазвичай має атрибут "тільки читання". Для зняття цього атрибута програмі, перш за все, необхідно за допомогою функції GetDIgItem () отримати покажчик на відповідний елемент управління , а потім викликати метод SetReadOnly () для присвоєння значення FALSE атрибуту "тільки читання" цього елементу управління.

Тепер все готово до виклику функції UpdateData () для відображення на екрані нової порожньої записи.

Аналіз функції 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 () помістити нові дані в елементи керування цього вікна. І нарешті, програма відновлює для поля коду службовця UserID атрибут "тільки читання", ще раз викликавши функції GetDIgItem () і SetReadOnIy ().

Аналіз функції OnRecordDeIete (). Видалення запису виконується досить просто. Функція OnRecordDe lete () викликає функцію Delete (), яка є членом класу вибірки даних. Після виконання видалення виклик методу MoveNext () класу вибірки даних дозволяє організувати перехід до відображення наступної записи таблиці. Однак тут може виникнути проблема, якщо видаляється запис була у таблиці останньої або ж єдиною. Виклик методу IsEOF () класу CRecordset дозволяє з'ясувати, чи досягнуто кінець послідовності записів. Якщо ця функція повертає TRUE, то покажчик запису потрібно помістити на останній запис в поточній вибірці. Для цього використовується метод класу вибірки даних MoveLast.

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

Для завершення роботи підпрограми необхідно оновити вміст вікна подання, що здійснюється викликом функції UpdateData ().