2009年9月29日

前次,我曾经介绍过可以通过使用JRBeanCollectionDataSource()返回一个JRDataSource,当时javabean 的数据类型都是原始类型,不曾碰到过使用集合类的复合javabean。这次考虑仍然使用javabean 来构造数据源,由于对ireport的datasource的处理机制不是很熟悉,经过很多次尝试后才摸索出一个往子报表插入特定数据源的办法(不是传递父报表的数据源,而是将父报表的一个变量当成数据源传递给子报表!)

DEMO:

准备工作:

一、程序准备:

1、 创建复合javabean :MainVO.java:(getter和setter方法自写)

 

package com.test;

import java.util.List;

public class MainVO {

    private String title;

    private String time;

    private List<SubVO> subList;

}

 

2、 创建子表javabean:SubVO.java(getter和setter方法自写)

 

package com.test;

public class SubVO {

private String name;

 

3、 创建JRAbstractBeanDataSourceProvider:TestSubReport.java

 

package com.test;

public class TestSubReport extends JRAbstractBeanDataSourceProvider {

    public TestSubReport() {

       super(MainVO.class);

    }

    public JRDataSource create(JasperReport arg0) throws JRException {

       /**

       *测试数据,在使用中,不需要继承JRAbstractBeanDataSourceProvider,

       *只需要把集合类封装到JRBeanCollectionDataSource中就可以了

       **/

       List<MainVO> mainList = new ArrayList<MainVO>();

        List<SubVO> list = new ArrayList<SubVO>();

       MainVO vo;

        /**测试数据自写*/

        ……

       return new JRBeanCollectionDataSource(mainList);

    }

 

4、 创建外部测试类:TestMain.java:

 

public static void main(String[] args) {

String filename = "bin/SubReport.jasper";

String outFileName = "bin/Out.html";

/**测试数据mainList自写*/

try {

JasperPrint print = JasperFillManager.fillReport(filename, new HashMap(),new JRBeanCollectionDataSource(mainList));

    JRExporter exporter = new JRHtmlExporter();

     exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,          outFileName);

    exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);

    exporter.exportReport();

       } catch (JRException e) {

           e.printStackTrace();

       }

    }

 

5、 创建Scriptlet:reportScriptlet.java

注意: 如果你从父报表传给子报表的数据源是个集合类型,且不需要任何的数据处理,这步可以省略,但需要注意我在第二部分的第7步骤的提示。

该类是用来进行类型转换的,要想让jasperreports识别数据源就必须把集合类封装到JRDataSource中。由于父报表把数据源传递给子报表是在afterDetailEval()方法之后,因此只需要重写该方法:

 

package com.test;

public class reportScriptlet extends JRAbstractScriptlet {

    /**其余方法省略*/

    @Override

    public void afterDetailEval() throws JRScriptletException {

       System.out.println("afterDetailEval...");

       List subList = (List)getFieldValue("subList");

       JRDataSource jr = new JRBeanCollectionDataSource(subList);

       /**

       *该值是在父报表中定义的一个变量Variables,

       *类型为net.sf.jasperreports.engine.JRDataSource

         *(需要手动填写Class Type)

       **/

         setVariableValue("other", jr);

    }

}

 

     该Scriptlet供父报表使用

二、报表准备

       由于ireport的汉化很不完整,这里就使用英文的界面做demo(有兴趣汉化的,可以编辑位于ireport.jar包的it.businesslogic.ireport.locale下的Ireport_zh_CN.properties)。

1、 创建父报表:SubReport.jrxml,通过菜单栏:Data -->Connections /Datasources -->new选择JRDataSourceProvider定义如图:

利用复合的javabean构造基于jasperreports的子报表(转) - 涸辙之鱼 - 涸辙之鱼

                       Test 成功后(前提是先在ireport的classpath中设置工程编译文件夹路径)save。

2、 设置另一个数据源(给子报表用)在这里我选择了使用Custom JRDataSource

利用复合的javabean构造基于jasperreports的子报表(转) - 涸辙之鱼 - 涸辙之鱼

                    使用Custom JRDataSource这里我必须在项目中编写一个额外的类用于测试:

         

 

package com.test;

public class CRDSFactory{

    public static JRDataSource createDatasource(){

    List<SubVO> list = new ArrayList<SubVO> ();

    /**测试数据自写*/

        ……

    return new JRBeanCollectionDataSource(list);

    }

}

 

                     Test 成功后 save。

3、 注册字段Fileld

利用菜单中的Data --> Report Query -->DataSource Provider 获取字段,然后全选获取到的字段点击确认注册。

利用复合的javabean构造基于jasperreports的子报表(转) - 涸辙之鱼 - 涸辙之鱼

     

4、 添加变量Variables

该变量用途是作为父报表传递给子报表的数据源,所以类型为JRDataSource

                    如图:

利用复合的javabean构造基于jasperreports的子报表(转) - 涸辙之鱼 - 涸辙之鱼

5、 创建子报表: SubReport_subreport0.jrxml,(名字由系统生成) 点击工具栏中的”SubReport”图标,并确定好子报表的位置,利用系统的wizard一步一步设置,注意在第2步设置”Connection/Datasource ”时最好选择”no connection or datasource”,因为我们的datasource是父报表中的一个变量)

6、 将ireport的Files视窗的其他报表文件关闭(大概需要这样,前几次因为没关闭出了点问题,不清楚什么原因)如果看不到Files视窗,可以通过菜单的View --> Docking panes -->Files 回显。单独选择刚才为该子报表而设置的数据源“custds”,通过刚才的Report Query -->JavaBean Data Source读取子报表相关的javabean属性。选择后点ok将其注册到Fields中。如图:

利用复合的javabean构造基于jasperreports的子报表(转) - 涸辙之鱼 - 涸辙之鱼

7、 打开父报表,在设计窗口的子报表上右键,选择Properties -->SubReport,设置由父报表传递给子报表的数据源:

         

利用复合的javabean构造基于jasperreports的子报表(转) - 涸辙之鱼 - 涸辙之鱼

                  提示:如果你略过了第一部分的第5步,这里的“ $V{other} ”要改成“ new  net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($V{other})”

8、 依次编译(使用动态连接)子报表、父报表(注意数据源的对应关系),如果能通过父报表看到子报表的内容被填充,则说明测试成功了!如果不成功,检查刚才设置是否有遗漏的地方,最好重新创建子报表,有时并不是我们设置问题,ireport目前还不是很稳定,在编译和保存数据时很容易出错,有时连子报表都不认-_-!!

9、

                   效果图:(没有修饰,确实很难看…)

          

利用复合的javabean构造基于jasperreports的子报表(转) - 涸辙之鱼 - 涸辙之鱼

                 注意事项:

?        熟悉jaspereports的以手动编辑代码为主, ireport为辅,使用ireport时有时也必须手动编辑jasperreport,特别是在编译出错的时候。

?       不能把父报表的一个变量同时传递给多个子报表,不然可能只能显示一个或什么都不显示,如果需要这么做,请定义多个变量。

?      子报表的添加不要用旧报表,即使你的旧报表是刚才使用的子报表。

?      如果子报表还要嵌套子报表的话,可以通过为子报表编写一个Scriptlet实现。

                                    不过要清楚的是子报表有可能不执行afterDetailEval()和beforeDetailEval()(比如使用jdbc连 接,这也许跟子报表的数据源选择有关),最好先测试,具体原因希望达人告知!

?     在使用ireport进行开发时,当修改了某个类时,就需要重启ireport才能看到修改的效果,即使是使用ireport的Scriptlet编辑器也一样。

?     不是越高版本越好用,主要是缺少使用文档,连javadoc

posted @ 2009-09-29 09:01 caihaibo 阅读(1412) | 评论 (0)编辑 收藏
  2009年8月18日
查看被锁的表

select   p.spid,a.serial#, c.object_name,b.session_id,b.oracle_username,b.os_user_name   from   v$process   p,v$session   a,   v$locked_object   b,all_objects   c   where   p.addr=a.paddr   and   a.process=b.process   and   c.object_id=b.object_id  




查看连接的进程

SELECT sid, serial#, username, osuser FROM v$session;




杀掉进程

alter   system     kill   session   'sid,serial#';
posted @ 2009-08-18 15:22 caihaibo 阅读(242) | 评论 (0)编辑 收藏
  2009年8月17日
修改bin下的catalina.bat中的java_home
posted @ 2009-08-17 14:26 caihaibo 阅读(203) | 评论 (0)编辑 收藏
  2009年8月3日

 

严重: IOException while loading persisted sessions: java.io.EOFException

java.io.EOFException

at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2281)

at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2750)

at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780)

at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)

at org.apache.catalina.util.CustomObjectInputStream.<init>(CustomObjectInputStream.java:58)

at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:362)

at org.apache.catalina.session.StandardManager.load(StandardManager.java:321)

at org.apache.catalina.session.StandardManager.start(StandardManager.java:637)

at org.apache.catalina.core.ContainerBase.setManager(ContainerBase.java:438)

at org.apache.catalina.core.StandardContext.start(StandardContext.java:4271)

at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)

at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)

at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)

at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:926)

at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:889)

at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)

at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)

at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)

at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)

at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)

at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)

at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)

at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)

at org.apache.catalina.core.StandardService.start(StandardService.java:516)

at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)

at org.apache.catalina.startup.Catalina.start(Catalina.java:578)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)

at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)

2008-10-21 15:18:18 org.apache.catalina.session.StandardManager start

严重: Exception loading sessions from persistent storage

java.io.EOFException

at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2281)

at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2750)

at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780)

at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)

at org.apache.catalina.util.CustomObjectInputStream.<init>(CustomObjectInputStream.java:58)

at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:362)

at org.apache.catalina.session.StandardManager.load(StandardManager.java:321)

at org.apache.catalina.session.StandardManager.start(StandardManager.java:637)

at org.apache.catalina.core.ContainerBase.setManager(ContainerBase.java:438)

at org.apache.catalina.core.StandardContext.start(StandardContext.java:4271)

at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)

at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)

at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)

at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:926)

at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:889)

at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)

at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)

at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)

at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)

at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)

at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)

at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)

at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)

at org.apache.catalina.core.StandardService.start(StandardService.java:516)

at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)

at org.apache.catalina.startup.Catalina.start(Catalina.java:578)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)

at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)

==================================================================================

出现原因:tomcat对保存硬盘的session读取失败

解决方法:打开TOMCAT的安装目录,在WORK文件夹找到当前项目文件夹,把里面的session.ser删除即可。

posted @ 2009-08-03 09:25 caihaibo 阅读(361) | 评论 (0)编辑 收藏
  2009年7月31日
Preferences->General -> Editors -> Text Editors
posted @ 2009-07-31 09:50 caihaibo 阅读(644) | 评论 (0)编辑 收藏
internet选项——常规——设置——Internet·临时文件 (检查网页的较新版本)选中每次访问网页时
posted @ 2009-07-31 09:44 caihaibo 阅读(417) | 评论 (0)编辑 收藏
  2008年12月11日

10g 10.2.1.0 

select * from dba_roles;

CONNECT                                                               创建session角色
RESOURCE                                                            创建资源角色,Create table 等等
DBA                                                                           数据库管理员角色
SELECT_CATALOG_ROLE                                 查看数据字典角色
EXECUTE_CATALOG_ROLE                              执行数据字典中部分函数的角色
DELETE_CATALOG_ROLE                                 删除sys.adu$记录的角色
EXP_FULL_DATABASE                                        全库导出角色
IMP_FULL_DATABASE                                         全库导入角色
RECOVERY_CATALOG_OWNER                      备份目录的拥有者 RMAN使用    
GATHER_SYSTEM_STATISTICS      
LOGSTDBY_ADMINISTRATOR         
AQ_ADMINISTRATOR_ROLE                             高级队列管理员角色
AQ_USER_ROLE                                                  高级队列使用者角色
GLOBAL_AQ_USER_ROLE              
SCHEDULER_ADMIN                                           调度管理者角色
HS_ADMIN_ROLE                                
AUTHENTICATEDUSER                    
OEM_ADVISOR                                    
OEM_MONITOR                                   
WM_ADMIN_ROLE                               
JAVAUSERPRIV                                   
JAVAIDPRIV                    
JAVASYSPRIV                   
JAVADEBUGPRIV                 
EJBCLIENT                     
JAVA_ADMIN                    
JAVA_DEPLOY                   
CTXAPP                        
XDBADMIN                      
XDBWEBSERVICES               
OLAP_DBA                      
OLAP_USER                     
MGMT_USER                     

 

posted @ 2008-12-11 16:12 caihaibo 阅读(1632) | 评论 (0)编辑 收藏
  2008年12月9日

Mysql
************************************
当前列  ClassName    ColumnType  DisplaySize  TypeName
0:
  java.lang.Integer  ColumnType:4  11  INTEGER
1:
  java.lang.Integer  ColumnType:-6  4  TINYINT
2:
  java.lang.String  ColumnType:12  0  UNKNOWN
3:
  java.lang.Boolean  ColumnType:-7  1  TINYINT
4:
  java.lang.Integer  ColumnType:5  6  SMALLINT
5:
  java.lang.Integer  ColumnType:4  9  MEDIUMINT
6:
  java.lang.Integer  ColumnType:4  11  INTEGER
7:
  java.lang.Long    ColumnType:-5  20  BIGINT
8:
  java.lang.Double  ColumnType:8  22  DOUBLE
9:
  java.lang.Double  ColumnType:8  22  DOUBLE
10:
  java.lang.Float    ColumnType:7  12  FLOAT
11:
  java.lang.String  ColumnType:12  11  UNKNOWN
12:
  java.lang.String  ColumnType:12  11  UNKNOWN
13:
  java.lang.String  ColumnType:1  300  CHAR
14:
  java.lang.String  ColumnType:12  300  VARCHAR
15:
  java.sql.Date    ColumnType:91  10  DATE
16:
  java.sql.Time    ColumnType:92  8  TIME
17:
  java.sql.Date    ColumnType:91  4  YEAR
18:
  java.sql.Timestamp  ColumnType:93  19  TIMESTAMP
19:
  java.sql.Timestamp  ColumnType:93  19  DATETIME
20:
  [B      ColumnType:-3  255  TINYBLOB
21:
  [B      ColumnType:-4  65535  BLOB
22:
  [B      ColumnType:-4  16777215  MEDIUMBLOB
23:
  [B      ColumnType:-4  -1  BLOB
24:
  java.lang.String  ColumnType:12  255  TINYBLOB
25:
  java.lang.String  ColumnType:-1  65535  TEXT
26:
  java.lang.String  ColumnType:-1  16777215  MEDIUMBLOB
27:
  java.lang.String  ColumnType:-1  -1  TEXT
28:
  java.lang.String  ColumnType:1  3  CHAR
29:
  java.lang.String  ColumnType:1  3  CHAR

posted @ 2008-12-09 18:57 caihaibo 阅读(365) | 评论 (0)编辑 收藏
mysql安装出现cannot start the service 错误 有可能是因为以前安装的文件夹还存在,删除以前安装的文件夹,再安装ok
posted @ 2008-12-09 18:53 caihaibo 阅读(2031) | 评论 (0)编辑 收藏
  2008年12月4日
你的系统是否最近出现过下图所示的情况呢?


=800) window.open('http://www.91kb.cn/attachment/Mon_0811/7_3836_d3527d6e31ec185.jpg');" src="http://www.91kb.cn/attachment/Mon_0811/7_3836_d3527d6e31ec185.jpg" onload="if(this.width>'800')this.width='800';" border=0>

=800) window.open('http://www.91kb.cn/attachment/Mon_0811/7_3836_b04e7433c85c56a.jpg');" src="http://www.91kb.cn/attachment/Mon_0811/7_3836_b04e7433c85c56a.jpg" onload="if(this.width>'800')this.width='800';" border=0>

杀毒查不出来,系统还原,重装系统均无效,什么原因?原来罪魁祸首是因为系统漏洞所致.
1024日,微软系统爆出2008年最大的安全漏洞(MS08-067),影响包括Windows XP SP3Windows 2000Windows Server 2003Windows Vista等几乎所有主流操作系统。黑客可以利用此漏洞发动大规模远程攻击,实际效果可与“冲击波”、“震荡波”等病毒类似。
本人前两天也深受其害,不能上网,后来打上这个补丁后解决问题.现将解决方法公布如下:
1.去微软下载MS08-067的安全更新,地址:http://www.microsoft.com/downloads/details.aspx?familyid=0D5F9B6E-9265-44B9-A376-2067B73D6A03&displaylang=zh-cn (:盗版软件也可以下,不会受微软黑屏影响,本人电脑就是用此方法解决好的)


  2.利用第三方软件,如瑞星卡卡,360安全卫士,QQ医生等下载系统漏洞补丁.只用下载MS08-067的即可.
posted @ 2008-12-04 21:13 caihaibo 阅读(688) | 评论 (0)编辑 收藏
仅列出标题  下一页