Писака из меня не кудышный..Так что принимается только конструктивная критика.
Автор: Багаутдинов Ирек Айратович, ака wsx.
------------------------------------------------------------------------------------------------------
Работа с PostgreSQL из приложения на Object Pascal (IDE: Delphi).
Тяжела работа российских администраторов: приходится выполнять самые разнообразные функции: администрировать сервера, сети, базы данных, разрабатывать приложения. В ходе такой работы у меня возникла задача реализации учёта компьютерного оборудования.
В частности, требовалось следующее:
1. Разработать «персональные карточки компьютеров»
2. Приход, списание оборудования на склад.
3. Использование оборудование со склада.
Вообще-то так получилось, что я – любитель баз данных, в особенности PostgreSQL.
Поэтому в своей разработке я использовал:
· Delphi 7 Personal
· PostgreSQL 8.0
· PostgresDAC 2.2.1
Что же собой представляет продукт «PostgresDAC»? PostgresDAC - является компонентом, способным работать на прямую с базой данных PostgreSQL. Данный продукт разработан и поддерживается MicroOLAP Technologies LTD. На их сайте также можно найти немало других интересных и полезных продуктов, связанных не только с базами данных: приложения для наблюдения за состоянием сети, «дизайнеры» карт баз данных, менеджеры данных для управления итд..
Так как рассматриваемая разработка не является коммерческой, и предназначалась только для использования в нашем малом офисе, я использовал Trial версию продукта. Особенности Trial лицензии:
· При подключении к базе данных появляется окошечко о разработчиках и сайте продукта.
· Закрытый исходный код.
В остальном компонент не отличается от коммерческих версий. Важно отметить, что работает он стабильно и быстро.
Ну что же, самое время запастись кружечкой кофе и начать работу над нашим приложением. Для начала следует разработать концепцию приложения, спроектировать базу данных и приступить к разработке.
Концепция.
Рассмотрим более подробно.
Разработка персональных карточек компьютеров
Что же такое «Персональная карточка компьютера»? Это личная карточка «болезней» каждого офисного компьютера, которая включает в себя характеристики оборудования, используемое программное обеспечение, данные по настройки сети, информацию о проведении профилактических работ, а так же дополнительные заметки.
Учет прихода и списания оборудования на склад.
Так как оборудование часто выходит из строя, организация закупает детали для «быстрой замены», а также списывает на склад морально устаревшее железо. Эту информацию необходимо фиксировать в разрабатываемом приложении.
Использование оборудование со склада.
Нам также может потребоваться фиксировать информацию об использовании оборудование со склада. Кому, когда и зачем было передано.
Само оборудование следует классифицировать для облегчения дальнейшей работы с приложением. Классы оборудования предлагается сделать динамическими, для дальнейшей маштабируемости.
Так же не стоит забывать и о программном обеспечении, установленном на компьютерах. Сведения о нем мы тоже будем заносить в базу данных.
У оборудования должны быть статусы: устаревшее, не рабочее, резерв, новое.
А так же sub-статусы: на складе, используется.
Очень важный момент – это представлять в чьём же распоряжении находится то или иное устройство.
Мы мысленно можем представить «дерево представления объектов данных» в приложении:
-Карточки компьютера.
--Карта№1
-Программное обеспечение
-Профилактические работы
-Пользователи
--Карта№2
-Программное обеспечение
-Профилактические работы
-Пользователи
--…
--Карта№N
-Программное обеспечение
-Профилактические работы
-Пользователи
-Оборудование
-Классы оборудования.
-Видео карты
--Riva TNT2
--Nvidia GeForce4 mx440
-Оперативная память
--512DDR2
--8mb SIM
-Мониторы
--Samsung Sync Master 765mb
-RAID контроллеры
Более-менее определившись с концепцией и задачами, можно приступать к разработке структуры базы данных.
Я предлагаю использовать следующую структуру БД:
CREATE TABLE devices(
id SERIAL NOT NULL,
PRIMARY KEY(id),
device_name VARCHAR(255) NOT NULL,
sn VARCHAR(50) NOT NULL,
device_group_id INT NOT NULL,
device_descr VARCHAR(500) NOT NULL,
status_str VARCHAR(10) NOT NULL DEFAULT ‘new’,
wh_status_str INT(1) NOT NULL DEFAULT 0,
comp_card_id INT NOT NULL,
user_id INT NOT NULL,
incoming_date DATE NOT NULL,
modification_date DATE NOT NULL,
brake_date DATE NOT NULL);
CREATE TABLE devices_groups(
id SERIAL NOT NULL,
PRIMARY KEY(id),
group_name VARCHAR(255) NOT NULL,
group_descr VARCHAR(500) NOT NULL,
last_incoming_date DATE NOT NULL,
dg_status INT(1) NOT NULL DEFAULT 1);
CREATE TABLE comp_cards(
id SERIAL NOT NULL,
user_id INT NOT NULL,
ip_addr INET NOT NULL,
net_mask INET NOT NULL,
dns1 INET NOT NULL,
dns2 INET NOT NULL,
domain_controller VARCHAR(255) NOT NULL,
computer_name VARCHAR(100) NOT NULL,
mac_address
gateway INET NOT NULL,
rescue_system VARCHAR(255) NOT NULL);
*По своему желанию вы можете добавить поля с данными о proxy сервере или VPN если используете таковые.
CREATE TABLE users(
id SERIAL NOT NULL,
PRIMARY KEY(id),
first_name VARCHAR(255) NOT NULL,
last_name VARCHAR(255) NOT NULL,
patronymic VARCHAR(255) NOT NULL,
position VARCHAR(255) NOT NULL,
phone_num BIGINT NOT NULL,
status INT(1) NOT NULL DEFAULT 1);
CREATE TABLE card_links(
id SERIAL NOT NULL,
PRIMARY KEY(id),
card_id INT NOT NULL,
device_group_id INT NOT NULL,
device_id INT NOT NULL);
CREATE TABLE soft_links(
id SERIAL NOT NULL,
PRIMARY KEY(id),
soft_id INT NOT NULL,
card_id INT NOT NULL);
CREATE TABLE works_links(
id SERIAL NOT NULL,
PRIMARY KEY(id),
work_id INT NOT NULL,
card_id INT NOT NULL);
CREATE TABLE soft(
id SERIAL NOT NULL,
PRIMARY KEY(id),
soft_name VARCHAR(255) NOT NULL,
soft_descr VARCHAR(400) NOT NULL,
soft_version VARCHAR(15) NOT NULL
default_path VARCHAR(500) NOT NULL);
CREATE TABLE works(
id SERIAL NOT NULL,
PRIMARY KEY(id),
work_name VARCHAR(255) NOT NULL,
work_descr VARCHAR(500) NOT NULL,
work_reason VARCHAR(500) NOT NULL,
work_date DATE NOT NULL);
Определившись со структурой базы данных мы можем переходить к процессу разработки. Для начала мы научимся производить основные операции, с СУБД используя PostgresDAC.
Создадим в среде Delphi новый проект. Далее, для удобства, я предлагаю вынести все объекты, которые напрямую связаны работой с СУБД в Data Module.
Сама установка компонента PostgresDAC – предельно проста и по этой причине я не буду её описывать в данной статье.
Начнём с подготовки компонентов к работе с базой данных.
Как видно из рисунка, на начальном этапе, я расположил в DataModule два объекта – TPSQLDatabase и TPSQLQuery.
Объекту TPSQLDatabase я назначил имя db, в объекту TPSQLQuery – query.
Хотелось бы поговорить подробнее об их свойствах.
Поле «Connected» принимает значение типа Boolean –True или False.
В поле «DatabaseName» следует указать имя базы данных, с которой мы будем работать.
В поле «Host» следует указать ip адрес или имя сервера, на котором располагается СУБД.
В поля «UserName» и «UserPassword» заносятся данные для авторизации на сервере. Соответственно имя пользователя и пароль пользователя, которые будут использованы для подключения и работы с БД.
В свойство «Params» можно занести дополнительные значения, если таковые требуются.
Указав все требуемые настройки, можно задать свойству «Connected» значение «true». Этим действием мы выполним соединение с СУБД.
Теперь я предлагаю вынести настройки подключения в отдельный конфигурационный файл. Эксперимента ради, будем использовать не обычный классический ini файл, а файл формата XML.
Создадим в текстовом редакторе файл с подобным содержанием и сохраним его в файл config.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Config>
<DataBase>
<DBname>warehouse</DBname>
<DBUser>MYCOOLUSER</DBUser>
<DBHost>database</DBHost>
<DBPass>MYCOOLPASS</DBPass>
</DataBase>
</Config>
Дальше, нам потребуется компонент, из закладки «Internet», XMLDocument. Его можно расположить на главное форме, или же вынести в отдельный модуль, для строгого разделения кода программы. Я же, для быстроты, вынес этот компонент на главную форму.
Следует задать свойства для полей DOMVendor и Name.
В качестве DOMVendor я выбрал OpenXML, а поле name приобрело значение XML.
Создадим процедуру, которая будет выполнять «прогрузку» конфигурации.
procedure LoadConfig();
var
XMLNode : IXMLNode;
begin
mainfrm.XML.FileName:='config.xml';
mainfrm.XML.Active:=true;
XMLNode := mainfrm.XML.DocumentElement.ChildNodes[0];
with dbModule do begin
db.Host := trim(XMLNode.ChildNodes['DBHost'].Text);
db.UserName := trim(XMLNode.ChildNodes['DBUser'].Text);
db.UserPassword := trim(XMLNode.ChildNodes['DBPass'].Text);
db.DatabaseName := trim(XMLNode.ChildNodes['DBname'].Text);
end;
dbModule.db.Connected:=true; //Устанавливаем соединение с СУБД.
end;
Теперь, после «прогрузки» конфигурационного файла, мы установим соединение с СУБД.
Далее следует продумать удобный для использования интерфейс. К сожалению я не обладаю даром делать вещи удобными. Так что у меня получилось что-то вроде:
На данной форме, мною использовались:
TDBGrid, TGroupBox, TSpeedButton, TPageControl, TMainMenu.
А так же DBNavigator для каждого DBGrid.
Вот здесь то нам и понадобиться компонент типа TPSQLTable. Он будет выступать в роли DataSet.
В поле «Database» следует выбрать имя компонента класса TPSQLDatabase.
Далее следует выбрать Table Name, если PSQDatabase уже настроен и подключен к базе данных, то появится список доступных таблиц.
На этом первая часть статьи закончена.
Полезные ссылки:
http://www.microolap.com/
http://www.sql.ru
http://www.postgresql.org
http://www.openproj.ru