在应用程序窗体中建立一个DateTimePicker控件。实现从DateTimePicker中去时间值传到存储过程里,然后把存储过程的数据集传到data.xsd数据集里。再由水晶报表调用数据。
1. 建立存储过程—CReport1
CREATE PROCEDURE [dbo].[CReport1]
@time datetime
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT msbmc,hwm,ssts,time1
--,convert (varchar(20),time1,112) as time1
from dtb join jsb on dtb.jid = jsb.jid
join hwzl on dtb.hid=hwzl.hid
join msbzl on dtb.mid=msbzl.mid
where convert(varchar(20),time1,112)=convert (varchar(20),@time,112)
2. 打开解决方案—右键项目—添加新建项—数据集。命名为dataset1.xsd
打开dataset1.xsd,右键点击添加—TableAdapter,选择数据库连接,选择“使用现有存储过程”,选择刚才新建的存储过程“CReport1”。点击完成。
这时在dataset1.xsd中出现新的数据集。右键点击“CReport1TableAdapter”下的“Fill,GetData()”属性,打开Paramters(SQL语句和存储过程的参数)的选项按钮打开 参数集合编辑器,添加存储过程中要输入的time参数。点击添加,在右边的DbType中选择datatime类型,把Size设置为8,ParamtersName选项改为@time。
完成设置后可以在dataset1.xsd中点击右键—预览数据,检查是否能从存储过程中取到数据。
3. 打开解决方案—右键项目—添加新建项—Crystal报表,建立一个“CrystalReport1.rpt”,
打开CrystalReport1.rpt,在字段资源管理器中,右键数据库字段—数据库专家,创建新连接—ADO.NET,弹出连接对话框,在文件路径中选择刚才建立的dataset1.xsd,点击完成。再把dataset1—Creport1加入,点击确定完成。
这时完成在水晶报表中加入数据源。
4. 新建一个form,在form中添加一个CrystalReportViewer控件,一个DateTimePicker控件,一个button控件。打开form代码编辑器。添加以下代码:
Imports System.Data.SqlClient
Imports CrystalDecisions.CrystalReports.Engine
Public Class Form1
Private strAppTitle As String
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim customerReport As ReportDocument = New ReportDocument
Try
Dim strConn As SqlConnection = New SqlConnection("Data Source=localhost;Initial Catalog=cjs;Integrated Security=true")
Dim ds As DataSet1 = New DataSet1
Dim adp As SqlDataAdapter = New SqlDataAdapter
strConn.Open()
adp.SelectCommand = New SqlCommand
adp.SelectCommand.Connection = strConn
adp.SelectCommand.CommandText = "CReport1"
'执行存储过程
adp.SelectCommand.CommandType = CommandType.StoredProcedure
'把DateTimePicker的值附给@time
adp.SelectCommand.Parameters.Add("@time", SqlDbType.DateTime).Value = DateTimePicker1.Value
adp.SelectCommand.ExecuteNonQuery()
adp.Fill(ds, "s")
'Application.StartupPath 表示获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。
Dim reportPath As String = Application.StartupPath & "/" & "CrystalReport2.rpt"
customerReport.Load(reportPath)
customerReport.SetDataSource(ds.Tables("s"))
CrystalReportViewer1.ReportSource = customerReport
Catch ExceptionErr As Exception
MessageBox.Show(ExceptionErr.Message, strAppTitle)
End Try
End Sub
End Class