ABI报表脚本模板说明

3204
0

玳玳我 小试身手Lv3

发表于2021-10-15 18:30

楼主
本帖最后由 玳玳我 于 2021-10-15 18:35 编辑

功能简介
脚本用于扩展功能。
产品提供的是基础通用功能,有固定处理逻辑,实际项目和应用场景中,总会有一些功能,利用产品提供的功能以及设置无法直接满足,这时候就可以利
用脚本提供的扩展功能,在相应的地方插入逻辑,修改或新增相关控制参数属性,达成希望的效果
报表模板中脚本根据执行时机的不同分为以下几种类型:
1、客户端脚本
2、计算加载事件
3、服务器端计算前
4、服务器端计算后
功能入口

使用场景与调用时机
1)客户端脚本
1、使用场景
客户端脚本适用于前端展示细节处理与具体交互操作控制,尤其是动态效果以及样式调整上。
2、调用时机
报表前台页面渲染完毕后,统计图等加载之前
3、客户端脚本常用对象
g_rptpage
ReportPageHtml
报表前台对象
方法名
返回值 功能
execmd()
执行命令
cmd_showCalcInfo
显示计算信息
cmd_calcReport
计算报表
cmd_printPreview
打印预览
cmd_printCurrentPage
打印
cmd_exportReport
导出
calcInfo
calcParam
rptPageDom
4、常用工具脚本

1)拖拽事件
var box1 = document.getElementById("HHH4");
drag(box1);
function drag(obj){
//当鼠标在被拖拽元素上按下时,开始拖拽 onmousedown
obj.onmousedown = function(event){
//设置box1捕获所有鼠标按下的事件
/*
* setCapture()
* - 只有IE支持,但是在火狐中调用时不会报错,
* 而如果使用chrome调用,会报错
*/
/*if(box1.setCapture){
box1.setCapture();
}*/
obj.setCapture && obj.setCapture();
event = event || window.event;
//div的偏移量 鼠标.clentX - 元素.offsetLeft
//div的偏移量 鼠标.clentY - 元素.offsetTop
var ol = event.clientX - obj.offsetLeft;
var ot = event.clientY - obj.offsetTop;
//document绑定一个onmousemove事件
document.onmousemove = function(event){
event = event || window.event;
//当鼠标移动时被拖拽元素跟随鼠标移动 onmousemove
//获取鼠标的坐标
var left = event.clientX - ol;
var top = event.clientY - ot;
//修改box1的位置
obj.style.left = left+"px";
obj.style.top = top+"px";
};
//document绑定一个鼠标松开事件
document.onmouseup = function(){
//当鼠标松开时,被拖拽元素固定在当前位置 onmouseup
//取消documentonmousemove事件
document.onmousemove = null;
//取消documentonmouseup事件
document.onmouseup = null;
//当鼠标松开时,取消对事件的捕获
obj.releaseCapture && obj.releaseCapture();
};
/*
* 当我们拖拽一个网页中的内容时,浏览器会默认去搜索引擎中搜索内容,
* 此时会导致拖拽功能的异常,这个是浏览器提供的默认行为,
* 如果不希望发生这个行为,则可以通过return false来取消默认行为
*
* 但是这招对IE8不起作用
*/
return false;
};
}

2)滑轮事件
myonmousewheel();
function myonmousewheel(){
//获取idbox1div
var box1 = document.getElementById("HHH5");
//box1绑定一个鼠标滚轮滚动的事件
/*
* onmousewheel鼠标滚轮滚动的事件,会在滚轮滚动时触发,
* 但是火狐不支持该属性
*
* 在火狐中需要使用 DOMMouseScroll 来绑定滚动事件
* 注意该事件需要通过addEventListener()函数来绑定
*/
box1.onmousewheel = function(event){
event = event || window.event;
//event.wheelDelta 可以获取鼠标滚轮滚动的方向
//向上滚 120 向下滚 -120
//wheelDelta这个值我们不看大小,只看正负
//alert(event.wheelDelta);
//wheelDelta这个属性火狐中不支持
//在火狐中使用event.detail来获取滚动的方向
//向上滚 -3 向下滚 3
//alert(event.detail);
/*
* 当鼠标滚轮向下滚动时,box1变长
* 当滚轮向上滚动时,box1变短
*/
//判断鼠标滚轮滚动的方向
if(event.wheelDelta > 0 || event.detail < 0){
//向上滚,box1变短
box1.style.height = box1.clientHeight - 10 + "px";
}else{
//向下滚,box1变长
box1.style.height = box1.clientHeight + 10 + "px";
}
/*
* 使用addEventListener()方法绑定响应函数,取消默认行为时不能使用return false
* 需要使用event来取消默认行为event.preventDefault();
* 但是IE8不支持event.preventDefault();这个玩意,如果直接调用会报错
*/
event.preventDefault && event.preventDefault();
/*
* 当滚轮滚动时,如果浏览器有滚动条,滚动条会随之滚动,
* 这是浏览器的默认行为,如果不希望发生,则可以取消默认行为
*/
return false;
};
//为火狐绑定滚轮事件
bind(box1,"DOMMouseScroll",box1.onmousewheel);
};
function bind(obj , eventStr , callback){
if(obj.addEventListener){
//大部分浏览器兼容的方式
obj.addEventListener(eventStr , callback , false);
}else{
/*
* this是谁由调用方式决定
* callback.call(obj)
*/
//IE8及以下
obj.attachEvent("on"+eventStr , function(){
//在匿名函数中调用回调函数
callback.call(obj);
});
}
}

3)键盘事件
myonkeydown();
//使div可以根据不同的方向键向不同的方向移动
/*
* 按左键,div向左移
* 按右键,div向右移
* 。。。
*/
function myonkeydown(){
var box1 = document.getElementById("HHH5");
//document绑定一个按键按下的事件
document.onkeydown = function(event){
event = event || window.event;
//定义一个变量,来表示移动的速度
var speed = 10;
//当用户按了ctrl以后,速度加快
if(event.ctrlKey){
speed = 500;
}
/*
* 37
* 38
* 39
* 40
*/
switch(event.keyCode){
case 37:
//alert("向左"); left值减小
box1.style.left = box1.offsetLeft - speed + "px";
break;
case 39:
//alert("向右");
box1.style.left = box1.offsetLeft + speed + "px";
break;
case 38:
//alert("向上");
box1.style.top = box1.offsetTop - speed + "px";
break;
case 40:
//alert("向下");
box1.style.top = box1.offsetTop + speed + "px";
break;
}
};
};

4)工具方法
/*
* 参数:
* obj:要执行动画的对象
* attr:要执行动画的样式,比如:left top width height
* target:执行动画的目标位置
* speed:移动的速度(正数向右移动,负数向左移动)
* callback:回调函数,这个函数将会在动画执行完毕以后执行
*/
function move(obj, attr, target, speed, callback) {
//关闭上一个定时器
clearInterval(obj.timer);
//获取元素目前的位置
var current = parseInt(getStyle(obj, attr));
//判断速度的正负值
//如果从0 800移动,则speed为正
//如果从8000移动,则speed为负
if (current > target) {
//此时速度应为负值
speed = -speed;
}
//开启一个定时器,用来执行动画效果
//向执行动画的对象中添加一个timer属性,用来保存它自己的定时器的标识
obj.timer = setInterval(function () {
//获取box1的原来的left
var oldValue = parseInt(getStyle(obj, attr));
//在旧值的基础上增加
var newValue = oldValue + speed;
//判断newValue是否大于800
//800 0移动
//向左移动时,需要判断newValue是否小于target
//向右移动时,需要判断newValue是否大于target
if ((speed < 0 && newValue < target) || (speed > 0 && newValue > target)) {
newValue = target;
}
//将新值设置给box1
obj.style[attr] = newValue + "px";
//当元素移动到0px时,使其停止执行动画
if (newValue == target) {
//达到目标,关闭定时器
clearInterval(obj.timer);
//动画执行完毕,调用回调函数
callback && callback();
}
}, 30);
}
/*
* 定义一个函数,用来获取指定元素的当前的样式
* 参数:
* obj 要获取样式的元素
* name 要获取的样式名
*/
function getStyle(obj, name) {
if (window.getComputedStyle) {
//正常浏览器的方式,具有getComputedStyle()方法
return getComputedStyle(obj, null)[name];
} else {
//IE8的方式,没有getComputedStyle()方法
return obj.currentStyle[name];
}
}
//定义一个函数,用来向一个元素中添加指定的class属性值
/*
* 参数:
* obj 要添加class属性的元素
* cn 要添加的class
*
*/
function addClass(obj, cn) {
//检查obj中是否含有cn
if (!hasClass(obj, cn)) {
obj.className += " " + cn;
}
}
/*
* 判断一个元素中是否含有指定的class属性值
* 如果有该class,则返回true,没有则返回false
*
*/
function hasClass(obj, cn) {
//判断obj中有没有cn class
//创建一个正则表达式
//var reg = /\bb2\b/;
var reg = new RegExp("\\b" + cn + "\\b");
return reg.test(obj.className);
}
/*
* 删除一个元素中的指定的class属性
*/
function removeClass(obj, cn) {
//创建一个正则表达式
var reg = new RegExp("\\b" + cn + "\\b");
//删除class
obj.className = obj.className.replace(reg, "");
}
/*
* toggleClass可以用来切换一个类
* 如果元素中具有该类,则删除
* 如果元素中没有该类,则添加
*/
function toggleClass(obj, cn) {
//判断obj中是否含有cn
if (hasClass(obj, cn)) {
//有,则删除
removeClass(obj, cn);
} else {
//没有,则添加
addClass(obj, cn);
}
}
2)计算加载事件
1、使用场景
计算加载事件脚本适用于前端计算的事件监控。
2、调用时机
在报表结构也没点击计算的时候,发送计算请求之前触发。
3)服务器端计算前
1、使用场景
计算前脚本适用于编译报表前,对报表内容增删改,或对作为输入的计算参数等进行加工处理。相当于前置条件处理。
2、调用时机
在服务器端后台进行,在计算线程执行之前调用,可以对一些参数进行动态调控。
计算前脚本中可供直接使用的对象有:rpt/login/params,分别为Script_ReportTemplate/Script_Login/StringMap对象,其中params为计算参数对象。
动态修改计算参数:
rpt.getGrid("grid1").getOptions().setValue("pagesize", params.get("@fy"))
Script_ReportTemplate
Script_ReportTemplate->Script_ReportPage->Script_ObjectAbs
分析表对象,分析表源表
函数名
返回值类型
说明
getGrid(String name)
Script_Report 获取表格对象
getWidget(String name)
WidgetObject 根据名字获得组件对象,可以获取grid以及其他控件
getCell(int r, int c)
返回r行,c列的表元对象,rc序号从0开始,比如返回第一个表元getCell(0,0)
getCell(String nm)
根据表元名返回表元对象
getColCount()
返回当前报表的列数,也可以这样调用,rpt.colCount 也是返回列数
getRowCount()
返回当前报表的行数,同上 rpt.rowCount 表示报表行数
getColWidth(int i)
返回第i列的列宽
getRowHeight(int i)
返回第i行的行高
insertCol(int fr)
fr列后面插入一列
insertCol(int fr, int count)
fr列插入count列,
insertRow(int fr)
fr行插入一行
insertRow(int fr, int count)
fr行插入count
merge(int r, int c, int rowspan, int colspan)
合并表元,r,c表示是起始表元位置,rowspancolsapn分别在行上或列上的位
移,
例如,rpt.merge(2,1,2,3) 表示合并的是从2,1开始,到3,3表元的这个块区域
setColWidth(int c, int w)
设置某列的宽度
setRowHeight(int r, int h)
设置某行的高度
setRowBgColor(int w, String color)
设置某行的背景色, rpt.setRowBgColor(1,'#FF0000'),设置第二行的背景为红

getOwner()
获取Script_Task对象。此对象获取任务相关的属性,比如jdbc链接、维等。
getFxqCount()
int
获取分析区个数
getFxq(int i)
FloatFxq
获取指定索引的分析区对象
createFxq(String rect)
FloatFxq
根据表格内的顶点位置矩形块创建分析区对象
delFxq(int i)
删除指定索引的分析区
getDimension(String nm)
IDimension
获取指定名的维对象
addSqlDataSource(String nm, String sql, String
dbpool)
添加sql数据源
Script_Report
Script_Report->Script_ObjectAbs
报表内的表格对象,一个报表内有多个表格
函数名
返回值
说明
getReportBuilder()
WidgetRpGrid 表格控件对象
getCell(int r, int c)
Script_Cell
返回r行,c列的表元对象,rc序号从0开始,比如返回第一个表元getCell(0,0)
getCell(String nm)
根据表元名返回表元对象
getColCount()
返回当前报表的列数,也可以这样调用,rpt.colCount 也是返回列数
getRowCount()
返回当前报表的行数,同上 rpt.rowCount 表示报表行数
getColWidth(int i)
返回第i列的列宽
getRowHeight(int i)
返回第i行的行高
insertCol(int fr)
fr列后面插入一列
insertCol(int fr, int count)
fr列插入count列,
insertRow(int fr)
fr行插入一行
insertRow(int fr, int count)
fr行插入count
merge(int r, int c, int rowspan, int colspan)
合并表元,r,c表示是起始表元位置,rowspancolsapn分别在行上或列上的位移,
例如,rpt.merge(2,1,2,3) 表示合并的是从2,1开始,到3,3表元的这个块区域
setColWidth(int c, int w)
设置某列的宽度
setRowHeight(int r, int h)
设置某行的高度
setRowBgColor(int w, String color)
设置某行的背景色, rpt.setRowBgColor(1,'#FF0000'),设置第二行的背景为红色
getOwner()
获取Script_Task对象。此对象获取任务相关的属性,比如jdbc链接、维等。
removeRow(int fr, int count)
删除从fr开始的count
removeRow(int fr)
删除第fr
removeCol(int fc, int count)
删除从fr开始的count
removeCol(int fc)
删除第fc
getValue(int r, int c)
String
获取表元值
getDouble(int r, int c)
double
获取double
getDisplayValue(int r, int c)
String
获取表元显示值
Script_Login
登录对象
函数名
返回值
说明
getId()
String
获取登录id
getOrgid()
String
获取登陆者所属机构id
getOrgrid()
String
获取机构资源id
getLoginName()
String
登陆者名称
getUserProperties
UserProperties 获取登录用户信息
isAdmin()
boolean
是否为管理员
StringMap
登录对象
函数名
返回值 说明
getValue(String key)
String
获取属性值
getIgnoreCase(String key, Object def)
Object 获取属性值,不区分key大小写
getValueIgnoreCase(String key, String def)
String
获取属性值串,不区分key大小写
getString(String key)
String
getInt(String key, int def)
int
getLong(String key, long def)
long
getBool(String key, boolean def)
bool
getBool(String key)
bool
4)服务器端计算后
1、使用场景
计算后脚本适用于计算完成后,结果集生成并构造表样完成后,对结果表对象进行操作,只在按既定的展示结果基础上,做相应的基本修改。相当于后置
条件处理。
2、调用时机
在服务器端后台进行,在计算线程执行之后,结果表构造完毕时调用,可以对报表结果表进行二次修改,过滤不需要的行列。
同服务器端计算前脚本,能直接使用的对象有login/rpt/params,分别为Script_Login/Script_ReportPageResult/StringMap,其中params为计算参数对象的
StringMap
注意,这里的rpt,它是一个Script_ReportPageResult对象,这是与计算前脚本不同的地方。
Script_ReportPageResult
Script_ReportPageResult->Script_ReportPage->Script_ObjectAbs
结果表对象,可以调用Script_ReportTemplate的各种不同方法
方法
说明
calcExp(String exp)
计算BI表达式,例如:rpt.calcExp("c3$.select(@>0.20)"),返回C3浮动出来大于0.2的表元
getDisplayValue(int r, int c) 返回表元的显示值
getDouble(int r, int c)
返回表元的的值,只对数值表元有效
getValue(int r, int c)
返回表元的值,如果是数值表元,会转换成字符串返回
案例:
给自定义echarts组件绑定钻取路径
/**
echartsesen :第三方对象 当json里面需要用到时可以使用
myChart:当前统计图对象,可以用来绑定事件使用
datajson:系统生成第三方json,可以在此基础上修改格式,也可以生成全新的,只需要最后用return 返回新格式
*/
/** 完整范例1:直接根据宏取数,修改系统生成第三方datajson*/
var captions = '<#=GRID1.B1$#>';
var values = '<#=GRID1.C1$#>';
captions = eval(captions);
values = eval(values);
for(var a = 0;a<values.length;a++){
values[a]={
value:values[a],
url:document.getElementById("GRID1.A"+(a+1)).children[0].getAttribute("onclick")
}
}
datajson.series[0].data = values;
datajson.xAxis[0].data = captions;
/** 完整范例2:不用系统生成第三方json,只依靠宏生成第三方echarts统计图
var option = {
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {
type: 'value'
},
series: [{
data: [120, 200, 150, 80, 70, 110, 130],
type: 'bar'
}]
};
return option; //一定要返回新格式
*


最近看过此主题的会员

esen_4V2FAE8RPI

13359319724

esen_56FY6PP7E2

esen_59RK0W9DHY

0个回答

只看楼主

登录后可回答问题,请登录注册

快速回复 返回顶部 返回列表

小时

全天响应

分钟

快速处理问题

工程师强势助力

明星产品
解决方案
联系合作

400咨询:400-0011-866

技术支持QQ:400-0011-866(工作日9:00-18:00)

产品建议邮箱yixin@esensoft.com

关注我们

扫TA学习更多干货

一对一专家交流

版权所有© 2006-2024 北京亿信华辰软件有限责任公司 京ICP备07017321号 京公网安备11010802016281号