Для демонстрации того, как легко создать новые прикладные
программы при наличии базового набора процедур, рассмотрим прог-
рамму инвентаризации. Запись, используемая для хранения информа-
ции, выглядит следующим образом
type
inv = record
status: integer;
name: string[30];
descript := string[40];
guantity: integer;
cost: real;
end;
Длина ее, найденная с помощью SizeOf, равна 83. Используя данную
длину и длину ключа, равную 30, программа SETCONST.PAS создает
определение констант
Const
MaxDataRecSize = 82;
MaxKeyLen = 30;
PageSize = 24;
Order = 12;
PageStackSize = 10;
MaxHeight = 4;
Другие изменения, необходимые для преобразования процедур
ведения почтового списка в процедуры инвентаризации, заключаются
только в изменениях предложений печати. Целиком программа инвен-
таризации выглядит следующим образом:
program inventory;
Const
{ данные константы генерируются программой SETCONST.PAS
предоставляемой инструментарием баз данных }
MaxDataRecSize = 82;
MaxKeyLen = 30;
PageSize = 24;
Order = 12;
PageStackSize = 10;
MaxHeight = 4;
type
inv = record
status: integer;
name: string[30];
descript: string[40];
guantity: integer;
cost: real;
end;
{следующие файлы содержат процедуры баз данных}
{$i access.box} {основные процедуры баз данных}
{$i addkey.box} {добавить элементы }
{$i delkey.box} {удалить элементы }
{$i getkey.box} {поиск по дереву }
var
dbfile: DataFile;
ifile: IndexFile;
done: boolean;
function MenuSelect:char; {возврат пользовательского
выбора }
var
ch:char;
begin
WriteLn('1. Введите элемент ');
WriteLn('2. Удалить элемент ');
WriteLn('3. Отобразить инвентарный список');
WriteLn('4. Поиск элементов ');
WriteLn('5. Обновление ');
WriteLn('6. Выход ');
repeat
WriteLn;
Write('Введите ваш выбор: ');
Read(ch); ch:=UpCase(ch); WriteLn;
until (ch>='1') and (ch<='6');
MenuSelect:=ch;
end; {MenuSelect}
{добавить элемент к списку}
procedure Enter;
var
done: boolean;
recnum: integer;
temp: string[30];
info: inv;
begin
done:=FALSE;
repeat
Write('Введите имя элемента: ');
Read(info.name); WriteLn;
if Length(info.name)=0 then dont:=TRUE
else
begin
Write('Введите описание: ');
Read(info.descript); WriteLn;
Write('Введите количество: ');
Read(info.guantity); WriteLn;
Write('Введите стоимость: ');
Read(info.cost); WriteLn;
info.status:=0; { сделать активной }
FindKey(ifile, recnum, info.name);
if not OK then
begin
AddRec(dbfile, recnum, info);
AddKey(ifile, recnum, info.name};
end else WriteLn('дублированный ключ игнорирован');
end;
until done;
end; {Enter}
{изменение элемента в списке с сохранением поля имени}
procedure Update;
var
done: boolean;
recnum: integer;
temp: string[30];
info: inv;
begin
Write('Enter item name: ');
Read(info.name); WriteLn;
FindKey(ifile, recnum, info.name);
if OK then
begin
Write('Введите описание: ');
Read(info.descript); WriteLn;
Write('Введите количество: ');
Read(info.guantity); WriteLn;
Write('Введите стоимость: ');
Read(info.cost); WriteLn;
info.status:=0;
info.status:=0; {сделать активной}
PutRec(dbfile, recnum, info);
end else WriteLn('ключ не найден');
end; {Update}
{удалить элемент из инвентарного списка}
procedure Remove;
var
recnum: integer;
name: string[30];
begin
Write('Введите имя уничтожаемого элемента: ');
Read(name); WriteLn;
FindKey(ifile, recnum, name);
if OK then
begin
DeleteRec(dbfile, recnum);
DeleteKey(ifile, recnum, name);
end else WriteLn('Не найдено');
end; {Remove}
procedure Display(info: inv);
begin
WriteLn('Item name: ',info.name);
WriteLn('Description: ',info.descript);
WriteLn('Quantity on hand: ',info.quantity);
WriteLn('Initial cost: ',info.cost:10:2);
WriteLn;
end; {Display}
procedure ListAll;
var
info: inv;
len, recnum: integer;
begin
len := filelen(dbfile) -1;
for recnum:=1 to len do
begin
Getrec(dbfile, recnum, info);
if info.status = 0 then display(info);
end;
end; {ListAll}
{поиск элемента}
procedure Search;
var
name: string[30];
recnum: integer;
info: inv;
begin
Write('Введите имя элемента: ');
ReadLn(name);
{найти ключ, если он существует}
FindKey(ifile, recnum, name);
if OK then {если найден}
begin
GetRec(dbfile, recnum, info);
if info.status = 0 then Display(info);
end else WriteLn('не найден');
end; {Search}
begin
InitIndex;
OpenFile(dbfile, 'inv.lst', SizeOf(inv));
if not OK then
begin
WriteLn('Cоздание нового файла');
MakeFile(dbfile, 'inv.lst', SizeOf(inv));
end;
OpenIndex(ifile, 'inv.ndx', 30, 0);
if not OK then
begin
WriteLn('Cоздание нового файла');
MakeIndex(ifile, 'inv.ndx', 30, 0);
end;
done:=false;
repeat
case MenuSelect of
'1': Enter;
'2': Remove;
'3': ListAll;
'4': Search;
'5': Update;
'6': done:=true;
end;
until done;
CloseFile(dbfile);
CloseIndex(ifile);
end.
Программа ведения почтового списка и данная программа имеют
один базовый скелет. Он может быть модифицирован для различных
ситуаций использования баз данных.