Из-за специфики реализации хранения дополнительных полей в системе не имеется возможности вывести их в печатную форму посредством мастера конструктора отчета.
Однако вывести данные поля возможно с помощью запросов на sql\jpql или скриптом groovy.
Ниже представлены примеры работы с дополнительными полями.
В виде документа добавлено три поля:
Каждому полю присвоен уникальный код для однозначной идентификации поля в таблице SYS_ATTR_VALUE
Способ первый – запрос sql.
запрос sql
select
max(case when t.code='txt' then t.STRING_VALUE else null end) as txtv,
max(case when (t.code='boolean' and t.BOOLEAN_VALUE = true) then 'Да' when (t.code='boolean' and t.BOOLEAN_VALUE =false) then 'Нет' else null end) as boolv,
max(case when t.code='int' then t.integer_value else null end) as intv
from (
select v.code,v.integer_value,v.STRING_VALUE, v.BOOLEAN_VALUE
from df_doc d
join sys_attr_value v on d.card_id=v.entity_id
where
v.entity_id=${entity} ) t
--txt, boolean, int - коды доп.полей вида документа
Вложенный SELECT позволяет нам выбрать из таблицы SYS_ATTR_VALUE все строки значений всех доп.полей для текущей карточки ${entity}.
С помощью функции MAX и условия CASE мы отбираем нужные нам значения и помещаем их в алиасы для шаблона печатной формы. Описание таблицы SYS_ATTR_VALUE можно посмотреть в модели данных системы.
В шаблоне печатной формы обращаемся к полученным данным как обычно - ${имя_полосы.имя_параметра}
Способ второй – запрос jpql
В данном случае потребуется для каждого доп.поля определить свой набор данных. Для удобства каждый набор назовите кодом доп.поля. Сами запросы будут уже обращаться к сущности sys$CategoryAttributeValue. Ее описание так же можно посмотреть в модели данных.
jpqlBOOLEAN
select t.booleanValue as boolv from sys$CategoryAttributeValue t
where t.entityId=${entity} and t.code ='boolean'
jpqlTXT
select t.stringValue as txtv from sys$CategoryAttributeValue t
where t.entityId=${entity} and t.code ='txt' and t.stringValue is not null
jpqlINT
select t.intValue as intv from sys$CategoryAttributeValue t
where t.entityId=${entity} and t.code ='int'
В шаблоне печатной формы обращаемся к полученным данным как обычно - ${имя_полосы.имя_параметра}
Способ третий – скрипт groovy
При наличии навыков написания скриптов groovy для отчетов этот способ будет наиболее гибким.
В начале потребуется загрузить через LoadContext данные из БД о текущем документе.
При загрузке обязательно выставить ctx.setLoadDynamicAttributes(true) – этот флаг говорит загрузчику, что требуется кроме стандартных данных о документе загрузить так же связанные данные из sys$CategoryAttributeValue
После этого возможно обращаться к доп полям как к системным через метод d.getValue(‘+код_поля’)
ВНИМАНИЕ: рекомендуется проверять на заполненность поля, чтобы обрабатывать вывод пустых значений. Кроме того может понадобиться явное приведение типов.
import com.haulmont.cuba.core.global.AppBeansimport com.haulmont.cuba.core.global.DataManager
import com.haulmont.cuba.core.global.LoadContext
import com.haulmont.thesis.core.entity.Doc
import com.haulmont.thesis.core.entity.SimpleDoc
import java.text.SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat('dd.MM.yyyy HH:mm')
DataManager dataManager = AppBeans.get(DataManager.NAME)
LoadContext ctx
List<Map<String, Object>> result = [] //контейнер для пар ключ-значение для вывода в печатную форму
Doc entity = (Doc) params.get("entity"); //загружаем документ из параметра отчета
ctx = new LoadContext(SimpleDoc.class)
ctx.setUseSecurityConstraints(false)
.setView("browse")
.setQueryString("select d from df\$SimpleDoc d where d.id = :entityId")
.setParameter("entityId", entity) //выгружаем из базы данных информацию по документу
ctx.setLoadDynamicAttributes(true); //флаг загрузки связанных с документом доп.полей
SimpleDoc d = dataManager.load(ctx)
def dataInfo =[
'txtv' : d.getValue('+txt') ? d.getValue('+txt'): "", //обязательно проверять на null. Если поле пустое, то выводить на печать пустую строку
'boolv' : d.getValue('+boolean'),
'intv' : d.getValue('+int')
]
result.add(dataInfo)
return result
В шаблоне печатной формы обращаемся к полученным данным как обычно - ${имя_полосы.имя_параметра}
Ниже скриншот результата вывода тестового отчета.