Posts Tagged ‘报表组’

巧用报表组实现套表的统一展现导出及打印

07.03.2009 by fengzhou - 0 Comment - 0
Posted in java报表相关

在实际业务中,经常会有一套业务联系紧密的报表,需要展现、导出、打印等操作都同时进行。此时如果都按照单独的报表分别去进行处理的话,就显得不那 么方便了。这个时候我们可以使用润乾报表提供的报表组功能。将这些联系紧密的各个报表整合成为一个报表组,然后就可以像操作单张报表一样简单的对报表组中 的所有报表一同进行操作和处理。

看下面两张报表:订单表和订单明细表

2.png

1.png

显然,在业务上这两张报表是要一起进行处理的。下面我们就以这两张报表为例来看一下报表组的使用。

新建一个报表组,为报表组添加报表源,即报表组里要包含的所有报表,这里就是订单表和订单明细表。

3.png

可以看到设计器的界面出现了类似excel那样的sheets标签,切换即可看到报表组中的各个报表。

4.png 5.png

发布到网页上之后,报表组是以tab页切换的方式在同一个页面上展现组内各张报表的:

6.png 7.png

报表组支持无失真导出为excel套表:

8.png 9.png

打印报表组时,首先会弹出提示框,可以选择需要打印的报表,默认是组内报表全部打印:

10.png

怎么样?对于业务关系密切的一套报表来说,使用报表组的方式进行展现导出及打印,方便得很吧!

润乾报表,凭借多年来对报表领域的专注和丰富的实施经验,不仅有着先进强大的核心模型,同时也对细节做了全面的优化,不但有能力解决复杂的问题,还可以带来成本与效率的显著改善,真正实现随需而动的商业智能
引自:润乾报表知识库
原文链接:巧用报表组实现套表的统一展现导出及打印
相关文章:一种实现类似excel把负数显示成红色且去掉负号的方法 ; 导入带公式excel的问题web报表的扩展功能
润乾报表出了新版统计图解决行式填报导入excel发生错位的问题
其他相关内容: 润乾商业智能解决方案 ; 商业智能BI联盟 ; Java报表 ; 报表软件

自定义报表组的tab样式

06.15.2009 by fengzhou - 0 Comment - 0
Posted in java报表相关

润乾报表提供的报表组功能,可以实现在同一页面上套表的统一展现,通过tab标签来进行各表之间的切换。如下图所示:

1.png

但由于各系统的风格不同,我们给出的默认tab样式可能无法符合当前系统的整体风格,这时就需要对tab样式进行自定义。比如:

2.png

下面就详细说明如何自定义报表组的tab样式。

首先,当使用润乾<report:Group>标签发布报表组时,后台会根据报表组内报表的逻辑名生成如下代码:

<style>
#rq_tabs {background:#F4F7FB;font-size:12px;font-family:宋体;line-height:normal;border-bottom:1px solid #BCD2E6; }
#rq_tabs label { margin:0;padding:0; }
#rq_tabs a { float:left;background:url(”http://127.0.0.1:6001/demo/images/rq_tableft1.gif”) no-repeat left top;margin:0;padding:0 0 0 4px;text-decoration:none;}
#rq_tabs a span { float:left;background:url(”http://127.0.0.1:6001/demo/images/rq_tabright1.gif”) no-repeat right top;padding:5px 15px 4px 6px;color:black; }
#rq_tabs a:hover { background-position:0% -42px; }
#rq_tabs a:hover span { background-position:100% -42px; color:black; }
#rq_tabs label.rq_curr a { background-position:0% -42px; }
#rq_tabs label.rq_curr a span { background-position:100% -42px; color:black; }
</style>
<div style=’padding-bottom:1px’><table cellspacing=0 cellpadding=0 border=0><tr><td id=rq_tabs currTableId=”item1″ tables=”item1,item2,item3″ style=”padding:
1px 2px 0 2px” nowrap>
<label id=”tab_item1″ reportId=”item1″ onclick=_groupClicked(this) class=rq_curr><a href=” onclick=’return false;’><span>tab1 contents</span></a></label>
<label id=”tab_item2″ reportId=”item2″ onclick=_groupClicked(this)><a href=” onclick=’return false;’><span>tab2 contents</span></a></label>
<label id=”tab_item3″ reportId=”item3″ onclick=_groupClicked(this)><a href=” onclick=’return false;’><span>tab3 contents</span></a></label>
</td></tr></table></div>

其中<style>内是对tab标签栏(rq_tabs)的样式设定,下面的三个<label>是发布的报表组内的三张报表所对应的tab标签,包括样式及点击时要做的动作。其中选中的当前页的样式(css类)是:class=rq_curr。

然后,我们根据这段生成的代码来修改样式及点击动作,修改后的代码如下(代码说明见代码注释信息):

<SCRIPT LANGUAGE=”JavaScript”>

//全局变量oldNode,用于记录当前tab页的前一页id,默认状态下tab_item1为选中状态,因此初值赋为tab_item1

var oldNode = “tab_item1″;

//点击tab标签时的动作click1,这里要接受一个参数,该参数是点击的当前tab页的id,比如说有tab1切换点击到tab2,此时接收到得id便是tab_item2

function click1(nodeDesc) {
//alert(nodeDesc);

//将接收到得id赋值给newNode记录

var newNode = nodeDesc;

/* 这里要进行判断,如果说获取的新tab的id跟保存在全局变量中的旧的tab的id相同,不会做任何动作。否则:改变当前tab的样式及前一tab的样式,当前tab页采用myhover样式,而前一tab采用mynormal样式,区别可以在例子中明显看出。并且最重要的动作是将新获取到的tab的id保存到全局变量oldNode中。*/

if(newNode!=oldNode){

document.getElementById( newNode ).childNodes.item(0).childNodes.item(0).className=”myhover”;
document.getElementById( oldNode ).childNodes.item(0).childNodes.item(0).className=”mynormal”;
document.getElementById( newNode ).childNodes.item(0).style.background=”#C6C0CB”;
document.getElementById( oldNode ).childNodes.item(0).style.background=”#ddd”;
oldNode = newNode;
}
}

//tab栏样式(更改的是标签栏所在div的样式)

document.getElementById( “rq_tabs” ).parentNode.parentNode.parentNode.width=”30%”;
document.getElementById( “rq_tabs” ).parentNode.style.background=”#BDD9D2″;

//现在的实现方式需手动加入标签页//tab1样式

//document.getElementById( “rq_tabs” ).style.background=”#ddd”;

//赋予tab_item1新的名称及动作

document.getElementById( “tab_item1″ ).innerHTML=”<a id=’a_item1′ href=” ><span id=’span_item1′ onclick=’click1(this.parentNode.parentNode.id);return false;’>tab1 contents</span></a>”;
document.getElementById( “tab_item1″ ).childNodes.item(0).childNodes.item(0).className=”myhover”;
document.getElementById( “tab_item1″ ).childNodes.item(0).style.background=”#C6C0CB”

//tab2样式//赋予tab_item2新的名称及动作

document.getElementById( “tab_item2″ ).innerHTML=”<a id=’a_item1′ href=” ><span id=’span_item2′ onclick=’click1(this.parentNode.parentNode.id);return false;’> tab2 contents</span></a>”;
document.getElementById( “tab_item2″ ).childNodes.item(0).childNodes.item(0).className=”mynormal”;
document.getElementById( “tab_item2″ ).childNodes.item(0).style.background=”#ddd”

//tab3样式//赋予tab_item3新的名称及动作

document.getElementById( “tab_item3″ ).innerHTML=”<a id=’a_item1′ href=” ><span id=’span_item3′ onclick=’click1(this.parentNode.parentNode.id);return false;’> tab3 contents</span></a>”;
document.getElementById( “tab_item3″ ).childNodes.item(0).childNodes.item(0).className=”mynormal”;
document.getElementById( “tab_item3″ ).childNodes.item(0).style.background=”#ddd”;

//待增加的tab……

</SCRIPT>

这样,我们就实现了报表组tab样式的自定义,通过自定义样式的使用,使得报表系统更加的灵活多变,以符合不同的需求。

报表组中的报表之间传递数据问题

05.20.2009 by fengzhou - 0 Comment - 0
Posted in java报表相关

报表报表之间可以通过参数模板或超链接等等传递数据,但是同一个报表组中的报表传递数据就不能通过这两种方法了,可以JS函数来传递。比如报表组中报表一A1的值要传到报表二B2,可以通过下面方法实现:

<script language=”javascript”>
//报表一中的A1值传给报表二中的B2方法
function sendA1()
{
var a1Value=””;
var a1Display=””;
//item1为报表在报表组中的逻辑名,A1为单元格名
a1Value=document.getElementById(”item1_A1″).value;
a1Display=document.getElementById(”item1_A1″).innerHTML;
document.getElementById(”item2_B2″).value=totalValue;
document.getElementById(”item2_B2″).innerText=totalDisplay;
}
//点击图中”报表二”的onClick方法
document.getElementById(’tab_item2′).onclick=function()
{
//先调用JSP自动生成的_groupClicked方法
_groupClicked(document.getElementById(’tab_item2′));
sendA1();
}
12
先在报表一A1输入一个值,然后点击报表二,在报表二中就会出现刚才在报表一输入的值。

引自:润乾技术知识库
相关文章:润乾参数表单中如何不点击查询按钮自动传参;关于润乾报表自定义函数报错的问题决策分析解决方案润乾报表填报处理类问题

其他相关内容:润乾报表 ; RAQSOFT ; 报表工具知识库 ; 商业智能专业知识库

润乾报表:不展现页面,直接将报表组导出excel

04.14.2009 by fengzhou - Comments Off - 0
Posted in java报表相关

润乾报表的用户提出这样的需求:点击页面上按钮后台自动计算报表组并导出excel。这样的需求可以用api实现。

解决方案

将如下代码加入报表展示的jsp文件中,假设报表组文件是reportFiles/tianbaoraq/4.rpg。

<%

//报表文件相对路径
String reportFile=application.getRealPath(”/reportFiles/tianbaoraq/4.rpg”);

//新建一个 HashMap对象存放参数,map可以存放空参数。传递参数时名称要保证和报表组用到的参数名一致。
HashMap map=new HashMap();
Enumeration paramNames = request.getParameterNames();
if(paramNames!=null){
while(paramNames.hasMoreElements()){
String paramName = (String) paramNames.nextElement();
String paramValue=request.getParameter(paramName);

//把参数名和参数值分别加入到hashmap的key和value里
map.put(paramName,paramValue);
}
}

//读取报表组文件
ReportGroup rg = ReportGroup.read(reportFile);

//报表组参数元数据
ParamMetaData rg_pmd=rg.getParamMetaData();

//设置报表组参数
if(rg_pmd !=null){
int rg_pmdNum = rg_pmd.getParamCount();
String rg_paramName=””;
for(int j=0; j<rg_pmdNum;j++){
rg_paramName=rg_pmd.getParam(j).getParamName();
for (Iterator it=map.keySet().iterator();it.hasNext();){

//遍历hashmap,将对应的参数写入报表组对象
String key= (String)it.next();
if(rg_paramName.equals(key)) {
rg_pmd.getParam(j).setValue((String)map.get(key));}
}
}
}

//获取上下文
Context context = new Context();

//计算报表组
GroupEngine gEngine = new GroupEngine(rg, context);

//获取子报表数量
int num=rg.getItemCount();

//新建excelReport对象
ExcelReport er=new ExcelReport();

//循环分别计算子报表
for(int i=0;i<num;i++){
IReport r = gEngine.get(i);

//生成子表的excel对象
er.export( “a”+i,r);
}
try{

//将多个子表的excel对象导入到一同个excel文件里。文件名拼上当前时间

Date currentTime = new Date();

//格式化日期
SimpleDateFormat formatter = new SimpleDateFormat(”yyyyMMddhhmmss”);
String dateString = formatter.format(currentTime);
er.saveTo(”c:/work/name”+dateString+”.xls”);
}catch(Exception e){
e.printStackTrace();
}
%>

<script>
alert(”导出完成。”);
</script>

引自:润乾技术知识库
原文链接:润乾报表:不展现页面,直接将报表组导出excel
相关文章:在润乾参数表单中如何不点击查询按钮自动传参关于润乾报表自定义函数报错的问题决策分析解决方案润乾报表填报处理类问题
其他相关内容:润乾报表 ; RAQSOFT ; 报表工具知识库 ; 商业智能专业知识库

润乾报表:不展现页面,直接将报表组导出excel

03.17.2009 by hewei - 0 Comment - 0
Posted in web报表应用

润乾报表的用户提出这样的需求:点击页面上按钮后台自动计算报表组并导出excel。这样的需求可以用api实现。

解决方案

将如下代码加入报表展示的jsp文件中,假设报表组文件是reportFiles/tianbaoraq/4.rpg。

<%

//报表文件相对路径
String reportFile=application.getRealPath(”/reportFiles/tianbaoraq/4.rpg”);

//新建一个 HashMap对象存放参数,map可以存放空参数。传递参数时名称要保证和报表组用到的参数名一致。
HashMap map=new HashMap();
Enumeration paramNames = request.getParameterNames();
if(paramNames!=null){
while(paramNames.hasMoreElements()){
String paramName = (String) paramNames.nextElement();
String paramValue=request.getParameter(paramName);

//把参数名和参数值分别加入到hashmap的key和value里
map.put(paramName,paramValue);
}
}

//读取报表组文件
ReportGroup rg = ReportGroup.read(reportFile);

//报表组参数元数据
ParamMetaData rg_pmd=rg.getParamMetaData();

//设置报表组参数
if(rg_pmd !=null){
int rg_pmdNum = rg_pmd.getParamCount();
String rg_paramName=””;
for(int j=0; j<rg_pmdNum;j++){
rg_paramName=rg_pmd.getParam(j).getParamName();
for (Iterator it=map.keySet().iterator();it.hasNext();){

//遍历hashmap,将对应的参数写入报表组对象
String key= (String)it.next();
if(rg_paramName.equals(key)) {
rg_pmd.getParam(j).setValue((String)map.get(key));}
}
}
}

//获取上下文
Context context = new Context();

//计算报表组
GroupEngine gEngine = new GroupEngine(rg, context);

//获取子报表数量
int num=rg.getItemCount();

//新建excelReport对象
ExcelReport er=new ExcelReport();

//循环分别计算子报表
for(int i=0;i<num;i++){
IReport r = gEngine.get(i);

//生成子表的excel对象
er.export( “a”+i,r);
}
try{

//将多个子表的excel对象导入到一同个excel文件里。文件名拼上当前时间

Date currentTime = new Date();

//格式化日期
SimpleDateFormat formatter = new SimpleDateFormat(”yyyyMMddhhmmss”);
String dateString = formatter.format(currentTime);
er.saveTo(”c:/work/name”+dateString+”.xls”);
}catch(Exception e){
e.printStackTrace();
}
%>

<script>
alert(”导出完成。”);
</script>

引自:润乾技术知识库
原文链接:润乾报表:不展现页面,直接将报表组导出excel
相关文章:在润乾参数表单中如何不点击查询按钮自动传参关于润乾报表自定义函数报错的问题决策分析解决方案润乾报表填报处理类问题
其他相关内容:润乾报表 ; RAQSOFT ; 报表工具知识库 ; 商业智能专业知识库

润乾报表填报表组:套表、多表填报

03.10.2009 by hewei - 0 Comment - 0
Posted in 未分类

实际应用润乾报表的填报表业务中,多个输入页面之间往往存在业务联系:比如员工的信息输入,可能包括基本信息输入、教育经历、工作经历、家庭成员等多个输入页面,这些输入页面之间的关联条件就是员工id。 为了方便输入,用户往往提出把多个输入页面摆在一起进行输入,比较方便直观。

乍一听这个功能没有什么难度,可是仔细分析,却发现有不少隐含的需求。

首先,如何保证多张输入表之间的数据库事务的一致性。用户想不到这一点,项目经理和程序员要帮用户想到。否则如上例,当员工基本信息没有保存成功,但是教育经历却给保存成功的时候,数据就会出现不一致了。

其次,表间合法性检查,既然多个表在一个界面上,有些必要的表间合法性检查就躲不过去了,举例来说,员工基本信息表里录入的出生日期为1980年,工作经历表里录入的工作起始日期是1995年,这一看就是非法使用童工,显然不合理。

接着就是打印和导出了,既然摆在了一个页面里,打印和导出就必然要求一起打印一起导出,导出到word\pdf等还好说点,拼在一起就行了,导出 excel就有不同的讲究了,分页方式导出的,一个报表有多页,一页一个sheet,每一页如何命名?不分页导出的,一个报表一个sheet等等。

最后就是参数的共享问题了,这些有着数据联系的报表,往往存在相同或类似的参数,因此,参数模板输入的参数,要求能够传递到每一个报表。

上述的这些,还仅仅是用户的需求,对项目经理和程序员来说,也希望套表能在一个界面上设计,统一定义,而不是分别定义报表模板,又费力写一大堆程序 把它们串起来。因此,我们建议使用润乾报表的填报表组来解决这些问题。润乾报表填报表组提供了简单统一的定义界面,实现了上述的全部功能!

实现步骤

  1. 根据业务需要设计好多个填报表
  2. 新建一个报表组,把多个填报表串起来
  3. 在报表组里定义这些填报表的表间合法性检查、参数等,并在报表组里对这些填报表进行统一的维护

效果演示

设计界面:Sheet1: multi_nput_report.png
设计界面:Sheet2:
multi_nput_report1.png

浏览界面:

multi_nput_report2.png

multi_nput_report3.png