- •О.С. Зеленський
- •Розділ 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. Перевірка значень змінних під час виконання програми
- •Контрольні питання
- •Список літератури
- •Додатки
Void cado6Dlg::OnFilter()
{
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
{
pRecordset->Filter = (_variant_t)str_query;
_ftime( &timebuffer );
double conec = timebuffer.time+timebuffer.millitm/1000.0;
CString vr_zap;
vr_zap.Format(" Фильтр установлен за %f сек ",
conec - nach);
//прив'язка елемента керування до pRecordset
m_datagrid1.SetRefDataSource(pRecordset);
MessageBox(vr_zap);
}
catch(_com_error &ce)
{
//прив'язка елемента керування до pRecordset
m_datagrid1.SetRefDataSource(pRecordset);
Doc->ErrMessage(ce);
m_editquery.SetFocus ();
}
}
Властивість Filter об'єкта Recordset приймає значення полів із заданими умовами. Можуть застосовуватися оператори відношення >, <, >=, <=, <>, =, а також порозрядні оператори AND, OR, NOT і т.д. Також як вхідний параметр може бути масив закладок відібраних записів.
Для того щоб зняти фільтр, необхідно властивості Filter встановити порожнє значення:
pRecordset->Filter = "";
Як й у випадку із сортуванням, до виконання фільтрації записів необхідно відв'язати елемент керування від набору, а потім при виконанні фільтра або при виникненні помилки – прив'язати заново.
Відновлення або перечитання набору записів відбувається у функції відгуку OnVozvrat() (кнопка <Возврат>), текст якої наведений нижче.
// Повернення - перечитування набору Recordset –
// кнопка <Возврат>
Void cado6Dlg::OnVozvrat()
{
if(pRecordset->GetState()==0)return;
struct _timeb timebuffer;
_ftime( &timebuffer );
double nach = timebuffer.time+timebuffer.millitm/1000.0;
//Відв’язка об'єкта Recordset від елемента керування
m_datagrid1.SetRefDataSource(0);
//Скидання сортування й фільтрації даних
pRecordset->Sort = "";
pRecordset->Filter = "";
((CButton*)GetDlgItem(IDC_CHECK_SORT))->SetCheck (0);
m_editquery.SetWindowText("");
//Прив'язка об'єкта Recordset до елемента керування
m_datagrid1.SetRefDataSource(pRecordset);
pRecordset->Requery (-1); // перечитати набір
_ftime( &timebuffer );
double conec = timebuffer.time+timebuffer.millitm/1000.0;
CString vr_zap;
vr_zap.Format("Обновление записей выполнено за %f сек ",
conec - nach);
MessageBox(vr_zap);
}
У даній функції заново перечитується набір з використанням методу Requery(). Для того щоб повернути початковий набір, необхідно відв'язати об'єкт Recordset від елемента керування Datagrid, після чого зняти сортування й фільтрацію записів.
Увага!!! При використанні методу Requery(-1) закриваються всі індекси й поточні настроювання, пов'язані з даним об'єктом Recordset. У тому випадку, якщо було встановлене сортування записів, то після створення нового об'єкта Recordset сортування буде виконане автоматично - тобто заново будуть створюватися тимчасові індекси. При використанні цього методу коректно перечитуються закладки (Bookmark). Його доцільно застосовувати після видалення однієї або декількох записів. Після застосування методу Requery() властивість Bookmark буде відповідати фізичному номеру запису в заданому наборі.