- •Содержание
- •Введение
- •1. Анализ документа «акт на списание малоценных и быстроизнашивающихся предметов» и существующих систем автоматизации
- •Структура и информационные потоки документа «Акт на списание малоценных и быстроизнашивающихся предметов»
- •Анализ существующих систем автоматизации
- •Требования к разрабатываемой информационной системе и постановка задачи
- •2. Разработка информационной системы акт на списание малоценных и быстроизнашивающихся предметов
- •2.1 Выбор средства реализации
- •2.2 Моделирование предметной области информационной системы
- •2.3 Моделирование структуры данных
- •2.4 Создание структуры базы данных
- •2.5 Разработка форм ввода и вывода информации
- •2.6 Разработка отчетов
- •2.7 Формирование программного обеспечения информационной системы
- •3. Технология работы с информационной системой
- •3.1 Подготовка системы к работе. Требование к оборудованию и программному обеспечению
- •3.2 Описание работы с системой
- •Заключение
- •Список использованной литературы
- •Приложение 1. Бланк «Акт на списание малоценных и быстроизнашивающихся предметов»
- •Приложение 2. Код функции number2word
2.4 Создание структуры базы данных
Для создания структуры базы данных использовалсяOracleDesigner. После построения серверной модели, представленной на рис. 4, необходимо выбрать пункт меню Generate - Generate Database from Server Model (рис. 5).
Рис. 5 – Генерация базы данных из серверной модели
В результате генерации физически были созданы таблицы D_AKT1, D_AKT2, D_AKT3, S_PODS, S_ORGS, S_PREDMETS.
2.5 Разработка форм ввода и вывода информации
После открытия программы Oracle Forms Developer необходимо сохранить новую форму, выбрав меню File->Save и указав имя файла формы D_AKT.fmb по имени документа «Акт на списание малоценных и быстроизнашивающихся предметов», для которого создается данная форма.
В окне Object Navigator необходимо установить курсор на узел Data Blocks и нажать кнопку Create на правой панели инструментов. В открывшемся диалоге нужно выбрать Use the Data Block Wizard для использования мастера создания блоков данных.
В открывшемся мастере необходимо нажать кнопку Далее и выбрать тип блока данных Table or View. На следующем шаге мастера, нужно указать по какой таблице будет строиться блок данных. Выбор таблицы осуществляется нажатием кнопки Browse, после чего следует ввести данные соединения с БД.
В окне Tables осуществляется выбор таблиц. Чтобы таблицы текущей схемы были видны, следует выбрать пункты Current User, Tables и Views. В предложенном списке таблиц выбирается D_AKT1. Чтобы отображать в блоке данных все колонки выбранной таблицы необходимо названия всех колонок переместить из поля Available Columns в поле Database Items.
На следующем шаге в поле Data Block Name вводится имя блока данных: D_AKT1. После чего завершаем работу мастера нажатием на кнопку Готово. Для планирования расположения полей на форме только что созданного блока данных сразу после мастера Data Block Wizard запускается мастер Layout Wizard. На двух первых его шагах следует просто нажать кнопку Далее. На третьем шаге, будет предложено выбрать, какие поля следует отображать на форме. В рассматриваемой задаче будут отображаться все поля, поэтому их все и нужно переместить в поле Displayed Items.
Следующий шаг, где предлагается установить размеры полей, остается без изменения.
На следующем шаге выбирается тип отображения формы как Form и завершается работа мастера нажатием кнопки Готово.
Для создания закладок на панели инструментов следует выбрать инструмент Tab Canvas. Для установки имен вкладок необходимо в контекстном меню вкладки выбрать пункт Property Palette и установить там следующие свойства
для первой вкладки:
Name: AKT1;
Label: Организация;
для второй вкладки:
Name: AKT2;
Label: Предметы;
для третьей вкладки:
Name: AKT3;
Label: Утиль(лом).
Вкладки были созданы поверх уже имеющихся на форме элементов управления. Для переноса этих элементов на вкладку «Организация» в окне Object Navigator нужно выделить все элементы блока данных D_AKT2, и выбрать пункт меню Tools-> Property Palette, чтобы установить идентичные свойства сразу для группы элементов.
Требуется установить следующие свойства:
Canvas: CANVAS6
Tab Page: AKT2
Где CANVAS6 имя канвы, на которой находятся страницы закладок, a AKT2-имя вкладки, на которую следует поместить, выбранные элементы блока данных. Аналогичным образом элементы блока D_AKT3 помещаются на вкладку AKT3.
Создание блоков данных D_AKT2 и D_AKT3 во многом аналогично созданию первого блока, поэтому ниже приведены только отличающиеся шаги.
Создание производиться также с помощью мастера Data Block Wizard. На третьем шаге мастера, где предлагается выбрать таблицу в качестве источника данных, следует выбрать соответствующую таблицу, S_PODS, S_PREDS.
На четвертом шаге требуется создать связь между двумя блоками данных. После нажатия на кнопку Create Relationship в открывшемся окне выбирается строка с указанием наименования связи, созданной при разработке структуры базы данных. Далее в качестве Detail Item выбирается поле KOD_D_AKT1, а и качестве Master Item – KOD1. Таким образом, будет осуществляться связь между блоками данных по первичному ключу в таблице D_AKT2 и по внешнему ключу в таблице S_PODS, S_PREDS.
На следующем шаге вводим имя нового блока данных: D_AKT2. Далее на втором шаге мастера Layout Wizard требуется выбрать канву и закладку, на которой новый блок данных будет отображаться, т.е. установить следующие значения:
Canvas: CANVAS6;
Tab Page: AKT2
Все следующие шаги мастера вплоть до 5-го аналогичны пройденным при создании первого блока данных.
На пятом шаге осуществляется выбор вида формы – Tabular.
Шестой шаг – завершающий шаг установки. Необходимо установить:
Records Displayed: 10;
Отметить флажок Display ScrollBar.
На этом работа мастера завершена и нажимается кнопка Готово.
Поле первичного ключа должно иметь уникальное значение в пределах одной таблицы, поэтому лучше, если его значения будут устанавливаться автоматически, а не вводиться пользователем вручную.
Для того чтобы при создании новой записи в каждом из блоков данных поле первичного ключа (KOD1) принимало автоматически следующее по порядку значение необходимо в каждом блоке объявить триггер PRE-INSERT. Сделать это можно следующим образом:
В окне Object Navigator выбрать блок данных D_AKT1 и в нем выбрать узел Triggers;
Затем вызвать контекстное меню и выбрать пункт Smart Triggers -> Others ->PRE-INSERT.
3. В появившемся окне ввести следующий код триггера:
SELECT kod_d_akt1.nextval INTO :D_AKT1.kod1 FROM dual; Аналогичный триггер нужно создать и в блоках D_AKT2, D_AKT3 со следующим кодом
SELECT kod_d_akt2.nextval INTO :D_AKT2.kod2 FROM dual
SELECT kod_d_akt2.nextval INTO :D_AKT2.kod2 FROM dual
Чтобы у пользователя не было доступа к кодовым полям в блоках данных, эти поля необходимо скрыть. Это можно сделать следующим образом, в Property Palette для элемента KOD блока данных D_AKT1 установить свойство Canvas этого элемента в Null значение, после этого поле KOD должно исчезнет в окне Layout Editor. Таким же образом устанавливается свойство Canvas для соответствующих элементов блоков данных D_AKT2 и D_AKT3.
Для отображения записей выбранных из справочников необходимо создать дополнительные поля для их отображения.
В блоке D_AKT1 в Items создать новое поле Item с помощью нажатия кнопки «+». Но новое поле установить следующие свойства:
Name: NAIM_ORG
Data Type: Char
Maximum Length: 50
Database Item: NO
CANVAS: CANVAS6
Tab Page: AKT1
Аналогичным образом создаются поля NAIM_PODR - D_AKT1, NAIM_PRED, NOM_N, INV_NOM,IZM_KOD,IZM_NAIM – D_AKT2, STR_POD-D_AKT3.
Также необходимо создать списки значений, которые применяются для наглядного выбора данных из таблиц справочников в поля блоков данных.
Для создания списка значений нужно в Object Navigator выделить узел LOVs и в меню выбрать пункт Edit-> Create. В появившемся диалоге выбрать Use the LOV Wizard.
На втором шаге мастера, где требуется указать запрос для заполнения списка значений данными, в поле SQL Query Statement ввести следующий запрос:
SELECT KOD, NAIM, OKPO FROM S_ORGS
На третьем шаге переместите все поля из области Record Group Columns в область LOV Columns для отображения в списке значений всех полей запроса. На четвертом шаге, необходимо указать в какие поля формы будут вставляться выбранные в списке значения. В колонке Column указывается имя поля в списке значений, в колонке Title - заголовок столбца и списке значений, Width - ширина колонки. Return Value - адрес элемента формы, в который следует записать выбранные пользователем значения.
NAIM - D_AKT1.NAIM_ORG
KOD - D_AKT1.S_ORG_KOD
OKPO - D_AKT1.OKPO
где первое значение - колонка Column, а второе - Return Value.
Пятый шаг мастера - это указание заголовка окна списка значений и его физических размеров. На этом работу мастера можно завершить нажатием кнопки Готово. Теперь в Object Navigator в узле LOVs появился новый список значений, который переименован в ORG_LOV.
Аналогичным образом были созданы списки значений:
PODR_LOV – для выбора подразделений в блоке D_AKT2
PODR2_LOV– для выбора подразделений в блоке D_AKT3
PRED_LOV– для выбора предметов в блоке D_AKT2
Создание кнопок вызова списков
Рядом с полем NAIM_ORG в блоке D_AKT1 создается кнопка для вызова Списка значений выбора организации с следующими свойствами:
Name: ORG_BUTTON
Label: …
Код кнопки:
DECLARE
res BOOLEAN;
BEGIN
res := Show_LOV('ORG_LOV');
END;
Чтобы можно было корректно сохранить изменения данных либо не сохранять их, в форме предусмотрены две кнопки «ОК» и «Отмена». По кнопке «ОК» осуществляется вызов процедуры, которая записывает все изменения в БД и закрывает форму. По кнопке «Отмена» производится выход из формы без сохранения обновлений.
Для создания процедуры в окне Object Navigator выбирается узел Программы и в меню выбирается Edit->Create.
Теперь в окне Новая Программа вводится имя новой процедуры: SAVE_FORM. Код процедуры сохранения:
PROCEDURE SAVE FORM IS BEGIN Post;
END;
На следующем шаге создается служебный блок данных, в котором будут располагаются кнопки «ОК» и «Отмена». Блок необходимо создать с выбором опции Build a new data block manually. Новому блоку данных присваивается имя TAIL и в Property Palette устанавливается свойство Database Data Block в значение NO, отметив тем самым, что данный блок не связан с БД.
Данные кнопки помещаются на канве CANVAS4 в блоке TAIL со следующими свойствами:
кнопка OK:
Name: OK_BUTTON
Label: OK
кнопка Отмена
Name: CANCEL_BUTTON
Label: Отмена
Чтобы по нажатию кнопок выполнялись нужные действия, следует для каждой из кнопок создать триггер WHEN-BUTTTON-PRESSED, который вызывается при нажатии кнопки. Для кнопки ОК триггер будет следующим:
Save_Form;
Exit_Form(NO_VALIDATE);
Для кнопки Отмена:
Exit_Form(NO_VALIDATE);
Триггер, который вызывается при открытии формы-WHEN-NEW-FORM-INSTANCE для блока D_AKT будет выглядеть следующим образом:
:System.Message_Level := '5';
Go_Block('D_akt1');
Execute_Query;
Go_Block('d_akt2');
Execute_Query;
Go_Block('d_akt3');
Execute_Query;
Go_Block('d_akt1');
Триггеры POST_QUERY для блоков данных:
D_AKT1:
IF :d_akt1.s_org_kod IS NOT NULL THEN
SELECT naim,okpo INTO :d_akt1.naim_org,:d_akt1.okpo FROM s_orgs WHERE kod = :d_akt1.s_org_kod;
END IF;
IF :d_akt1.s_pod_kod_p IS NOT NULL THEN
SELECT naim_p INTO :d_akt1.naim_podr from s_pods where kod_p=:d_akt1.s_pod_kod_p;
END IF;
EXCEPTION WHEN NO_DATA_FOUND THEN
NULL;
D_AKT2:
IF :d_akt2.s_predmet_kod_pr IS NOT NULL THEN
SELECT naim_pr, nom_n, inv_n, kod_ed, naim_ed INTO :d_akt2.naim_pred, :d_akt2.nom_n, :d_akt2.inv_nom,:d_akt2.izm_kod,:d_akt2.izm_naim FROM s_predmets
WHERE kod_pr = :D_akt2.s_predmet_kod_pr;
END IF;
EXCEPTION WHEN NO_DATA_FOUND THEN
NULL;
D_AKT3:
IF :d_akt3.s_pod_kod_p IS NOT NULL THEN
SELECT naim_p INTO :d_akt3.str_pod from s_pods where kod_p=:d_akt3.s_pod_kod_p;
END IF;
EXCEPTION WHEN NO_DATA_FOUND THEN
NULL;
При закрытии окна формы срабатывает триггер WHEN-WINDOW-CLOSED. Если в форме есть несохраненные данные, то нужно предложить пользователю их сохранить. Для этих целей необходимо использовать сообщение Alert. Чтобы создать Alert, необходимо в окне Object Navigator выделить узел Alerts и выбрать пункт меню Edit->Create.
Для нового сообщения Alert устанавливаются следующие свойства:
Name: SAVE_ALERT
Title: Сообщение
Message: Вы хотите сохранить сделанные Вами изменения?
Button 1 Label: Да
Button 2 Label: Нет
Button 3 Label: Отмена
Default Alert Button: Button 3
Код триггера WHEN-WINDOW-CLOSED:
DECLARE
but NUMBER;
stat VARCHAR2(14);
BEGIN
Go_Block('D_akt1');
stat := :System.Block_Status;
Go_Block('D_akt2');
stat := stat || :System.Block_Status;
Go_Block('D_akt3');
stat := stat || :System.Block_Status;
if stat <> 'QUERYQUERY' THEN
but := Show_Alert('SAVE_ALERT');
if but = ALERT_BUTTON3 then -- Нажали "Отмена"
return;
end if;
if but = ALERT_BUTTON1 then -- Нажали "Да"
Save_Form;
end if;
end if;
Exit_Form(NO_VALIDATE);
END;
Для того, чтобы установить заголовок формы в Object Navigator в узле Windows в Property Palette установить свойства:
Title: Акт на списание
Primary Canvas: CANVAS4
После выполнения вышеперечисленных шагов в результате получаются нижеприведенные формы (рис.6 -рис.12)
Рис. 6 - Форма вывода данных «Журнал актов на списание малоценных и быстроизнашивающихся предметов»
Рис. 7 - Вкладка «Организация» формы ввода данных
Рис. 8 - Вкладка «Предметы» формы ввода данных
Рис. 9 - Вкладка «Утиль (лом)» формы ввода данных
Рис. 10 – Форма «Справочник организаций»
Рис. 11 – Форма «Справочник подразделений»
Рис. 12 – Форма «Справочник предметов»