阿泰的软件实用主义

水晶报表/BOE

博客园 首页 新随笔 联系 订阅 管理
  155 Posts :: 9 Stories :: 1837 Comments :: 37 Trackbacks
本帖作为三月份&四月份问题、建议收集帖,与本博客相关的内容可参考 http://www.cnblogs.com/babyt/archive/2008/01/20/1046392.html

到四月中旬,报表的支持工作可能会告一段落,之前我将收集整理尽可能多的资料

也欢迎大家提供开发经验及一些好的网址、文章,谢谢~~

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

因项目开始逐渐进入忙碌阶段,自4月7日开始,站点的回复频率将有所下降,会集中在每天的某个时段回答问题(一般会在晚上)。
posted on 2008-03-18 22:15 阿泰 阅读(395) 评论(42)  编辑 收藏 所属分类: A_Blog通告

Feedback

#1楼  2008-03-20 14:14 hw169 [未注册用户]
vs2005自带的水晶报表(web打印)printmode=activex,在开发环境下运行没有问题,发布到IIs后点工具栏的打印按钮出现一个小窗口,IE提示拦截到弹出窗口,启用activex后窗体一闪就消失,不能出现选择机的窗口???这个该怎么解决呢,望高手回复
  回复  引用    

#2楼 [楼主] 2008-03-20 14:23 阿泰      
@hw169

activex 模式需要下载一个printcontrol.cab安装到客户端上,开发环境没问题是因为你安装CR或 VS的时候就已经装上了。

不过理论上讲不会出现这个问题,
问一下出现这个症状的电脑是不是处于内网中,不能连接外网?
  回复  引用  查看    

#3楼  2008-03-21 10:49 hw169 [未注册用户]
我已经把printcontrol.cab下载到主机,内网有机器能下载下来,有的不能,而且本机(虚拟机,winxp)打开也是不能正常下载.web.config 如下
<configuration>
<configSections>
<sectionGroup name="businessObjects">
<sectionGroup name="crystalReports">
<section name="printControl" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null" />
</sectionGroup>
</sectionGroup>
</configSections>

<businessObjects>
<crystalReports>
<printControl>
<add key="url" value="http://localhost/rpt/PrintControl.cab" />
</printControl>
</crystalReports>
</businessObjects>

<appSettings>
<add key="CrystalImageCleaner-AutoStart" value="true" />
<add key="CrystalImageCleaner-Sleep" value="60000" />
<add key="CrystalImageCleaner-Age" value="120000" />
</appSettings>
<connectionStrings>
  回复  引用    

#4楼 [楼主] 2008-03-24 16:29 阿泰      
@hw169

有的能,有的不能,那应该是客户端上设置的问题
比如说用了IE7,或者安装了其他的类似与网页防火墙之类的东西
阻止了控件包的自动下载

最好比较一下能下和不能下的机器的设置差异
还有就是对于这种情况,可以作为一种故障的解决方法,做一次本地安装,呵呵


  回复  引用  查看    

#5楼  2008-03-26 10:47 hw169 [未注册用户]
谢谢,在vs2005开发环境中,上面的webconfig文件会提示
未能找到元素“crystalReports”的架构信息。
未能找到元素“printControl”的架构信息。………………
这个怎么回事,怎么解决呢???
  回复  引用    

#6楼 [楼主] 2008-03-26 11:22 阿泰      
@hw169

将对应的段更改为:

<configuration>
<configSections>
<sectionGroup name="businessObjects">
<sectionGroup name="crystalReportsForVS2005">
<section name="printControl" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null" />
</sectionGroup>
</sectionGroup>
</configSections>

<businessObjects>
<crystalReportsForVS2005>
<printControl>
<add key="url" value="http://localhost/rpt/PrintControl.cab" />
</printControl>
</crystalReportsForVS2005>
</businessObjects>

无论成功与否,请反馈一下,谢谢。
  回复  引用  查看    

#7楼  2008-03-27 09:48 hw169 [未注册用户]
消息 1 未能找到元素“businessObjects”的架构信息。 E:\Web\safety\Web.Config 18 4 E:\Web\safety\
消息 2 未能找到元素“crystalReportsForVS2005”的架构信息。 E:\Web\safety\Web.Config 19 6 E:\Web\safety\
还是有这样的提示,是不是没有办法,上网也看了好多帖子,也没有发现解决方法,郁闷ing.
  回复  引用    

#8楼  2008-03-27 14:09 ma_xiaoyun [未注册用户]
阿泰,看了一部分你的博客,非常感谢你的知识共享。
初次接触报表,我遇到的问题是:在VB.net中,能否用纯代码创建Crystal Report? 我查了很多资料都是用VS.net自带的CrystalReportsApplication去生成,并且要使用它的向导,创建一个空的报表,再在代码中动态对报表填充数据。
我做的程序是一个windows service程序,在这个服务中需要定时产生一些报表,而所产生的报表的数量和显示的列都是动态的,是按照用户配置从配置表中读取出来的。
请帮忙指点一二,谢谢。
  回复  引用    

#9楼 [楼主] 2008-03-27 14:33 阿泰      
@hw169

我目前用的是2008,所以测不出来,晚上我换台2005的机器看看~~

  回复  引用  查看    

#10楼 [楼主] 2008-03-27 14:41 阿泰      
@ma_xiaoyun

Crystal Reports 确实支持纯代码创建,但是VS自带的这个版本不支持
需要购买高级开发版许可
这个版本我一直没有遇到,所以实际的纯代码创建功能一直未能实现

不过可以有另外一种方式来替代,你可以参考一下
http://www.cnblogs.com/babyt/archive/2005/04/21/142309.html
这篇的思路

对于水晶报表与webservice,可以看一下
http://www.cnblogs.com/babyt/archive/2005/04/07/133399.html
http://www.cnblogs.com/babyt/archive/2005/04/13/136496.html

但是对于不定列的情况,不是很推荐用水晶报表,不够灵活
如果只是为了显示数据(类Excel的规则显示)和打印的话,建议使用Grid去实现
  回复  引用  查看    

阿泰哥,我是个菜鸟,有一个问题我找了好久都没找到办法,我想这个应该是很普遍的问题,但是我找不到资料,请赐教!
我用vb6建立了一个查询界面,用datagrid将查询到的记录显示出来,然后想用水晶报表将查询到的结果打印.因为查询的条件和方式多种多样,无法用传递参数的方法将报表的记录选择公式与datagrid的recordset查询语句保持一致.除了将查询出来的结果存入一个临时表作为报表的数据源外(因为数据量大的话速度会很慢吧),有没有更好的办法使报表即时显示出datagrid的内容?
  回复  引用    

#12楼 [楼主] 2008-03-30 01:12 阿泰      
@没有名字

你的情况完全可以使用此方案实现(如果只是组合查询条件复杂,而数据列固定的话)
http://www.cnblogs.com/babyt/archive/2005/03/11/116878.html
http://www.cnblogs.com/babyt/archive/2005/03/11/116880.html

对于大数据量,无论用什么实现方式,水晶报表的加载效率都不高,呵呵。

  回复  引用  查看    

阿泰哥,非常感谢你及时的回复了我的问题,不过以我的水平只会傻瓜式的操作,而且也被我问到了这个方法:
在设置报表源后加上这句即可:
objcrreport.Database.SetDataSource frmyanshou.Adodc1.Recordset
说明:frmyanshou是datagrid所在窗口,adodc1是datagrid的数据源,已在vb6+水晶上通过,希望各位同学以后不要再走弯路.


  回复  引用    

#14楼  2008-03-31 10:16 brx [未注册用户]
阿泰,我想在程序运行过程中动态的在主报表中加入不同的子报表,能否指点一下?
  回复  引用    

#15楼 [楼主] 2008-03-31 10:45 阿泰      
@没有名字

呵呵,其实我给你的第2篇文章里也有这句啊,这是必须的~~
  回复  引用  查看    

#16楼 [楼主] 2008-03-31 10:47 阿泰      
@brx

动态有两种,一种是在程序中,一种是纯报表中实现
但是一般情况下我们都只能用第2种方法
请仔细描述下需求,要达到什么程度的“动态”方法

  回复  引用  查看    

阿泰哥,我看了那个例子好久,也发现了那一句,可是把那个rst研究了好久也没发现原来这个rst可以直接等于adodc1.recordset的,见笑了,呵呵

  回复  引用    

#18楼  2008-04-02 10:31 brx [未注册用户]
@阿泰
谢谢阿泰!
比如一张主报表设计时有5张不同的子报表,在程序运行中根据条件有些子报表是没有数据显示的,像这样的子报表就需要隐藏或者动态的从主报表删除,不让他显示.
另外一种情况是:一张主报表设计时有5张不同的子报表,然后有第6张子报表在设计时已经设计好了,只不过没有加入主报表,,然后在运行过程中需要加入第6张子报表.

  回复  引用    

#19楼  2008-04-03 11:12 oggg [未注册用户]
@阿泰
请问怎么在java下使用水晶报表呢?我使用的Myeclipse6.0+Tomcat5.0。在BO提供的JSP页面示范里,把CR目录下的所有.jar文件包含进入工程,import的东西找不到。我已经装过CR10,是还需要其它的安装包吗?
谢谢
  回复  引用    

#20楼 [楼主] 2008-04-05 00:41 阿泰      
@oggg

不好意思,我对java方面,知之甚少
  回复  引用  查看    

#21楼 [楼主] 2008-04-05 00:48 阿泰      
@brx

第一种情况,子报表本身就可以实现,比如设置count(子报表的某个字段)=0时抑制子报表的显示
第二种情况,似乎不行(这种方式只能通过代码实现,但是应该使用高级开发版,没用过,呵呵),但是第2种情况应该可以使用第一种情况的方式来实现的吧?
  回复  引用  查看    

阿泰哥,我又有问题了,是关于vb6的
我窗口上有个datacombobo,后面跟一个checkbox,我想datacombo选择之后,代码控制checkbox被选中,然后执行一次查询;而每次点击checkbox也执行一次查询.
代码如下:
Private Sub DataCombo1_Change()
Check1.Value = 1
chaxun
End Sub
Private Sub Check1_Click()
chaxun
End Sub
现在问题是,当chek1没被选中时,每次选择datacombo1都会执行2次查询,好象是check1.value这句激活了check1_click事件,请问有什么办法可以避免这样的情况?
  回复  引用    

更恐怖的是,我一个窗口上有4个checkbox,一个"全部"按钮,当按全部按钮的时候,代码控制4个checkbox为不被选择并执行一次查询,当4个都为被选择状态时按"全部",则执行5次查询,我的天啊,请救命!
  回复  引用    

#24楼 [楼主] 2008-04-05 11:10 阿泰      
@没有名字

我觉得你可以做一个全局变量来控制一下


Private iState as integer

Private Sub DataCombo1_Change()
iState =0
Check1.Value = 1
chaxun
End Sub
Private Sub Check1_Click()
if iState =1 then chaxun
End Sub


  回复  引用  查看    

阿泰哥真棒,更棒的是象阿泰哥这么厉害的大侠可以不厌其烦的回答菜鸟的问题,我照你的方法解决了,太谢谢阿泰了!
  回复  引用    

#26楼  2008-04-05 21:50 brx [未注册用户]
@阿泰
谢谢阿泰,我试试.阿泰哥真是热心好人!

  回复  引用    

#27楼  2008-04-09 11:34 hw169 [未注册用户]
泰哥,我的那个报表的问题是不是解决不了了呀,我还在郁闷呢
  回复  引用    

#28楼  2008-04-09 11:35 hw169 [未注册用户]
泰哥,我的那个报表的问题是不是解决不了了呀,我还在郁闷呢
  回复  引用    

#29楼 [楼主] 2008-04-09 11:43 阿泰      
@hw169

是“未能找到元素“businessObjects”的架构信息”这个问题吗?
你把程序打包给我看下吧,我在 VS2005 、VS2008下都没出现过这个问题。。
babyt#163.com

  回复  引用  查看    

#30楼  2008-04-14 14:30 kathyowen [未注册用户]
@阿泰
我有下面一些问题,困扰我很久了,麻烦你帮我解答解塔。
我的开发环境是vs2005自带的水晶报表,c/s架构
1 在系统每次单击开发的报表,就会刷新,能不能把这个刷新去掉?
2 点击组字段时,会有一个小手,能不能把这个小手去掉?
3 做交叉表时,交叉表中的列的宽度可不可以随内容的变化而动态变化,设置cangrow属性为true,运行后又会变为false,且设计是右击字段,格式化,公用标签中的“可以扩大”是灰色的。这个问题有没有办法解决?
4 能否在程序中控制图表的样式?比如饼形图还是柱形图?控制标签怎么显示?控制图例怎么显示?
麻烦你了,这些问题我在网上找了好久,没有找到解决的办法。
  回复  引用    

#31楼  2008-04-15 09:14 hw169 [未注册用户]
泰哥,程序已发送到你的信箱,帮忙看一下,webconfig提示“未能找到元素“businessObjects”的架构信息”
  回复  引用    

阿泰哥,好久不见,我又来了,请帮我看一下这个代码,adodc1打开的表"部门"中设成不能出现重复的记录,并用datagrid1将表内容显示出来.问题是以下代码可以忽略adodc1不能向表"部门"中写入重复记录的错误,datagrid1却自动增加了一个重复的记录,而且自动update的时候,错误提示不能写入重复的记录.请问如何忽略这个datagrid自动update出错的问题?
Private Sub Command1_Click()
On Error Resume Next
str = InputBox("输入部门名称")
If str <> Empty Then
Adodc1.Recordset.AddNew
Adodc1.Recordset.Fields("部门") = str
Adodc1.Recordset.Update
cnn.Open "Provider=MSDASQL.1;Persist Security Info=False;Extended Properties=" & "DSN=wuzi;DBQ=d:\ckgl\cangku.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;UID=admin;"""
cnn.Execute "create table " & str & " ( 领用人 text(10))"
cnn.Close
End If
End Sub
  回复  引用    

#33楼  2008-04-17 08:59 lisy7421 [未注册用户]
泰哥,请问如何获得报表查看器CrystalReportViewer中的报表源.rpt中具体对象的值,比如.rpt的页脚有一个合计的对象SumofSSZF1,如何获得值 .

我在在报表中增加的文本框(文本框中设了一个函数)中能够显示值,但获取的值却是{@test}。test是我加的公式字段。

  回复  引用    

#34楼  2008-04-19 10:54 dingjie [未注册用户]
阿泰你好:
我的软件打包后提示
"CrystalDecisions.CrystalReports.Engine.ReportDocument" 错误
如何解决,软件异常后随即关闭,急。谢谢
  回复  引用    

#35楼  2008-04-21 09:50 mhw [未注册用户]
阿泰
你好!我是水晶报表的新手,有一个问题困扰我很久了.麻烦你有时间帮我解决一下.我用三层结构写了个程序,在客户端写报表时出现预览正常,打印或导出时提示要登陆数据库." 您请求的报表需要更多信息.".代码大概是这样.
DataSet ds = new DataSet();
var dd = new ServiceReference1.Service1SoapClient();
ds = dd.Getbm(); 获取层数据
var reportPath = Server.MapPath("Report1.rpt");
ReportDocument newport = new ReportDocument();
newport.Load(reportPath);
newport.SetDataSource(ds.Tables[0]);
CrystalReportViewer1.DataBind();
CrystalReportViewer1.ReportSource = newport;
CrystalReportViewer1.DataBind(); //特别这条语句,如果不用,预览正常.打印或导出出错.如果用了.连预览提示要数据库登陆信息.
CrystalReportViewer1.Visible = true;
CrystalReportViewer1.RefreshReport();
麻烦帮我看看.谢谢了.
  回复  引用    

#36楼  2008-04-22 15:38 kathyowen [未注册用户]
@mhw
第一个 CrystalReportViewer1.DataBind(); 就可以不用啊,第二个也可以不用,其他地方好象就没有问题了。
  回复  引用    

#37楼  2008-04-25 15:46 CHYYY [未注册用户]
阿泰你好,我现在是用VS2003自带的水晶报表
我是在WINFORM下调用WEB页面上的水晶报表
导出PDF有时候成功,有时候失败。没什么错误提示
就是文件导不出来,郁闷!
  回复  引用    

#38楼  2008-04-28 02:00 凌风      
@阿泰
大侠,我在点击打印的时候,出现一个打印对话框,但是是一个空白页,在上面有一个小原点,是不是该打印控件没有下载下来呢?该怎么下载呢?在哪里有下载的呢,我看该页面的html代码链接到官方网站上去了,但是这个控件下载不了。
我用的是Vs2008.

希望你们可以看到。

  回复  引用  查看    

#39楼 [楼主] 2008-04-28 10:05 阿泰      
@凌风

使用activex打印的时候,需要下载一个cab控件包,默认是从BO的网站上下载的。有时候在内网应用或者网速较慢的情况下,就会出现该情况。
可以将其设置为从本地服务器上加载,在web.config中加入如下节

<configuration>
<configSections>
<sectionGroup name="businessObjects">
<sectionGroup name="crystalReports">
<section name="printControl" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null" />
</sectionGroup>
</sectionGroup>
</configSections>

<businessObjects>
<crystalReports>
<printControl>
<add key="url" value="http://localhost/rpt/PrintControl.cab" />
</printControl>
</crystalReports>
</businessObjects>

将PrintControl.cab放到相应的web位置,主要修改路径
PrintControl.cab在本地的位置为(可能会有些许不同,对应着查找一下)
c:\Program Files\Business Objects\Common\3.5\crystalreportviewers115\PrintControl.cab

  回复  引用  查看    

#40楼  2008-04-28 12:20 凌风      
@阿泰
非常感谢你。
又遇到问题了。
我打包后部署在服务器上了。
但是在预览时出错了。我也把必备文件,还有也安装了【C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\CrystalReports10_5.CRRedist2008_x86.msi】并且System.Web.Extensions <add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>也Copy在bin目录中了,但是我不知道为什么这里提示的是Version=2.0.0.0

错误信息:
未能加载文件或程序集“System.Web.Extensions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)

  回复  引用  查看    

在crystal report中我们可以使用代码
报表.DataDefinition.FormulaFields["未绑定字段"].Text = "{表名.字段名}" 对字段进行绑定

我想问一下如果"{表名.字段名}"中的字段名是通过SQL语句重新生成的,语句该怎么写?
我的SQL语句是这样的: Dim querystring As String = "SELECT [CollectionDateTime] as 日期" & _
",[1001] as 污水浓度" & _
",[1003] as 污染物排放量" & _
",[1007] as 污水流量 FROM BaseDayData " & _
" PIVOT" & _
"( " & _
"sum ( ParamValue)" & _
"FOR ParamID IN ([1001],[1003],[1007])" & _
")AS Pvt order by [CollectionDateTime]"

我的报表中要用到“污水浓度”这个字段,程序中我是这样写的:
myReportDocument.DataDefinition.FormulaFields("污水浓度").Text = "{BaseDayData." + dDataset.Tables(0).Columns(1).ColumnName + " }"
运行时老出现错误:该字段名未知。文件 C:\DOCUME~1\zsr\LOCALS~1\Temp\DayReport {A42EC4B9-CC5E-465E-8B14-CBD3852AD6E6}.rpt 内出错:公式 <污水浓度>. '{BaseDayData.污水浓度 }' 该字段名未知。
我想问一下阿泰该问题应该如何解决

  回复  引用    

#42楼 [楼主] 2008-04-29 20:33 阿泰      
@午夜飘零

建议将语句创建为一个view,使用view来进行后续操作
  回复  引用  查看