46624 (588406), страница 5
Текст из файла (страница 5)
Таблица имеет следующие поля:
MZ_ID : Уникальный идентификатор
MZ_KAT_ID : Каталог
MZ_MAT_ID : Идентификатор заменяемого материала
MZ_NEW_MAT_ID : Ифентификатор нового материала
MZ_KOL : Количество заменяемого материала
MZ_MAX_KOL : Всего заменяемого материала
MZ_NEW_KOL : Количество нового материала
MZ_TYPE : Тип замены (0 - полная, 1 - частичная)
Процедура добавления замены:
CREATE OR REPLACE PROCEDURE "MATERIALS_ZAMEN_CREATE" (
in_kat_id IN sostav.sos_kat_id%TYPE,
in_mat_id IN materials_zamen.mz_mat_id%TYPE,
in_new_mat_id IN materials_zamen.mz_mat_id%TYPE,
in_old_kol IN materials_zamen.mz_kol%TYPE,
in_max_kol IN materials_zamen.mz_max_kol%TYPE,
in_new_kol IN materials_zamen.mz_new_kol%TYPE,
in_zamen_type IN materials_zamen.mz_type%TYPE
)
/*добавление записи по материалу к версии расчета*/
IS
out_id INTEGER;
mat_count INTEGER := 0;
summ_kol NUMBER := 0;
BEGIN
SELECT seq_material_zamen_mz_id.NEXTVAL
INTO out_id
FROM DUAL;
-- Ищем были ли произведены полные замены на данный материал
SELECT COUNT (*)
INTO mat_count
FROM materials_zamen
WHERE mz_mat_id = in_mat_id AND mz_type = 0
AND mz_kat_id = in_kat_id;
-- Если производится частичная замена и уже есть полная замена
IF (in_zamen_type IN (0, 1) AND mat_count > 0)
THEN
raise_application_error
(-20001,
'Вы не можете проводить замену, т.к. с данным материалом уже была произведена полная замена.'
);
END IF;
mat_count := 0;
-- Ищем были ли произведены частичные замены на данный материал
SELECT COUNT (*)
INTO mat_count
FROM materials_zamen
WHERE mz_mat_id = in_mat_id AND mz_type = 1
AND mz_kat_id = in_kat_id;
-- Если производится полная замена и уже есть частичные замены
IF (in_zamen_type = 0 AND mat_count > 0)
THEN
raise_application_error
(-20001,
'Вы не можете проводить полную замену, т.к. с данным материалом уже была произведена частичная замена.'
);
END IF;
--Проверяем, можно ли произвести частичную замену
IF (in_zamen_type = 1)
THEN
SELECT SUM (mz_kol)
INTO summ_kol
FROM materials_zamen
WHERE mz_mat_id = in_mat_id AND mz_type = 1 AND mz_kat_id = in_kat_id;
summ_kol := summ_kol + in_old_kol;
IF (summ_kol > in_max_kol)
THEN
raise_application_error
(-20001,
'Общее количество материалов при проведении частичных замен превышает максимальное количество.'
);
END IF;
END IF;
INSERT INTO materials_zamen
(mz_id, mz_kat_id, mz_mat_id, mz_new_mat_id, mz_kol,
mz_max_kol, mz_new_kol, mz_type
)
VALUES (out_id, in_kat_id, in_mat_id, in_new_mat_id, in_old_kol,
in_max_kol, in_new_kol, in_zamen_type
);
END materials_zamen_create;
Процедура удаления замены:
CREATE OR REPLACE PROCEDURE "MATERIALS_ZAMEN_DELETE" (
in_mz_id IN materials_zamen.mz_id%TYPE
)
/*удаление замены материала*/
IS
BEGIN
DELETE FROM materials_zamen
WHERE mz_id = in_mz_id;
END materials_zamen_delete;
2.4.4. Структура таблицы «закупок »
«Таблица закупок» содержит информацию о заменах (табл.4).
Табл.4
MC_ID : Идентификатор
MC_MAT_ID : Идентификатор материала
MC_MZ_ID : Идентификатор замены материала
MC_POST_ID : Идентификатор контрагента
MC_NAME : Наименование контрагента
MC_COUNT : Количество на закупку
MC_COST : Цена
MC_EDIZM : Еденица измерения
MC_KAT_ID : Каталог
Процедура добавления контрагента в таблицу закупок:
CREATE OR REPLACE PROCEDURE "MATERIALS_CONTRAGENT_CREATE" (
in_mc_kat_id IN materials_contragent.mc_kat_id%TYPE, in_mc_mat_id IN materials_contragent.mc_mat_id%TYPE, in_mc_mz_id IN materials_contragent.mc_kat_id%TYPE, in_mc_post_id IN materials_contragent.mc_post_id%TYPE, in_mc_name IN materials_contragent.mc_name%TYPE, in_mc_count IN materials_contragent.mc_kat_id%TYPE, in_mc_cost IN materials_contragent.mc_cost%TYPE, in_mc_edizm IN materials_contragent.mc_edizm%TYPE, out_id OUT materials_contragent.mc_id%TYPE
)
/*добавление записи по материалу к версии расчета*/
IS
BEGIN
SELECT seq_materials_contragent_mc_id.NEXTVAL
INTO out_id
FROM DUAL;
INSERT INTO materials_contragent
(mc_id, mc_mat_id, mc_mz_id, mc_post_id, mc_name,
mc_count, mc_cost, mc_edizm, mc_kat_id
)
VALUES (out_id, in_mc_mat_id, in_mc_mz_id, in_mc_post_id, in_mc_name,
in_mc_count, in_mc_cost, in_mc_edizm, in_mc_kat_id
);
END materials_contragent_create;
Процедура удаления контрагента в таблицу закупок:
CREATE OR REPLACE PROCEDURE "MATERIALS_CONTRAGENT_DELETE" (
in_mc_id IN materials_zamen.mz_id%TYPE
)
/*удаление контрагента*/
IS
BEGIN
DELETE FROM materials_contragent
WHERE mc_id = in_mc_id;
END materials_CONTRAGENT_delete;
2.5. Разработка модулей
2.5.1. Модуль Mat_Zamen.pas
Модуль Mat_Zamen.pas, представленный на рис.3, является главным модулем проекта, так как он содержит описание действий происходящих при загрузке программы, а также описание формы MainForm.
На форме расположены три таблицы TDBGridEh. Это таблицы материалов, замен и контрагентов, а также закладки и меню TMenuItem. На форме присутствуют компоненты TСlientDataSet, TdataSource.
Компонент TClientDataSet используется в клиентской части многозвенного распределенного приложения.
Компонент обеспечивает выполнение следующих основных функций:
• получение данных от удаленного сервера и передача ему сделанных изменений с использованием удаленного компонента-провайдера;
• представление набора данных при помощи локального буфера и поддержка основных операций, унаследованных от класса TDataSet;
• объединение записей набора данных при помощи агрегатных функций для получения суммарных данных;
• локальное сохранение набора данных в файле и последующее восстановление набора данных из файла;
• представление набора данных в формате XML [6].
Предком компонента TClientDataSet является класс TDataSet, поэтому TClientDataSet обладает таким же набором функций, что и обычный компонент, инкапсулирующий набор данных. Основное же отличие заключается в том, источник данных для него доступен только через удаленный компонент-провайдер. Это означает, что сохранение изменений и обновление набора данных осуществляется локально, без обращения к источнику данных [7].
Как и обычный компонент, компонент TClientDataSet может использоваться совместно с визуальными компонентами отображения данных. Для этого нужен компонент TDataSource.
На втором этапе разработки приложения баз данных необходимо перенести на форму и настроить компонент TDataSource. Он обеспечивает взаимодействие набора данных с компонентами отображения данных. Чаще всего одному набору данных соответствует один компонент TDataSource, хотя их может быть несколько.
Для настройки свойств компонента необходимо выполнить следующие действия.
1. Связать набор данных и компонент TDataSource. Для этого используется свойство DataSet компонента TDataSource, доступное через Инспектор объектов. Это указатель на экземпляр компонента доступа к данным.
В списке этого свойства в Инспекторе объектов перечислены все доступные компоненты наборов данных.
2. Переименовать компонент. Это не обязательное действие. Тем не менее желательно присваивать компонентам осмысленные имена, соответствующие названиям связанных наборов данных [7].
Компонент меню, представленный на рис. 4, выполняет следущие процедуры:
-
Ввод / удаление контрагента;
-
Ввод / удаление замены;
-
Печать отчета
Рис. 4. Главное меню
Процедуры ввода (TFRep_Mats.N5Click) и удаления (TFRep_Mats.N14Click) контрагентов.
procedure TFRep_Mats.N5Click(Sender: TObject);
begin
IF not assigned(scM4_ContrAgents) then
initscM4_ContrAgents(SharedConnection.ParentConnection);
ContrAgentsGet_Sprav(Self, IM4ContrAgentsDisp(IDispatch(scM4_ContrAgents.AppServer)),
(Screen.DesktopHeight div 2) - (height div 2),
(Screen.DesktopWidth div 2) - (width div 2),
'', '', '',
ContrAgent_Name,
ContrAgent_Code);
if (DBGEh_Mats.Focused = True) and (ContrAgent_Name <> '') Then
Mat_Contr_Add(Application, SharedConnection, Kat_Id, CDS_Mats.FieldByName('MD_MR_ID').AsInteger,
0, 0, ContrAgent_Code, ContrAgent_Name)
else if (DBGEh_Zamen.Focused = True) and (ContrAgent_Name <> '') then
Mat_Contr_Add(Application, SharedConnection, Kat_Id, CDS_Zamen.FieldByName('MZ_MAT_ID').AsInteger,
CDS_Zamen.FieldByName('MZ_ID').AsInteger, 1, ContrAgent_Code, ContrAgent_Name);
Contr_Refresh;
end;
procedure TFRep_Mats.N14Click(Sender: TObject);
begin
V.Mat_Zamen_Contr_Del(CDS_Contr.FieldByName('MC_ID').AsInteger);
Contr_Refresh;
end;
Процедуры ввода и удаления замен:
procedure TFRep_Mats.N13Click(Sender: TObject);
begin
Enter_Zamen(Application, SharedConnection,
Kat_Id,
CDS_Mats.FieldByName('MD_MR_ID').AsInteger,
CDS_Mats.FieldByName('GM_ID').AsInteger,
CDS_Mats.FieldByName('MAT_OKP').AsInteger,
CDS_Mats.FieldByName('MR_NAME').AsString,
CDS_Mats.FieldByName('POTREB').AsString,
CDS_Mats.FieldByName('GM_NAME').AsString);
Zamen_Refresh;
end;
procedure TFRep_Mats.N15Click(Sender: TObject);
begin
V.Mat_Zamen_Delete(CDS_Zamen.FieldByName('mz_id').AsInteger);
Zamen_Refresh;
Contr_Refresh;
end;
Печать отчета
procedure TFRep_Mats.N8Click(Sender: TObject);
begin
Mat_Zamen_Rep(Application, SharedConnection, Kat_Id, 1, Kat_ZCO_NAME, Kat_Name);
end;
2.5.2. Модуль Mat_Zamen_New.pas
На форму модуля Mat_Zamen_New вынесены следующие компоненты: TDBGridEh, TbitBtn, TdataSource, TclientDataSet, Tedit, TradioGroup (рис.5).
Рис.5. Модуль Mat_Zamen_New
TDBGridEh – таблица в которую заносятся данные , TbitBtn – кнопки ввода замены и отмены, TdataSource и TclientDataSet – для соединения с базой данных, Tedit – строки с материалами, TradioGroup – выбор полной или частичной замены.
Процедура выбора типа замены:
rocedure TFNew_Zamen.RGClick(Sender: TObject);
begin
if RG.ItemIndex = 1 then
begin
DBN_OldKol.Enabled := True;
end
else if RG.ItemIndex = 0 then
begin
DBN_OldKol.Enabled := False;
DBN_OldKol.Value := Old_Kol;
end;
Zamen_Type := RG.ItemIndex;
end;
Процедура ввода замены:
procedure TFNew_Zamen.BitBtn1Click(Sender: TObject);
var Old, Max, New : WideString;
begin
Old := FloatToStr(DBN_OldKol.Value);
Max := FloatToStr(Max_Kol);
New := FloatToStr(DBN_NewKol.Value);
V.Mat_Zamen_Create(Kat_Id,
Mat_Id,
CDS_Mats.FieldByName('MATERIAL_ID').AsInteger,
Old,
Max,
New,
Zamen_Type);
Close;end;
2.5.2. Модуль Mat_Zamen_CNTR_Add.pas
На форме (рис. 6) находятся следующие компоненты: Tedit, TDBNumberEditEh, TspeedButton, TclientDataSet, TdataSource, TcomboBox.
Tedit – наименование контрагента, TDBNumberEditEh – количество закупаемого материала и цена, TcomboBox – выпадающее меню выбора едениц измерения, TspeedButton – рабочие кнопки , TclientDataSet и TdataSource – связь с базой данных.
Рис.6. Модуль Mat_Zamen_CNTR_Add
2.5.2. Модуль формирования очета
На форму (Рис.7 ) вынесена таблица, меню и компоненты связи с базой данных.
После заполнения таблицы, выбрав из меню строку «печать отчета» появится окно компонента FastReport (Рис.8). Этот компонент отвечает за печать отчета.
Рис.7. Таблица закупок
Рис.8. Отчет FastReport
-
Технологическая часть
-
Требования к аппаратному и программному обеспечению
-
Требования к аппаратному обеспечению:
- Процессор Pentium 800 МГц;
- Объем оперативной памяти 128 Мбайт;
- Объем жесткого диска не менее 5 Гбайт;
- Монитор SVGA, клавиатура и манипулятор мышь.
-
Требования к программному обеспечению:
- программа должна работать под управлением операционной системы Microsoft Windows 98/ME/2000/XP.
-
Установка подсистемы
Вычислительная среда поставляется на диске CD-R, емкостью 700 Мб. Установка производится в несколько этапов:
-
Проверить соответствие оборудования, на которое предполагается произвести установку, минимальным требованиям для работы подсистемы;
-
Вставить компакт-диск с программой в CD-ROM;
-
Скопировать каталог K_T_Base и все его содержимое на жесткий диск, с которого предполагается производить запуск программы, в каталог C:\ K_T_Base;
-
Для удобства запуска создать на рабочем столе операционной системы значок «K_T_Base», ссылающийся на программу C:\ K_T_Base \ K_T_Base.exe, рабочий каталог C:\ K_T_Base;
-
Создать в главном меню элемент, ссылающийся на программу C:\ K_T_Base \ K_T_Base.exe;
-
Произвести запуск программы;
-
Установка завершена.
-
Руководство администратора
Для функционирования подсистемы необходимо наличие специального ПО:
1. На сервере баз данных необходимо установить серверную часть Oracle.
2. Для сервера приложений необходимо установить: клиентскую часть Oracle – для связи с сервером Oracle, Borland Socket Server – для прослушивания порта, к которому будет происходить подключение и Borland Database Engine – для соединения сервера приложений с клиентской частью Oracle.
3. Также необходимо зарегистрировать сервер приложений, запустив его.















