Inject Custom function to FR

Source vvsprog
Ковыряясь в исходных кодах нашел следующее в файле oracle\hyperion\11.1.1\epm\products\biplus\lib\HReports.jar
com\hyperion\reporting\expressions\TextFunction.class есть такой код

Код
case 52: // ‘4’
stringbuffer.append(“Invoke(“);
break;


наряду с

Код
case 304:
stringbuffer.append(“MemberName(“);
break;


то есть понимаю что есть не задокументированная функция Invoke
в файле com\hyperion\reporting\expressions\EvalText.class нахожу

Код
case 52: // ‘4’
s = invokeExternalClass(itextfunction);
break;


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

создал класс и скомпилировав его кладу в G:\oracle\hyperion\11.1.1\epm\products\biplus\lib\com\hyperion\reporting\addon\
вот текст

Код

package com.hyperion.reporting.addon;

import java.util.StringTokenizer;
import java.lang.reflect.Field;

import com.hyperion.reporting.contents.IGridResult;

public class ItemFromGridPOVMemberName
implements IReportAddOn
{

public ItemFromGridPOVMemberName()
{
}

public String invoke(String s, IReportContent ireportcontent)
throws Exception
{
if(s == null)
return null;
StringTokenizer params = new StringTokenizer(s, “;”);
String gridname = params.nextToken();
String dimname = params.nextToken();
String delimiter = params.nextToken();
String position = params.nextToken();
int  iposition = Integer.parseInt(position);
String outstr = “”;
IGridContent igridcontent = ireportcontent.getGrid(gridname);
IPovContent ipovcontent = igridcontent.getGridPov();
String [] dimensions= ipovcontent.getDimensions(0);
for(int i = 0; i < dimensions.length; i++)
{
String idimname = dimensions[i].toString();
if(idimname.equals(dimname))
{
String ioutstr = ipovcontent.getValue(0,i);
StringTokenizer iarroutstr = new StringTokenizer(ioutstr, delimiter);
int itoken=1;
while (iarroutstr.hasMoreTokens())
{
String buffer = iarroutstr.nextToken();
if(itoken==iposition)
{
outstr = outstr + buffer;
}
itoken++;
}
break;
}
}
return outstr;
}
}

После этого в своем отчете например в текстовом поле вставляю следующий вызов:
<<Invoke(“com.hyperion.reporting.addon.ItemFromGridPOVMemberName”,”FALSE”,”Сетка1;Функциональная классификация;.;4″)>>
Данный пример позволяет вытащить имя текущего мембера в гриде Сетка1, измерения “Функциональная классификация” в POV,разделить его используя разделитель точка и показать 4ый элемент.

Всё работает. То есть можно писать любые функции которых не хватает в стандартном наборе Oracle-Hyperion Financial Reports.

Единственное замечание –
первый параметр функции Invoke это полное имя класса у которого вызовется метод invoke
второй параметр говорит о том кешировать ли экземпляр нашего класса или нет,
во время отладки ставьте FALSE. Иногда(верней почти всегда:)) он не помогает и надо перегружать reporting server.
третий параметр строка которая передастся как параметр при вызове invoke нашего класса.

Спасибо за ответы.