Основні властивості та методи компонентів набору даних

Розглядаючи складові delphi-програм, що створюються для роботи з базами даних, нами неодноразово було використано термін набір даних. Але що ж мається на увазі під цим терміном залишається не зовсім зрозумілим. Отже, у найпростішому випадку набір даних — це файл таблиці, фізично розташований на жорсткому диску комп'ютера, де таблиця складається з певного переліку полів, кожне з яких призначене для зберігання даних певного типу.

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

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

Після того, як з основними моментами розібрались, нагадаємо ще раз, що в середовищі програмування Delphi, для різних механізмів доступу до даних в якості наборів даних використовуються свої, але аналогічні компоненти:

  1. Для BDETTable, TQuery, TUpdateSQL і TStoredProc.
  2. Для ADOTADOTable, TADOQuery і TADOStoredProc.
  3. Для dbExpressTSQLTable, TSQLQuery і TSQLStoredProc.

Розглянемо основні їх властивості та методи. Отже, дізнатися, в якому стані, в даний момент часу, знаходиться набір даних, можна скориставшись властивістю Active типу Boolean. Якщо властивість приймає значення True, то набір даних активний і як мінімум доступний для перегляду. Відмітимо, що керувати станом набору даних можна також і з допомогою методів Open та Close. Процедура Open відкриває набір даних, тобто її виклик еквівалентний установці властивості Active значення True. Процедура Close закриває набір даних, і її виклик еквівалентний установці властивості Active значення False.

При відкритті набору даних будь-яким способом, виникають події BeforeOpen і AfterOpen типу TDataSetNotifyEvent, який описується наступним чином:

type TDataSetNotifyEvent = procedure (DataSet: TDataSet) of object;

У даному описі параметр DataSet визначає набір даних, для якого відбулася подія.

При закритті набору даних виникають події BeforeClose і AfterClose цього ж типу TDataSetNotifyEvent. Відмітимо, що закриття набору даних не забезпечує автоматичне збереження змін в поточному записі. Тобто, якщо набір даних при закритті знаходився в режимах редагування або вставки, то зроблені зміни даних в поточному записі будуть втрачені. Тому перед закриттям набору даних доцільно перевірити його режим і, при необхідності, примусово викликати метод Post, який збереже зроблені зміни. Одним з варіантів збереження змін є виклик методу Post в обробнику події BeforeClose, що виникає безпосередньо перед закриттям набору даних.

Далі, покажемо, яким чином реалізується даний випадок на конкретному прикладі. Але перед тим, як перейти до практики, розглянемо ще одну властивість набору даних, яку, в параграфі Невізуальний delphi-компонент TDataSource ми вже згадували та використовували, і яка нам знадобиться для реалізації задуманого. Отже, властивість State типу TDataSetState — показує поточний стан набору даних, або режим його роботи. Дана властивість доступно для читання під час виконання програми і, в кожен момент часу, може приймати одне з наступних значень:

  1. dsInactive — набір даних закритий і доступ до його даних неможливий;
  2. dsBrowse — набір даних доступний для перегляду, але не знаходиться в стані редагування;
  3. dsEdit — поточна запис може бути змінений;
  4. dsInsert — доданий, але ще не відправлений в таблицю новий запис;
  5. dsSetKey — здійснюється пошук запису (тільки для компонентів TTable);
  6. dsCalcFields — здійснюється розрахунок полів;
  7. dsFilter — проводиться фільтрація записів;
  8. dsOpening — розпочато але ще не завершений процес відкриття набору даних.

Повертаючись до прикладу зазначимо, що для його реалізації скористаємось delphi-проектом, який міститься за вказаним вище посиланням. Отже, запустимо середовище програмування Delphi, відкриємо необхідну delphi-програму і в тілі процедури Table1BeforeClose напишемо наступний програмний код:

procedure TForm1.Table1BeforeClose(DataSet: TDataSet);
begin
// Якщо набір даних знаходиться в режимі редагування або вставки
if (Table1.State = dsEdit) or (Table1.State = dsInsert) then
// Зберігаємо внесені зміни
Table1.Post;
end;

Тобто, якщо набір даних Table1 типу TTable знаходиться в режимі редагування або вставки, то перед його закриттям внесені зміни будуть збережені.

Зауваження: при закритті програми подія BeforeClose не генерується, і не збережені зміни будуть втрачені.

З усього сказаного вище, приходимо до висновку, що відкритий непорожній набір даних забезпечує доступ до своїх записів. Поточний запис набору зазвичай називається активним записом (саме на ньому встановлений курсор набору). Переміщення курсору призводить до зміни активного запису. У Delphi реалізований цілий ряд методів, що забезпечують переміщення курсору по набору даних. До найбільш часто використовуваних процедур такого типу варто віднести: First, Prior, Next та Last. Методи First і Last позиціонують курсор відповідно на перший і останній запис. Процедури Prior і Next здійснюють покроковий перехід до попереднього і наступного записів відповідно. Щоб перемістити курсор відразу на кілька записів, використовують метод:

function MoveBy(Distance: Integer): Integer;

Де у параметрі Distance задається дистанція, на яку потрібно переміститися по набору щодо поточного запису. Якщо в якості значення для параметра Distance задати від'ємне число, то переміщення буде здійснюватися на початок набору. Якщо додатне — в його кінець. Функція повертає реальну кількість записів, на яку вдалося перемістити курсор. Зауважимо, що виклик розглянутих вище методів переміщення має сенс тільки в тому випадку, коли набір даних не порожній. Дізнатися про це допоможе метод IsEmpty, який повертає значення True, якщо в наборі даних не міститься жодного запису. Якщо ж в наборі є записи, то дізнатися про загальну кількість їх рядків можна скориставшись властивістю RecordCount типу Integer.

І на завершення, коротко розглянемо ще дві спеціальні властивості, які сигналізують про місцезнаходження курсора. Якщо курсор знаходиться на першому записі набору, то значення True приймає властивість Bof. Якщо ж курсор знаходиться на останньому записі, то значення True приймає властивість Eof. Відмітимо, що дані властивості часто використовуються при переборі всіх записів набору даних за допомогою циклів. Для прикладу, доповнимо головну форму розглядуваного в даному параграфі delphi-проекту, двома компонентами: Button2 типу TButton та Memo1 типу TMemo. І на обробник подію OClick кнопки Button2 реалізуємо процес перебору всіх записів набору та заповнення рядків компонента Memo1 значеннями другого поля таблиці cars.

procedure TForm1.Button2Click(Sender: TObject);
begin
//Готуємо компонент Memo1 до виводу значень поля Model
Memo1.Clear;
//Встановлюємо курсор на перший запис набору даних Table1
Table1.First;
// Відключає від набору даних Table1 візуальні елементи управління даними
Table1.DisableControls;
// Поки курсор набору даних Table1 не знаходиться на останньому записі
while (not Table1.Eof) do
begin
// Копіюємо значення поля Model активного запису набору Table1 в новий рядок компонента Memo1
Memo1.Lines.Add(Table1.FieldByName('Model').AsString);
// Здійснюємо перехід до наступного запису
Table1.Next;
end;
// Підключаємо до набору даних Table1 візуальні елементи управління даними
Table1.EnableControls;
end;

Запустивши проект на виконання та користавшись кнопкою «Копіювати», перевіримо правильність його роботи.

Перебір всіх записів набору даних Table1

Також хочеться звернути Вашу увагу на два методи, що використовуються в даному прикладі. Процедура DisableControls відключає від набору, а процедура EnableControls підключає до набору даних візуальні елементи управління даними (TDBGrid, TDBText, TDBMemo та інші), що відповідають за показ поточного записи. Здійснювати виклик цих методів необхідно саме у зазначеній в прикладі послідовності. Це дозволить значно прискорить процес перебору записів і позбавить delphi-програму від необхідності постійної (з кожною зміною активного запису) перемальовування елементів управління.

Скачати delphi-проект Властивості на методи компонентів набору даних.

Матеріал був корисним, поділись в соціальних мережах:
Якщо тобі сподобалась дана тема, залиш свій коментар