Posts Tagged ‘显示值’

巧用空值判断函数nvl()

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

在设计企业报表时,报表单元格的表达式中经常需要用到空值判断,例如在单元格的显示值属性中,判断当单元格的值为空时,显示为0,否则显示单元格的真实值,等等。一般这种情况下,用户习惯写的表达式是: if(value()==null, 0, value())。

如果我们把value()换成更加复杂的表达式,例如if(ds1.select1(…)==null, 0, ds1.select1(…)),大家可以看出,这种算法明显很慢,需要把ds1.select1(…)这样的复杂表达式运算两次,而如果采用nvl()则可以避免这个问题。

单元格函数:nvl()

函数说明:
根据第一个表达式的值是否为空,若为空则返回指定值

语法:
nvl( valueExp1, valueExp2 )

参数说明:
valueExp1–需要计算的表达式,其结果不为空时返回其值
valueExp2–需要计算的表达式,当valueExp1结果为空时返回此值

返回值:
valueExp1或valueExp2的结果值

示例:
例1:nvl(A1,””) 表示当A1为空时,返回空串,否则返回A1

例2:nvl(value(),0) 表示当当前格为空时返回0,否则返回当前格的值

应用举例:

正确写法,速度快 错误写法,速度慢
nvl(ds1.select1(…), 0) if(ds1.select1(…)==null, 0, ds1.select1(…))
nvl(a1[……]{……}, “–”) if(a1[……]{……}==null, “–”, a1[……]{……})

引自:润乾报表知识库
相关文章:一种实现类似excel把负数显示成红色且去掉负号的方法 ; 导入带公式excel的问题web报表的扩展功能;润乾报表出了新版统计图解决行式填报导入excel发生错位的问题

快逸基础设计:日期时间显示格式的两种设置方法

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

在 国内行业的各类报表中日期和时间可以算是最长见的一个数据单位了,几乎所有的报表都可以和时间拉上关系,而且报表浏览者也大都要求报表中有时间日期,这样 才能让报表信息更清晰明了。但是时间和日期在数据库中的存储的方式分门别类,各有不同,不同报表不同的浏览者又有不同展示要求,于是快逸报表丰富的时间日 期显示格式设置就有用武之地了。

今天给大家介绍的就是快逸报表对时间日期格式设定的两种方法:

方法一:属性栏中显示格式中的设置

这种设置是对已经检索出来的时间日期格式进行约束和设置,设置方法如下:

请注意观察下图中”订购日期”中的时间显示方式

7.png

这个时间日期格式是一个没有做任何处理,直接从数据库中取出来的日期时间格式,如果这种格式不是用户想要的形式,比如感觉后面的时间显示多余,日期应该显示年月之类,这个时候就可以用我们的显示格式来实现您的需求了。

设置过程在设计器中进行,编辑状态下点击时间日期的单元格,在右面的属性栏里我们可以看到相应属性信息:
其中的显示格式就是设置我们格式形式的功能区,双击显示格式的”值”属性单元格,如下图所示:

6.JPG

然后根据自己的需求选择其中的日期、时间、日期时间来设定格式,例子中选择的是yyyy年MM月dd日,保存以后可以看到右面的属性栏中显示格式已经有设定内容,效果如下:

3.JPG

再次预览以后就可以看到我们的设定已经生效,可以看到我们想要的结果了。

8.png

注意:有些用户的”时间日期”数据在数据库中是以字符串或者其他类型存储的,而我们的显示格式设定只对日期型数据起作用,这就需要用date函数把数据转换成日期型才可以使用,如=ds1.Select1(date(订购日期))。

方法二:单元格中函数的约束设置

这种设置是在数据还没有检索以前先定义想要取数的类型和格式,下面是具体的函数设置说明

1.year () 在时间日期型数据中单独取出其中的年份。

{month() day() hour() minute() second() 等函数用法基本相同,具体可参看相应函数说明 }

示例:
例1:year(datetime2(”19800227″,”yyyyMMdd”)) 返回:1980

例2:year(”1972-11-08 10:20:30″) 返回:1972

例3:year(dateTime(”2006-01-15 13:20:45″)) 返回:2006

2.now() 取得当前pc机的日期和时间

3.weekbegin() 获得指定日期所在星期的星期天,这里认定星期天为一周的开始

weekend() 获得指定日期所在星期的星期六,这里认定星期六为一周的结束

示例: 例1:weekbegin(datetime2(”19800227″,”yyyyMMdd”)) 返回:1980-02-24 00:00:00

例2:weekend(”1972-11-08 10:20:30″) 返回:1972-11-11 10:20:30

这里只例举出这3例,没有列出的还有很多实用有效的函数,这些就需要大家去发现和探索了,您可以在设计器–表达式编辑–函数说明中查看函数的具体功能。

引自:报表工具知识库
原文链接: 日期时间显示格式的两种设置方法

Jasperreports+ireport不支持显示值,怎么办?

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

数据库结构中常见代码表(或者叫做字典表)的设计方式。比如,下图中的学历字段,在员工表中保存的是代码”1、2、3″等,在学历代码表存放的是代码对应的名称”博士、硕士、学士”等。这就要求报表工具提供一个”代码”到”名称”的转换机制:真实值是代码,显示值是名称。

但是Jasperreports+ireport报表却不支持这种方式,只能在sql中写很复杂的语句。

那么,有没有其他免费的报表工具可以实现这个功能呢?这里,给您推荐一款免费的报表工具--快逸报表,可以轻松的使用类似excel的设计界面,实现复杂的中国式报表!!

快逸报表可以很自由的定义显示值表达式,而显示值仅仅是用来展现,在单元格互相引用的时候,可以引用真实值,也可以引用显示值。

上图中的”性别”字段显示值表达式为:map(list(”1″,”2″),list(” “,” “))

上图中的”学历 “字段表达式为:ds2.select1(name,id==value())

和Jasperreports+ireport这样的开源控件相比,用快逸报表有什么好处呢?

1、同样是免费报表工具,快逸报表是国内厂商的商用产品,适合中国式复杂报表需求。

2、快逸报表采用类似excel的设计风格,从扩展、对齐等角度来说更加易用,为最终用户设计报表创造了条件。

3、快逸报表提供零代码的数据填报表设计功能,在数据展现的同时,很方便的解决数据填报入库的需求。

4、快逸报表具备专业的技术团队,提供免费的中文文档和技术论坛服务。

引自:报表工具知识库
原文链接:Jasperreports+ireport不支持显示值,怎么办?
相关文章:报表工具:开源 or 收费? ; 代码与显示值的匹配 ; 解决快逸报表设计器控制台出现的一个异常;能够实现图形化界面设计的免费Web控件
其他相关内容:报表系统与java;VB报表打印工具软件; 研究BI报表设计;web报表博客

显示值or真实值?——谈谈导出excel的数据显示

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

设计报表的时候往往都有显示值和真实值之分,通常真实值对应的是数据库中的代码,显示值对应的是实际业务术语。然而,excel文件中是没有显示值 和真实值之分的。那么,当把展现出来的报表(以显示值的方式)导出为excel文件的时候,是导出了显示值还是真实值呢?通过测试得知,只有当单元格的真 实值是字符串型时导出的是显示值,其余的情况导出的都是真实值(这大概和excel偏重于计算有关)。

当需要按照显示值导出数据时,就需要在报表中把真实值先转换为字符串型(需要用到单元格的值进行计算时再转回原来的类型),然后再设置其显示值,这样就可以保证导出excel中的数据和web端展现的一致了。

下面举个简单的例子说明:

对于非字符串型的数据,设置了其显示值:

1.png

在web上正常按照显示值的设置展现,导出到excel的却是报表中的真实值:

2.png

将数据的类型转换为字符串型,导出到excel的就是显示值了:

3.png

巧用快逸报表属性中的显示值和独立多数据集

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

设计Web报表时,存储在数据库中的往往是员工D、员工编号、产品序号、简称,而报表展现出来的却需要是员工的姓名和产品的名称。

而且很多时候员工ID和员工姓名不是来自数据库的同一个表,在老式的报表工具中需要程序员写SQL将几个表中的数据字段拼接在一起。这时需要同时对这几个表进行WHERE条件运算,往往运算速度很慢;而且SQL写起来也比较复杂,后期维护困难。

在这种情况下,利用快逸报表的”报表属性”中的”显示值”和”独立多数据集”往往可以轻松的解决问题,而且解决方案非常直观,便于后期的维护和修改。具体应用例子我们来看下面这个张报表,如下图:

快逸报表</p

这是一种常见的订单统计表,报表中统计了不同年份中,各个销售人员完成订单金额的情况,以及各年份的订单金额总和。

这张报表是一张典型的二级分组报表,第一级按年份进行分组,第二级按销售员进行分组,这时问题来了,如果产生数据集ds1的物理表中,只有”雇员ID”,没有雇员的姓氏和名字。那如何得到雇员的全名呢?如下图所示:

数据集ds1</p

图中:A2表达式为:=ds1.Group(year(订购日期),false)+”年”,B2表达式为:=ds1.Group(雇员ID,false),数据集ds1里面没有雇员的姓氏和名字。这时如果不想写SQL语句改数据集ds1来增加雇员的姓氏和名字,有没有更一种简单的方法得到雇员的姓名呢?答案是利用快逸”报表属性”中的”显示值”和”独立多数据集”。如下图所示:

利用快逸报表属性</p

如图中所示:用简单的SQL语句增加一个数据集ds2:SELECT 雇员.雇员ID,雇员.姓氏,雇员.名字 FROM 雇员,然后直接设置B2的显示值为: ds2.select1(姓氏+名字,雇员ID==value()),这样就通过”显示值”表达式把”雇员ID”变成了”姓名”。这也就引出了快逸”独立多数据集的概念”,也就是在报表单元格中不能用多个数据集,但在单元格的”显示值”中却可以使用多个数据集,而且多个数据集可以相互关联。

我们再来看报表的C2和D2单元格的表达式,C2格中为:=ds1.sum(单价*数量),D2格中为:=sum(C2{}),根据快逸分组扩展的概念,C2只求数据本年本雇员的”单价*数量”,所以表达式很简单;而D2则通过更改主格为A1,从而通过sum(C2{})可以直接对本年度分组内C2格扩展出的所有单元格求和,如下图所示:

更改D2左主格,从而通过sum(C2{})可以直接对本年度分组内C2格扩展出的所有单元格求和

这时细心的读者可能会问:最后一列中的”比去年增长金额”如何计算?这个同样是利用”报表属性”中的”显示值”和”独立多数据集”:首先我们将数据集ds1原封不动的复制成数据集ds3:然后在E2里面写表达式:=year(ds1.订购日期)-1,再设置E2的”显示值”为:if(value() in ds3.Group(year(订购日期)), sum(C2{}) - ds3.sum(单价*数量,year(订购日期) == year(ds1.订购日期)-1),”去年为空”)。就能达到目的了,最终结果如第一张图所示。如果仔细观察还会发现用这种方法,还可以做出与上年或者上个月的同期比等报表,至于如何做留给读者自己去思考吧!

读到这里,有的读者可能还是觉得这样实现功能非常复杂,但是这仅仅是快逸报表免费版的功能,在快逸开发版和增强版中有更多高级功能,可以用更简单的方法来做本文的这张报表,包括直接在表达式中使用多个数据集。快逸报表开发版和增强版都提供免费试用,申请地址:http://www.quiee.com.cn/archives/341

快逸报表免费下载地址:http://www.quiee.com.cn/archives/337,推荐试用免费版。

引自:报表工具知识库
原文链接:巧用快逸报表属性中的显示值和独立多数据集
相关文章:Sql语句中的as问题 ; 多源关联分片介绍 ; 报表工具制表能力的探讨;五种主流web报表工具的功能对比模板与数据能否分离
其他相关内容:如何用多源关联设计复杂报表; 免费.NET Web报表工具下载; 探讨Web报表工具;.net报表研究