[水晶报表]创建不受数据库限制的报表(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
Feedback
如果你用了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
回复 引用 查看
Private Sub CRViewer91_CloseButtonClicked(UseDefault As Boolean)
Dim ingret As Long
UseDefault = False '取消默认打印
objcrreport.PrinterSetup Me.hWnd '进行打印机设置
objcrreport.PrintOutEx True '直接打印
End Sub
就可以了?我刚才试过,不行,正在苦恼中,请阿泰指教。
回复 引用 查看
可是列于列之间的间隔太宽,不符合节约纸张的要求,我们l老师不喜欢。还有一个问题就是我想要在报表上画线隔开,但是他的线好像是无限长的,怎么也控制不了他的长度。如:
———————————————————————————————
类别1 类别2 类别3 类别4
——————————————————————————————————
100 200 300 400
——————————————————————————————————
图不懂怎么上传,只能这样画算了。不知这样你是否理解了呢?如果理解就教我怎么做好吗?谢谢你了!
回复 引用 查看
http://www.cnblogs.com/babyt/archive/2005/03/13/118059.html
列的距离,可以通过缩写拖动字段来控制
回复 引用 查看
1、不需要列的标题
2、只需要显示数据内容,
3、数据显示如下的格式:
____________________________________________________
张三 | 李四 | 赵五| '姓名
____________________________________________________
| 0001| 0002| 0003| '学号
____________________________________________________
| 120 | 117 | 115 | '数学
____________________________________________________
|110 | 115 | 112 | '语文
____________________________________________________
|120 | 119 | 118 | '英语
____________________________________________________
中间行与列之间使用分割线分开,其中:姓名、学号、数学、语文、英语是原来表中的字段名,这里不要它们在报表中显示。这样说明白我的意思了吗?如果这样做使用你说的方法不能满足要求,请再次教我好吗?
回复 引用 查看
下面这篇正是你所想要的
http://www.cnblogs.com/babyt/archive/2005/04/21/142309.html
主要是看一下实现的思路~~
回复 引用 查看
我窗体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语句则不产生作用。。。。
回复 引用 查看
:我已经看到了,按你说的 写入:'.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类型,我再试一试吧,总之,表示感谢!
回复 引用 查看
你好!
1.我是用VS.NET2003+CR10.0开发的,准备做一个WEB报表页.报表文件是别人做好的,也是以TTX作为数据源.该报表在VB中 使用正常,可以调用到数据.但一应用到.NET中,就没办法显示数据.数据源是一个自定义的DATATABLE, 我用的连接语句是Creport.Database.Tabels[0].Setdatasource(DATATABLE),但报表始终是空的, 无法显示数据.请问是什么原因啊?急急!!!
2.我在设计报表时连接了一个表, 但在设置报表数据源是要用一个自定义表作为数据源的,但运行时,报表始终显示的是设计时的那个表内容,无法显示当前自定义表的内容,我采用的边接就是上面 的那个语句.开发环境也一样.不知道两个的问题是不是一样.可怎么办啊?在网上搜刮了一空,还是没找到解决方案.
注:两个我都有设了LOGON信息.
急盼回音,谢谢
回复 引用 查看
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
回复 引用 查看
当使用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
回复 引用 查看