Генератор
Проектов

Проект utlgbd

Проект демонстрирует использование базы данных сетевой структуры.

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

В отличие от типа-документа сетевая база данных реализуется спциализированным типом пакета genbd. После заголовка пакета и возможных опций можно определить типы данных, в том числе требуемые структурные типы данных для записей базы. Отметим, что здесь, как и в типе-документе, структурные типы или их компоненты можно определять в других пакетах, а здесь только использовать в описании записей.

Структура базы данных в отличие от типа-документа определяется в пакете типа genbd отдельным разделом после декларации типов. Синтаксис аналогичен таковому в типе-документу, но без внешних скобок.

В отличие от документа для инициализации базы данных требуются дополнительные действия. Для этого в пакете декларирована процедура prepare, в которую передается ссылка на описываемую базу, специальная инициализирующая структура из системного пакета typ_genbd и имя директории, в которой будет создана поддиректория с файлами базы данных. В инициализирующей структуре следует как минимум заполнить поля с именем корневой директории базы, поддиректории и имени каталога базы. Далее следует вызвать автоматически определенную процедуру открытия/создания базы orggbd_open (имя пакета и суффикс "_open") с параметрами - ссылка на базу и инициализирующая структура. Инициализирующая структура должна описываться в той же области действия, что и ссылка на базу, так как она используется в процессе работы.

Заполнение тестовыми данными (процедура fill) сопадает с аналогичной в проекте utldoc. Дело в том, что интерфейсы работы с документом и сетевой базой идентичны за исключением процесса инициализации.

В проекте описаны две утилиты: utlfill - заполнение базы тестовыми данными и utlview - печать в консоли содержимого базы данных.

В данном проекте задействованы системные пакеты rand и rand_test для генерации случайных тестовых данных.

Файл utlgbd.gen:

project utlgbd
  /version="01.001"
  /firm="УСТ"
  /http="http://www.ustech.ru"
  /email="managers@ustech.ru"

genbd orggbd

utility utlfill

utility utlview

Файл orggbd.genbd:

genbd orggbd;

type t_orgname : char8[100];
type t_addr : char8[100];
type t_phone : char8[30];
type t_empname : char8[100];
type t_org : struct
( t_orgname orgname,
  t_addr addr,
  t_phone phone
);
type t_emp : struct
( t_empname empname1,
  t_empname empname2,
  t_empname empname3,
  t_addr addr,
  t_phone phone
);

record org : t_org;
record emp : t_emp;

set orgs_org member org;/oper=(mem,next)
set org_emp owner org member emp;/oper=(mem,next)

procdecl prepare(orggbd porgs,inout typ_genbd.t_gbdcnf xgbdcnf,string8 d_exe8);
procdecl fill(orggbd porgs);

implementation

procdecl prepare(orggbd porgs,inout typ_genbd.t_gbdcnf xgbdcnf,string8 d_exe8)
{ xgbdcnf.d_name := d_exe8;
  xgbdcnf.d_name += "gbd_orggbd";
  xgbdcnf.name := "orggbd";
  orggbd_open(porgs,xgbdcnf);
}

procdecl fill(orggbd porgs)
{ var
    int iorg;

  rand.init();

  for ( iorg := 0; iorg < 6; iorg += 1 )
  { var
      org rorg,
      t_org yorg,
      int iemp;

    rand_test.firm8(yorg.orgname);
    rand_test.addr8(false,yorg.addr);
    rand_test.phone(yorg.phone);
    org_cre(porgs,yorg,rorg);
    orgs_org_ins(porgs,rorg,-1);

    for ( iemp := 0; iemp < 8; iemp += 1 )
    { var
        emp remp,
        t_emp yemp;

      rand_test.name8(yemp.empname1,yemp.empname2,yemp.empname3);
      rand_test.addr8(true,yemp.addr);
      rand_test.phone(yemp.phone);
      emp_cre(rorg.xdoc,yemp,remp);
      org_emp_ins(rorg,remp,-1);
    }
  }
}

Файл utlfill.utility:

utility utlfill:"UTLFILL"

main
{ varobj
    orggbd.orggbd porgs,
    typ_genbd.t_gbdcnf xgbdcnf;

  call orggbd.prepare(porgs,xgbdcnf,xutl.d_exe8);
  call orggbd.fill(porgs);
}

Файл utlview.utility:

utility utlview:"UTLVIEW"

proc test(orggbd.orggbd porgs)
{ var
    orggbd.org rorg,
    orggbd.t_org yorg;

  orggbd.orgs_org_mem(porgs,0,rorg,yorg);

  while ( isnotnull(rorg) )
  { dprint("\n");
    dprint(U"Наименование: ",yorg.orgname,"\n");
    dprint(U"Адрес: ",yorg.addr,"\n");
    dprint(U"Телефон: ",yorg.phone,"\n");

    var
      orggbd.emp remp,
      orggbd.t_emp yemp;

    orggbd.org_emp_mem(rorg,0,remp,yemp);

    while ( isnotnull(remp) )
    { dprint("\n");
      dprint(U"  Фамилия: ",yemp.empname1,"\n");
      dprint(U"  Имя: ",yemp.empname2,"\n");
      dprint(U"  Отчество: ",yemp.empname3,"\n");
      dprint(U"  Адрес: ",yemp.addr,"\n");
      dprint(U"  Телефон: ",yemp.phone,"\n");
      orggbd.org_emp_next(remp,yemp);
    }

    orggbd.orgs_org_next(rorg,yorg);
  }
}

main
{ varobj
    orggbd.orggbd porgs,
    typ_genbd.t_gbdcnf xgbdcnf;

  call orggbd.prepare(porgs,xgbdcnf,xutl.d_exe8);
  call test(porgs);
}
Скачать проект utlgbd