
- •Реляционные базы данных создание клиентских программ баз данных в среде delphi
- •2 Издание
- •Оглавление
- •2 Издание 0
- •Введение
- •Занятие 1. Разработка физической модели базы данных.
- •(Товар, Ед измерения) → Цена за ед (так как встречается один и тот же товар в различной упаковке)
- •Занятие 2. Создание базы данных в программе FlameRobin.
- •Занятие 3. Разработка форм «Товар» и «Покупатели».
- •Занятие 4. Разработка главной формы программы
- •Приложение 1. Дополнительные данные для ввода в бд:
Занятие 2. Создание базы данных в программе FlameRobin.
Приступим к созданию базы данных:
ЗАДАНИЯ
Запустите программу FlameRobin и зарегистрируйте удаленный сервер:
Рисунок 2. Регистрация удаленного сервера
Создайте новую базу, задав в диалоговом окне такие данные ( рис. 3 ):
Рисунок 3. Создание базы данных на удаленном сервере
Имя базы – TORG_FIOStudenta.fdb, а путь к файлу – директория на удаленной машине, на которой работает сервер (172.20.3.65). Имя пользователя и пароль - FIOStudenta, password, кодировка – WIN1251 (MS Windows, русская).
Рисунок 4. Объекты базы данных в FlameRobin
На рисунке представлено окно программы FlameRobin, подключенной к базе данных. Вызовите контекстное меню щелчком правой кнопки мыши для нашей базы данных. Выберите пункт Run a Query…
Откроется окно для ввода SQL-выражений и их выполнения ( рис. 5):
Рисунок 5. Окно ждя ввода SQL-операторов
Скопируйте и выполните приведенные выше SQL-операторы.
После выполнения операторов не забудьте нажать кнопку Commit (рис.6):
Рисунок 6. SQL-операторы. Малиновая кнопка с треугольником - Commit
Результатом наших действий стало создание разработанных нами пяти таблиц ( рис. 7 ):
Рисунок 7. Созданные таблицы в FlameRobin
Создайте генераторы и триггера для автоинкрементных полей IdTov и IdPokup так, как это описано в [2] на странице 14.
Создайте просмотр ( VIEW ) с именем PO_NAKL,
Создайте индексы, исключения, хранимые процедуры и триггера, приведенные на стр. 22-26 в [2].
Подробнее о создании объектов баз данных в СУБД Interbase (Firebird) рассказано в [2].
Введите по 2-3 записи в таблицы TOVAR, POKUP и NAKL, используя данные таблиц, приведенных на стр. 2.
После создания всех таблиц базы данных и заполнения тестовых данных мы готовы к разработке клиентского приложения в Delphi.
Занятие 3. Разработка форм «Товар» и «Покупатели».
Компоненты ZeosDBO размещаются на вкладке ZEOS Access и могут быть использованы в таких средах разработки:
Delphi 5 - 7 and 9-11
Lazarus (FreePascal)
MSEide+MSEgui (FreePascal)
C++ Builder 5 - 6
Kylix 2 - 3
Компоненты позволяют разрабатывать клиентские приложения ( при установленных в ОС клиентских библиотеках ) для следующих СУБД:
MySQL 3.20 - 5.0
PostgreSQL 6.5 - 8.1
Firebird 1.0 - 2.0
Interbase 5.0 - 7.5
Microsoft SQL Server 7, 2000
Sybase ASE 12.0, 12.5
Oracle 9i
SQLite 2.8, 3.5
Рассмотрим назначение основных компонент:
TZConnection - отвечает за подключение к базе данных выбранной СУБД и управление транзакциями. Кроме того, в этом свойстве можно задать кодировку клиентско программы в виде:
ZConection.Properties.Add ('lc_ctype=win1251');
или
ZConnection.Properties.Add ('Codepage=cp1251');
TZReadOnlyQuery – позволяет выполнять запросы не возвращающие результат или запросы Select. При этом полученные данные не редактируемы ( read only ).
TZQuery и TZUpdateSQL чаще всего используются совместно и являются наиболее гибким средством выполнения запросов.
Основные свойства TZQuery:
SQL (TStrings) – строки, в которых задан оператор Select выборки данных;
UpdateObject – свойство, в котором указывают объект класса TZUpdateSQL, который отвечает за выполнения операторов Insert, Update, Delete и Refresh для данного запроса;
Params (TParams) – позволяет создавать SQL-запросы с параметрами, в частности создавать связи Master-Detailed между компонентам – наследниками класса TDataset (TZReadOnlyQuery, TZQuery и TZTable );
Connection – подключает компонент к TZConnection, после чего компонент может получать метаданные соответствующего серверного объекта ( название и типы столбцов таблиц, участвующих в запросе), посылать запросы и получать результаты от СУБД;
Active - позволяет включить или отключить компонент.
Основные свойства TZUpdateSQL:
InsertSQL, ModifySQL, DeleteSQL, RefreshSQL (TStrings) - свойства для хранения соответствующих SQL – операторов.
На практике используется UpdateSQL Editor, вызываемый из контекстного меню компонента TZUpdateSQL.
TZTable - позволяет обращаться к одной определенной таблице в базе данных. В использовании проще, чем TZQuery, что обеспечивает его частое использование на практике.
Основные свойства TZTable:
TableName – задает имя таблицы базы данных на сервере;
Filter – используется для фильтрации данных, запрашиваемых у сервера и содержит строку с условиями отбора данных в том виде, в каком она используется после ключевого слова WHERE в операторе SELECT;
Filtered – позволяет включить или отключить фильтрацию данных.
TZStoredProc – используется для вызова хранимых процедур, созданных на сервере. Если хранимая процедура возвращает в клиентское приложение много строк, то вызывают ее используя оператор SELECT, например:
SELECT * FROM MyProc1( :par1, ‘Текст’ )
В том случае, если хранимая процедура возвращает в клиентское приложение одну строку, то вызывают ее программным способом, используя ее входные и выходные параметры. Например:
with spSumByName do
begin
Close;
ParamByName ('Name').Value := 'DontKnowHow';
Open;
Label1.Caption:= ParamByName ('Result').AsString
end;
TZSQLProcessor – предназначен для выполнения скрипта из нескольких SQL - операторов, загружаемого методами LoadFromStream() или LoadFromFile().
TZSQLMonitor – позволяет обрабатывать и записывать события, поступающие с сервера. В текстовый файл на диске:
sqlMonitor.FileName := '.\MyAppLog.log';
sqlMonitor.Active := True;
sqlMonitor.AutoSave := True;
В компонент Мемо:
Procedure Tfrm_MyApp.sqlMonitorLogTrace (Sender: TObject; Event: TZLoggingEvent);
Begin
If Trim (Event.Error) > '' Then
memMontor.Lines.Add (DateTimeToStr (Event.Timestamp) + ': ' +
Event.Message + #13#10 + ' Error: ' + Event.Error)
Else
memMontor.Lines.Add (DateTimeToStr (Event.Timestamp) + ': ' +
Event.Message);
End; // sqlMonitorLogTrace
TZSQLMetadata – позволяет получать метаданные об объектах базы данных ( таблицы, поля, просмотры и др. ) для использования в программе.
Отметим, что если компоненты TZConnection, TZReadOnlyQuery, TZQuery, TZUpdateSQL, TZTable опробованы лучше, то другие могут не работать должным образом для различных СУБД ( Приведенные данные взяты с сайта разработчика и справедливы для СУБД Firebird ).
ЗАДАНИЯ
Запустите Delphi и создайте новое приложение. Задайте свойству Name активной формы значение MainForm.
Добавьте в состав приложения модуль данных (File►New►DataModule), который предназначен для хранения невизуальных компонент разрабатываемого приложения. Его имя (Name)замените с DatataModule1 на DM.
Сохраните файлы проекта в отдельную папку. Для файла Unit1.pas задайте имя MainU.pas, Unit2.pas - DMU.pas, файл проекта Project1.dpr переименуйте в PrTorgovlia.dpr.
Чтобы начать работу с главными таблицами базы данных – «Накладная» и «Отпуск товара», Вам необходимо заполнить вспомогательные таблицы «Товар» и «Покупатель». Поэтому создайте дополнительную форму (File►New►Form), предназначенную для ввода товаров пользователем. Свойство BorderStyle этой формы установите равным bsSingle. Название формы измените на TovarForm, а заголовок – на «Сведения о товарах». Сохраните форму в общую папку проекта под именем TovarU.pas.
Переключитесь на работу с модулем данных и активизируйте его у (F12).
В палитре компонент Delphi найдите вкладку ZEOS Access и поместите в модуль данных компонент ZConnection и заполните свойства компонента данными:
DataBase = C:\Inetpub\ftproot\DB\Torgovl_FIOStudenta.fdb - - путевое имя файла БД на сервере. ( В других СУБД: MySql – имя базы данных, Oracle 11g R2 - SID базы данных – XE, а база данных определяется логином пользователя )
На
рисунке 8 приведены заполненные свойства
ZConnection:
Подключите базу данных – ( ZConnection.Connected=True).
Перенесите на модуль данных с вкладки ZEOS Access компонент TZTable и дайте ему имя TovarTbl. Чтобы подключить таблицу к существующей базе данных, задайте свойство Connection= ZConnection1. Так как в состав одной базы данных могут входить много таблиц (как в нашем случае), необходимо уточнить, какой таблице соответствует компонент Tovar. Поэтому откройте список поля TableName и выберите таблицу БД - Tovar.
Поместите в модуль данных экземпляр компонента DataSource ( они находятся на вкладке DataAccess ). Дайте имя компоненту DataSource DSTovar. В качестве свойства DataSet каждого компонента DataSource установите имя соответствующей таблицы TovarTbl.
Перейдите на форму TovarForm. С вкладки DataControls палитры компонент поместите компоненты DBGrid и DBNavigator. Со вкладки Additional добавьте на форму кнопку BitBtn. Свойство Kind кнопки установите в значение bkClose. Измените масштаб компонент и их расположение так, как показано на рисунке 10:
Рисунок 10. Форма TovarForm
Сохраните форму TovarU.pas.
Свяжите форму TovarForm c модулем данных. ( выполнив File►Use Unit►UDM )
Значение свойства DataSource для DBGrid и DBNavigator выберите из списка - DM.DSTovar. Активизируйте таблицу Tovar, задав свойству Active значение true. При этом вы увидите отображение в заголовках DBGrid названий столбцов, а в строках – данные строк таблицы товар.
Рисунок 11. Форма TovarForm в режиме разработки
Замечание: Обратите внимание, какие кнопки DBNavigator активны.
Нам нужно изменить заголовки столбцов таблицы, поместив в них названия на русском языке, а также задать формат вывода данных ( 2 знака после запятой ) для столбца Cena. Наиболее удобным методом является явное создание экземпляров полей таблицы Tovar и определение их свойств.
С
ейчас
определение класса TDM
выглядит так:
type
TDM = class(TDataModule)
ZConnection1: TZConnection;
Tovar: TZTable;
DSTovar: TDataSource;
private
{ Private declarations }
public
{ Public declarations }
end;
Переключитесь в режим формы, в Object TreeView, разверните список свойств Tovar, выделите Fields, вызовите контекстное меню и в нем выберите Add all fields ( как показано на рис. 12 )
Теперь определение класса TDM выглядит так:
type
TDM = class(TDataModule)
ZConnection1: TZConnection;
Tovar: TZTable;
DSTovar: TDataSource;
TovarIDTOV: TIntegerField;
TovarTOVNAME: TStringField;
TovarEDIZM: TStringField;
TovarCENA: TFloatField;
TovarTOVGROUP: TStringField;
private
{ Private declarations }
public
{ Public declarations }
end;
Переключитесь в режим разработки, выделите в Object TreeView поле CENA и посмотрите на список свойств в Object Inspector ( см. рис. 13 ):
Обратите внимание: имя объекта, наследника класса TField формируется как Таблица поле (TovarCENA); значением свойства FieldName является имя столбца таблицы в базе данных и не должно изменяться; свойство DisplayLabel служит для отображения названия столбца в визуальных компонентах; свойство DisplayLabel позволяет задать количество символов ( ширину ), отображаемых в визуальных компонентах. Например, поле в таблице может содержать строку из 50 символов, а столбец в DBGrid должен быть шириной 20 символов. Тогда для отображения остальных символов в длинных строках нужно поместить курсор в ячейку таблицы и смещать его вправо.
Свойство DisplayFormat позволяет задавать строку формата, что используется чаще всего для типов дата, время, вещественное значение ( если вещественное значение представляет деньги, то можно использовать более простой способ – установить значение currency равным true ). Обратите также внимание на свойства ReadOnly и Visible. ReadOnly позволяеть разрешить/запретить редактирования набора данных, Visible - скрывает/ показывает поле в визуальных компонентах.
Изменим значение свойства DisplayLabel на “Цена”. Дадим свойству DisplayFormat значение “#.00”, а DisplayWidth – 10. Задайте свойства DisplayLabel и DisplayWidth для полей TOVNAME – “Название”,20; EDIZM – “ед.изм”, 10; TOVGROUP – “группа товара”, 20.
Теперь данные на форме TovarForm выглядят так:
Рисунок 14. Форма «Товар» после задания свойств полей
Поместите на главную форму приложения компонент MainMenu и создайте в нем два пункта меню – Файл и Справочники. В первом пункте создайте подпункт Выход, а во втором – подпункты Товары и Покупатели.
Свяжите форму MainForm c модулем данных и формой TovarForm (см. пункт 12 ).
Выберите в главном меню Delphi пункты: Project -> Options, в разделе Forms в поле выбора Auto-created forms перетащите мышкой модуль DataModul DM на первое место!!!
Создайте обработчик события OnCreate для главной формы с таким содержанием:
DM.Tovar.Active:=True;
Щелчок по пункту Выход должен закрывать приложение. Щелкните по пункту и в редакторе кода в программе обработчика события наберите Close;
Теперь щелкните по пункту меню Справочники►Товары. В тексте обработчика события наберите: FormTovar.ShowModal;
Запустите приложение, перейдите к окну формы TovarForm и проверьте возможность заполнения данными таблицы Tovar.
Рисунок 15. Ввод новых данных в таблицу Tovar
Добавьте в проект новую форму, задайте свойство Name – PokupForm, Caption – Покупатели. Сохраните файл под именем PokupFUnit. Свяжите форму PokupForm с модулем данных DM, а главную форму – с модулем формы PokupForm.
Поместите на форме 2 компонента DBGrid и 2 компонента DBNavigator так, как показано на рисунке.
Рисунок 15. Визуальные компоненты формы «Покупатели»
В модуле данных DM разместите два новых компонента ZTable, задайте свойства Name Pokupatel и Phone соответственно. Свойства TableName – POKUP и TEL.
Разместите в DM два новых компонента DataSource, дав им имена DSPokup и DSPhone, а свойство DataSet для них установите – Pokupatel и Phone.
Подключите компоненты DBGrid и DBNavigator к DSPokup и DSPhone, откомпилируйте, запустите приложение и введите на форме PokupForm данные о 2 покупателях и 2 телефона для первого покупателя так, как приведено на рисунке:
Рисунок 16. Добавление новых данных в окне «Покупатели»
Первое, на что Вы наверное обратили внимание – навигация по данным родительской таблицы POKUP и дочерней таблицы TEL совершенно независимы, хотя нам было бы удобнее работать в данной форме не со всеми телефонами в таблице TEL, а только с телефонами одного покупателя.
Запомните: Реализация связей родительская – дочерняя таблица на сервере означает только контроль за целостностью данных и никак не связана с выборкой данных, т.е. результатами операторов SELECT и DML.
В Delphi и C++Builder эта проблема решается путем организации связи между компонентами – наследниками класса TDataset ( TTable, TQuery ) с помощью связывания Master – Detail. Как Вы поняли, компонент TDataSource осуществляет передачу данных от TTable к визуальным компонентам, но кроме этого используется в реализации связывания Master – Detail
Сейчас мы установим связь Master – Detail между компонентами TZTable родительской таблицы POKUP и дочерней таблицы TEL
В свойстве MasterSource дочерней таблицы Phone раскройте список и выберите TDataSource DSPokup, подключенный к родительской таблице. В выпадающем списке свойства MasterFields выберите среди всех полей таблицы POKUP поле первичного ключа - IDPOKUP, а для свойства LinkedFields выберите поле внешнего ключа таблицы TEL - POKUPID.
Запустите программу, откройте окно PokupForm и выполните навигацию по записям таблицы POKUP. Теперь в DBGrid, связанном с таблицей Phone отображаются только записи, относящиеся к текущей записи таблицы Pokupatel.
Рисунок 17. Добавление новой записи в таблицу Phone после создания связывания Master – Detail
На рис. 17 показано добавление новой записи в дочернюю таблицу. Обратите внимание, что значение поля внешнего ключа в таблице Phone добавляется автоматически. Следовательно это поле можно скрыть от пользователя, установив значение свойства Visible поля POKUPID равным false.
В следующих занятиях мы увидим, как реализовать связь Master – Detail для компонент TZQuery.