[水晶报表]创建不受数据库限制的报表(2)

新建一个vb工程,增加水晶报表设计及运行组件的引用,在界面上增加一个Viewer控件。

运行的结果就是把在(1)中所做的模板加载数据后显示出来

核心代码:

    '--------------------------------------------------
    '创建报表
    '--------------------------------------------------
    '加载报表模板

    Set objCRReport = objCRApp.OpenReport(App.Path & ""Report1.rpt", 1)
    '加载报表字段定义文件
    Set props = objCRReport.Database.Tables(1).ConnectionProperties
    For Each prop In props
        If InStr(prop.Name, "Field Definition File") > 0 Then
           prop.Value = App.Path & ""Users.ttx"
           Exit For
        End If
    Next
    Set props = Nothing
    '清除报表中保持的数据
    objCRReport.DiscardSavedData
    '赋给报表数据
    objCRReport.Database.SetDataSource rst

请在此处下载完整的代码(VB+水晶报表9.2)
程序有完整注释,你可以当作开发模板使用 :)
2004年12月15日更新,增加报表参数演示,禁止参数界面弹出

2005年4月25日更新,增加打印时选择打印机功能
http://www.cnblogs.com/babyt/archive/2005/04/25/144962.html
 



posted on 2005-03-11 14:42 阿泰 阅读(10723) 评论(55)  编辑 收藏 所属分类: CR我的原创

Feedback

#1楼 218.19.242.* 2005-06-14 10:40 ask
阿泰,水晶报表的数据有时候可以显示出来有时候又不能,明明数据库里面是有数据的,这是怎么回事呢?我又该怎么去解决它呢?是不是 objCRReport.Database.SetDataSource rst 除了这个语句还要外,还要增加什么语句呢?谢谢!!
  回复  引用  查看    

#2楼 [楼主] 2005-06-14 11:24 阿泰
这句一定要的

'清除报表中保持的数据
objCRReport.DiscardSavedData

  回复  引用  查看    

#3楼 218.16.75.* 2005-06-24 16:13 huadj
Set props = objCRReport.Database.Tables(1).ConnectionProperties
For Each prop In props
If InStr(prop.Name, "Field Definition File") > 0 Then
prop.Value = App.Path & ""Users.ttx"
Exit For
End If
Next
阿泰,能详细注释一这一段吗?主要不明白的地方:Tables(1)指的是那一个表?你定义了三个ttx文件,为什么只用一个users.ttx就能显示其他的?
  回复  引用  查看    

#4楼 [楼主] 2005-06-24 16:23 阿泰
每个ttx文件相当于一个表
在字段管理器的位置上,从上到下的顺序依次为1、2、3。。。

我的例子里是一个ttx文件啊,,你在哪里看到有3个的??
  回复  引用  查看    

#5楼 218.16.75.* 2005-06-24 16:41 huadj
呵呵,看错了。那个循环作什么用啊
  回复  引用  查看    

#6楼 218.16.75.* 2005-06-24 16:56 huadj
假如我的报表要加载几个ttx文件,是不是在prop.Value = App.Path & ""Users.ttx" 后加上prop.Value = App.Path & ""***.ttx" ?
  回复  引用  查看    

#7楼 [楼主] 2005-06-24 17:00 阿泰
循环是为了遍历报表内的对象

如果你用了3个表,那么这样设置
当然你可以写得更简单点
Set props = objCRReport.Database.Tables(1).ConnectionProperties
For Each prop In props
If InStr(prop.Name, "Field Definition File") > 0 Then
prop.Value = App.Path & ""Users1.ttx"
Exit For
End If
Next

Set props = objCRReport.Database.Tables(2).ConnectionProperties
For Each prop In props
If InStr(prop.Name, "Field Definition File") > 0 Then
prop.Value = App.Path & ""Users2.ttx"
Exit For
End If
Next

Set props = objCRReport.Database.Tables(3).ConnectionProperties
For Each prop In props
If InStr(prop.Name, "Field Definition File") > 0 Then
prop.Value = App.Path & ""Users3.ttx"
Exit For
End If
Next

  回复  引用  查看    

#8楼 219.130.49.* 2005-06-25 15:44 huadj
谢谢阿泰!
另问字段定义里BLOG类型跟Access数据库里的文本类型对应吗?如果不是,又是什么类型?我想不能显示是不是这里的问题。

  回复  引用  查看    

#9楼 222.67.11.* 2005-06-26 00:19 阿泰
是Blob而不是Blog,呵呵,两者差远了
Blob对应的是Access里的二进制类型,Access里的文本对应的是String型
  回复  引用  查看    

#10楼 218.16.74.* 2005-06-27 10:39 huadj
阿泰,我现在算是明白了,你说的不受数据库限制,指的是报表数据在代码里指定。我的报表数据来源于数据库,所以用这个方法不适合,对吗?那么,我要实现在预览报表的时候选择打印机,是不是只在在代码里曾加:
Private Sub CRViewer91_CloseButtonClicked(UseDefault As Boolean)
Dim ingret As Long
UseDefault = False '取消默认打印
objcrreport.PrinterSetup Me.hWnd '进行打印机设置
objcrreport.PrintOutEx True '直接打印
End Sub

就可以了?我刚才试过,不行,正在苦恼中,请阿泰指教。
  回复  引用  查看    

#11楼 [楼主] 2005-06-27 12:43 阿泰
用数据库直接连水晶报表,没什么好讲的,所以我也没怎么提。

怎么个不行法?什么提示?
  回复  引用  查看    

#12楼 218.19.246.* 2005-06-27 15:06 ask
阿泰,前面我的问题是我找到了原因,是因为我的程序里面在某个时刻同时访问同一个数据库才出现的问题,我已经解决了。现在我有个无从下手的问题:我用海波的方法实现了记录的纵向排列+多列格式化。详细请看:http://blog.csdn.net/haibodotnet/archive/2003/11/16/21518.aspx
可是列于列之间的间隔太宽,不符合节约纸张的要求,我们l老师不喜欢。还有一个问题就是我想要在报表上画线隔开,但是他的线好像是无限长的,怎么也控制不了他的长度。如:
———————————————————————————————
类别1 类别2 类别3 类别4
——————————————————————————————————
100 200 300 400
——————————————————————————————————
图不懂怎么上传,只能这样画算了。不知这样你是否理解了呢?如果理解就教我怎么做好吗?谢谢你了!

  回复  引用  查看    

#13楼 [楼主] 2005-06-27 15:21 阿泰
我想你说的可能是这个意思
http://www.cnblogs.com/babyt/archive/2005/03/13/118059.html

列的距离,可以通过缩写拖动字段来控制

  回复  引用  查看    

#14楼 218.20.218.* 2005-06-27 16:14 ask
阿泰,不是这个意思,我用你的方法试了一次,虽然可以达到了缩短了列的距离,但是却失去了我原来想要的结果,是我说的不够明白,我再说一次,希望你能再看一次. 我要达到的效果如下:
1、不需要列的标题
2、只需要显示数据内容,
3、数据显示如下的格式:
____________________________________________________
张三 | 李四 | 赵五| '姓名
____________________________________________________
| 0001| 0002| 0003| '学号
____________________________________________________
| 120 | 117 | 115 | '数学
____________________________________________________
|110 | 115 | 112 | '语文
____________________________________________________
|120 | 119 | 118 | '英语
____________________________________________________
中间行与列之间使用分割线分开,其中:姓名、学号、数学、语文、英语是原来表中的字段名,这里不要它们在报表中显示。这样说明白我的意思了吗?如果这样做使用你说的方法不能满足要求,请再次教我好吗?
  回复  引用  查看    

#15楼 218.16.74.* 2005-06-28 08:51 huadj
阿泰,我的问题是加那段代码后仍无法选择打印机,按下打印图标出现的对话框里只有默认的打印机。还须要加什么代码?

  回复  引用  查看    

#16楼 218.16.74.* 2005-06-28 11:19 huadj
谢谢你阿泰,这个问题我解决了。问题点在于选择事件没有选择好。应该是CRViewer91_PrintButtonClicked(UseDefault As Boolean),说出来,让大家以后不要走这条弯路。
  回复  引用  查看    

#17楼 [楼主] 2005-06-28 11:32 阿泰
呵呵~~ 实在不好意思,我也没仔细看原来你用的是CloseButton
做什么都要细心啊,我的例子里没搞错吧,赶紧看看
  回复  引用  查看    

#18楼 218.16.74.* 2005-06-28 16:45 huadj
这个问题解决了,还有更复杂的问题呢。
报表设计好了,但不知道怎么控制报表输出(是不是也叫部署报表)。报表有些地方我想通过combo控件(因为有些报表数据只有固定几个),由用户选择后动态生成报表,却不知怎样写代码,麻烦阿泰再教我,老板促得紧。
  回复  引用  查看    

#19楼 218.19.240.* 2005-06-29 09:55 ask
阿泰,帮我解决这个问题好吗?就是上次我说的,我使用了“记录的纵向排列+多列格式化”后,我在其中使用直线将每一行每一列分开,可是行的是无限长,直到 记录的最后一条,我现在想要他每一行都能够等长,这样看起来就像是表格一样,这样做是不是不可以,是否还有其他的方法呢?我想了好几天了,还是没有半点头 绪。请你帮帮我!!!谢谢!!
  回复  引用  查看    

#20楼 59.36.150.* 2005-06-29 20:43 huadj
阿泰,能给我一个例子或思路吗?拜托了!
  回复  引用  查看    

#21楼 [楼主] 2005-06-30 01:07 阿泰
To:huadj
你是使用Combox选某一报表名称后显示相关的报表吗?
根据combox的选择确定一个rpt文件,然后使用一个公用的函数load这个rpt不就行了吗?
  回复  引用  查看    

#22楼 [楼主] 2005-06-30 01:08 阿泰
To:Ask
把你的模板进行数据保持后发给我看看吧
babyt#mail.csdn.net
  回复  引用  查看    

#23楼 59.36.150.* 2005-06-30 09:07 huadj
阿泰,我的意思是,报表上要显示的内容由用户自己选择。比如我的报表模板上有有两个位置是“项目”。两个“项目”对应的字段的内容只有“加热负载”、”过 压负载“、”加压煮沸“几个内容,但两个项目的内容都不一定显示同样内容同时在报表上显示。如第一个项目栏位用户选择“加热负载”,第二个项目栏位用户选 择“加压煮沸“,之后点“报表预览”,报表就显示用户选择的项目内容显示在报表上了。不知我这样描述你明不明白。但我从来没有做过软件的,真不知道该怎么 样把这些代码、数据库、报表整合在一起。
  回复  引用  查看    

#24楼 [楼主] 2005-06-30 09:25 阿泰
看来我理解错了,
下面这篇正是你所想要的
http://www.cnblogs.com/babyt/archive/2005/04/21/142309.html
主要是看一下实现的思路~~
  回复  引用  查看    

#25楼 218.20.216.* 2005-06-30 12:42 ask
阿泰,你给我的这个babyt#mail.csdn.net 是不是你的邮箱阿,我已经将模板发到这个邮箱去了,麻烦你去看一下好吗?
  回复  引用  查看    

#26楼 222.240.17.* 2005-08-15 13:18 yyj [未注册用户]
请问啊泰:我用数据库直接连水晶报表。。可我的图片字段和图片总不能在报表里显示出来。不知道是咋回事啊。。图片字段类型是image数据库是SQLserver2000
  回复  引用  查看    

#27楼 [楼主] 2005-08-15 16:48 阿泰
没遇到过,把表结构和模板文件发给我看看吧
babyt#mail.csdn.net
  回复  引用  查看    

#28楼 61.161.64.* 2005-08-20 10:33 dux++ [未注册用户]

#29楼 61.181.174.* 2005-10-17 11:19 nedtwo [未注册用户]
:例子很好,自我扩充也得心应手,在此对【阿泰】表示衷心感谢!;但在【定义:日期变量】时,我是这样定义:'.Append "RW", adDBDate; 写入:'.Fields("RQ") = " 2005-10-17 ",报错:数据集不能添加,分析:应为定义日期的变量类型有问题?我本意:是将【DAtetime】类型的日期数据,加入格式:“2005-10- 17”,8位。请您有空,看一下这个贴子。email_no:nedtwo@sohu.com 2005-10-17
  回复  引用  查看    

#30楼 152.104.155.* 2005-10-17 17:32 lm [未注册用户]
阿泰:水晶报表10的参数只能传递5个吗?我用VB传了7个参数,但只能传递5个,后面那两个不能传!
  回复  引用  查看    

#31楼 152.104.155.* 2005-10-17 17:32 lm [未注册用户]
阿泰:水晶报表10的参数只能传递5个吗?我用VB传了7个参数,但只能传递5个,后面那两个不能传!
  回复  引用  查看    

#32楼 60.26.10.* 2005-10-18 16:22 nedtwo [未注册用户]
lm:请问:你的参数是否与【日期-datetime】有关,若有关,说两句。 OK!
  回复  引用  查看    

#33楼 [楼主] 2005-10-19 10:12 阿泰
to lm:
你说的是参数字段吧?
帮助文档中没有明显限制,我最多用过30几个
你说的是不能传参数,还是参数传递进去后无效?
  回复  引用  查看    

#34楼 [楼主] 2005-10-19 10:26 阿泰
to:nedtwo

定义:'.Append "RW", adDBDate;
写入:'.Fields("RQ") = " 2005-10-17 ",

这里的RW--RQ是不小心打错了吧?

使用adDBDate或adDate对应ttx里的date

  回复  引用  查看    

#35楼 61.175.133.* 2005-10-19 10:51 小刘 [未注册用户]
我想问个问题,可能对你来说很简单,可困扰了我好几天,我是初学水晶报表的,请各位大大指教。
我窗体1的代码是这样的:Private Sub Command1_Click()
Dim connstr As String
If conn.State = adStateOpen Then conn.Close
connstr = "driver=SQL Server;server=LIU;uid=sa;pwd=0414;database=liu"
conn.ConnectionString = connstr
conn.Open
conn.CursorLocation = adUseClient
If rs.State = adStateOpen Then rs.Close
Dim strsql As String
strsql = "select mrBaseInf.EmpName,DataEntry.CountPrice,DataEntry.CountNum from DataEntry,mrBaseInf where DataEntry.EmpID=mrBaseInf.EmpID "
'这是多表查询,语法该没问题的吧。
rs.Open strsql, conn, adOpenKeyset, adLockReadOnly

Form2.Show 1 '数据库连接完成后,调用Form2水晶报表工程
End Sub



窗体2是水晶报表自动生成的,
Option Explicit

Private Sub Form_Load()
Dim oApp As New CRAXDRT.Application
Dim oRpt As CRAXDRT.Report
Dim reportName As String

Screen.MousePointer = vbHourglass
reportName = ""rpt"Report12.rpt" '定义要引用的rpt文件

Set oRpt = oApp.OpenReport(App.Path & reportName, 1)
oRpt.DiscardSavedData
oRpt.Database.SetDataSource rs '连接水晶报表和数据源
oRpt.ReadRecords

CRViewer91.ReportSource = oRpt '启用水晶报表的预览功能
CRViewer91.ViewReport
Screen.MousePointer = vbDefault

End Sub

Private Sub Form_Resize()
CRViewer91.Top = 0
CRViewer91.Left = 0
CRViewer91.Height = ScaleHeight
CRViewer91.Width = ScaleWidth

End Sub
Private Sub Form_Unload(Cancel As Integer)
Set rs = Nothing
Set conn = Nothing
Unload Form2

End Sub

Module1中代码是这样的
Public conn As New ADODB.Connection
Public rs As New ADODB.Recordset

具体问题是这样的,本来我调用的报表是由一个表中的字段生成的,而且我可以根据SELECT语句来显示要的数据,但当我要调用2个相关联的表,我 一个个语句运行下来发现运行到oRpt.ReadRecords出错,说用户sa登录失败,我马上换个报表和SELECT语句(单表查询)运行一切正常, 是同一数据库的。请啊泰帮帮我。。。。。
还有问下,我拿掉oRpt.DiscardSavedData语句,可以调用水晶报表,但SELECT语句则不产生作用。。。。



  回复  引用  查看    

#36楼 60.26.9.* 2005-10-19 11:34 nedtwo [未注册用户]
re: [水晶报表]创建不受数据库限制的报表(2) 2005-10-19 10:26 阿泰
:我已经看到了,按你说的 写入:'.Fields("RQ") = " 2005-10-17 ", 可通过。
我用一个文本文件的各个字段读出->装入变量,再装入 Fields("RQ") 就NO!

写为:.Fields("RQ") =format(d3,"yyyy-mm-dd") 后,编译没问题通过,显示出来的日期都是 “1900-XX-XX”而不是 " 2005-01-01 "了。
我认为,还是个“类型的格式”有错。
SQL ADO 方式下的日期用格式:="' & d3 '",来对应datetime类型,我再试一试吧,总之,表示感谢!
  回复  引用  查看    

#37楼 218.69.193.* 2005-10-19 16:18 nedtwo [未注册用户]
阿泰:你好!
.Append "RQ", adDBDate
。。。。
.Fields("RQ") = D4
已经很流畅的通过了,分组求和概念也加上了。与我原先对SQL server2000下的表的效果一样。真得谢谢你,相互沟通,相互切磋,对提高技能有好处。
  回复  引用  查看    

#38楼 222.92.63.* 2005-11-11 11:42 ti [未注册用户]
阿泰你好,我现在使用的是VB+SQL+Crystal Report 9,我是个新手,但老板给我的任务却很重,而且给我的时间也不是很充裕,所以很需要一个像你这样,知识渊博又热心的好人来帮助我,我的QQ: 5749675,可以尽快和我联系吗,我很需要你!
  回复  引用  查看    

#39楼 222.92.63.* 2005-11-11 11:47 tj [未注册用户]
请问现在有一张带有子报表的report,可是子报表调用的是数据库中的另一张表里的数据,这样的情况下,sql语句怎么写,还是要在子报表中也加SQL语句呢,要是加 子报表的程序应该怎么写呢

  回复  引用  查看    

#40楼 218.7.68.* 2005-11-11 16:56 lionet [未注册用户]
阿泰你好,我现在遇到个提示数据库登录的问题,我自己画了一个模板,字段放在ttx文件里,然后在程序中传的数据,数据库在我机器上,我们是多人开发。当我把我做好的模板放到别人机器上的时候就出来一个数据库登录的提示, 这是怎么回事啊。
  回复  引用  查看    

#41楼 218.7.68.* 2005-11-11 16:59 lionet [未注册用户]
在我机器上的时候报表一切正常,数据能正常显示, 到别人机器上就出现这个问题,我用的是VB.NET 2003、 水晶报表9 、SQL SERVER数据库。我是初学,请多帮忙。
谢谢!!!
  回复  引用  查看    

#42楼 59.42.46.* 2005-11-13 15:46 ask [未注册用户]
lionet 我也遇到和你一样的问题。而且使用的版本都是一样。希望有人能帮忙解决!

  回复  引用  查看    

#43楼 221.196.85.* 2005-11-13 16:25 nedtwo [未注册用户]
:让对方【别人】机器,软件环境与你机器一样就行了。控件和动态链接文件得有啊。
不能闲麻烦。试一试。会成功的。
  回复  引用  查看    

#44楼 218.7.68.* 2005-11-14 10:02 lionet [未注册用户]
软件环境都是一样的,因为我们同时开发用的VSS,所用的控件和引用的DLL文件也都是相同的,不同的就是都使用我机器的数据库,源代码所在路径不同。

再者是我的方法有问题吗? 在程序外画模板,字段引用TTX文件。在程序中传dataset。应该没什么错误吧。 有什么需要注意的吗?

  回复  引用  查看    

#45楼 59.42.41.* 2005-11-14 13:41 ask [未注册用户]
nedtwo
你说的:让对方【别人】机器,软件环境与你机器一样就行了。控件和动态链接文件得有啊。就算是可以(我没有试过),但是没有什么使用价值阿,你想 想:我做好一个程序,为了能够在另外一台电脑上运行,又将另外一台电脑的软件环境与我的机器一样,一台可以这么做,如果很多台呢?还有如果安装到客户的电 脑上,难道你也要求客户的电脑的软件环境与你机器一样?这样是不行的,还有别的方法吗?
  回复  引用  查看    

#46楼 61.145.182.* 2005-12-28 23:56 kuaile [未注册用户]
阿泰你好:我用加载TTX的方式来连接SQL,SQL中有一个字段为日期(datetime,长度是8),我在TTX中对应的是Datetime类型,但 这样显示出来的会有一个时间,如果我在TTX中设为Date的话就无法显示,请问我要怎么做才能显示短日期?
  回复  引用  查看    

#47楼 61.141.202.* 2006-01-23 17:02 tom.zhou [未注册用户]
阿泰你好: 我做的是一个有关联的子报表(vb+ sqlserver2000 + cr9.2 ),但是不知什么,子报表的SQL中的表名是全局的即: "数据名".'用户名"."表名" 我怎么样才能取得表明前面的数据库名与用户名啊?
  回复  引用  查看    

#48楼 61.141.202.* 2006-01-23 17:17 tom.zhou [未注册用户]
阿泰你好: 我做的是一个有关联的子报表(vb+ sqlserver2000 + cr9.2 ),但是不知道什么,子报表的SQL中的表名是全局方式的即: "数据名".'用户名"."表名" 我怎么样才能去掉表名前面的数据库名与用户名啊?

  回复  引用  查看    

#49楼 59.60.6.* 2006-02-19 00:07 李子 [未注册用户]
阿泰:
你好!
1.我是用VS.NET2003+CR10.0开发的,准备做一个WEB报表页.报表文件是别人做好的,也是以TTX作为数据源.该报表在VB中 使用正常,可以调用到数据.但一应用到.NET中,就没办法显示数据.数据源是一个自定义的DATATABLE, 我用的连接语句是Creport.Database.Tabels[0].Setdatasource(DATATABLE),但报表始终是空的, 无法显示数据.请问是什么原因啊?急急!!!
2.我在设计报表时连接了一个表, 但在设置报表数据源是要用一个自定义表作为数据源的,但运行时,报表始终显示的是设计时的那个表内容,无法显示当前自定义表的内容,我采用的边接就是上面 的那个语句.开发环境也一样.不知道两个的问题是不是一样.可怎么办啊?在网上搜刮了一空,还是没找到解决方案.
注:两个我都有设了LOGON信息.
急盼回音,谢谢
  回复  引用  查看    

#50楼 218.58.125.* 2006-03-18 15:26 苍郁 [未注册用户]
阿泰,您好,我下载了您上面提供的vb代码,然后我在您构建的数据集中,新加了一个日期字段,如果我把这个日期字段定义为 adDBDate 则能正常显示,但是如果定义为 adDate 就无法显示。当然ttx文本中字段的定义格式都是日期格式。
这是为什么?水晶报表不支持addate格式?
  回复  引用  查看    

#51楼 61.184.255.* 2006-08-04 08:53 吴争容 [未注册用户]
.ttx文件只能用于VB.net 编程吗?
  回复  引用  查看    

#52楼 218.88.98.* 2006-10-09 10:32 祥子 [未注册用户]
请问阿泰:有没有方法在VC6.0的MFC工程中实现你所说的“创建不受数据库限制的报表”。因为我们的程序希望统一编程语言,只能用VC。请尽快回复,万分感谢。我的QQ:77161112,在线等。
  回复  引用  查看    

#53楼 222.92.63.* 2006-11-21 15:43 wdtking [未注册用户]
谢谢阿泰!!!
你的例子简单明了,切中重点!!
多谢!!
  回复  引用  查看    

#54楼 222.216.156.* 2007-03-12 18:48 石嶷山友 [未注册用户]
真正不受数据源限制的方法
Public RS As ADODB.Recordset

Private Sub DH_Change()

Dim oApp As New CRAXDRT.Application
Dim oRpt As CRAXDRT.Report
Dim reportName As String
Dim SQL$, I%, JEHJ$

Dim RS2 As ADODB.Recordset

SQL = "SELECT * FROM NBDBD_BT WHERE DBDH='" + Trim(DH.Text) + "'"
Set RS2 = CN.Execute(SQL)
JEHJ = "" & RS2("JEHJ")
If Val(JEHJ) = 0 Then JEHJ = "0"

SQL = "SELECT * FROM NBDBD_MX WHERE DBDH='" + Trim(DH.Text) + "'"
Set RS = New ADODB.Recordset
RS.Open SQL, CN, 1, 3

Screen.MousePointer = vbHourglass

reportName = App.Path + ""Reports"销售发货单.rpt" '定义要引用的rpt文件

Set oRpt = oApp.OpenReport(reportName, 1)
' oRpt.PaperSize = crPaperUser
' oRpt.SetUserPaperSize 1100, 2200 '自定义纸张大小 单位: 0.01mm

For I = 1 To oRpt.Database.Tables.Count
oRpt.Database.Tables(I).ConnectionProperties.DeleteAll
oRpt.Database.Tables(I).SetDataSource RS
Next I

CRViewer91.ReportSource = oRpt '启用水晶报表的预览功能

oRpt.DWMC.SetText Report_Name

oRpt.Text6.SetText "内部调拨发货单"
oRpt.XSDH.SetText "No:" + DH.Text
oRpt.RQ.SetText "日期:" & RS2("RQ")
oRpt.SHDZ.SetText "" & RS2("SHDZ")
oRpt.KHMC.SetText "" & RS2("KHMC")
oRpt.JEDX.SetText "(大写)" + ChMoney(JEHJ)
oRpt.CKMC.SetText "" & RS2("CKMC")
oRpt.THFX.SetText "" & RS2("THFX")
oRpt.CPHMc.SetText "" & RS2("CPHM")
oRpt.THR.SetText "" & RS2("THRXM")
oRpt.JSZT.SetText ""
oRpt.BZ.SetText "" & RS2("BZ")
oRpt.JJY.SetText "" & RS2("JJYXM")
oRpt.YXY.SetText "" & RS2("YXYXM")
oRpt.CGY.SetText "" & RS2("CGYXM")
oRpt.SHR.SetText "" & RS2("SHRXM")
oRpt.FHR.SetText "" & RS2("FHRXM")
oRpt.CZY.SetText "" & RS2("KDRXM")
CRViewer91.ViewReport
Screen.MousePointer = vbDefault
Me.Width = 13140
RS2.Close
Set RS2 = Nothing

End Sub

Private Sub Form_DblClick()
Debug.Print Me.Width & "," & Me.Height
End Sub

Private Sub Form_Resize()
CRViewer91.Top = 0
CRViewer91.Left = 0
CRViewer91.Height = ScaleHeight
CRViewer91.Width = ScaleWidth

End Sub

Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
RS.Close
Set RS = Nothing
End Sub

=============== 注意以下几行是清除水晶报表原来的所有边接
For I = 1 To oRpt.Database.Tables.Count
oRpt.Database.Tables(I).ConnectionProperties.DeleteAll
oRpt.Database.Tables(I).SetDataSource RS
Next I

  回复  引用  查看    

#55楼  2007-11-18 21:45 wind2
谢谢楼主,今天刚用水晶报表,遇到一个问题,业务层生成的DataSet是不能在视图中显示,也就是出现“未能找到项目”的错误,这个错误不是因为数据库的原因,有朋友已经找到解决问题的办法,我比较笨,花了一晚上也找到,如下:
当使用SP或复杂的SQL生成DataSet时,我们没法用IDE显示结构,可以用一个简单办法来作,因为我们只需要知道DataSet的表结构。
1. 在项目中新建一个DataSet,增加一个datatable,在增加column,注意每一个column的名字与你动态生成的dataset中的column名相同。例:

DataTable1 表名
cEmployeeCode 字段名1
vFirstName 字段名2
vLastName 字段名3
mMonthlySalary 字段名4
dPayDate 字段名5

2.把设计好的DataSet作为新设计好的CrystalReport1的数据源,并选好报表出现的column.这个楼主已经说的很详细了。

3.在程序中可以这样绑定
ReportDocument r1 = new ReportDocument();

r1.FileName = Application.StartupPath + """CrystalReport1.rpt";

string sqlstrr = "SELECT Employee.cEmployeeCode, Employee.vFirstName, Employee.vLastName, MonthlySalary.mMonthlySalary, MonthlySalary.dPayDate FROM Employee INNER JOIN MonthlySalary ON Employee.cEmployeeCode = MonthlySalary.cEmployeeCode";

SqlDataAdapter da = new SqlDataAdapter(sqlstrr,"Server=(local);Database=HR;Uid=sa;Pwd=123456");

DataSet1 ds = new DataSet1();

da.Fill(ds.Tables[0]);

r1.SetDataSource(ds.Tables[0]);

this.crystalReportViewer1.ReportSource = r1;

这样就可以显示业务层中的DataSet
如果DataSet的结构是不定的呢?参考下面的
http://www.codeproject.com/useritems/Dynamic_Crystal_Report.asp




  回复  引用  查看    

posted on 2008-03-24 00:29  谭洪星  阅读(635)  评论(0编辑  收藏  举报

导航