示例说明
灵活分析报表在设置跳转规则向导,下钻到另一张电子表格报表时,默认都是在新窗口中打开,无法实现在覆盖式下钻(即在当前窗口打开)的效果。如果希望跳转目标报表在当前窗口打开,则需要通过下述宏代码来实现。源报表见下图-1所示。
设置方法
- 在 定制 -> 展现定制 界面中,创建一张灵活分析报表。
- 切换到 定制 ->宏管理 页面,双击此灵活分析进入报表宏界面。
- 在报表宏界面新建跳转规则向导,按照正常步骤设置跳转规则的源、目标,让系统自动生成客户端模块代码。然后手动修改所生成的客户端模块代码。
宏类型
类型 | 对象 | 事件 |
---|---|---|
ClientSide | simpleReport | onRenderTable |
宏代码
function main(simpleReport, simpleReportContext) { simpleReport.addColumnLinkByName("City0", me); //字段别名:顾客所在城市 }; var menuItem = { alias: "覆盖式下钻到电子表格", callback: function(simpleReport, simpleReportContext) { simpleReport.writeParamsToContext(); var paramsInfo = new Array(); //获取当前单元格所在行的顾客所在城市字段的值 var realValue = simpleReport.getCurrentFieldRealValue("顾客所在城市"); var dispValue = simpleReport.getCurrentFieldValue("顾客所在城市"); var paramInfo = createParamInfo("城市", realValue, dispValue); paramsInfo.push(paramInfo); //在新窗口打开资源 /* simpleReportContext.openURL("openresource.jsp?resid=I40282b811f09cb49014ca0f64b2303fd&showtoolbar=true&refresh=true", [{ name: "paramsInfo", value: lang.toJSONString(paramsInfo) }]);*/ // 在当前窗口覆盖式打开 //debugger; window.iframe_drilldown_to_spreadsheet = 1; var frameId = "iframe_drilldown_to_spreadsheet"; var tempIFrame; try { // for I.E. tempIFrame = document.createElement('<iframe name="iframe_drilldown_to_spreadsheet">'); } catch(ex) { //for other browsers, an exception will be thrown tempIFrame = document.createElement('iframe'); } tempIFrame.style.position = "absolute"; //tempIFrame.style.width = simpleReport.parent.style.pixelWidth; //tempIFrame.style.height = simpleReport.parent.style.pixelHeight; tempIFrame.style.border = "none"; tempIFrame.style.width = "1040px"; tempIFrame.style.height = "1040px"; tempIFrame.style.top = "0px"; tempIFrame.style.left = "0px"; tempIFrame.style.zIndex = "999999"; tempIFrame.setAttribute("class", frameId); tempIFrame.setAttribute("id", frameId); tempIFrame.setAttribute("name", frameId); tempIFrame.setAttribute("scrolling", "no"); simpleReport.parent.appendChild(tempIFrame); simpleReportContext.openURL("openresource.jsp?resid=I40282b811f09cb49014ca0f64b2303fd&showtoolbar=true&refresh=true", [{ name: "paramsInfo", value: lang.toJSONString(paramsInfo) }], frameId); } }; var me = menuItem; //创建参数信息 function createParamInfo(name, value, disValue) { var paramInfo = new Object(); paramInfo.name = name; paramInfo.value = value; paramInfo.displayValue = disValue; return paramInfo; };
主要修改内容:
- 将原来打开目标报表的代码注视掉://simpleReportContext.openURL("openresource.jsp?resid=I40282b811f09cb49014ca0f64b2303fd&showtoolbar......; 换成其下“在当前窗口覆盖式打开”的代码。
- 覆盖式打开的原理是在源报表的窗口中创建一个IFrame,覆盖整个灵活分析报表的窗口,打开的目标报表就显示在该IFrame之中。
跳转如何返回
在从源报表跳转到目标报表后,如何返回到第一张报表呢?我们可以在目标报表中添加一个“返回”按钮,点击后回到源报表。目标报表见下图-2所示。
设置方法
- 切换到 定制 ->宏管理 页面,双击目标电子表格进入报表宏界面。
- 在报表宏界面新建客户端模块,在新建模块对话框上,选择 spreadsheetReport 对象,onRender 事件,然后将如下代码粘贴到代码编辑区。
宏类型
类型 | 对象 | 事件 |
---|---|---|
ClientSide | spreadsheetReport | onRender |
宏代码
function main(spreadsheetReport) { if (!spreadsheetReport._newBtn) { // 不要重复添加按钮 //debugger; var input = document.createElement("INPUT"); input.type = "button"; input.value = "返回"; input.title = "返回"; input.accessKey = "N"; input.style.width = "55"; input.style.height = "20"; var newBtn = spreadsheetReport.elem_btnPrint.parentNode.appendChild(input); spreadsheetReport.addListener(newBtn, "click", doNewButtonClick, spreadsheetReport); spreadsheetReport._newBtn = newBtn; } }; // 新添加按钮Click事件处理函数 function doNewButtonClick(e) { //debugger; var spreadsheetReport = this; try { var tempIFrame; var obj = window; var maxLevel = 10; while (obj && !obj.iframe_drilldown_to_spreadsheet && (--maxLevel > 0)) { obj = obj.parent; } if (obj) { tempIFrame = obj.document.getElementById("iframe_drilldown_to_spreadsheet"); } if (tempIFrame) { // 如果找到外层打开当前电子表格的IFrame对象则销毁 spreadsheetReport.destroy(); domutils.destroyNode(tempIFrame); } } catch(e) {} };
代码说明:
- 首先在工具栏上添加一个“返回”按钮:spreadsheetReport.elem_btnPrint.parentNode.appendChild(input);
- 用户点击返回按钮时,先关闭并销毁当前报表,然后再销毁承载该报表的外层IFrame容器。这样就相当于回到了源报表。