【水晶报表内功心法】--PUSH模式样板招式(转帖+亲自实践+补充)

水晶报表教程,强烈推荐CSDN上babyt(阿泰)的帖子(以下内容皆转帖自此贴以及其子连接):

http://topic.csdn.net/u/20090713/18/6e14bf28-1979-4ade-9c60-aaf09284553d.html

 

前篇讲解了PULL模式下的操作方法,比较简单。
本文进一步详细讲解一下PUSH模式下的样板操作。
仍以Web为例

首先,在vistual studio中新建一个 Asp.Net CrystalReports的网站  (本文使用的是visual C#语言)

弹出下面这个界面后,选第2项-作为空白报表,然后点确认,进入一个空白界面。

在vistual studio中"新建文件",新建一个数据集合


出现此提示时,点“是”


然后还会出来连接数据库的提示,一律点否,直至界面上什么提示也没有
在这个界面上,点右键,添加一个datatable,命名为myTable。


然后在myTable里增加相应的列,我这里有3个列,注意要设置好类型。




特别说明:
因为水晶报表里不认datatime型,对于2009-06-26 9:23:15
会自动截断为2009-06-26
所以datatime型数据在xsd文件中,可设置为string型
而代码中的SQL中可把字段转换为String传入。

xsd设计完毕后,开始进入报表模板设计阶段。

在“数据库字段”上点右键,选“数据库专家”


再弹出的界面上,点“项目数据”,依次点开,找到我们刚才自己做的mytable


确定后,在“数据库专家”下面会出现表名mytable,点开后会看到字段,
把字段拖到模板上的详细资料节即完成基础模板的制作了("页眉"节的内容会随着"详细资料"节的拖动而自动生成)


点一下预览,会看到虽然我们还没有任何实际的数据操作,但是界面上已经有数据了
这是水晶报表的一个虚拟数据,可以看到一个最终显示的效果。


好了,上代码

C# code

 

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Web;
using System.Data.OleDb;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ConfigureCrystalReports();

    }

    private void ConfigureCrystalReports()

    {
      
        //连接字串
        String connstr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\CrZen\testall.mdb;";
        OleDbDataAdapter da = new OleDbDataAdapter();
        OleDbConnection cn = new OleDbConnection(connstr);
        //
        da = new OleDbDataAdapter("SELECT * From RPT_CR_TEST1", cn);
        //创建我们的DataSet1实例
        DataSet1 dt1 = new DataSet1();
        //填充dt1
        //注意:表名mytable必须与我们在xsd设计的表名称一致。
        //本例中数据库的表实际名称为RPT_CR_TEST1,而最终是以mytable为准的
        //使用 PUSH模式的优点就在此,可以自由组合SQL
        //前提是表名称和字段名(需要在SQL中使用as别名的方式跟xsd中设计的字段名一致)都要一致
        da.Fill(dt1, "mytable");
        
        ReportDocument myReport = new ReportDocument();
        string reportPath = Server.MapPath("crystalreport1.rpt");
        myReport.Load(reportPath);

        //绑定数据集,注意,一个报表用一个数据集。
        myReport.SetDataSource(dt1);
        CrystalReportViewer1.ReportSource = myReport;

    }

}

 

补充:

我在vb.net 2008上尝试babyt(阿泰)帖子上的C#代码,现在把vb.net连接SQL Server 代码放出,经测试可以实现

以下程序放在Defalut.aspx.vb中(注,在我的程序中,为了实验多表结合,所以SQL文的SELEC字段与上文中阿泰的截图不一样)

Imports CrystalDecisions.Shared
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Web
Imports System.Data.OleDb

 

Partial Class _Default
    Inherits System.Web.UI.Page

 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ConfigureCrystalReports()
    End Sub

 

    Private Sub ConfigureCrystalReports()

        '连接字串

        Dim connstr As String = "Provider=SQLOLEDB;Persist Security Info=False;Data Source=服务器名;" _
                & "Initial Catalog=数据库名;User ID=pa;Password=123"

        Dim da As OleDbDataAdapter = New OleDbDataAdapter()
        Dim cn As OleDbConnection = New OleDbConnection(connstr)
        '
        da = New OleDbDataAdapter(" SELECT   a.storeName ,  b.salesDate ,  c.productName,  b.quantity     " _
                                  & "FROM store  a, outstock b, product c  " _
                                  & "WHERE a.storeID =b.storeID     and b.productID =c.productID     and b.quantity >50", cn)
        '创建我们的DataSet1实例
        Dim dt1 As DataSet1 = New DataSet1()
        '填充dt1
        '注意:表名mytable必须与我们在xsd设计的表名称一致。
        '本例中SQL的表实际名称各异,而最终是以mytable为准的(即:xsd中定义的DataTable名称为准)
        '使用 PUSH模式的优点就在此,可以自由组合SQL
        '前提是:字段名--需要在SQL中使用as别名的方式跟xsd中设计的字段名一致
        da.Fill(dt1, "mytable")

        Dim myReport As ReportDocument = New ReportDocument()
        Dim reportPath As String = Server.MapPath("crystalreport1.rpt")
        myReport.Load(reportPath)

        '绑定数据集,注意,一个报表用一个数据集。
        myReport.SetDataSource(dt1)
        CrystalReportViewer1.ReportSource = myReport

    End Sub

End Class

然后运行就可以了。



这里做一下说明,在【推拉之间】没有说这个xsd,是因为当时没讲到细节操作。
说了很难理解。
这个xsd,是我们自己构造的,做个比喻吧:
就是xsd比作个一个架子,它负责把水晶报表撑起来,但是是空的,没有内容
我们用 PUSH模式,把数据塞给它,把架子塞满,这样水晶报表也就能呈现出效果来


常见问题:
1:报表可以显示出来,但是没数据,
一般有以下几种情况
a:表中确实没数据
b:da.Fill(dt1, "mytable");表名称与xsd中设计的表不一致
c: 如果你用了多个表,可能是因为表默认的关联关系导致无数据

2:出现下面这个图的提示,特别是翻页、打印、导出的时候,因为这些动作都需要重新连接数据库源。


a:如果是多表的话,可能是部分表没有赋值。
  水晶报表需要对用到的每个表进行验证,即使没数据。没有的话,传个空的记录集也行。
b:代码没有放到Page_Load或Page_init里,或者是放到了,但是控制了 postback。
  因为http是无状态的,如果控制了postback,水晶报表就丢失了前面的设置,会导致出现此情况的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值