Опубликован: 07.04.2008 | Уровень: специалист | Доступ: платный
Лекция 32:

Индексы, фильтрация, отчетность

< Лекция 31 || Лекция 32: 12 || Лекция 33 >
Аннотация: В этой лекции мы закончим работу над проектом "Библиотечный каталог". Научимся создавать индексы, производить по ним фильтрацию (поиск) данных, выводить данные в отчет. Научимся создавать подстановочные поля – вводить в таблицу новое поле, из другой таблицы.

Индексы

Иногда бывает необходимо отсортировать данные по одному или по другому полю, в возрастающем или убывающем порядке. Для этого используют индексы, которые заметно ускоряют процесс сортировки, особенно в больших таблицах с десятками тысяч записей. Индексов может быть много, они могут содержать одно поле таблицы или несколько. Если вы указываете в индексе только одно поле, то при применении индекса таблица будет отсортирована по этому полю. Если вы указываете два индексных поля, то вначале сортировка будет произведена по первому, затем по второму полю. Впрочем, индексацию таблицы лучше изучать на примере.

Если в данный момент у вас открыта Delphi с нашей программой – закройте ее. Нам нужно будет изменить структуру таблицы, и просто закрытие приложения не поможет, до закрытия Delphi таблица будет в использовании, и изменить ее структуру не получится.

Теперь откройте утилиту Database Desktop, и загрузите в нее нашу таблицу d:\data\books.db

Далее выбираем команду TableRestructure. Откроется то самое окно, в котором мы вводили названия и типы полей таблицы.

Перед тем, как мы установим индексы для полей, давайте изменим языковой драйвер таблицы. Если этого не сделать, то при использовании индексирования по текстовому полю, где содержится текст на русском языке, могут возникнуть проблемы. Для изменения языкового драйвера в поле Table Properties выберите Table Language, а в открывшемся окне – Pdox ANSI Cyrillic.

Теперь вот что еще важно – чтобы индексы работали, необходимо иметь главный ключ, так что если у вас поле Key1 не установлено, как ключевое, сделайте это. Кстати, поле Key2 во второй таблице тоже должно быть ключевым.

Далее приступим к созданию индексов. Поскольку сортировку мы будем делать по полю "Автор" и по полю "Название", то и индексов у нас должно быть два. В поле Table Properties выберите Secondary Indexes, и нажмите кнопку Define. Откроется окно, в левой части которого будут находиться все поля нашей таблицы, а в правой – индексные поля. Правая часть пока что пуста. Установите галочку "Maintained", без этого вы сможете пользоваться индексом только в режиме чтения, при добавлении новой записи будет выходить ошибка. Установка этой галочки говорит о том, что в дальнейшем индексация данных будет автоматической.

Выделите поле Avtor, и кнопкой со стрелкой вправо скопируйте его в правую часть. Таким образом, мы указали это поле как вторичный индекс.

Далее нажимаем кнопку OK. Выйдет окошко с запросом имени индекса, укажем там "Sort_Avtor". Называть индексы теми же именами, что и таблица, не рекомендуется – индексов может быть много, да и вам легче будет запутаться в одинаковых названиях. После этого, индекс Sort_Avtor должен появиться в окне ниже кнопки Define. При выделении этого индекса станут доступными еще две кнопки – Modify и Erase. Первой кнопкой вы сможете изменить этот индекс, второй – удалить его. Но нам это не нужно.

Далее точно также делаем другой индекс – нажимаем кнопку Define, копируем направо поле Nazvanie, и сохраняем индекс по имени "Sort_Nazvanie". Теперь в окошке вы должны видеть два индекса. Сохраните таблицу и выйдите из утилиты. Посмотрите на каталог с базой данных – он увеличился на 4 файла, по 2 файла на каждый индекс. Именно поэтому базы данных в серьезных приложениях бывают довольно большими и содержат сотни взаимосвязанных файлов.

С модификацией таблицы закончили, открываем наш проект. По команде меню "СортировкаПо автору" напишем такой код:

fDM.TBooks.IndexName := 'Sort_Avtor';

"СортировкаПо названию книги" будет содержать

fDM.TBooks.IndexName := 'Sort_Nazvanie';

Сохраните проект, скомпилируйте его и посмотрите, как он работает.

Подсчет данных

Улучшим пример, подсчитав общее количество книг и их сумму. Для этого в модуле DM создайте переменную – закладку. Она нам необходима для того, чтобы после подсчета возвращаться к записи, откуда вызвана процедура пересчета. И переменная должна находится там же, где определены компоненты Table, потому что закладки описываются в этих модулях. Переменная должна быть глобальной:

bm : TBookmarkStr; //закладка

Далее, в главном модуле в разделе Private опишем нашу процедуру:

procedure Itog;

Напишем эту процедуру в самом низу:

procedure TfMain.Itog;
var
   all : Integer; //для общ. кол-ва книг
   summ : Real; //для общ. суммы
begin
   //ставим закладку:
   DM.bm := fDM.TBooks.Bookmark;
   //обнуляем переменные
   all := 0;
   summ := 0;
   //перемещаемся от начала до конца и сохраняем результат:
   fDM.TBooks.First;
   while not fDM.TBooks.Eof do begin
      all := all + fDM.TBooks['Exemp'];
      summ := summ + fDM.TBooks['Exemp'] * fDM.TBooks['Cena'];
      fDM.TBooks.Next;
   end; //while
   //снова переходим на закладку и убираем ее:
   fDM.TBooks.Bookmark := DM.bm;
   DM.bm := '';
   //записываем данные:
   Label1.Caption := 'Всего книг: ' + IntToStr(all);
   Label2.Caption := 'На общую сумму: ' +
        FormatFloat('0,000.00', summ) + ' руб.'; //15 лекция
end;

Сгенерируйте событие onShow для главной формы и там вызовите нашу процедуру:

Itog;

Также добавьте ее вызов из команды меню "Редактирование – Добавить книгу". Теперь мы можем быть уверены, что при добавлении книги пересчет будет правильный.

< Лекция 31 || Лекция 32: 12 || Лекция 33 >
Виктор Пелих
Виктор Пелих

Здравствуйте.
Прохожу курс "Введение в программирование на Delphi"
Добрался до Лекции 29: Введение в базы данных.

Установлена RAD Studio 11.3, у которой отсутствует вкладка BDE и, соответственно, компонент Table,  который обеспечивает доступ к таблице средствами механизма BDE.
Поиск в интернете подсказал 
BDE Installer for RAD Studio, Delphi, C++Builder 10.3 Rio
Подскажите, имеется ли ещё возможность использовать механизм BDE в Delphi11 и если такая возможность есть, как подключить BDE к Delphi11?
С уважением...

 

Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989