Шаг 23.
Создание Internet-приложений в среде Delphi. Компонент TQueryTableProducer

    На этом шаге мы рассмотрим компонент TQueryTableProducer.

    Компонент TQueryTableProducer во многом аналогичен компоненту TDataSetTableProducer. С его помощью создается HTML-таблица на основе SQL-запроса к базе данных. Свойство DataSet у этого компонента отсутствует, вместо него используется свойство Query, в которое помещается запрос к базе данных. Остальные свойства у этих компонентов совпадают. Совпадают и три события, которые были рассмотрены выше. Очевидно, что информация для формирования SQL-запроса к базе данных, поступает от клиента как часть HTTP-запроса.


    В следующем примере будет сделана одна выборка из таблиц parts.db и vendors.db базы данных DBDEMOS. Из первой таблицы выводится описание товара, а из второй - название поставщика. Выборка будет производиться с помощью следующего запроса:
SELECT Parts.Description, Vendors.VendorName
FROM "parts.db" Parts
INNER JOIN "vendors.db" Vendors
ON (Parts.VendorNo = Vendors.VendorNo)

    Для формирования запроса можно воспользоваться услугами Построителя SQL-запросов.

    Создадим новое приложение Web-сервера и поместим на форму компоненты TQueryTableProducer и TQuery. Второй компонент располагается на странице доступа к данным - DataAccess и понадобится для формирования запроса к базе.

    Если щелкнуть правой кнопкой мыши на этом компоненте, то в появившемся меню можно выбрать команду SQL Builder.


Рис.1. Окно построителя SQL-запросов

    Окно построителя приведено на рисунке 1. Здесь в списках Table и Database нужно сначала отметить требуемую базу данных, а затем из нее выбрать нужное количество таблиц. В нашем случае в качестве базы данных выбираем базу DBDEMOS и таблицы parts.db и vendors.db.

    В первой таблице хранятся сведения о неких товарах, во второй - о поставщиках этих товаров. В HTML-таблицу будут выводиться только два текстовых поля: Description из первой и Vendor Name из второй таблицы.

    Поставщик товара в первой таблице обозначается по своему идентификационному номеру VendorNo. Этот же номер используется во второй таблице, из которой берутся подробные данные о поставщиках. Такой подход часто применяется в базах данных, чтобы избежать ненужного дублирования информации. Некоторые, повторяющиеся сведения обозначаются неким условным идентификатором, а в отдельной таблице, один раз, создается "расшифровка" таких идентификаторов.

    Чтобы в результирующей таблице вместо значений поля VendorNo проставились верные имена поставщиков, необходимо установить связь или отношение этих двух таблиц по полю VendorNo. В построителе SQL-запросов это делается просто. Нужно нажать на левую кнопку мыши, поместив перед этим курсор на поле VendorNo в таблице parts, а затем перетащить курсор мыши, при нажатой левой кнопке , в таблицу vendors и отпустить кнопку на поле VendorNo. В результате между таблицами будет установлена связь по выбранному полю.

    Теперь остается выполнить вторую часть SQL-запроса, указать поля, которые будут отбираться для просмотра. Для этого нужно перейти на закладку Selection и поставить отметки на нужных полях, или дважды щелкнуть на имени выбираемого поля. Далее выполняем команду Runиз меню Query для проверки сформированного запроса и, если все в порядке, выходим из Построителя. При этом в свойстве SQL объекта Query1 должна появиться приведенная выше строка запроса. Затем необходимо задать в свойстве Active значение True.

    Далее обратимся к объекту QueryTableProducer1. Чтобы компонент смог выполнить сформированный запрос, нужно из списка свойства Query выбрать имя объекта Query1. Затем активировать свойство Columns, для того чтобы загрузить Редактор Свойств. После этого, используя кнопку Add All Fields, надо сделать доступными отобранные ранее поля. В Редакторе Свойств можно настроить цвет и размеры колонок таблицы и дать им свои заголовки.

    После настройки внешнего вида таблицы, заполним оставшиеся свойства объекта QueryTableProducer1. Для получения полноценного HTML-документа заполняем свойства Header и Footer. В свойстве Caption задается заголовок этой программы.

    Затем создаем один объект-действие и связываем его с поставщиком страниц через свойство ProducerContent. После чего - откомпилировав проект, переложим его в каталог серверных приложений и отправим запрос через браузер.

    Вид окна браузера с полученной таблицей приведен на рисунке 2.


Рис.2. Результат выполнения приложения

    Листинг программы:

unit Unit1;
interface
uses
  SysUtils, Classes, HTTPApp, DBWeb, DBBdeWeb, DB, DBTables;
type
  TWebModule1 = class(TWebModule)
    Query1: TQuery;
    QueryTableProducer1: TQueryTableProducer;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  WebModule1: TWebModule1;
implementation
{$R *.DFM}
end.
Текст приложения можно взять здесь.

    Со следующего шага мы начнем рассматривать создание приложений с использованием сокетов.




Предыдущий шаг Содержание Следующий шаг