水晶报表隐藏空值字段

来源:互联网 发布:mac 如何装office 免费 编辑:程序博客网 时间:2024/06/05 18:45

前提: VB 2005 + 内置的Crystal Report + SQLServer 2008

今天处理几张报表,一个人可能属于几个公司,在公司里的头衔还不一样,所以在一张表里,放了: org1, org2, org3, org4及title1, title2, title3, title4(其实就不要计较为什么不另外加一个表专门来存放这些公司的信息了,因为是老程序,不可能把结构大改,用户要什么,就给他们加,用最简单的方式加),要在水晶报表里显示所有信息,要求没值的就不显示,不然会占据空间,打印出无用的行来,而且大部分的人,都只属于一家公司,极少部分最多两家公司,然后,再然后,就更少更少,都打印出所有所属公司的标题,又没有内容,一是占地方,二是难看。其实主要难点就是,字段前面还包含 Label,等于是前面的Label也不能显示。

比如:

-------------------------------------------------------------------------------------------

Organisation 1 : XXXXXXXXXXXXXX Title 1 : XXXXXXXXXX

Organisation 2 : XXXXXXXXXXXXXX Title 2 : XXXXXXXXXX

Organisation 3 : XXXXXXXXXXXXXX Title 3 : XXXXXXXXXX

Organisation 4 : XXXXXXXXXXXXXX Title 4 : XXXXXXXXXX

--------------------------------------------------------------------------------------------

因为大部分人都只属于一家公司,这样的显示就比较浪费纸张了:

-------------------------------------------------------------------------------------------

Organisation 1 : XXXXXXXXXXXXXX Title 1 : XXXXXXXXXX

Organisation 2 : Title 2 : 

Organisation 3 :  Title 3 : 

Organisation 4 :  Title 4 : 

--------------------------------------------------------------------------------------------

处理方式主要有几种。

1. 如果每个条信息占一行,就比较容易处理。

    在水晶报表层面,把可能要隐藏的行,毎行做成一个section,和别的内容同级,然后,打开 section expert,选择你要处理的行(即所属的section),在 common页签处,勾上”Suppress(No Drill Down)",然后,再点右边的公式,就是那个有 x-2和一支笔的按钮,把当什么情况时要进行隐藏的条件设置就OK了,一般我用的是basic的语法,不用crystal的语法。

2. 如果信息分左右(左边显示基本的个人信息),右边显示详细信息,这个就有点麻烦。哦,题外话,如果水晶报表要显示的字段信息是长度不固定的,记得要对字段设置“Can grow”。

   其实具体情况具体分析了,象我碰到的这种情况,我是想了个可能也是取巧,也可能是笨的方法,看你怎么看了。因为数据是通过存储过程取数,所以就想了个办法,把结果先在数据库层面进行判断,进行数据的拼接,这样就可以显示有数据的字段。

 2.1 先把原来的结果放入一个临时表中,用“ select * into 临时表 from XXXXXX' 创建临时表

 2.2 ,然后把这几个字段直接打包成一个字段,在水晶报表里直接显示这个字段的内容即可。对临时表的相应字段进行判断,并可以加入Label(题头),排版(主要是用char(13)进行换行,char(9)添加制表符),进行打包,代码示例:

  select @sql = 'select *
  , ISNULL(           ''Position 1 : '' + char(9) + char(9) + Title1,'''')
  + isnull( char(13) + ''Organisation 1 : '' + char(9) + Org1,'''') 
  + isnull( char(13) + ''Position 2 : '' + char(9) + char(9) + Title2,'''') 
  + isnull( char(13) + ''Organisation 2 : '' + char(9) + Org2,'''') 
  + isnull( char(13) + ''Position 3 : '' + char(9) + char(9) + Title3,'''') 
  + isnull( char(13) + ''Organisation 3 : '' + char(9) + Org3,'''') 
  + isnull( char(13) + ''Position 4 : '' + char(9) + char(9) + Title4,'''') 
  + isnull( char(13) + ''Organisation 4 : '' + char(9) + Org4,'''') as Orgs
 from ' + @cTmpTable 
exec sp_executesql @sql 

 

select @sql = ' drop table ' + @cTmpTable 

exec sp_executesql @sql 

0 0