帆软报表使用iframe跳转问题总结
公司业务需求需要使用帆软的填报报表制作分组效果,但是填报报表做完分组之后问题很多,比如添加行需要点特定列,点错了就需要用户刷新重新填写,这对用户的体验来说不是特别的友好,于是我想了其他的方法来实现点击分组的效果。
文章目录
- 帆软报表使用iframe跳转问题总结
- 问题
- 解决方法
问题
然后我翻阅帆软报表的使用文档,找到了JS实现点击按钮打开对话框报表
这篇文档,打算使用iframe的方式编写两张报表,一张主报表,一张子报表的方式来实现分组效果。
刚开始的时候缺少添加后面的参数,导致页面跳转失败,我发现了ref_c
是必填的,没有填写会报错 你没有该页面的访问权限 需访问请联系管理员。
根据问答得知,这是属于模板认证的东西,如果你在后台将模板认证
关闭后,就可以不需要填写ref_c
这个参数也能进行跳转,但这样不管什么权限的用户都能访问到报表,显然是不行的,所以必须要在保留ref_c
这个参数情况下实现跳转功能。
但是这个ref_c
参数是设计器默认生成的,而且每次重启设计器都会生成新的值,所以也不能直接通过写死拼接值来进行跳转,这样重启帆软软件后就会新生成新的值导致跳转失败。它的值也没有通过特定参数可以获取,那只能通过其他的方式来进行获取了。
解决方法
然后我在使用报表设计器的时候发现,在同一次登录的过程中,在网址后面拼接的ref_c
参数值都是一样的,虽然他不是session_id
,但也可以把他理解成为session_id
一个登录凭证,那我们只需要通过JS获取需要跳转页面的ref_c值,然后在跳转的的时候将他拼接在请求url上就可以实现正常跳转了。
获取参数代码如下。
//通过遍历的方式获取 "?" 后的所有参数
var auth = "";
var qs = (location.search.length > 0 ? location.search.substring(1) : '');
var args = {};
items = qs.length ? qs.split('&') : [];
var item, name, value, i = 0;
len = items.length;
for (i = 0; i < len; i++) {
item = items[i].split('=');
name = decodeURIComponent(item[0]);
value = decodeURIComponent(item[1]);
if (name.length) {
args[name] = value;
//当遍历到"ref_c"的时候,将值赋给auth
if (name == "ref_c") {
var auth = args[name];
}
}
}
这样我们就取得了ref_c
的参数值,然后只要在将他拼接在请求url上就可以成功跳转了。
完整实现JS如下(跳转的报表自己填写)
var auth = "";
var qs = (location.search.length > 0 ? location.search.substring(1) : '');
var args = {};
items = qs.length ? qs.split('&') : [];
var item, name, value, i = 0;
len = items.length;
for (i = 0; i < len; i++) {
item = items[i].split('=');
name = decodeURIComponent(item[0]);
value = decodeURIComponent(item[1]);
if (name.length) {
args[name] = value;
if (name == "ref_c") {
var auth = args[name];
}
}
}
//获取参数前的URL
var url = FR.serverURL + FR.servletURL;
var $iframe = $("<iframe id='inp' name='inp' width='100%' height='100%' scrolling='no' frameborder='0'>"); // iframe参数的命名及宽高等
$iframe.attr("src", url +"?viewlet=xxxx.cpt&ref_t=design&op=write&ref_c=" + auth + "&line=" + line); //xxx.cpt为点击查询时,对话框中显示的子报表
var o = {
title: "xxxx",
width: 800, //调整对话框宽度
height: 300 //调整对话框高度
};
FR.showDialog(o.title, o.width, o.height, $iframe, o); //弹出对话