Валерий Юринский, Алексей Ярцев

Фирма "Софтсервис", Москва

(Опубликована в "ORACLE Magazin/Russian Edition", № 2, 1996г.)

Intranet: Первый опыт успешен

Зачем?

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

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

Что-где искать Пользователю2 ? Какую программу запустить? Как собрать все вместе, объединив единым, интуитивно понятным интерфейсом? - этим вопросом озадачивались, наверное, многие аналитики и разработчики.

Свершилось! Технологии глобальной сети Internet привлекают все больше и больше сторонников. Корпоративные базы данных, справочные системы, офисы Предприятий все плотнее опутываются гипертекстовой Всемирной Паутиной.

Вместе с эрой Водолея наступает эра Internet/Intranet.

Что мы сделали?

Расскажем о своем первом опыте разработки приложений Intranet.

Это главная страница Intranet офиса:

Undisplayed Graphic

Рис. 1

Первый пункт - общедоступная информация. Это копия или, как говорят, “зеркало” Web-сервера www.softexpress.ru.

Остальная информация предназначена для внутреннего использования. Здесь, как Вы видите, есть сведения о проводимых мероприятиях, офис продажи (товары, цены, склад, выписка счетов), блок регистрации участников конференции и подсистема запросов к базе данных клиентов фирмы.

Вся информация хранится на сервере, работающем под управлением операционной системы Microsoft Windows NT.

Часть сведений хранится в виде статических HTML-страниц, в файлах Microsoft Word, Microsoft Excel и Adobe Acrobat.

“Офис продажи” - динамические интерактивные HTML-страницы. Исторически сложилось так, что эта часть системы была некогда написана на Clipper’е и до сих пор успешно использовалась. Поэтому, чтобы не ломать работающее приложение, формированием страниц и обработкой данных здесь по прежнему пока занимается Clipper.

Информация о клиентах фирмы загружена в таблицы Oracle7 Workgroup Server. поэтому, запросы к ней реализованы средствами Oracle Web Server. Рассмотрим подробнее, как построена эта часть информационного обеспечения офиса.

Как это выглядит снаружи?

Сценарий работы

Приложение состоит всего из четырех динамически генерируемых HTML-страниц.

Первая страница - регистрация пользователя в системе:

Undisplayed Graphic

Рис. 2
[к тексту]

При успешной проверке имени и пароля клиента высвечивается вторая страница:

Undisplayed Graphic

Рис. 3
[к тексту]

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

В конце списка выход в главное меню Internet офиса, откуда мы “пришли” в раздел "Запросы к базе данных".

Допустим, что мы выбрали таблицу “СОТРУДНИКИ”, тогда появляется следующа страница:

Undisplayed Graphic

Рис. 4
[к тексту]

В полях этой формы Пользователь может:

Вывод на экран выбранных строк регулируемыми порциями более удобен дл просмотра и позволяет снизить загрузку сети, поскольку Пользователь, особенно не новичок, как правило, получает нужные данные отнюдь не в последних строках, выбранных по запросу. Однако, при этом 1) увеличивается нагрузка на сервер базы данных (запрос повторяется при каждом “листании”) и 2) при работе с быстро меняющимися данными есть шанс на последующих “листах” увидеть уже просмотренные данные или не найти их же на предыдущих. Учитывая сказанное, для больших и/или очень часто модифицируемых таблиц, а также для сложных представлений данных (view), будет уместным установить по умолчанию число выводимых строк достаточно большим.

Если в таблице много столбцов, (как, например, в представлении СОТРУДНИК_ОТДЕЛ_НАЧАЛЬНИК), то при выводе она может не уложиться в ширину экрана и ее будет неудобно просматривать. Поэтому Пользователь может сам определить перечень требуемых ему данных.

Параллельно задаются параметры запроса. При этом различаются типы данных столбцов: числовые данные и прочие данные.

Условие SQL Эквивалент Выводимое
имя условия
Примечание
LIKE ‘X’ LIKE ‘X’ КАК Для нечисловых данных
NOT LIKE ‘X’ NOT LIKE ‘X’ НЕ КАК Для нечисловых данных
= X = ANY (X) = Возможно более удачным будет 'РАВНО'

При замене X на X1,X2,X3 реализуетс условие IN(X1,X2,X3)

!= X != ALL (X) != Возможно более удачным будет 'НЕ РАВНО'

При замене X на X1,X2,X3 реализуется условие NOT IN(X1,X2,X3)

< < < Возможно более удачным будет 'МЕНЬШЕ'
<= <= <= Возможно более удачным будет 'МЕНЬШЕ/РАВНО' или 'НЕ БОЛЬШЕ'
>= >= >= Возможно более удачным будет 'БОЛЬШЕ/РАВНО' или 'НЕ МЕНЬШЕ'
> > > Возможно более удачным будет ' БОЛЬШЕ'
IS NULL IS NULL ПУСТО
IS NOT NULL IS NOT NULL НЕ ПУСТО
BETWEEN

X and Y

BETWEEN

X and Y

МЕЖДУ

X и Y

Только для числовых данных. При отсутствии в 'Значении' контекста '_и_ ' преобразуется в '>='

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

Если для столбца задано только имя условия, н не определено соответствующее ему значение (за исключением 'ПУСТО' и 'НЕ ПУСТО'), то в динамически формируемом запросе ограничения выборки по данному атрибуту не накладывается. Это позволяет высвечивать в listbox'ах условия наиболее упоребительное имя по умолчанию (для нечисловых данных - 'КАК').

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

После того, как все условия заданы Пользователь инициирует выполнение запроса кнопкой 'ВЫБРАТЬ' и получает на экране таблицу результатов:

Undisplayed Graphic

Рис. 5
[к тексту]

Как видим в шапке таблицы выводятся заголовки столбцов, причем эти заголовки отличаются от логических имены полей, которые высвечивались в форме, где задавались условия запроса. Это необходимо потому, что форматирование таблиц производится Internet browser'ом автоматически. При этом он "старается" а) чтобы таблица, по возможности, помещалась по ширине экрана и б) чтобы ширина столбца позволяла, если это возможно, самый длинный текст ячейки таблицы уместить в одну строку.

Если при выборке данных из базы было использовано какое-либо условие, то его текст выводится под заголовком столбца зеленым цветом. Это нужно, чтобы напомнить Пользователю об ограничениях выборки и подтвердить, что они приняты. Аналогично выводятся параметры сортировки: 'сртN' (по возрастанию) и/или 'сртNу' (по убыванию).

Сколько строк выбрано по запросу и какой номер строки результата виден в первой строке на экране указано в заголовке окна browser'а. В соответствующих случаях выводятся надписи <первая строка> и <последняя строка>.

За прокрутку вперед и назад отвечают кнопки '<<НАЗАД' и 'ДАЛЕЕ>>'. Кнопка 'ПАРАМЕТРЫ' возвращает к форме, где задаются параметры запроса, а 'СПИСОК ТАБЛИЦ' переносит на страницу со списком доступных таблиц.

“А что у нея там внутри?”

Программные средства

Поскольку работа идет исключительно с базой данных, то вполне естественно хранить приложение в той же самой базе данных. Поэтому используем Oracle Web Server и PL/SQL-интерфейс.

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

Структура данных

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

MY_WEBABLE_TABLES (СПИСОК ДОСТУПНЫХ ТАБЛИЦ)

create table MY_WEBABLE_TABLES (
TABLE_NAME VARCHAR2(30) not null,
LOGICAL_TABLE_NAME VARCHAR2(30) not null,
ORDER_NUM NUMBER default 1 not null,
SELECT_BY_NROWS NUMBER default 10 not null,
constraint MY_WEBABLE_TABLES_PK primary key (TABLE_NAME) )
/

TABLE_NAME - имя таблицы или представления в словаре данных Oracle7,

LOGICAL_TABLE_NAME - лЃEEЊгическое имя таблицы, которое выводится в списке таблиц,

ORDER_NUM - порядковый номер в списке доступных таблиц,

SELECT_BY_NROWS - сколько строк выбирается за один раз по умолчанию (высвечивается в поле формы запроса к таблице).

MY_TAB_COLUMNS (ОПИСАНИЕ СТОЛБЦОВ ДОСТУПНЫХ ТАБЛИЦ)

create table MY_TAB_COLUMNS (
TABLE_NAME VARCHAR2(30) not null,
COLUMN_NAME VARCHAR2(30) not null,
LOGICAL_COLUMN_NAME VARCHAR2(30) not null,
COLUMN_HDR VARCHAR2(30) not null,
ORDER_NUM NUMBER default 0 not null,
SELECT_BY_DEFAULT NUMBER(1,0) default 1 not null,
constraint MY_TAB_COLUMNS_PK primary key (TABLE_NAME, COLUMN_NAME),
constraint MY_TAB_COLUMNS_FK_MY_WEB_TABS foreign key (TABLE_NAME)
references MY_WebABLE_TABLES),
constraint CHK_SELECT_BY_DEFAULT check (SELECT_BY_DEFAULT in (0,1))
/

TABLE_NAME - имя таблицы или представления в словаре данных Oracle7,

COLUMN_NAME - имя столбца таблицы в словаре данных Oracle7,

LOGICAL_COLUMN_NAME - логическое имя столбца , которое выводится в форме, которая отвечает за построение запроса к таблице,

COLUMN_HDR - заголовок столбца таблицы (выводится в шапке таблицы результата выполнения запроса),

ORDER_NUM - порядок появления столбца в форме построения запроса и в таблице результата,

SELECT_BY_DEFAULT - нужно просматривать данные столбца по умолчанию (1 - да, 0 - нет).

Необходимые сведения о типе данных столбца выбираются из атрибута DATA_TYPE стандартного представления USER_TAB_COLUMNS:

select ..., U.DATA_TYPE
from USER_TAB_COLUMNS U, MY_TAB_COLUMNS M
where M.TABLE_NAME = U.TABLE_NAME
and M.COLUMN_NAME = U.COLUMN_NAME;

MY_CLIENT (КЛИЕНТЫ)

create table MY_CLIENT (
CLIENT_NAME VARCHAR2(15) not null,
CLIENT_PASS VARCHAR2(15) not null,
CLIENT_COMMENT VARCHAR2(500),
primary key (CLIENT_NAME))
/

CLIENT_NAME, CLIENT_PASS, CLIENT_COMMENT - имя, пароль и примечание.

MY_LAST_QUERY (ПРЕДЫДУЩИЙ ЗАПРОС КЛИЕНТА К ТАБЛИЦЕ)

create table MY_LAST_QUERY (
CLIENT_NAME VARCHAR2(15) not null,
TABLE_NAME VARCHAR2(30) not null,
MY_SEL_BY_NROWS INTEGER not null,
QUERY_DATE DATE not null,
primary key (CLIENT_NAME, TABLE_NAME))
/

MY_SEL_BY_NROWS - сколько строк выбиралось за один раз (высвечивается в поле формы при следуюшем запросе к таблице), QUERY_DATE - дата запроса. Смысл остальных атрибутов совпадает с одноименными в описанных ранее таблицах.

MY_CLIENT (ПАРАМЕТРЫ ПРЕДЫДУЩЕГО ЗАПРОСА КЛИЕНТА)

create table MY_LAST_QUERY_PARM (
CLIENT_NAME VARCHAR2(15) not null,
TABLE_NAME VARCHAR2(30) not null,
COLUMN_NAME VARCHAR2(30) not null,
MY_SELECT_BY_DEF NUMBER(1) not null,
MY_WHERE_COND VARCHAR2(30),
MY_WHERE_VALUE VARCHAR2(30),
MY_ORDER_BY VARCHAR2(30),
MY_ASC_DESC VARCHAR2(30),
primary key (CLIENT_NAME, TABLE_NAME, COLUMN_NAME),
foreign key (CLIENT_NAME) references MY_CLIENT,
foreign key (TABLE_NAME, COLUMN_NAME) references MY_TAB_COLUMNS)
/

Атрибуты, имена которых начинаются с MY_ предназначены для хранения параметров предыдущего запроса. Смысл остальных атрибутов совпадает с одноименными в описанных ранее таблицах.

Реализация приложения

Все приложение оформлено в виде пакета PL/SQL. Используются стандартные средства Oracle7 - пакет DBMS_SQL, Oracle Web Server’а - пакеты HTF, HTP и OWA_UTIL, а также пакет OWA_SQL Томаса Кайта.

После проверки имени и пароля Пользователя (Рис. 2) процедура WELCOME обращается к главной процедуре MAIN, которая выбирает логические имена доступных таблиц из MY_WEBABLE_TABLES в порядке, определяемом значением ORDER_NUM, и генерирует видимую Пользователю динамическую HTML-страницу (Рис. 3).

Логические имена таблиц (LOGICAL_TABLE_NAME) - гипертекстовые ссылки (anchors). Значения их параметров - имена таблиц в базе данных Oracle7 (...VALUE=“ИМЯ_ТАБЛИЦЫ_БД”).

Выбирая “мышью” нужную таблицу Пользователь инициирует процедуру QUERY_FORM, которая получает из главной процедуры TABLE_NAME. Затем из MY_TABLE_COLUMNS или MY_LAST_QUERY_COLS (если есть) выбирается информация, соответстствующая заданной таблице и Пользователю, и генерируется HTML-страница для ввода параметров запроса (Рис. 4).

После формирования запроса Пользователь нажимает кнопку ‘ВЫБРАТЬ’ и QUERY_FORM обращается к процедуре DO_QUERY, которая формирует команду SELECT, включая список столбцов, фразы FROM, WHERE и ORDER BY и вызывает процедуру FETCH_ROWS. При этом из соответствующих таблиц удаляются данные о предыдущем запросе и записываются сведения о текущем.

FETCH_ROWS выдает на экран первую порцию выбранных данных (Рис. 5) и, рекурсивно обращаясь, к самой себе обеспечивает их прокрутку вперед (‘ДАЛЕЕ>>’) и назад (’<<НАЗАД’).

Для нового запроса к той же таблице нужно нажать кнопку ‘ПАРАМЕ 2OРЫ’, при этом снова вызывается QUERY_FORM (Рис. 4).

При выборе 'ОЧИСТИТЬ' процедура FETCH_ROWS удаляет параметры предыдушего запроса данного Пользователя и вновь вызывает QUERY_FORM.

’СПИСОК ТАБЛИЦ’ вызывает главную процедуру.

Прочие возможности

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

create view EMP_DEPT_MGR (
EMPNO, ENAME, JOB, MGR, MGRNAME,
HIREDATE, SAL, COMM, DEPTNO, DNAME, LOC)
as select E.EMPNO, E.ENAME, E.JOB, E.MGR, M.ENAME,
E.HIREDATE, E.SAL, E.COMM,
E.DEPTNO, D.DNAME, D.LOC
from EMP E, EMP M, DEPT D
where E.DEPTNO = D.DEPTNO
and E.MGR = M.EMPNO
/

Сразу после добавления данных о нем в таблицы MY_WEBABLE_TABLES и MY_TAB_COLUMNS данное представление уже доступно для просмотра.

Триггеры таблиц MY_LAST_QUERY и MY_LAST_QUERY_COLS (after insert for each row) позволяют накапливать полезные статистические данные - какие таблицы и их атрибуты наиболее часто используются, каковы типичные условия запросов и сортировок, кто, когда, что запрашивает и проч. Все это позволяет изучить потребности Пользователей и улучшить вашу базу данных.

Настройка клиентской части Oracle

На компьютере, где работает Oracle Web Agent (OWA), кроме стандартной его настройки и настройки агента (NLS_LANG = AMERICAN_AMERICA.CL8MSWIN1251) следуует установить значение параметра:

NLS_DATE_FORMAT = DD.MM.YYYY

(в ОС Microsoft Windows NT для этого нужно вызвать программу REGEDIT32.EXE)

Это делается для того, чтобы календарные даты отображались в привычном для нас всех виде. Четыре цифры при написании года тоже необходимы - до 2000-го осталось всего три года!

Заключение

Конечно представленное пробное приложение далеко от совершенства (которого, как говорил Сальвадор Дали, нам “все равно никогда не достичь”). Тем не менее оно позволило опробовать технологии Internet применительно к стандартной промышленной СУБД Oracle7.

Разработанное приложение обеспечивает простое построение запросов и позволяет в течение нескольких минут подключать/отключать любые таблицы и представления СУБД Oracle7.

Эти свойства могут быть весьма полезны при переходе от настольных систем, разработанных на базе Clipper, dBASE, FoxPro, Clarion и др., к архитектуре клиент сервер. Вы загружаете ваши старые таблицы в базу Oracle7, если нужно создаете объединяющие их представления и можете сразу приступать к работе.

Пока средства разработки Web-приложений не поспевают за потребностями программирующей публики. Однако появление новой версии Oracle Designer/2000, Borland IntraBuilder и других продуктов вселяют во всех причастных к Internet нормальный оптимизм.

Internet/Intranet - уже не будущее. Это - Настоящее (во всех смыслах этого слова).

Попробуйте! У нас получилось. И у Вас обязательно получится!

Благодарности

Авторы выражают свою признательность Томасу Кайту (tkyte@us.oracle.com), за прекрасный PL/SQL-пакет OWA_SQL, который Томас послал в телеконференцию comp.databases.oracle и который существенно облегчил разработку.

Валерий Юринский благодарен Алексею Ярцеву (alex@softexpress.ru) за многочисленные знания разнообразных технологий Internet, а Алексей Ярцев - Валерию Юринскому (vsu@softexpress.ru) за обширные познания технологий Oracle. :-)


Примечания авторов

1 "Предприятие" Следуя за К.Дейтом будем считать, что "Термин "Предприятие" есть просто удобный общий термин, обозначающий любую деловую деятельность ... в различных областях экономики, науки, техники и др. Например: промышленная компания, банк, больница, министерство, университет". (прим. авт.) [к тексту]

2 "Пользователем" будем называть любого человека тем или иным образом взаимодействующего с вычислительной системой. [к тексту]