2015-11-25 16:52:21
Краткое описание :
Нужно добавить поле или дать возможность добавлять поля
самостоятельноОписание :
Построитель отчетовЧто измененно :
Пользователи могут создавать новые поля для построителя
отчетов, путем разработки и компиляции vip-интерфейсов, реализующих объектный
интерфейс Z_StaffBuilder::IFFRB. Для получения значения таких полей
используется ссылка на карточку сотрудника (Persons.NRec), по которой
программно можно получить значения связанных с этой карточкой различных
атрибутов. Если в настройке отчета указан "Порядок обработки", отличный от
"Текущее состояние", то в отчет могут выводиться по несколько строк для каждого
сотрудника, соответствующих разным записям таблицы обхода, связанной с
карточкой текущего сотрудника. В таком случае плагин на основе IFFRB не
позволяет реализовать пользовательское поле, которое бы выводило в отчет
значения атрибутов таблицы, по которой выполняется обработка данных (порядок
обхода). Нужно дать возможность создавать пользовательские поля отчета, для
получения значений которых будет использоваться не ссылка на карточку
сотрудника, а ссылка на запись таблицы, по которой выполняется построение
отчета.
В качестве примера нужно реализовать плагины для полей "Документ основание" и
"Номер документа основания" таблицы "Поощрения", соответствующей нижней панели
3-го окна картотеки.
Как измененно :
Объявлен объектный интерфейс Z_StaffBuilder::ILoopTable.
Vip-интерфейсы, реализующие пользовательские поля, значения которых зависят от
порядка обработки, должны реализовывать помимо IFFRB ещё и этот интерфейс
ILoopTable. У объектного интерфейса ILoopTable есть лишь одно свойство -
TableNum, определяющее по какой таблице должен быть организован порядок
обработки в отчете, использующем это пользовательское поле. Свойство доступно
только на чтение, т.е. vip-интерфейс пользовательского поля должен через это
свойство возвращать значение, определяющее таблицу циклической обработки.
Допустимые значения описаны в документации компонента
GalDoc\Z_StaffBuilder.chm. В метод GetValue vip-интерфейса, реализующего
ILoopTable через параметр Psn будет передаваться не ссылка на карточку
(Persons.NRec), а ссылка на запись таблицы, по которой реализован порядок
обработки в отчете (например, Apointments.NRec, если в настройках отчета
указано "Порядок обработки"="Назначения" и свойство TableNum vip-интерфейса
пользовательского поля возвращает константу "1", соответствующую этому же
порядку обработки).
В окне выбора полей для отчета созданные пользователем поля будут отображаться
в папке "Пользовательские поля", если они не зависят от порядка обработки,
иначе в соответствующих порядку обработки папках, например в папке
"Назначение", если интерфейс пользовательского поля реализует ILoopTable и его
свойство TableNum возвращает значение "1".
Пользовательские поля в иерархическом представлении окна выбора полей выделены
специальной иконкой.
Сортировка и фильтры по пользовательским полям не поддерживаются.
В качестве примера реализованы плагины для полей "Документ основание" и "Номер
документа основания" таблицы "Поощрения", соответствующей нижней панели 3-го
окна картотеки. Ниже приведен исходный текст одного из них. Компилировать его
необходимо используя файл FFRB.vih, поставляемый с обновлением.
//------------------------------------------------------------------------------
// (c) корпорация Галактика
// Галактика ERP 9.1 - Управление персоналом
// Плагин пользовательского поля "Поощрение: Номер документа основания"
//------------------------------------------------------------------------------
#include FFRB.vih // описание
#doc
Плагин пользовательского поля "Номер документа основания" для таблицы обхода
"Поощрения"
#end
Interface FFRB_1008;
Create view as select *
from Fortune;
// Идентификатор (код) поля
public function GetCode: word;
{
result := 1008;
}
// Описание поля (отображается при выборе)
public function GetDescription: string;
{
result := 'Номер документа основания';
}
// Номер окна, разграничение прав которого должно влиять на видимость поля
public function GetWindowNumber: byte;
{
result := 3; // Анкетные данные, стаж
}
// Типа поля
public function GetTypeField: word;
{
result := 0; // строка
}
// Корневая таблица пользовательского поля
property ILoopTable.TableNum: word read 17; // Поощрения
// Значение поля
public function GetValue(Psn: comp): variant;
{
result := '';
if (GetFirst Fortune where (( Psn == Fortune.NRec )) = tsOk)
result := Fortune.DocNmb;
}
// Путь на текстовый файл с описанием sql-запроса
public function GetSqlFile: string;
{
result := '';
}
// Проверка корректности данного поля при фильтрации
public function CheckField(Psn: comp): boolean;
{
#__UnUsed__(Psn)
result := true;
}
// Множественная пометка
public function Pick(Psn: comp; wFlag: word): boolean;
{
#__UnUsed__(Psn, wFlag)
result := true;
}
End.