08.06.2014

Отчет из данных ViewObject

Мы можем выдать пользователю отчет сразу по нажатию кнопки, без создания конкаррента. Такое удобно, например, при выгрузке в Excel результатов с поисковой формы.

Ключевые моменты.
1) Формирование XMLNode c данными из VO. Первый параметр - глубина структуры XML.
XMLNode xmlNode = (XMLNode)reportVO.writeXML(4, XMLInterface.XML_OPT_ALL_ROWS);
2) Добавление доп.параметров в XML (параметры шапки)
XMLNode xmlNode = (XMLNode)am.invokeMethod("fillWithVODataset");
XMLDocument doc = xmlNode.getDocument();
Element elem = doc.createElement("ReportInfo");
Element elemPeriod = doc.createElement("SomeParameter");
Text startPeriodVal = doc.createTextNode((String)someBean.getValue(pageContext));
elemPeriod.appendChild(startPeriodVal);
elem.appendChild(elemPeriod);
XMLNode firstChild = (XMLNode)xmlNode.getFirstChild();
// xmlNode пуст, если VO был пуст
if (firstChild != null){
  XMLNode parent = (XMLNode)firstChild.getParentNode();
  parent.appendChild(elem); 
}else{
  // добавляем элемент в корень
  xmlNode.appendChild(elem);
}
3) Натягиваем данные на существующий шаблон XDO
select lb.file_data
from xdo_templates_b tmp,
        xdo_lobs lb
where tmp.template_code = :1
   and tmp.application_short_name = :2
   and lb.application_short_name = tmp.application_short_name
   and lb.lob_code = tmp.data_source_code
   and lb.lob_type = 'TEMPLATE'
   and sysdate between tmp.start_date and nvl(tmp.end_date,sysdate)
4) Формируем выходной поток с помощью класса oracle.apps.xdo.template.FOProcessor

Шаблон для нашего отчета будет иметь особенности. Имя группы будет составлено как Имя_VO || 'Row'. Например, если VO отчета назывался ReportVO, то группа будет названа ReportVORow. Имена элементов будут совпадать с именами атрибутов VO. Отдельная группа - вручную добавленные параметры шапки:
<dataStructure>
  <group name="reportVORow" source="reportVORow">
   <element name="ATTR1" value="ATTR1"/>
   <element name="ATTR2" value="ATTR2"/>
   ...
  <group name="ReportInfo" source="ReportInfo">
   <element name="SomeParameter" value="SomeParameter"/>
   ...

Комментариев нет :