- •О.С. Зеленський
- •Розділ 9. Структура створення додатків
- •9.1. Загальна структура додатків
- •9.2. Додатки без використання архітектури «Документ-вид»
- •9.2.1. Приклад додатку реєстрації wnd-класу вікна
- •9.2.2. Створення та видалення дочірніх вікон без використання архітектури «Документ-Вид»
- •9.2.3. Створення дочірніх вікон без використання архітектури «Документ-Вид» (переключення вікон з використанням функції ShowWindow)
- •9.3. Архітектура «Документ-Вид»
- •Idr_mainframe формат строкового ресурсу.
- •9.3.1. Приклад додатку з використанням архітектури «Документ-Вид»
- •9.3.2. Види у архітектурі «Документ-Вид»
- •9.3.3. Створення видів у архітектурі «Документ-Вид» (переключення видів з використанням функції ShowWindow)
- •9.3.4. Робота з документами та видами на прикладі додатку SingleTemplate
- •9.4. Додатки mdi, робота з шаблонами
- •9.4.1. Приклад додатку mdi з одним шаблоном
- •9.4.2. Приклад додатку mdi з декількома шаблонами
- •Контрольні питання
- •Розділ 10. Робота з базами даних з використанням об'єктів ado
- •10.1.1. Ініціалізація об'єктів com з використанням директиви #import
- •10.1.2. Підтримка класів сом
- •10.2. Об'єкт Connection
- •10.3. Об'єкт Command
- •10.4. Об'єкт Recordset
- •10.5. Об'єкт Field і колекція Fields
- •10.6. Об'єкт Error і колекція Errors
- •10.8. Коротка характеристика структури мови sql
- •10.9. Синтаксис оператора вибору Select
- •10.10. Приклад програмування об'єктів ado
- •10.11. Опис розробленого навчального пакету ado6 для роботи з базами даних access та MySql
- •Int tip_bd; // тип бд 1- ms access, 2- MySql, 3 - xml
- •Void Connect_Baza(cString str);
- •Void ErrMessage(_com_error &ce);
- •If(pConn.CreateInstance("adodb.Connection"))
- •If(pRecordset.CreateInstance("adodb.RecordSet"))
- •Void cAdo6Doc::ErrMessage(_com_error &ce)
- •Void cAdo6Doc::OnMsaccess()
- •Void cAdo6Doc::OnMysql()
- •Void cAdo6Doc::OnXmlRead()
- •Void cAdo6Doc::Connect_Baza(cString str)
- •Virtual void DoDataExchange(cDataExchange* pDx);
- •Void cAdo6Dlg::DoDataExchange(cDataExchange* pDx)
- •Void cAdo6Dlg::Struct_MySql()
- •Void cAdo6Dlg::OnSelchangeListBaza()
- •Void cAdo6Dlg::OnVibor_bd()
- •Void cAdo6Dlg::AccessOpen()
- •Void cAdo6Dlg::xmlOpen()
- •Void cAdo6Dlg::Structura_bd()
- •Void cAdo6Dlg::OnSelchangeListTab()
- •Void cAdo6Dlg::show(int kod, int kod_bd)
- •Void cAdo6Dlg::Recordset_Baza(cString str)
- •Void cAdo6Dlg::OnClose()
- •10.11.2. Формування списку бд (MySql), відкриття бази даних (ms access), відкриття xml-файлу, формування списку таблиць (MySql і ms access) та полів (MySql, ms access, xml)
- •Void cAdo6Dlg::OnSelchangeListTab()
- •1. Обрану таблицю необхідно брати в зворотні лапки "`", щоб виключити помилку в тому випадку, якщо в імені таблиці будуть зустрічатися пробіли.
- •10.11.3. Робота з sql-запитами
- •Void cAdo6Dlg::OnZapros_Select()
- •If (str_query.Mid(0,6).Compare("select"))
- •If(!baza.Left(3).Compare("otl") &&
- •Void cAdo6Dlg::Recordset_Baza(cString str)
- •Void cado6Dlg::OnZapros_Make()
- •Vr_zap.Format(" Запрос выполнен за %f сек ",conec - nach);
- •10.11.4. Видалення, сортування, пошук, фільтрація, оновлення набору записів
- •Void cado6Dlg::OnZapis_Delete()
- •Void cado6Dlg::OnCheck_Sort()
- •Void cado6Dlg::OnFind()
- •0L,adSearchForward,bb);
- •Void cado6Dlg::OnFilter()
- •Void cado6Dlg::OnVozvrat()
- •10.11.5. Переходи по записах
- •Void cado6Dlg::OnButtonFirst()
- •Void cado6Dlg::OnButtonLast()
- •Void cado6Dlg::OnButtonLeft()
- •Void cado6Dlg::OnButtonRight()
- •Void cado6Dlg::OnButtonRecno()
- •Void cado6Dlg::OnButtonPgup()
- •Void cado6Dlg::OnButtonPgdn()
- •Void cado6Dlg::OnButtonBookmark()
- •10.11.6. Запис даних до xml-файлу
- •Void cAdo6Dlg::OnButtonSave()
- •10.11.7. Кнопки, призначені тільки для роботи з otl_tab
- •Void cado6Dlg::OnZapis_Add1()
- •Void cado6Dlg::OnZapis_Add2()
- •Void cado6Dlg::OnZapis_Update1()
- •Void cado6Dlg::OnZapis_Update2()
- •Void cado6Dlg::OnFormir_bd()
- •Void cAdo6Dlg::OnValues_Fields()
- •10.12. Використання у якості джерела даних електронної таблиці Excel
- •Контрольні питання
- •Завдання
- •Розділ 11. Програмування для інтернет
- •11.1. Створення броузера
- •11.3. Використання протоколу http
- •If ((pInternetSession)
- •11.4. Використання протоколу ftp
- •Контрольні питання
- •Розділ 12. Створення елементів activex
- •12.1. Створення елементів ActiveX
- •Invalidate();
- •12.2. Тестування елемента ActiveX
- •12.4. Створення елемента ActiveX на базі стандартних елементів
- •12.5. Відображення елементів ActiveX
- •Контрольні питання
- •Розділ 13. Налагодження програм
- •Int data[5];
- •Invalidate();
- •13.3. Установка точки переривання
- •13.2. Покрокове виконання програми
- •13.4. Перевірка значень змінних під час виконання програми
- •Контрольні питання
- •Список літератури
- •Додатки
10.11.4. Видалення, сортування, пошук, фільтрація, оновлення набору записів
У даному розділі розглядаються функції відгуків видалення (OnZapis_Delete(), кнопка <Удаление>), сортування (OnCheck_Sort(), прапорець <Сортировка>), пошуку (OnFind(), кнопка <Поиск>), фільтрації (OnFilter(), кнопка <Фильтр>) оновлення (OnVozvrat(), кнопка <Возврат>) набору записів.
Розглянемо функцію відгуку OnZapis_Delete() за допомогою якої видаляється поточний запис набору. Текст даної функції наведений нижче.
// Видалення поточного запису - кнопка <Удаление>
Void cado6Dlg::OnZapis_Delete()
{
if(pRecordset->GetState()==0)return;
if (!pRecordset->GetRecordCount ())
{
MessageBox("Пустая таблица!!!","Внимание!!!",
MB_ICONINFORMATION);
return;
}
try
{
// видалення поточного запису
pRecordset->Delete (adAffectCurrent);
pRecordset->MoveNext ();
if (pRecordset->ADO_EOF)
pRecordset->MovePrevious ();
}
catch(_com_error &ce)
{
Doc->ErrMessage(ce);
}
}
Якщо в наборі немає записів (метод GetRecordCount() повертає 0), здійснюється вихід із процедури. У тому випадку, якщо в таблиці є записи, – видаляється поточний запис за допомогою методу Delete() із вхідним параметром adAffectCurrent, після чого переходимо на наступний запис. Якщо був досягнутий кінець набору, необхідно перейти на попередній запис.
Розглянемо функцію відгуку на прапорець IDC_CHECK_SORT, OnCheck_Sort(), у якій здійснюється сортування по заданих полях обраної таблиці. Приведемо текст даної функції.
// Сортування записів по заданій умові - прапорець <Сортировка>
Void cado6Dlg::OnCheck_Sort()
{
if(pRecordset->GetState()==0)return;
//Відв’язка елемента керування від об'єкта pRecordset
m_datagrid1.SetRefDataSource(0);
CString str_query;
m_editquery.GetWindowText(str_query);
struct _timeb timebuffer;
_ftime( &timebuffer );
double nach = timebuffer.time+timebuffer.millitm/1000.0;
try
{
CString vr_zap;
if (((CButton*)GetDlgItem(IDC_CHECK_SORT))->
GetCheck ()==1)
{
pRecordset->PutSort ((_bstr_t)str_query);
_ftime( &timebuffer );
double conec = timebuffer.time+timebuffer.millitm/1000.0;
vr_zap.Format(" Сортировка выполнена за %f сек ",
conec - nach);
//прив'язка
m_datagrid1.SetRefDataSource(pRecordset);
MessageBox(vr_zap);
}
else
{
pRecordset->Sort = "";
// прив'язка
m_datagrid1.SetRefDataSource(pRecordset);
_ftime( &timebuffer );
double conec = timebuffer.time+timebuffer.millitm/1000.0;
vr_zap.Format(" Сортировка снята за %f сек ",
conec - nach);
MessageBox(vr_zap);
}
}
catch(_com_error &ce)
{
//прив'язка
m_datagrid1.SetRefDataSource(pRecordset);
ErrMessage(ce);
((CButton*)GetDlgItem(IDC_CHECK_SORT))->SetCheck (0);
m_editquery.SetFocus ();
}
}
Увага!!! При роботі із сортуванням і фільтрацією даних, необхідно відв'язуватися від елемента керування DataGrid, тому що при знятті відповідно сортування або фільтрації компонентів DataGrid поводиться некоректно. Тобто на початку процедури необхідно відв'язатися від елемента керування за допомогою рядка:
m_datagrid1.SetRefDataSource(0);
а після виконання або зняття сортування, або у випадку виникнення помилки, необхідно здійснити прив'язку об'єкта Recordset до елемента DataGrid:
m_datagrid1.SetRefDataSource(pRecordset);
Сортування встановлюється до певного набору даних за допомогою функції PutSort() об'єкта Recordset або використовуючи властивість Sort. Сортування може здійснюватися по декількох полях. Скажімо, якщо потрібно відсортувати дані по полях id та kod, то в текстовому полі, звідки буде забиратися властивість Sort необхідно через кому перелічити ці поля, наприклад:
pRecordset->PutSort("id, kod");
або
pRecordset->Sort = "id, kod";
При знятті сортування властивості Sort необхідно привласнити порожнє значення ("").
Зміст сортування полягає в тому, що воно створює тимчасові відкриті індексні файли на конкретне поле, або перелік полів. Так, якщо спочатку створити сортування по двох полях "id, kod", а потім зняти його, то тимчасовий файл не видалиться, і можна здійснити сортування по іншому полю, скажімо, по полю "Name". Таким чином, в пам’яті будуть створені два індекси, які при зміні даних будуть миттєво перебудовуватися. Тобто, досить зробити один раз сортування по певних полях, а при повторному сортуванні – будуть використовуватися раніше створені індекси. Щоб видалити всі відкриті індексни необхідно закрити й заново відкрити набір записів. Для того щоб зробити сортування за спаданням можна скористатися ключовим словом desc після імені поля. Скажемо, відсортуємо дані за спаданням значень поля kod:
pRecordset->PutSort("kod desc");
або
pRecordset->Sort = "kod desc";
Головний зміст властивості Sort об'єкта Recordset складається в її використанні для швидкого пошуку відповідних даних з використанням методу Find().
Розглянемо функцію відгуку OnFind() (кнопка <Поиск>), у якій детально описується призначення й функціональні особливості методу Find(). Текст даної функції наведений нижче.
// Пошук записів - кнопка <Поиск>