Oracle reports功不可没,实现报表定长输出


  本文标签:Oracle reports

  我们大家都知道在Oracle中实现相关报表的定长输出,首先我们要接触到Oracle reports,它是Oracle的相关的数据统计以及相关图形化报表的使用工具,它的主要功能是提供六种风格的报表格式  。

  而我们通常使用的只有其中的两种,即tabular和matrix,无论用哪种风格生成的报表,打印出的表格数都是动态变化的  。其中tabular风格的报表,列数固定,而行数不定;matrix风格的报表,行数和列数均不定  。那么在Oraclereports中如何Oracle实现报表的定长与定宽输出呢?笔者在实际开发过程中对上述两种风格的报表各总结出一种行之有效的方法,供大家参考  。

  

  一、对于tabular风格的报表,可用报表触发子after parameter form和after report实现定长输出  。

  其方法是:根据实际情况确定每页打印的行数,当最后一页的记录数少于每页打印的行数时,则用空记录补齐  。在触发子after parameter form插入空记录,在触发子after report中再将空记录删除,下面举例说明  。

  假设有一数据基表wzdm:存放物资代码信息,其数据结构为:

  字段名 含义 长度 类型

  wzdm 物资代码 9 c

  

  wzmc 物资名称 20 c

  

  xhgg 型号规格 20 c

  

  jldw 计量单位 6 c

  

  

  要求:按定长输出物资代码表,并且每页均输出x行(x可根据实际情况而定)  。

  

  1.启动Oracle reports,建立物资代码打印报表(略),然后在报表触发子after parameter form中加入以下代码:

  1. declare  
  2. v—jls number(2);  
  3. i number(2):=1;  
  4. begin  
  5. select count() into v—jls from wzdm;  
  6. if mod(v—jls,x)〈〉0 then  
  7. loop  
  8. exit when i〉=(x-mod(v—jls,x))+1;  
  9. insert into wzdm(wzdm,wzmc,xhgg,jldw)  
  10. values(′′,′′,′′,′′);  
  11. ii:=i+1;  
  12. end loop;  
  13. commit;  
  14. end if;  
  15. end;  

  在报表触发子after report中分别加入以下代码: 

  1. begin  
  2. delete from wzdm where wzdm is null;  
  3. commit;  
  4. end;  

  2.运行报表后即可输出定长的物资代码表  。

  说明:对于其它tabular风格的报表,在编写上述两个触发子时只需将基表名与列名根据实际情况修改一下,并确定x的值即可  。

  二、对于matrix风格的报表,可利用视图实现定长与定宽输出,其思路是:当行记录数和列记录少于实际报表的行数和列数时,均以空记录补齐  。

  下面举例说明  。

  假设有一物资资金消耗去向统计月报,该表横向显示本期消耗去向,纵向显示物资类别,由于每月物资消耗去向和消耗物资均不定,所以此类报表即为一矩阵报表  。该报表的数据存放在基表t—zjxhqx中,其数据结构如下:

  字段名 含义 长度 类型

  lbmc 类别名称 20 c

  

  dwmc 单位名称 20 c

  

  je 金额 14,2 n

  

  

  要求:按定长定宽输出物资资金消耗去向统计月报,并且每页均输出x行y列(行数和列数可根据实际情况而定)  。

  

  1.首先建一基表t—kjl,用来存放空记录,其数据结构为:

  字段名 含义 长度 类型

  no 序号 2 n

  

  

  建完该数据表后,再往其中插入记录,记录数可根据实际情况而定,一般为一页所能打印的最大行数,这里假设为z条,即no的值为1,2,3…z  。

  

  2.建视图,其过程如下:

  1. create view v—tjbb as  
  2. select dwmc,lbmc,je from t—zjxhqx  
  3. union  
  4. select dwmc,null,to—number(null) from t—zjxhqx,t—kjl  
  5. where no-(z-x)〉(select mod(count(distinct lbmc)-1,x)+1 from t—zjxhqx)  
  6. union  
  7. select null,lbmc,to—number(null) from t—zjxhqx,t—kjl  
  8. where no-(z-y)〉(select mod(count(distinct dwmc)-1,y)+1 from t—zjxhqx);  

  3. 启动Oracle reports,建立矩阵报表查询时直接引用视图v—tjbb即可  。这样运行时输出的报表每页都是x行y列,即实现了定长和定宽输出  。