帆软报表使用iframe跳转问题总结


公司业务需求需要使用帆软的填报报表制作分组效果,但是填报报表做完分组之后问题很多,比如添加行需要点特定列,点错了就需要用户刷新重新填写,这对用户的体验来说不是特别的友好,于是我想了其他的方法来实现点击分组的效果。


文章目录

  • 帆软报表使用iframe跳转问题总结
  • 问题
  • 解决方法


问题


然后我翻阅帆软报表的使用文档,找到了JS实现点击按钮打开对话框报表这篇文档,打算使用iframe的方式编写两张报表,一张主报表,一张子报表的方式来实现分组效果。

刚开始的时候缺少添加后面的参数,导致页面跳转失败,我发现了ref_c是必填的,没有填写会报错 你没有该页面的访问权限 需访问请联系管理员

nginx 帆软集成_获取参数

nginx 帆软集成_前端_02

根据问答得知,这是属于模板认证的东西,如果你在后台将模板认证关闭后,就可以不需要填写ref_c这个参数也能进行跳转,但这样不管什么权限的用户都能访问到报表,显然是不行的,所以必须要在保留ref_c这个参数情况下实现跳转功能。

nginx 帆软集成_前端_03

但是这个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上就可以成功跳转了。

nginx 帆软集成_前端_04

nginx 帆软集成_前端_05

完整实现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); //弹出对话