- •Государственный комитет рф по высшему образованию
- •6. Организация рабочего места программиста 82
- •7. Литература. 101
- •Глава 1 специальная часть
- •Введение
- •Эскизный проект
- •Постановка задачи
- •Определение понятия модели
- •Требования, предъявляемые к системе экономического планирования.
- •Выбор платформы проектирования и еe обоснование
- •Экономическая модель в системе экономического планирования
- •Структура экономической модели
- •Язык модели
- •Внутренний язык - язык вычислителя UniCalc
- •Константы
- •Переменные
- •Стандартные математические функции
- •Пример формулы на внешнем языке и внутреннем языке.
- •Общая отруктура системы
- •Структуры данных
- •Инфологическая модель базы данных
- •Предметная область
- •Описание объектов
- •Связи между объектами
- •Лингвистическое описание
- •Алгоритмические связи
- •Информационные потребности пользователя
- •Ограничение целостности
- •Даталогическая модель данных
- •Технический проект
- •Конфигурация технических средств
- •Алгоритмы предварительной подготовки данных для расчета экономической модели
- •Общий алгоритм работы программы
- •Структура программы
- •АрхитектураBorland Database Engine (idapi) – ядро доступа к данным.
- •Иерархия форм.
- •Создание псевдонимаBde.
- •Модуль формы fmNew.
- •Глава 2 технологическая часть
- •Технология программирования с использованием средств быстрой разработки приложений.
- •Введение.
- •ОсобенностиRad–средств.
- •Визуальная компонентность.
- •Многократное использование кода.
- •Создание программ в средеDelphi.
- •Отладка программ.
- •Глава 3 Организационно - экономическая часть
- •Расчёт затрат на разработку программы
- •Введение
- •Составляющие затрат на разработку программ Kр
- •Затраты на непосредственную разработку кп
- •Факторы кп как объекта проектирования, влияющие на непосредственные затраты при разработке сложных программ.
- •Применение современных методов разработки кп.
- •Факторы оснащенности процесса разработки кп аппаратурными средствами, влияющими на непосредственные затраты при разработке сложных программ.
- •Факторы организации процесса разработки кп, влияющие на непосредственные затраты при создании сложных программ.
- •Затраты на изготовление опытного образца как продукции производственно-технического назначения.
- •Затраты на технологию и программные средства автоматизации разработки кп.
- •Затраты на эвм, используемые для автоматизации разработки данной программы.
- •Расчет затрат на разработку системы моделирования макроэкономики.
- •Исходные данные
- •Коэффициенты изменения трудоемкости
- •Расчет непосредственных затрат на разработку
- •Затраты на эвм
- •Факторы обитаемости
- •Воздействие электромагнитного излучения монитора
- •Оптимизация условий зрительного восприятия
- •Освещение
- •Расчет общего освещения
- •Микроклимат
- •Оптимизация акустических условий
- •Электробезопасность.
- •Меры защиты от поражения электрическим током.
- •Защита от статического электричества.
- •Защита от электромагнитных полей и ионизирующего излучения.
- •Психофизические факторы.
- •Организационные мероприятия.
- •Пожаробезопасность.
- •Мероприятия по организации рабочего места.
- •Заключение.
- •Выводы.
- •Литература.
Создание псевдонимаBde.
Первое, что надо сделать при разработке приложения базы данных с поиощью Delphi, - создать псевдоним BDE, представляющий базу данных нашего приложения. Созданный псевдоним будет использоваться в приложении для обращения к реальной базе данных.
Для создания псевдонима мы используем многофункциональное средство Delphi Database Explorer.
Рис.7. Окно Database Explorer после добавления нового псевдонима BDE.
Далее рассмотрим подробнее некоторые модули отвечающие за связь с базой данных.
Модуль формы fmNew.
Если мы выберем пункт меню ФайлНовая модель, тогда вызывается модуль,который отвечает за открытие новой модели.
Рис.8. Форма fmNew.
Модуль состоит из пяти процедур. Рассмотрим только наиболее интересующие нас.
Процедура TfmNew.BitBtn1Click
Рис.9. Алгоритм работы процедуры TfmNew.BitBtn1Click
Описываем переменные:
var
s : String;
i : longint;
Если в строке не ввели имя модели тогда вывести сообщение ‘Введите имя модели’
begin
if eNew.Text='' then begin
MessageDlg('Введите имя модели', mtError, [mbOk], 0);
eNew.SetFocus;
exit;
end;
Если не ввели путь к базе данных модели вывести сообщение об ошибке
if ePath.Text='' then begin
MessageDlg('Введите путь к базе данных модели', mtError, [mbOk], 0);
ePath.SetFocus;
exit;
end;
Если не ввели название файла модели вывести сообщение об ошибке
if eModel.Text='' then begin
MessageDlg(‘Введите название файла модели', mtError, [mbOk], 0);
eModel.SetFocus;
exit;
end;
Идентификация имени модели
fmMain.DbPath:=ePath.Text+'\'+eNew.text+'.gdb';
fmMain.Model:=ePath.Text+'\'+eNew.text+'.gdb';
Вырезаем имя файла с текстом формул
s:=UpperCase(eModel.Text);
if (pos('.MDL',s)=0) then begin
s:='';
if pos('.',eModel.Text)=length(eModel.Text)-3
then for i:=1 to length(eModel.Text)-4 do s:=s+eModel.Text[i];
s:=eModel.Text+'.MDL';
end;
fmMain.FModel:=s;
Обработка исключительной ситуации
try fileUtil.copyfile(extractfilepath(application.ExeName)+'base.gdb',ePath.Text+'\'+eNew.text+'.gdb',nil);
except
showmessage(Не найден прототип базы);
exit;
end;
Добавляем параметры подключения к базе данных.
with fmmain.DataBase do begin
Connected:=false;
Params.Clear;
params.Add('user name=sysdba');
params.Add('password=masterkey');
params.Add('server name='+ePath.Text+'\'+eNew.text+'.gdb');
Connected:=true;
end;
Модуль формы fmForm1.
Рис.10. алгоритм работы процедуры TfmForm1.FormCreateформыfmForm1.
Процедура TfmForm1.FormCreate.
begin
i:=1;
strQ:='select ID,path,MFile from Model';
qMain.Close;
qsec.Close;
with db1 do begin
Connected:=false;
Params.Clear;
params.Add('user name=sysdba');
params.add('password=masterkey');
params.Add('server name='+fmmain.dbPath);
Connected:=true;
end;
model_name:=fmMain.DbPath;
qMain.SQL.Clear;
qSec.SQL.Clear;
qsec.Close;
Выборка имени модели из таблицы ‘Model’
Self.qMain.SQL.Add(strQ);
Self.qMain.Open;
model:=tv.Items.AddFirst(nil,Self.qMain.FieldByName('ID').AsString);
fmMain.FModel:=Self.qMain.FieldByName('MFile').AsString;
Цикл рекурсивной выборки подмоделей и переменных
while i<Self.qMain.RecordCount do begin
Self.qMain.First;
Self.qMain.MoveBy(i);
child_model:=tv.Items.AddChild(model,Self.qMain.FieldByName('ID').AsString);
strTmp:=Self.qMain.FieldByName('Path').AsString;
Self.qMain.close;
showchild(child_model, strTmp);
inc(i);
strQ:='select ID,path from Model';
Self.qMain.SQL.Clear;
Self.qMain.SQL.Add(strQ);
Self.qMain.Open;
end;
Выборка параметров моделей из таблицы ‘Params’
i:=0;
strQ:='Select id from params';
Self.qMain.close;
Self.qMain.SQL.Clear;
Self.qMain.SQL.Add(strQ);
Self.qMain.Open;
Заполнение дерева
while i<Self.qMain.RecordCount do begin
(tv.Items.AddChild(model,Self.qMain.FieldByName('id').AsString));
Self.qMain.Next;
inc(i);
end;
count_grids:=0;
qMain.Close;
qSec.close;
Визуализация дерева и таблицы
fmMain.SpeedButton3.Enabled:=true;
fmMain.SpeedButton2.Enabled:=true;
fmMain.SpeedButton1.Enabled:=true;
treevisible:=true;
tablevisible:=true;
graphvisible:=true;
model.Expand(true);
end;
Модуль формы fmVar.
Форма отвечающая за ввод переменных.
Рис.11. ФормаfmVar.
Процедура TfmVar.BitBtn1Click.
Дерево модели может включать в себя переменные, подмодели, а также группы из переменных и подмоделей, но на данном этапе развития проекта понятие группы пока не рассматривается.. Также пока не существует модели макроэкономики, которая была бы структурирована достаточным образом, т.е. в нее кроме переменных входила бы хоть одна подмодель. Таким образом, на данном этапе развития проекта имеет смысл говорить о модели, состоящей только из переменных. Программно это выполнено следующим образом: после ввода имени переменных, комментария и индексов, от которых зависит переменная, из таблицы indexes.db с помощью SQL - запроса выбирается информация по индексам, от которых зависит переменная, и, на основании этой информации, формируется таблица для первоначальных значений. Далее, после того, как пользователь ввел начальные значения переменной, заполняются таблицы inter.db, param.db, params.db и var_value.db. Все это делает процедура класса fmVar.
Рис.11. алгоритм работы процедурыTfmVar.BitBtn1Click формы fmVar.
var
i,j,num : longint;
Two : Boolean; - имеет значение True, когда переменная зависит от 2-х индексов
begin
if (eVar.Text='') or (lbVar.Items.Count=0) then exit;
if lbVar.Items.Count>2 then begin
MessageDlg('В переменной должно быть не больше двух индексов',mtError,[mbOk],0);
exit;
end;
IndexChance:=not IndexChance;
lbAll.Enabled:=not lbAll.Enabled;
lbVar.Enabled:=not lbVar.Enabled;
sgVar.Enabled:=not sgVar.Enabled;
eVar.Enabled:=not eVar.Enabled;
eRem.Enabled:=not eRem.Enabled;
sgVar.ShowHint:=not sgVar.ShowHint;
if lbVar.Items.Count=2 then Two:=True
else Two:=False;
Кнопка Ok нажата один раз
if not IndexChance then begin
fmMain.qMain.SQL.Clear;
Выборка параметров индексов
fmMain.qMain.SQL.Add('SELECT * from Indexes where ID='+#39+lbVar.Items.Strings[0]+#39+';');
fmMain.qMain.Open;
Количество столбцов таблицы sgVar
sgVar.ColCount:=round((fmMain.qMain.FieldByName('Mx').AsInteger-fmMain.qMain.FieldByName('Mn').AsInteger) div fmMain.qMain.FieldByName('Step').AsInteger+1)+1;
Если переменная зависит от 2-х индексов
if Two then begin
fmMain.qSec.SQL.Clear;
fmMain.qSec.SQL.Add('SELECT * from Indexes where ID='+#39+lbVar.Items.Strings[1]+#39+';');
fmMain.qSec.Open;
Количество строк таблицы sgVar для второго индекса
sgVar.RowCount:=round((fmMain.qSec.FieldByName('Mx').AsInteger-fmMain.qSec.FieldByName('Mn').AsInteger) div fmMain.qSec.FieldByName('Step').AsInteger+1)+1;
end;
Заполнение верхней строки таблицы sgVar значениями индекса
sgVar.FixedRows:=1;
sgVar.FixedCols:=1;
for i:=1 to sgVar.ColCount-1 do
sgVar.Cells[i,0]:=IntToStr(fmMain.qMain.FieldByName('Mn').AsInteger+(i-1)*fmMain.qMain.FieldByName('Step').AsInteger);
Если переменная зависит от 2-х индексов
if Two then begin
Заполнение первого столбца таблицы sgVar значениями второго индекса
for i:=1 to sgVar.RowCount-1 do
sgVar.Cells[0,i]:=IntToStr(fmMain.qSec.FieldByName('Mn').AsInteger+(i-1)*fmMain.qSec.FieldByName('Step').AsInteger); sgVar.Cells[0,0]:=fmMain.qSec.FieldByName('Id').AsString+'\'+fmMain.qMain.FieldByName('Id').AsString;
end
else sgVar.Cells[0,0]:=fmMain.qMain.FieldByName('Id').AsString;
fmMain.qMain.Close;
fmMain.qSec.Close;
end
Кнопка Ok нажата второй раз
else begin
for i:=0 to lbVar.Items.Count-1 do begin
fmMain.qMain.SQL.Clear;
Заносим имя переменной и ее индекс в таблицу Inter
fmMain.qMain.SQL.Add('INSERT INTO Inter VALUES('+#39+eVar.Text+#39+','+#39+lbVar.Items.Strings[i]+#39+',1,'+#39+'v'+#39+');');
fmMain.qMain.ExecSQL;
end;
num:=0;
Заносим в базу данных значения переменных иэ табл. sgVar
for i:=1 to sgVar.ColCount-1 do
for j:=1 to sgVar.RowCount-1 do begin
fmMain.qMain.SQL.Clear;
inc(num);
fmMain.qMain.SQL.Add('INSERT INTO Param VALUES('+#39+eVar.Text+#39+','+#39+lbVar.Items.Strings[0]+#39+','+#39+sgVar.Cells[i,0]+#39+','+IntToStr(num)+');');
fmMain.qMain.ExecSQL;
Заносим в табл. Param имена переменных и их комментарии
if Two then begin
fmMain.qMain.SQL.Clear;
fmMain.qMain.SQL.Add('INSERT INTO Param VALUES('+#39+eVar.Text+#39+','+#39+lbVar.Items.Strings[1]+#39+','+#39+sgVar.Cells[0,j]+#39+','+IntToStr(num)+');');
fmMain.qMain.ExecSQL;
end;
fmMain.qMain.SQL.Clear;
fmMain.qMain.SQL.Add('INSERT INTO Var_value VALUES('+#39+eVar.Text+#39+','+IntToStr(num)+','+#39+sgVar.Cells[i,j]+#39+','+'0);');
fmMain.qMain.ExecSQL;
fmMain.qMain.SQL.Clear;
fmMain.qMain.SQL.Add('INSERT INTO Var_value VALUES('+#39+eVar.Text+#39+','+IntToStr(num)+'," ",'+'-1);');
fmMain.qMain.ExecSQL;
end;
fmMain.qMain.SQL.Clear;
fmMain.qMain.SQL.Add('INSERT INTO Params (id,remark) VALUES('+#39+eVar.Text+#39+','+#39+eRem.Text+#39+')');// changed for MDI
fmMain.qMain.ExecSQL;
Добавляем переменную в дерево переменных
if not(TfmForm1(fmMain.ActiveMDIChild).tv.Selected.HasChildren or not(TfmForm1(fmMain.ActiveMDIChild).tv.Selected.Parent<>nil )) then TfmForm1(fmMain.ActiveMDIChild).tv.Items.AddChild(TfmForm1(fmMain.ActiveMDIChild).tv.Selected.Parent,eVar.Text)
else TfmForm1(fmMain.ActiveMDIChild).tv.Items.AddChild(TfmForm1(fmMain.ActiveMDIChild).tv.Selected,eVar.Text);
Close;
end;
end;
Модуль формы fmSetInter.
Рис.12. форма fmSetInter.
Рис.13. алгоритм работы процедуры TfmSetInter.cb1Change формыfmSetInter.
Процедура TfmSetInter.cb1Change.
var
i:integer;
begin
Если минимальное значение изменено
if TComboBox(sender).name='cb1' then begin
Списку максимальных значений присвоить список минимальных
cb2.items:=cb1.items;
Если выбрано мин. значение – удаляем из макс. списка лишнее
if cb1.itemindex<>-1 then for i:=0 to cb1.itemindex-1 do cb2.Items.Delete(0);
end;
Если выбраны все значения – кнопка Ok доступна
if (cb1.ItemIndex<>-1) and (cb2.itemindex<>-1) then OKBtn.enabled:=true
else okBtn.enabled:=False;
Сохраняем значения
min:=cb1.items[cb1.itemindex];
max:=cb2.items[cb2.itemindex];
Модуль формы fmIndex.
Рис.14. форма fmIndex.
Рис.15. алгоритм работы процедуры TfmIndex.FormClose.
var
i : longint;
begin
Курсор в начало таблицы
tIndex.First;
цикл по всем строкам таблицы
for i:=1 to tIndex.RecordCount do begin
условия корректности
if (tIndex.FieldByName('Mn').AsInteger>tIndex.FieldByName('Mx').AsInteger)
or (tIndex.FieldByName('Mn').AsInteger+tIndex.FieldByName('Step').AsInteger>tIndex.FieldByName('Mx').AsInteger)
then begin
сообщение об ошибке
MessageDlg('Введите привильное значение индекса', mtError, [mbOk], 0);
Action:=caNone;
exit;
end;
переход на следущую строку
tIndex.Next;
end;
закрытие таблицы tIndex
tIndex.Active:=False;
end;