Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ELIK / ELIK / ALL.DOC
Скачиваний:
17
Добавлен:
16.04.2013
Размер:
4.19 Mб
Скачать

Логическая структура модели

Дерево модели может включать в себя переменные, подмодели, а также группы из переменных и подмоделей, но на данном этапе развития проекта понятие группы пока не рассматривается. Вообще, под группой переменных или подмоделей понимается совокупность переменных или подмоделей, объединенных каким-либо общим признаком, например, для подмоделей - группа моделей экономики Уральского региона. Также пока не существует модели макроэкономики, которая была бы структурирована достаточным образом, т.е. в нее кроме переменных входила бы хоть одна подмодель. Таким образом, на данном этапе развития проекта имеет смысл говорить о модели, состоящей только из переменных. Программно это выполнено следующим образом: после ввода имени переменных, комментария и индексов, от которых зависит переменная, из таблицы indexes.db с помощью SQL - запроса выбирается информация по индексам, от которых зависит переменная, и, на основании этой информации, формируется таблица для первоначальных значений. Далее, после того, как пользователь ввел начальные значения переменной, заполняются таблицы inter.db, param.db, params.db и var_value.db. Все это делает процедура класса fmVar (описание приведено в приложении «Описание используемых классов» и «Исходные тексты программ»)

Трансляция данных и формул в формат вычислителя

Данный этап является самым интересным с точки зрения алгоритма и реализация, чего нельзя сказать о предыдущих этапах - там были в основном линейные алгоритмы, без ветвлений. Кроме того, здесь рассматривается только преобразования формул из формата макета, поскольку подразумевается, что текст формул пишется сразу на языке вычислителя.

Трансляция данных в формат вычислителя

Алгоритм данного преобразования реализован процедурой класса основного окна программы fmMain (модуль psMain.pas). В процедуру передается структура типа TstringList (массив строк), в которую впоследствии записывается результат - массив строк вида

v[i1,j1]=<value1>;

....

v[iN,jM]=<valueNM>;

где v - некая экономическая переменная, зависящая от двух индексов размерностью соответственно 1..N и 1..M, value1..valueMN - значения переменной в зависимости от индексов.

procedure TfmMain.Variables2Formulas(var L : TStringList);

var

N : longint; // количество индексов у переменной

n1 : longint; // счетчик цикла по индексам

LTmp : TStringList; // рабочая структура TStringList

i,j,c : longint;

fFirst : Boolean; // True, если строка только начала формироваться

s,s1 : String; // рабочие строки

begin

n1:=0;

LTmp:=TstringList.Create;

with TQuery.Create(Self) do begin

DatabaseName:=Model;

SQL.Add('SELECT * FROM InForm;');

Open;

for j:=1 to RecordCount do begin

fFirst:=True; s:=FieldByName('Present').AsString; c:=pos(',',s);

while (fFirst or (c<>0)) do begin

c:=pos(',',s);

if c<>0 then begin

s1:=Copy(s,1,c-1);

s:=Copy(s,c+1,length(s)-c);

end

else s1:=s;

qMain.SQL.Clear;

qMain.SQL.Add('SELECT id,iid_value,num FROM Param WHERE id='+#39

+FieldByName('id').AsString+#39+' AND iid='+#39+s1+#39+' ORDER BY num;');

qMain.Open;

for i:=0 to qMain.RecordCount-1 do begin

if fFirst then LTmp.Add(FieldByName('id_Name').AsString+'['+qMain.FieldByName( 'iid_value').AsString)

else LTmp.Strings[n1+i]:=LTmp.Strings[n1+i]+','+qMain.FieldByName('iid_value').AsString;

qMain.Next;

end;

fFirst:=False;

end;

qSec.SQL.Clear;

qSec.SQL.Add('SELECT id_value,num FROM Var_value WHERE id='+#39+qMain.FieldByName('id').AsString+#39

+' AND ver=+IntToStr(Version)+ ORDER BY num;');

qSec.Open;

for i:=0 to qSec.RecordCount-1 do begin

if qSec.FieldByName('id_value').AsString='' then LTmp.Strings[n1+i]:=''

else LTmp.Strings[n1+i]:=LTmp.Strings[n1+i]+']='+qSec.FieldByName('id_value').AsString+';';

qSec.Next;

end;

qSec.Close;

Next;

n1:=LTmp.Count;

end

Close;

Free;

end;

L.AddStrings(LTmp);

LTmp.Free;

end;

Соседние файлы в папке ELIK