Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OdinDiplom / OdinDiplom / Osnova.doc
Скачиваний:
8
Добавлен:
16.04.2013
Размер:
3.07 Mб
Скачать
      1. Создание псевдонимаBde.

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

Для создания псевдонима мы используем многофункциональное средство Delphi Database Explorer.

Рис.7. Окно Database Explorer после добавления нового псевдонима BDE.

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

      1. Модуль формы 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;