【仅供内部供应商使用,不提供对外解答和培训】
...
| Code Block | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
package com.fr.script;
import com.fr.common.annotations.Open;
import com.fr.locale.InterProviderFactory;
import com.fr.stable.Primitive;
import com.fr.stable.UtilEvalError;
import com.fr.stable.exception.FormulaException;
import com.fr.stable.script.Node;
/**
* 内置函数/自定义函数的抽象实现类.
*
* @author richie
* created on 2020-09-04
*/
@Open
public abstract class AbstractFunction extends CalculatorEmbeddedFunction {
/**
* 通过指定的参数,计算函数的结果.
*
* @param arguments 参数列表
* @return 函数的结果
* @throws UtilEvalError 如果在计算中出现无法解析的值,则抛出此异常
*/
@Override
public Object evalExpression(Node[] arguments) throws UtilEvalError {
Object returnValue;
if (this.getType() == HA) {
//层次坐标系列的不在这边eval
returnValue = tryRun(arguments);
} else {
Object[] args = new Object[arguments.length];
for (int i = 0; i < arguments.length; i++) {
args[i] = this.getCalculatorProvider().evalValue(arguments[i]);
}
returnValue = tryRun(args);
}
if (returnValue == Primitive.ERROR_VALUE || returnValue == Primitive.ERROR_NAME) {
log(InterProviderFactory.getProvider().getLocText("Fine-Core_Base_NS_Cell_Formula") + toString());
}
return returnValue;
}
/**
* 获取函数所使用的算子.
*
* @return 算子
*/
@Deprecated
public Calculator getCalculator() {
return (Calculator) getCalculatorProvider();
}
private Object tryRun(Object[] args) throws UtilEvalError {
try {
return run(args);
} catch (FormulaException fe) {
throw new UtilEvalError(fe);
}
}
/**
* 计算函数的结果.
*
* @param args 函数的参数,是经过了算子处理了其中特殊参数的
* @return 函数的结果
* @throws FormulaException 函数计算过程中抛出的异常
*/
public abstract Object run(Object[] args) throws FormulaException;
}
|
产品线 | 版本 | 支持情况 | 备注 |
|---|---|---|---|
| FR | 8.0 | 支持 | |
| FR | 9.0 | 支持 | |
| FR | 10.0 | 支持 | |
| BI | 3.6 | 支持 | |
| BI | 4.0 | 支持 | |
| BI | 5.1 | 支持 | |
| BI | 5.1.2 | 支持 | |
| BI | 5.1.3 | 支持 |
| Code Block | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
<extra-core>
<!-- 注册一组函数的方法 -->
<FunctionGroup class="your class name"/>
<!-- 注册单个函数的方法 -->
<FunctionDefineProvider class="your class name"
name="函数名" description="函数的用法介绍"/>
</extra-core> |
...
单一函数注册生效是当插件引擎加载插件后,ExtraClassManager通过mountSpecific调用addFunctionDef在其中把xml中的class/name/description 三个属性转换成FunctionDef保存在functions对象中缓存;三个属性转换成FunctionDef保存在functions对象中缓存;也就是一般意义的FunctionDefineProvider接口
算子是报表计算过程中的一个核心,函数会通过DefaultNameSpace注册到算子中生效,在DefaultNameSpace#getMethod获取函数时,如果目标函数不再标准函数集内
会先查找自定义函数中的扩展函数。如果找不到,会从ExtraClassManager的functions对象中获取插件函数中的单个函数扩展,如果还是找不到,会继续获从分组函数扩展中获取。最终生效
...
demo地址:demo-function-def-container
免责声明:所有文档中的开源示例,均为开发者自行开发并提供。仅用于参考和学习使用,开发者和官方均无义务对开源案例所涉及的所有成果进行教学和指导。若作为商用一切后果责任由使用者自行承担。免责声明:所有文档中的开源示例,均为开发者自行开发并提供。仅用于参考和学习使用,开发者和官方均无义务对开源案例所涉及的所有成果进行教学和指导。禁止用于任何商业用途,若作为商用一切后果责任由使用者自行承担。