Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод_Практичні роботи_ИЗВП_укр.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
7.14 Mб
Скачать
  1. Забезпечення сортування та фільтрації записів з бд.

Сортування і фільтрація записів. Часто при роботі з базою даних потрібно змінити порядок, в якому записи відображаються на екрані, або ж здійснити пошук записів, що задовольняють певному критерію. Існуючі в MFC класи роботи з базами даних ODBC розпорядженні методи, що дозволяють сортувати вибрані записи по кожному з їх полів.

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

1. Додайте меню Sort (Сортування) в основне меню програми, як показано на ріс.9.8. Надайте Visual Studio автоматично визначити ідентифікатори команд.

2. За допомогою майстра ClassWizard організуйте в класі CDBView перехоплення чотирьох нових команд сортування, використовуючи імена функцій, запропоновані цим майстром. Остаточний вигляд вікна ClassWizard показаний на рис.4.9.

3. Додайте меню Filter (Фільтрація) в рядок меню додатка. Надайте Visual Studio встановити ідентифікатори команд.

4. За допомогою майстра СlassWizard організуйте в класі CDBView перехоплення чотирьох нових команд фільтрації, використовуючи імена функцій, запропоновані цим майстром.

5. Виберіть команду Insert \ Resource та створіть нове діалогове вікно, зробивши подвійне клацання на елементі Dialоg, а потім відредагуйте діалогове вікно так, щоб воно виглядало, як показано на ріс.7.10. Привласніть елементу управління - текстовому полю - ідентифікатор ID_FILTERVALUE.

Залишивши нове діалогове вікно розкритим на екрані, запустіть майстер ClassWizard. Розкриється діалогове вікно Adding a Class. Встановіть опцію Create a new class і клацніть на кнопці ОК. Розкриється діалогове вікно New Class. У полі Name введіть значення CFiIterDlg, як показано на рис. 7.11.

Рис.7.8 – Створення меню Sort

Рис. 7.9. - Вид вікна майстра ClassWizard після додавання чотирьох нових функцій сортування

Рис. 7.10 - Створення діалогового вікна установки параметрів фільтрації

У вікні майстра ClassWizard клацніть на корінці вкладки Member Variables, зв'яжусь елемент управління IDC_FILTERVALUE зі змінною-членом m_fiIterValue. Завершіть роботу з майстром СlassWizard, клацнувши на кнопці ОК.

Рис. 7.11 - Створення класу діалогу для вікна Filter

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

void CDBView:: OnSortUserID ()

{

m_pSet->Close();

m_pSet->m_strSort = "UserID";

m_pSet->Open():

UpdateData(FALSE);

}

void CDBView: :OnSortFirstName ()

{

m_pSet->Close();

m_pSet->m_strSort = "UserFirstName";

m_pSet->Open();

UpdateData(FALSE);

}

void CDBView: : OnSortMiddleName()

{

m_pSet->Close();

m_pSet->m_strSort = “UserMiddleName";

m_pSet->Open();

UpdateData(FALSE);

}

void CDBView: : OnSortLastName()

{

m_pSet->Close();

m_pSet->m_strSort = “UserLastName";

m_pSet->Open();

UpdateData(FALSE);

}

void CDBView::OnSortEMail ()

{

m_pSet->Close():

m_pSet->m_strSort = "UserEMail";

m_pSet->Open();

UpdateData(FALSE);

}

Введите в начало файла DBView.cpp после уже имеющихся директив #include строку #include "FiIterDlg.h". Добавьте функции-обработчики:

void CDBView:: OnFilterUserID ()

{

DoFilter("UserID");

}

void CDBView: :OnFilterFirstName ()

{

DoFilter("FirstName");

}

void CDBView: : OnFilterMiddleName()

{

DoFilter(“MiddleName");

}

void CDBView: : OnFilterLastName()

{

DoFilter(“LastName");

}

void CDBView::OnFilterEMail ()

{

DoFilter("EMail");

}

Всі ці чотири функції викликають функцію DoFilter (). Далі необхідно буде написати функцію, що виконує фільтрацію записів бази даних, представлених в класі вибірки даних. На панелі ClassView клацніть правою кнопкою миші на класі CDBView і виберіть в розкрився контекстному меню команду Add Member Function. Вкажіть в розкрився діалоговому вікні тип функції void і введіть її оголошення як DoFilter (CString col). Даний метод повинен бути захищеним, так як він викликається тільки іншими методами цього ж класу CDBView. На панелі ClassView зробіть подвійне клацання на функції DoFilter () і помістіть в неї текст програми, показаний в лістингу:

void CDBView::DoFilter(CString col)

{

CFiIterDlg dig;

int result = dlg.DoModal():

if (result == IDOK)

CString str = col + " = " + dlg.m_fiIterValue;

m_pSet->Close();

m_pSet->m_strFiIter = str;

m_pSet->Open();

int recCount = m_pSet->GetRecordCount();

if (recCount == 0) {

MessageBox("No matching records.");

m_pSet->Close();

m_pSet->m_strFiIter = "";

m_pSet->Open();

UpdateData(FALSE);

}

}

Ми додали до створюваномудодатком функції сортування і фільтрації записів бази даних. Відтранслює додаток і запустіть його на виконання. На екрані з'явиться головне вікно програми, яке виглядає так само, як і раніше. Однак тепер можна сортувати записи по будь-якому полю, для чого достатньо просто вибрати ім'я поля в меню Sort. Крім того, з'явилася можливість задати фільтрацію відображуваних записів, вибравши ім'я необхідного поля в меню Filter, а потім ввівши значення фільтра в розкрився діалоговому вікні Filter. Визначити, як записи відсортовані або який для них заданий фільтр, ви зможете, переміщаючись від одного запису до іншого. Спробуйте, наприклад, відсортувати записи по відділах або по зарплаті, а потім встановіть фільтрацію по будь-якому з відділів, який ви бачили, переглядаючи базу.

Аналіз функції 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 ().