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