Табличные врапперы Назад В начало Вперед

Для удобства использования введен специальный вид табличного объекта - табличный враппер. Табличный враппер можно использовать как обычную таблицу. В т.ч. для него не требуется явно заводить переменную или указывать его в секции from логической таблицы.

От табличного объекта общего вида табличный враппер отличается соглашением по именам интерфейсов - они начинаются с заданных префиксов, за которыми следует имя таблицы или табличного объекта. Значения префиксов по умолчанию:

<префикс-по-умолчанию-для-obj-интерфейсов> = I
<префикс-по-умолчанию-для-vip-интерфейсов> = tw

При использовании враппера компилятор автоматически заводит переменную с именем, совпадающим с именем таблицы или табличного объекта. Тип этой переменной есть ссылка на objInteface с именем:

<префикс-враппера-для-obj-интерфейсов><имя-таблицы>

Эта ссылка автоинициализируется неразделяемым экземпляром vipInterface с именем:

<префикс-враппера-для-vip-интерфейсов><имя-таблицы>

Например для доступа к таблице KatPersons необходим враппер, состоящий из:

objInterface IKatPersons;
vipInterface twKatPersons implements IKatPersons, IModify;

Теперь к KatPersons можно обращаться как к обычной таблице, например:

browse;
  fields
   KatPersons.FIO 'ФИО' : [20], pickButton, protect;
. . .
Summ := Quant * KatPersons.SALARY;

Для получения табличного враппера можно использовать генератор врапперов tbl2obj. Утилита позволяет сгенерировать объект-оболочку (враппер) для таблицы из словаря.

Префиксы можно задать в секции [Vip] конфигурационного файла. Однако, во избежании проблем компиляции, когда у разных компонент эти префиксы окажутся различными, лучше эти параметры не изменять. Утилита tbl2obj генерирует значения префиксов по умолчанию.

Примеры.

Пример 1.

Описание враппера к табличному объекту XFILES (файл IXFILES.vih)

#ifndef __XFILES__VIH__
#define __XFILES__VIH__

#include IModify.vih

public objInterface IXFILES;
  property XFCODE : word read write;
  property XFNAME : string[20] read write;
  index FILEBYCODE = XFCODE(unique);
  index FILEBYNAME = XFNAME;
end;

public vipInterface twXFILES
  implements IXFILES, IModify licensed(free);

#endif

Реализация враппера (файл twXFILES.vip)

#include IXFILES.vih

interface twXFILES;
  create view as select * from X$FILES;

  property IXFILES.XFCODE : word
	absolute X$FILES.XF$CODE read write;
  property IXFILES.XFNAME : string[20]
	absolute X$FILES.XF$NAME read write;

  function IModify.doInsert : Word;
	{ Result := insert current X$FILES; }
  implementation IModify.doUpdate abstract;
  implementation IModify.doDelete abstract;
  implementation IModify.doFlush  abstract;

  index IXFILES.FILEBYCODE auto;
  index IXFILES.FILEBYNAME auto;
end.

Использование созданного враппера. Табличный объект XFiles будет создан автоматически.

#include IXFILES.vih

interface TblObjVar3;

 create view
   As select * from x$files;

 handleEvent
   cmInit:
   {
	 if (getFirst XFiles = tsOK)
	 {
		_loop XFiles
	 {
		 message ('XFiles.Name='+XFiles.XFNAME);
	 }
	 }
   }
 end;
end.

Пример 2.

Файл IKatPersons.vih

// Описание враппера к таблице KatPersons компонента C_STAFF
// с полями NRec, FIO, salary, department, post
#component "C_STAFF"
#include IModify.vih
objInterface IKatPersons;
  property NRec : comp read;
  property FIO : string[35] read; // Фамилия И.О.
  property salary : double read;  // Ср.дневной заработок
  property department : string[20] read; // Подразделение
  property post : string[20] read;  // Должность
  index KatPersons0 = NRec(unique);
end;
VipInterface twKatPersons
  implements IKatPersons, IModify licensed(free);

Файл twKatPersons.vip

// Реализация враппера
#component "C_STAFF"
#include IKatPersons.vih
interface twKatPersons;
 create view
   as select
	 KatPersons.*, KatPosts.Name, KatDeps.Name
   from
	 KatPersons, KatPosts, KatDeps
   where ((
	 root				 == KatPersons.NREC and
	 KatPersons.cDepartment == KatDeps.NREC	and
	 KatPersons.cPost	 == KatPosts.NREC
   ));

  property IKatPersons.NRec : comp
	absolute KatPersons.NRec read;
  property IKatPersons.FIO : string[35]
	read KatPersons.LastName+' '+
		 SubStr(KatPersons.FirstName,1,1)+'.'+
		 SubStr(KatPersons.MiddleName,1,1)+'.';
  property IKatPersons.salary : double
	read (KatPersons.taxrate+KatPersons.raise)/21;
  property IKatPersons.department : string[20]
	absolute KatDeps.Name read;
  property IKatPersons.post : string[20]
	absolute KatPosts.Name read;

  function IModify.doInsert : word;
	{ result := insert current KatPersons; }
  function IModify.doUpdate : word;
	{ result := update current KatPersons; }
  function IModify.doDelete : word;
	{ result := delete current KatPersons; }
  implementation IModify.doFlush abstract;

  index IKatPersons.KatPersons0 auto;
end.

Фрагмент файла KatPersonsUsage.vip

// Использование созданного враппера
#component "C_PRJMNG"
#include IKatPersons.vih
create view
  as select
	KatPersons.*, ...
  from objref KatPersons, ...
  where ((
	 . . .
	 cEmployee == KatPersons.NRec
  ))
;

Версия

Атлантис 5.1.23.