Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual2.doc
Скачиваний:
5
Добавлен:
07.03.2016
Размер:
3.31 Mб
Скачать

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(). Текст даної функції наведений нижче.

// Пошук записів - кнопка <Поиск>

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]