阿泰的软件实用主义

水晶报表/BOE 第3季 Only 2008.5 [万众一心,众志成城]

博客园 首页 新随笔 联系 订阅 管理
  134 Posts :: 9 Stories :: 1534 Comments :: 14 Trackbacks

置顶随笔 #

本帖作为五月份问题、建议收集帖,与本博客相关的内容可参考 http://www.cnblogs.com/babyt/archive/2008/01/20/1046392.html


请不要通过网站短信息或留言方式提问,那样我收不到邮件通知,不能及时回复你的问题。请在本帖中以评论方式提问。

我会集中在每天的某个时段回答问题(一般会在晚上)。
posted @ 2008-05-04 10:16 阿泰 阅读(117) | 评论 (39)编辑

2008年5月17日 #

说明:本文大部分内容来源于MSDN,我主要对内容进行了梳理,并对其中一些细节地方做了描述
本文只在进行功能说明与一些相关产品方面的介绍,并不是所谓的软文,呵呵。

水晶报表本来是CrystalDecisions的产品,之后公司整体被BO(BusinessObjects)收购,而现在SAP已经把BO收购了。
早先Crystal Reports 4.x的时候,曾嵌入到VS中,后来就没有了,自VS.Net后,又重新嵌入。

目前市面上存在的几个版本为:

最新独立版本为CR2008,最新嵌入版本为VS2008中的CR basic for VS2008

Q:什么是热修补程序?
A:BO站点中的热修补程序程序(hotfix),类似于微软的KB补丁,是对某一问题的及时修正。
   这些补丁没有注册的话不会主动推送。

RAS部分在后面再讲

各版本的功能差异为:


重点说一下黄色标注的部分:
跨平台:VS中内嵌的版本自然只支持MS平台, 但是RAS服务器有多种版本,另外还支持Unix,Linux,AIX等平台
集成安全性:RAS可以与windows用户,windows AD用户,LDAP用户集成安全
负载均衡:RAS支持部署在多台服务器,使用CMS进行均衡控制
报表对象储备库:RAS将现有报表对象(比如在CR中可以看到添加到资源库这个项目),资源库其实就是一个RAS自带的一个数据库,将报表对象保存在数据库中,便于重用,迁移等
报表计划(类似于windows的计划任务):RAS支持报表定时执行,也可以按事件执行(如发生了某个事件后再执行报表)。定时执行时可以指定执行的用户、参数、执行时间点,执行前置任务,执行后置任务。执行后的文件可能是标准保存有数据的rpt文件,或者是pdf,excel,另外也可以直接打印到指定打印机
信息传送系统:报表计划执行完成后,可将执行后的文件通过email或ftp等传递到某人或某个位置

通过编程方式创建或修改报表 在后面说

目前最新的CR Basic for VS2008并没有太大的变化

Crystal Reports Basic for Visual Studio 2008 是 Crystal Reports for Visual Studio 2005 的升级版。
此版本中新增了多项功能。
ClickOnce 部署支持 HomeSite 属性,并且现在可用于 x64 位计算机。
Crystal Reports Basic for Visual Studio 2008 支持 Windows Vista 和 Windows Server 2008。
支持 .Net 3.5 Framework。


下面重点说一下RAS



什么是 RAS?

Report Application Server (RAS) 是 Business Objects 的一种技术。RAS既是客户端 SDK,又是服务器。
可以使用 RAS 服务器来创建和修改 Crystal 报表,以及处理页面请求。
当服务器进程检索到请求的报表时,RAS 将把它传递到报表查看器。

RAS 服务器仅作为 Crystal Reports Server 或 BusinessObjects Enterprise 的一部分提供。

托管 RAS

由其它 Enterprise 框架组件管理的 RAS 服务器称为托管 RAS 服务器。
Crystal Reports Server 和 BusinessObjects Enterprise 提供了一个服务器框架,以便于进行全企业范围、基于 Web 的报表管理和分发。
托管 RAS 服务器是这一框架中的几个服务器之一。
它可以处理与 Web 服务器和 RAS SDK 位于相同计算机上的报表,或者处理位于单独报表储备库服务器上的报表。

托管 RAS 服务器可以使用 ReportClientDocument 对象模型InfoObject 对象模型

Crystal Reports Server 和 BusinessObjects Enterprise 均包含托管 RAS 服务器。

非托管 RAS

非托管 RAS 不再作为升级选项提供。

独立于 Enterprise 框架运行的 RAS 服务器称为非托管 RAS 服务器。
非托管 RAS 服务器提供对本地文件系统上或指定网络文件夹中的 Crystal 报表文件的访问。非托管 RAS SDK 和非托管 RAS 服务器可以位于两个不同的计算机上。

非托管 RAS 服务器使用的是 ReportClientDocument 对象模型

之前有些朋友问到的,能不能在运行过程中创建一个报表,或者在报表中新增加字段、字报表的,就是依托RAS实现的。需要单独的授权。

RAS 服务器仅作为 Crystal Reports Server 或 BusinessObjects Enterprise(BOE) 的一部分提供。

另外说一说BOE及其他

BOE是一套完整的报表平台,结合CR,可以实现不用编程,仅需要通过CR制作报表,然后发布到BOE中,能实时通过WEB方式浏览报表
并指定报表计划,且能实现用户组、用户的管理及权限分配,
通过CMS可实现负载均衡以及通过语义层(业务视图或域)实现行集或列的安全控制
等等
大大加快开发进程,当然也价值不菲。
不过对于大用户并发的BS系统,单纯使用CR结合VS.Net或Java 的方式开发,其性能应该远不能满足需要。
此时BOE系统的优势也才能真正显现出来。
现在BOE广泛应用于保险、通讯、石化、银行等大型行业中。

对于小型应用来说,单纯的水晶报表足矣,但是对于一些中式报表,却不如其他一些国产报表工具(比如基于cell 方式的报表工具)灵活。

BO推出的Crystal Xcelsius(简称CX,中文名称水晶易表) 2008,可能这个会更满足一些应用的需要,
该工具借助Flash技术,实现了非常酷炫的效果,支持交互。比CR更灵活多变,且能与CR相互勾连。
当然,CX并不适合大数据量的展现,并不能替代CR ,据说价位也不贵

更多版本信息可以从此处获得:
http://www.china.businessobjects.com/products/crystal/default.asp
水晶易表的实际效果可从此处获得:
http://www.china.businessobjects.com/products/crystalxcelsius/default.asp


posted @ 2008-05-17 16:09 阿泰 阅读(28) | 评论 (0)编辑

2008年5月11日 #

本文为CSDN图表区问题的一个解答模型,却不是最终答案
原来的帖子中已经提出了解决该问题的更好的方法,就是事先在数据库中进行数据修整
本文仅从水晶报表角度来探讨实现方法,可能在其他的地方会用得的到。
(对于数据修整的操作方法,其实在前面的交叉表实现的时候我也曾提到过,尽量在数据库中进行整形)

本问题的相关帖子为:
http://topic.csdn.net/u/20080505/23/69a83cf6-e6f1-4771-abf1-14a089810bac.html
http://topic.csdn.net/u/20080509/20/4c8772d1-3761-46d5-a8f5-126f9abc5273.html

本文的问题是,有这样一个考勤表。

仅有考勤日的数据,但是为了显示上的美观,需要显示该月所有日期,即从1日到月末最后1日
(在这里,我们假设为31日,虽然数据中是2月份,这里仅是个模型,实际操作中,
需根据实际情况对29日、30日、31日三个日期加额外的公式公式,当然这个就比较简单了)。

这样就涉及到一个补行的问题,如果用程序来补行的话,可以直接根据1~31之间的有无来插入
但是对水晶报表来说,如果第一行不是1号,最后一行不是最后1日,那么数据就会被分为3段。
第一段是出现在第一条记录之前的,也就是2月4日之前的。
第二段是出现在第一条和最后一条中间的差异行
第三段是出现在最后一条记录之后的

1:做一个普通的报表,显示这个数据行。
2:拆分详细资料节,在现有数据行的后面增加31个详细资料节,全部抑制显示(31个节,为了对应最大的31日)。
3:在现有数据行前再拆分出8个详细资料皆,抑制显示
(一般来说,每月月头最多有周六、周日两个非工作日,无数据,考虑到国庆节,可能有7个休息日,所以用了8个节,这个根据实际需要可再加几个)

最终的样子是这样的,设计模式下(限于图片大小,后面的几个节抓出来),黄色的段为正常数据显示段


然后我们就要用公式来控制这些节的显示

黄色段前的节公式为(以详细资料节a为例,其余的公式只是将1从上到下一次替换为2~8):
if onfirstrecord then
  day({myData.date1})<=1
else
   true


这个意思是,如果是第一行数据(if onfirstrecord then)则,
判断当前数据行是否<=1(其实也可以写为=1),如果是,则返回true(抑制显示),否则就返回false(不抑制显示)
如果不是第一行数据(else),则直接返回true,抑制显示。

黄色段后的节公式为(以后面第一个节j为例子,其余公式依次替换其中的数据,把所有的数据一次+1)
if OnFirstRecord then
    day ({myData.date1})>1 or day(next ({myData.date1}))<=2
else if onlastrecord then
    //如果是最后一条记录
      day ({myData.date1})>=2
else
day({myData.date1})>=2 or day(next ({myData.date1}))<=2


这句的意思是
如果当前是第一条数据,判断当前数据是否>=1,或者第2条数据<=2
    如果是的话(也就是说,如果该行记录出现在1号后面,或者下一条记录是在2号前面),则抑制显示
如果是最后一条数据,
   如果当前记录是>=2,也就是说如果是在1号之后的,为true,抑制显示
其他的情况,就是夹杂在数据之间的判断当前行和下一行的数据即可

这个公式不复杂,但是逻辑上却比较复杂,需要好好理解。(而且似乎还可以再简化)

最终显示的效果为:


非黄色的区域都是自动补的行,后面的数字是我写的固定公式,不是自动递增的,是每个节上固定的一个公式
这个公式可以根据需要修改显示为需要补的日期。

需要说明的是
1:本文仅为说明水晶报表可以实现类似的效果,但是却并不推荐.详细资料节是嵌套出现的,效率比较低。
水晶报表并不能主动为数据整形,原理可参考<大数据量下水晶报表的实现及显示过程中的进度条显示讨论 >一文中的水晶报表工作模型
所以还是依靠在呈现时进行处理(WhilePrintingRecords)
2:本文所构造的公式虽然实现了现有效果,但是可能还存在缺陷或者能进一步简化。

本文所用到的示例数据库及rpt模板可在此处现在,解压缩密码babyt
/Files/babyt/CR20080511.rar
posted @ 2008-05-11 23:24 阿泰 阅读(45) | 评论 (0)编辑

2008年5月9日 #

infoview 是 BOE 的 Web方式呈现工具,用以浏览报表,执行计划、浏览实例等
界面如下:

infoview支持IE5.5/IE6/IE7/FF2.x/
但是在实际使用时,可能会遇到以下问题:
一:无法打印和导出

infoview在执行导出或打印操作时,需要弹出一个窗口
使用IE7、Maxthon(遨游)、TheWorld(世界之窗)或者安装了其他的IE保护工具时
可能因为阻止弹出窗口导致该窗口无法弹出,所以无法进行后续操作
可以将该网址或IP加入网站信任名单或白名单,在弹出窗口处排除该域名或IP即可
二:导出报表时出错
报表能导出,但是无法正常打开。如导出xls后,打开xls文件时提示

使用Ultraedit打开该文件,发现如下代码
<link rel="stylesheet" type="text/css" href="http://www.cnblogs.com/http://www.cnblogs.com/viewers/crystalreportviewers115/css/exception.css">
<table class="crExceptionBorder" width="100%" cellspacing=1 cellpadding=0 border=0>
<tr><td class="crExceptionHeader">Error</td></tr>
<tr>
    
<td>
        
<table width="100%" border=0 cellpadding=5 cellspacing=0>
            
<tr>
                
<TD class="crExceptionElement">
                    
<table border=0 cellpadding=5 cellspacing=0>
                        
<tr><td><span class="crExceptionText">文件 (你的报表文件名称) 内出错:
未知数据库连接器错误
</span></td></tr>
                    
</table>
                
</td>
            
</tr>
        
</table>
    
</td>
</tr>
</table>

经测试,仅在使用TheWorld和Maxthon时会出现此情况,使用IE和FF则不会,具体原因不明。

三:对于分组的报表,使用infoview显示时,会默认显示组树,占据了一定的显示空间。而一般情况组树是不需要显示的和操作的
可用此方法将其去掉。
报表制作时,在水晶报表中,打开菜单栏里的“文件”--“报表选项”,将里面的“创建组树”的勾点掉即可


posted @ 2008-05-09 15:44 阿泰 阅读(25) | 评论 (0)编辑

2008年5月6日 #


交叉表,顾名思义,就是行和列交叉,用于将行上的数据,作为列指标来呈现。

用一个图直观的说明一下,就是将图1中的数据样式


最终呈现为如图2的效果



实际在使用中,我们可以用两种方式来实现这个效果

一是在数据库端用SQL将数据组织成交叉表,然后对这个数据以普通的报表形式呈现。
在这里,我摘录了网上一篇写的比较直白的文章,请参考此链接。
http://server.chinabyte.com/474/2591974.shtml
根据数据的情况,交叉后的列可能是固定的,也可能是不固定的
要注意写法,还要注意不同的数据库的SQL也是不一样的。如SQL Server和Oracle就有不同。
这里主要是提供个思路。

二是依靠水晶报表来直接实现,我在文章的最后提供了一个操作视频,大家可以看实际的操作步骤。
在这里需要说明一下的是,不是所有的数据,都那么标准,所以需要做一些修正。
水晶报表不仅仅支持从表里取数据,还支持View和SQL命令,存储过程等
所以可以使用View或者SQL命令来实现,在视频的例子中,我就用了这个例子
原始数据是这样的(图3),


为了适用交叉表,将其修正为图1所示。
我做了View来简化后续的操作,对于后续操作来说,使用表和view的效果是一样的。
view脚本为:

select 年份,地区,指标,'最大值' as 数值类别,最大值 as 数值 from test_4
UNION 
select 年份,地区,指标,'最小值' as 数值类别,最小值 as 数值 from test_4;


在视频最后,我对交叉表上的一些设置进行了操作,大家可以参考。如:
如何去除行、列上的合计字段
如何去掉交叉表左上角的缺角等一些基本操作

特别说明一下,要从交叉表导出一张完美的Excel是比较困难的
如果有这种需要,建议使用使用SQL交叉的方式,用一般的报表方式来实现.

请在此处下载操作视频,解压缩密码为:babyt
/Files/babyt/CR20080505.rar
(本视频为http://topic.csdn.net/u/20080505/17/2ff3406c-9240-40ef-b361-1490aa802581.html而作,比一般性的交叉表稍嫌复杂)

posted @ 2008-05-06 00:20 阿泰 阅读(104) | 评论 (3)编辑

2008年5月5日 #

本文转自:http://blog.csdn.net/luby/archive/2005/06/16/395860.aspx,原作者不详



具体步骤:

1, 到http://www.idautomation.com/网站下载字体DEMO和UFL(自定义函数苦)并安装。 字体:http://www.advancemeants.com/downloads/IDAutomation_C39FontAdvantageDEMO.zip UFL:http://www.filesland.com/companies/IDAutomation-com-Inc/download/Barcode-UFL-for-Crystal-Reports.exe

2, 按照帮助示例文件Read Me.html直接操作了。大致就是 建立formula field, 将该字段拖到RPT文件中,设置该字段的字体。

相关资料:
Crystal Decisions的技术文档 http://support.crystaldecisions.com/communityCS/TechnicalPapers/scr_barcodes.pdf
azalea的c39方面的示例: http://www.azalea.com/SampleCode/code39.html
idautomation方面的示例使用的是Code128: http://www.bizfonts.com/crystal/

我首先使用的是azalea的Barcode的UFL,使用的是手工安装。结果折腾半天没有在VS.net自带的Crystal Report的函数库里找到要用的函数,害我都怀疑是不是VS.net自带的Crystal Report不支持UFL。后来使用了idautomation的东西终于看到了Barcode。这两家的字体CR都没有自带,idautomation的DEMO字体正确率只有25%,用他来展示范例是没有问题,但要使用还得付费。明天在和boss讨论吧。

更新 2004-6-28:
由于上面介绍的字体都是需要Money的,DEMO字体只能拿来摆摆样子。这里介绍一个别的方法(不过只能使用Barcode code39)。
1,到 http://www.squaregear.net/fonts/ 下载Free 3 of 9 Barcode Fonts。这里只有code39的字体,安装好该字体。
2,在Crystal Report中添加formula字段,这里取名Barcode。公式 “*“+{Table.BarcodeField}+“*“ ,其实就是将你的barcode首尾都加上一个“*“这是barcode39 要求的。其实Idautomation提供的UFL也就是做了这个事情。
3,将该字段拖入Report,设置它的字体为我们刚下载安装的free3of9
4, 测试一下,看看你的成果吧。

文章中涉及的【Free 3 of 9 Barcode Fonts】可在此下载:/Files/babyt/free3of9.zip
posted @ 2008-05-05 18:46 阿泰 阅读(77) | 评论 (2)编辑