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
);
ENDmaterials_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;