Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
2004 г.

Маленькая база для маленькой компании

Николай Ткаченко, "Комиздат"

Сделать полезную информацию доступной для всех сотрудников не так уж и сложно. Для этого не обязательно быть программистом баз данных. Просто воспользуйтесь бесплатным офисным пакетом.

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

Такая технология существует давно и известна под названием "база данных для рабочих групп". Создать ее можно при помощи множества инструментов, которые отличаются возможностями и степенью сложности. Но в данном случае хотелось бы остановиться на проблеме организации базы данных небольшой организации, которая потребовала бы наименьших материальных и ресурсных затрат. Средства быстрой разработки программ, такие как Borland Delphy или MS Access, известны всем. А вот о том, что несложные базы данных можно строить с помощью OpenOffice, знают не все.

Эта рабочая среда не имеет отдельной встроенной программы, которая представляла бы соответствующие визуальные средства. Вместо этого предлагается использовать специализированный объект — DataSource, к которому можно производить обращение из таких типов документов, как  "текстовый документ", "таблица", "презентация". Далее, используя выражения SQL, можно интегрировать данные в документ и производить над ними все необходимые действия. Важно то, что строить запросы по выборке можно даже без знания SQL — достаточно воспользоваться многочисленными инструментами и мастерами, предоставленными в распоряжение пользователя.

Организовать базу данных с помощью OpenOffice (www.openoffice.org) можно как локально, так и по сетевой клиент-серверной технологии. Первый метод очень прост — но при этом скорость работы может быть сильно ограничена, если этой базой будут пользоваться одновременно несколько сетевых машин. В качестве другого способа (клиент-серверная технология) можно порекомендовать связку OpenOffice и MySQL. Вообще, сервером базы данных может быть любая программа, предоставляющая интерфейс ODBC/JDBC операционной среде, в которой работает OpenOffice.

Мы же рассмотрим именно MySQL — как наиболее доступную для неискушенных пользователей серверную платформу. Тем более что и литературы по ней более чем достаточно.

Постановка задачи

Чтобы легче было разобраться в последовательности действий и их смысле, вначале оговорим и конкретизируем задачу, которую мы хотим выполнить. Первый шаг сделаем достаточно простым — но не бесполезным.

Итак, есть список сотрудников и клиентов фирмы, а также перечень ее партнеров. Требуется создать набор учетных карточек как людей, так и организаций,— причем с возможностью различных выборок. К примеру, мы должны иметь возможность, задав название фирмы, получить список ее сотрудников — или, наоборот, выбрав определенного человека, получить информацию (адрес, телефон и др.) о той организации, где он числится.

В реляционных базах данных (а сейчас распространены практически только такие БД) информация хранится в таблицах. Нам понадобится две.

В первой будут размещены учетные карточки людей. Это значит, что столбцы таблицы будут содержать такую информацию, как имя, домашний адрес, телефон, e-mail и место работы.

Вторая таблица, относящаяся к предприятию, будет иметь следующие поля: название организации, ее адрес, телефон, факс и т.д.

Как вы понимаете, связь между таблицами может строиться через общее поле, идентифицирующее предприятие. Таким образом, для каждого человека известно, в какой организации он работает. Используя эту информацию, в соответствующей таблице можно найти дополнительные сведения о человеке, например узнать его рабочий телефон.

Установка необходимых программ

Начать можно с инсталляции MySQL на сервер. Сервером можно сделать любую машину, на которой будет находиться база данных и которая будет предоставлять доступ к этой базе другим компьютерам сети. Конечно, лучше, если это будет самая "сильная" машина в офисе. Но вначале, на стадии разработки и тестирования, обычно задействуют собственный ПК. Будем надеяться, что у вас установлена Windows 2000/XP.

Итак, распаковываем пакет mysql-4.0.21-win (или другую версию этой программы) и запускаем setup. Несколько раз нажав кнопку Ok, вы получите установленный в папку c:\mysql и готовый к работе программный пакет. Запуск этого сервера можно производить как из командной строки:

 c:\mysql\bin\mysqld

 так и виде сервиса, при старте Windows. Для этого нужно дать команду:

 c:\mysql\bin\mysql -install

 Остановка mysql может быть произведена так:

 c:\mysql\bin\mysqladmin -u root shutdown

 — или с помощью графической утилиты Службы, которая находится в Панели управления.

Запускаем MySQL-сервер и создаем базу данных. Дадим ей имя myoffdb, а пользователя, управляющего этой базой, назовем mydbadm. Делается это с помощью утилиты командной строки mysql, входящей в состав пакета.

Выполняем

c:\mysql\bin\mysql -u root

— мы очутились в оболочке mysql. Создаем нужного пользователя и предоставляем ему нужные права:

GRANT ALL ON myoffdb TO 'mydbadm'@'localhost' IDENTIFIED BY 'secret';
QUIT;

Не забудьте завершать каждую команду символом ";" — в противном случае утилита запутается. Как вы уже, наверное, догадались, пользователю myoffdb приписывается еще и пароль secret.

Далее создаем саму базу данных — делаем это при помощи все той же утилиты, но уже от имени пользователя mydbadm. Из командной строки вызываем mysql:

c:\mysql\bin\mysql -u mydbadm –p

После ввода правильного пароля (secret) попадаем в утилиту и даем команду:

CREATE DATABASE myoffdb;
QUIT;

База данных создана. В принципе, здесь же можно насоздавать и нужных таблиц, но работать с командной строкой не очень удобно, так что возложим эту задачу на OpenOffice.

Пришло время установить соответствующий коннектор ODBC. Зачем он нужен? Этот интерфейс позволяет различным клиентским программам обращаться к различным SQL-серверам, используя стандартный набор команд. То есть коннектор необходим тому же OpenOffice — не важно, будет он принимать данные от MySQL- или Postgree-сервера.

Нужный нам драйвер (MyODBC-standard-3.51.8-win) можно скачать с сайта www.mysql.com. Распаковываем этот драйвер и после копирования файлов вручную добавляем его в систему. Для этого откройте Панель управления > Администрирование > Источники данных и на вкладке Пользовательский DSN нажмите Добавить.... В появившемся диалоге (см. рис. 1) нужно выбрать MySQL ODBC и нажать Готово. Затем следует уточнить параметры, относящиеся к соединению с сервером баз данных. Для оговоренного нами случая можно ввести значения, как на рисунке. Если в данное время MySQL-сервер работает, то с помощью кнопки Test Data Source можно проверить работоспособность созданного интерфейса.

Рис. 1. С помощью средств ОС Windows, подключаем драйвер ODBC

Предположим, все нормально. Тогда устанавливаем OpenOffice, запускаем его и настраиваем источник данных. Для этого нужно открыть мастер адресных книг из меню File > AutoPilot > Address Data Source.... Из списка переключателей типов источников адресов выберите самый нижний — Other external data source. Нажмите Next, а затем кнопку Settings. Откроется окно, в котором нужно будет задать необходимые сведения о базе данных (вы помните, что в это время MySQL должен быть запущен?).

Сделайте все так, как изображено на рис. 2. Не забудьте сохранить настройки (кнопки Apply и Ok). Теперь OpenOffice знает, откуда черпать данные для дальнейшей обработки.

Рис 2. Подключаем базу данных в OpenOffice с помощью мастера

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

Но если изменения в таблицы вносить все-таки нужно, а используемый драйвер не позволяет этого делать, придется кое-что подправить в установках: в свойствах базы данных нужно добавить поле IgnoreDriverPrivileges со значением TRUE. К сожалению, для выполнения данного действия пользовательского интерфейса не предусмотрено. Впрочем, можно задействовать специальный макрос (http://dba.openoffice.org/howto/IgnoreDriverPrivileges.html).

Если вы совершенно не в курсе, как управляться с макросами, сделайте следующее: откройте Tools > Macros > Macro... В поле Macro Name введите какое-нибудь имя (например, WriteToDB) и нажмите кнопку New — откроется окно макросов. Проще всего стереть весь текст в окне и вместо него вставить код, скопированный с веб-страницы. Дальше следует запустить макрос Main на выполнение и задать правильное имя базы данных. Вот и все. Во всяком случае, для связки OpenOffice-ODBC-MySQL это работает.

Мы уже знаем, что без таблиц, между которыми устанавливаются связи, не обойтись. Собственно, эти связи и придают системе необходимую функциональность. Что ж, давайте создадим такие таблицы.

Начнем с описания фирм. Предположим, что все данные, которые могут нам понадобиться, это название фирмы, ее адрес, телефон/факс и e-mail.

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

Для создания таблиц воспользуемся встроенным в OpenOffice средством редактирования баз данных Data sources… — оно вызывается из меню Tools. Откройте вкладку Tables

Рис. 3. В этом диалоге можно отредактировать все таблицы


Теперь создаем таблицу firms — нажимаем кнопку New Table Design. Откроется редактор, в котором можно создавать поля таблицы со всеми необходимыми атрибутами: именем поля, типом, длиной и значением по умолчанию. С именем все понятно, а что касается типов, то поле может быть тестовым, числовым, датой и т.д. В нашей таблице все поля текстовые (в обозначения MysQL — VARCHAR).

Каждое поле имеет определенную длину, которая определяется максимальным количеством символов, которые можно в него вписать. Чем поле короче, тем быстрее работает  MySQL. Но, с другой стороны, если в такое поле не поместится название или адрес фирмы, то ничего хорошего тоже не получится. Как говорится, семь раз отмерь… В общем, создайте набор полей как на рис. 4 (но если у вас есть собственные соображения по поводу того, как усовершенствовать базу,— не стесняйтесь).

Рис. 4. Набор полей для таблицы с описанием фирм


При сохранении таблицы появится диалоговое окно с предложением создать Primary key (главный ключ). Соглашайтесь.

Следующая таблица, которая нам понадобится, это persons — она содержит информацию о конкретных людях. Ее поля могут быть такими: "Имя", "Фамилия", "Домашний телефон", "Место работы". Место работы должно совпадать с соответствующим (а именно — Name) полем в таблице firms. И тогда, используя выборку, мы сможем узнать дополнительные сведения о человеке, в том числе его рабочий телефон и e-mail.

Вновь воспользовавшись редактором New Table Design, задаем поля таблицы —получится нечто похожее на то, что изображено на рис. 5.

Рис 5. Поле Work — это сноска на таблицу с описанием фирм


Костяк базы данных готов, остается вопрос ее наполнения и выборки записей по различным критериям.

Заполняем таблицы

Теперь можно попробовать заполнить поля таблиц. Правильней будет сначала ввести информацию о фирмах, а потом уже заняться персональными карточками сотрудников. Это потому, что строка информации о людях имеет поле Work — сноску на таблицу firms.

Редактировать таблицы можно и в режиме Data Sources, если включить его через меню View > Data Sources или при помощи соответствующей кнопки панели инструментов. Впрочем, такая работа подходит для стадии отладки, а не для конечного использования. На рис. 6 показано, что в этом случае очень хорошо видна структура таблицы, все ее поля.

Рис. 6. В режиме Data Sources таблица представлена пользователю "как есть"

Но единственное действие, которое можно произвести для повышения удобства операторской работы, это скрыть какой-то столбец. К примеру, в данном случае столбец ID нам не нужен — он заполняется автоматически. Скрыть его можно при помощи контекстного меню (вызывается правой кнопкой мыши).

А вот переименовать колонки таблицы нельзя. Это неудобно — ведь иногда приходиться давать столбцам абстрактные имена в английском написании (вроде wrktelnum — не очень-то понятно).

Чтобы упростить редактирование базы данных, можно прямо на листе документа вставить специальную форму. Для этого следует переключиться в режим дизайна, нажав кнопку Design Mode On/Off (рис. 7).

Рис. 7. Переключатель режима дизайна


Затем следует открыть панель инструментов Form Functions и активировать инструмент Table control (рис. 8). Теперь очертите на листе фрагмент, в котором должна содержатся форма. Автоматически запустится диалог-помощник, который попросит выбрать для включения в форму нужную таблицу и ее поля.

Рис. 8. Инструмент для удобного редактирования таблиц


В созданной форме с помощью контекстного меню Columns колонке можно дать понятное имя, добавить подсказку и настроить некоторые другие опции (см. рис. 9).

Рис. 9. Теперь можно придать таблице подходящий вид


Если выключить режим дизайна, то записи таблицы будут выглядеть примерно так, как на рис. 10. А в самой форме можно найти все инструменты для добавления или удаления записей, их фильтрации и сортировки.

Создаем форму для удобного редактирования таблиц

 с персональной базой, скорее всего, вызовет ваше неудовольствие. Дело в том что поле Work в таблице persons указывает на имя фирмы (поле Name) в таблице firms. Логично было бы устроить форму редактирования таким образмо, чтобы название фирмы можно было выбирать из списка. И этого можно добиться, если заменить текстовое поле на поле со списком.

Но вначале следует создать запрос (Query), который будет возвращать список названий всех фирм, существующих в нашей базе данных. Сделать это можно с помощью элемента New Query, принадлежащего контекстному меню объекта Queries из источника данных (если последний закрыт, вызвать его можно с помощью ).

Проще всего создавать запрос в визуальном виде (Design view) — в этом случае все сводится к правильному выбору предлагаемых элементов диалога. Только в начале нужно добавить таблицы, из которых будет проводиться выборка. В нашем случае такая таблица одна — firms (рис. 11).

Рис. 11. Из этих таблиц будет происходить выборка результатов

Посмотрите на рис. 12 и сделайте точно так же. Вас может удивить присутствие двух одинаковых столбцов Name — но это вполне объяснимо: функции у них будут разные.

Рис. 12. Для работы с формой нужно два одинаковых столбца


Результат в виде SQL-синтаксиса можно увидеть, если с помощью кнопки Switch Design View On/Off (на ней изображен школьный угольник) переключиться в режим SQL. Командная строка должна выглядеть примерно так:

SELECT `Name`, `Name` FROM `myoffdb`.`firms` `firms

Как работает запрос, можно также проверить с помощью кнопки Run Query (в панели инструментов первая слева). Осталось только сохранить запрос(все формы и запросы сохраняются вместе с документом OpenOffice) под именем, скажем,  FirmsName.

Следующий этап — создание формы редактирования таблицы учетных карточек сотрудников и модернизация ее путем внедрения созданного нами запроса. Для этого элемент Table control, привязанный к таблице person, вставьте на пустую страницу. Вы уже можете редактировать (изменять, добавлять, удалять) записи, единственное неудобство это поле Work. Его содержимое — название предприятия, где работает человек. Обидно вводить эти записи еще раз. К тому же, нельзя ошибиться даже в мелочи — этого будет достаточно, чтобы не сработала автоматическая выборка, а ведь именно в автоматизации вся сила баз данных.

Впрочем, эту беду можно обойти. Осталось разобраться, как.

Вызовите правой кнопкой мыши контекстное меню столбца Work и с его помощью выполните преобразование Replace with/List box — таким образом вы замените текстовое поле на список. Самое сложное — это наполнить этот список нужным содержимым и связать его с полем Work таблицы persons. Такую настройку свойств элемента списка можно произвести, вызвав правой кнопкой мыши диалог Column...

Откроем вкладку Data. На ней находятся четыре важных для нашего случая параметра:

  • DataField. Поле в таблице, к которой привязана форма, будет изменяться с помощью этого элемента списка;
  • Type of list contents — способ (тип), при помощи которого будет наполняться список. Мы обязаны выбрать Query (ведь специально для этого и создавался запрос); если же избрать SQL, то SQL-запрос можно будет ввести "на ходу", без лишней возни по дизайну запросов;
  • List Content. Выбрали тип наполнения — теперь нужно конкретизировать его суть. В нашем случае это можно сделать, выбрав из списка запрос FirmsName (в другом случае в этом поле пишется строка SQL-команды);
  • Bound Field — очень интересный параметр. Помните, в запросе мы делали две колонки с одинаковыми значениями, Name? Роль первой проста — эта колонка отображается как содержание списка. То есть, если запрос проводить по-другому (например, SELECT `City`, `Name`), то в списке будут отображаться не названия фирм, а города, где они расположены. Отображаться, а не записываться в базу! Поле запроса, которое должно вноситься в таблицу, указывается номером (начиная с нуля) в рассматриваемом параметре.

Посмотрите еще раз на диалог. В данном поле стоит единица (ноль, кстати, указать не удается) — это получается второе по счету поле запроса, Name. Его содержимое будет записываться в поле таблицы, указанное в параметре DataField. Попросту говоря, с помощью данных параметров мы определяем, какое поле запроса писать в конкретном поле таблицы. При этом в списке всегда будет отображаться первое поле запроса. Хитро.

Снова переключите режим формы Design Mode On/Off. Надеюсь, все сделано правильно и результат достигнут: теперь фирму, в которой работает человек, можно выбирать из списка.

Запрос с параметром

Для построения разнообразных выборок из таблиц, придется освоить параметризированные запросы. Предположим, следует найти все фирмы, которые расположены в Севастополе. Для этого нужно будет построить простенький запрос (используйте New Query(Design View), если нет желания возиться с SQL-синтаксисом).

Рис. 13. Параметр запроса обозначается в поле Criterion двоеточием


Обратите внимание на рис. 13. Это подсказка по созданию запроса. В поле Criterion вписывается критерий выборки. Если критерий параметризованный (то есть такой, что будет определяться во время выполнения), то его имя должно начинаться с двоеточия. В виде SQL-команды он выглядит следующим образом:

SELECT `Name`, `City`, `Address`, `Tel`, `Fax` FROM `myoffdb`.`firms` `firms` WHERE ( ( `City` = :x ) )

Теперь выполните запрос — появится диалоговое окно с просьбой определить параметр "x" (рис. 14).

Рис. 14. Укажите город, по которому следует провести выборку

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

Возьмем документ, в который мы встроили таблицу persons, и несколько дополним его. А именно: сделаем так, чтобы при выборе определенного сотрудника сразу отображалась его рабочая информация. Для этого нужно создать форму, подчиненную главной.

Для управления формами документа, если их несколько, предусмотрено специальное средство — Form Navigator, он вызывается из панели функций. Вызовите контекстное меню и создайте новую форму (как это показано на рис. 15).

Рис. 15. Подчиненные формы нужны для обработки запросов с параметрами

Пока это всего лишь оболочка — в ней нет ни одного отображаемого объекта. Впрочем, ими мы займемся позже. Роль подчиненной формы лучше всего продемонстрировать наглядно (см. рис. 16).

Рис. 16. Соотношение между источником данных и документом определяется в свойствах подчиненной формы


В данном случае, мы не будем создавать отдельный запрос для выборки информации о предприятии, а впишем соответствующую SQL-команду прямо в форму:

SELECT `City`, `Address`, `Tel`, `Fax`, `Name` FROM `myoffdb`.`firms` `firms` WHERE ( ( `Name` = :firm )

Как видите, в результате работы команды будут отобраны данные (город, адрес, телефон, факс) для фирмы, название которой предается через параметр firm.

Как передать этот параметр? Для этого можно выделить соответствующее поле (Work, именно в нем находится название фирмы, где работает интересующий нас человек). При этом связь между конкретным полем и параметром запроса оформляется с помощью свойств подчиненной формы Link master fields и Link slave fields — как это изображено на рис. 16.

Механизм работы формы будет строиться по следующему принципу: при перемещении по записям основной таблицы (учетные карточки сотрудников) будет формироваться параметр firm, как значение поля Work. В результате передачи этого параметра в подчиненную форму, которая основана на параметризованном SQL-запросе, актуальные данные будут отображены в документе.


*  *  *

Информацией сегодня принято дорожить. В какой бы сфере вы ни работали, база данных — по клиентам или по сделкам — понадобится всегда.

Конечно, существуют специализированные программные продукты — CRM. Но практически все они созданы на коммерческой основе. Как ни странно, в этом есть свои минусы — чтобы поднять стоимость таких программ, разработчики "раздувают" их по максимуму. И если на данном этапе работа вашего предприятия не нуждается в полноценной, масштабной автоматизации отношений "менеджер-клиент", можно попробовать обойтись "малой кровью".

База данных, созданная собственными руками, может быть гибко адаптирована под специфику работы предприятия, оперативно модернизироваться и расширяться. А если через некоторое время вы все-таки придете к необходимости использования коммерческой CRM, прежние наработки не пропадут зря. Ведь все системы такого рода используют для хранения данных стандартное хранилище — SQL-сервер. А значит, есть техническая возможность импортировать данные в новую программу.

Новости мира IT:

Архив новостей

Последние комментарии:

Loading

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 985 1945361
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2015 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...