Послідовна навігація за записами

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

Для виконання дій по послідовному перебору записів, починаючи від деякого стартового запису до кінця набору даних, використовують цикл while. do чи repeat. until:

with Tablel do begin

while not EOF do begin

with Tablel do begin

Так само можна переміщатися від кінця НД до його початку:

with Tablel do begin

while not BOF do begin

with Tablel do begin

Якщо НД допускає виклик запису за її номером (його властивість IsSequenced у разі має містити значення True), можна використовувати цикл for. Наприклад, наступний обробник події TForm. On Act ivate помістить усі значення рядкового поля BName НД Books у багаторядкове текстове поле Memol:

procedure TForml.FormActivate(Sender: TObject); var

RecNo: Integer; begin

if Books.IsSequenced then

for RecNo := 1 to Books.RecordCount do

Books.RecNo := RecNo; Memol.Lines.Add(Tablel['BName1]) end; end;

Зауважу, що для компонентів TTable і TQuery, пов'язаних із файл-серверними таблицями БД, властивість IsSequenced завжди містить значення True. У клієнт-серверній архітектурі воно залежить від сервера БД, що використовується. Властивість RecNo набору даних визначає порядковий номер оброблюваного запису (нумерація починається з 1), яке властивість RecordCount - кількість записів.

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

with Tablel do while not EOF do begin

Delete; Next; end;

Після видалення чергового запису курсор НД перейде на наступний, але виклик Next змусить його зміститися ще раз, і черговий запис буде пропущено. Правильний варіант: