Отчет с дополнительными полями (примеры скриптов)

Из-за специфики реализации хранения дополнительных полей в системе не имеется возможности вывести их в печатную форму посредством мастера конструктора отчета.

Однако вывести данные поля возможно с помощью запросов на 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 можно посмотреть в модели данных системы.

В шаблоне печатной формы обращаемся к полученным данным как обычно - ${имя_полосы.имя_параметра}
image

Способ второй – запрос 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'

В шаблоне печатной формы обращаемся к полученным данным как обычно - ${имя_полосы.имя_параметра}
image

Способ третий – скрипт 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

В шаблоне печатной формы обращаемся к полученным данным как обычно - ${имя_полосы.имя_параметра}
image
Ниже скриншот результата вывода тестового отчета.