Використання індексів

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

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

При створенні в базі даних таблиці LichData ми вказали поля "Прізвище" та "Ім'я" як індексовані. Цим і скористаємось. Щоб увімкнути сортування записів по полю "Прізвище", достатньо вказати назву поля у властивості IndexFieldNames таблиці:

Якщо потрібно вимкнути сортування, цій властивості присвоюється порожній рядок:

Сортувати за прізвищем Сортувати за іменем Не сортувати

Спочатку створіть обробник подій для пункту "Не сортувати" (двічі клацніть пункт). Тут все просто:

procedure TfMain.NNetClick(Sender: TObject); begin

Для обробника подій пункту "Сортувати за прізвищем" код трохи складніше:

procedure TfMain.NFamClick(Sender: TObject); var

stype: String; begin

// Вибираємо напрямок сортування:

if NObrat.Checked then stype := 'DESC' //зворотне сортування else stype := 'ASC'; //пряме сортування //сортуємо

fDM.TLichData.IndexFieldNames := 'Прізвище' + stype; end;

Тут, залежно від стану якості Checked пункту "Зворотне сортування", ми присвоюємо рядковий змінної stype або значення 'ASC' (пряме сортування), або 'DESC' (зворотне сортування). Зверніть увагу, що перед рядком є ​​пробіл, він потрібен, щоб рядок не "приліпився" до назви поля. Далі ми встановлюємо індекс, вказуючи ім'яполя та додаючи до нього значення змінної stype. Таким чином, якщо Checked пункту "Зворотне сортування" має значення True (галочка встановлена), ми додаємо 'DESC', або 'ASC' в іншому випадку. В результаті ім'я індексного поля може бути "Прізвище ASC", або "Прізвище DESC".

Сортування на ім'я кодуємо аналогічним чином:

procedure TfMain.NImyaClick(Sender: TObject); var

stype: String; begin

// Вибираємо напрямок сортування:

if NObrat.Checked then stype := 'DESC' else stype := 'ASC';

fDM.TLichData.IndexFieldNames := 'Ім'я' + stype; end;

Нам залишилося вказати код пункту спливаючого меню "Зворотне сортування". Тут нам потрібно не просто встановити галочку, якщо її не було, але також перевірити - чи є сортування з якогось поля? Якщо таблицю відсортовано, потрібно її пересортувати цим же полем, але вже у зворотному порядку. Ось код:

procedure TfMain.NObratClick(Sender: TObject); begin

//змінюємо напрямок сортування

NObrat.Checked := not NObrat.Checked;

//якщо сортування на прізвище, пересортуємо

if Pos('Прізвище',fDM.TLichData.IndexFieldNames)>0 then

fMain.NFamClick(Sender); //якщо сортування на ім'я, пересортуємо if Pos('Ім'я',fDM.TLichData.IndexFieldNames)>0 then

Як бачите, ми використовували функцію Pos(), яка поверне нуль, якщо в рядку не знайдено зазначеного підрядка, або номер символу, з якого цей підрядок починається, якщо він є. Нам потрібно визначити, чи не входить до імені індексного поля "Прізвище" або "Ім'я". Адже до імені поля додано рядок 'ASC' або 'DESC', так що пряма перевірка

if fDM.TLichData.IndexFieldNames = 'Прізвище' then результату не дасть, у будь-якому випадку результатом було б False. Ну а дляпересортування ми викликаємо відповідний пункт меню, щоб не писати код сортування ще раз, наприклад:

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

У властивості PopupMenu верхньої сітки DBGridl виберіть створене меню, яке щойно випливає, щоб воно відкривалося тільки над цією сіткою, збережіть проект, скомпілюйте його і спробуйте сортування даних.

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

лекція 4. Набори даних. Основні властивості, методи та події

До цього часу ми працювали з таблицями за допомогою компонента TADOTable. Насправді ми працювали не з самими таблицями, а з набором даних (DataSet). Набір даних - це колекція записів із однієї або кількох таблиць бази даних. Набори даних можна отримати за допомогою компонентів TADOTable, TADOQuery або TADOStoredProc, який необхідний для архітектури клієнт-сервер. Як виходять набори даних? Коли ми відкриваємо таблицю, тобто, привласнюємо True властивості Active компонента TADOTable, наприклад, спеціальний механізм робить вибірку записів відповідно до заданих параметрів, і повертає нам ці записи у вигляді таблиці. Можна сказати, що набори даних - це прошарок між нашим додатком та реальними таблицями, що зберігаються у базі даних. Всі зазначені вище компоненти є наборами даних, мають загального предка-клас TDataSet і запозичували від нього властивості, методи та події, додаючи власні можливості.Про це й поговоримо на цій лекції.