水晶报表里有一个push的模式,我想知道怎么回事,pull我知道怎么弄了,可是这个push是怎么弄,说是有一个dateset,我想知道建的过程,比如是先建dateset然后再建CrystalReport,还是怎么样,还有,是不是先让dateset连接数据库?然后在将dateset和CrystalReport绑定,具体流程希望大家帮我说一下,细节部分我自己再多研究研究...

解决方案 »

  1.   

    水晶报表push大家都不怎么熟么???
      

  2.   

    告诉我一下建表的过程就行,比如先建dateset还是什么的,怎么互相连接上告诉我下..
      

  3.   

    我看了,你那个视频我看了好多次了,但是还是不明白,我现在想问几个问题,第一个是我怎么把dateset和CrystalReport连起来,就是在dateset里有两个数据集,是叫数据集吧,怎么让他在CrystalReport里显示出来,就是在CrystalReport设计里也有两个同样的数据库的字段,但是读不出来,还有另一个问题,就是我把数据库里的信息提到dateset里可以再把这些数据处理么,比如统计一下一共有多少信息之类的?
      

  4.   

    这我知道,他的BOLG和什么空间的还有视频我都看老多了,可是还是弄不太明白,我一个刚毕业的大学生,进公司就给我整这个项目,一点头绪都没有....
      

  5.   

    晕菜,是不是我提供给你的那个PUSH模式里的图你看不到?
      

  6.   

    图文的那个看不到,全是X,我也不知道为什么,在你BLOG看到的那个文章也是图片全看不到,阿泰哥,能抽出几分钟时间帮我写一下做push模式的流程么,比如先建dateset再建什么CrystalReport,然后他们之间怎么联系的,怎么把数据库的信息提出来,然后用一个柱形图表示出来,能麻烦帮下忙么?
      

  7.   

    我在CrystalReport里的数据库字段里点右键,选数据库专家了,然后里面的选定的表里也已经把之前设计的dateset里的两个字段放进去了,那是不是应该说我现在在CrystalReport里点主报表预览就能看到数据库里的信息了,还是要在后台写代码才能看到,那代码应该怎么写?
      

  8.   


    回头我把图片补上去。
    但其实你看了视频,应该也会有感觉的,。
    我在我的教程里说过
    水晶报表是对个动手能力有要求的工具,没有一定的经验,光凭想是很难去理解的
    所以我的主张就是不管你理解了没,照着我的视频去做一下,其实花不了多少时间。

    做一下,就会有感觉。你把大量时间浪费在问问题和焦急地等待上了,
    你先要解决的问题是怎么连上库,怎么显示出数据,然后再去做别的这个需求对我来说很简单,但是我做完了,你可能还是不会。
    我的视频已经帮助了千余人学会了PUSH模式,希望你也很快成为他们中的一个。
      

  9.   

    哈哈,阿泰啊,别人对你没feeling 啊
      

  10.   

    嗯,我会的,我已经自己动手把pull模式的做过了,感觉自己会了,但是我这个项目用pull根本解决不了我的问题,我必须得用push模式的,我自己动手做了很多次,可是就是不能让数据正常在图表显示出来,你的视频是不连数据库的,所以可能这样我看着在理解方面会有点问题,还有我做的是winform,虽然和web差不了多少,但是我还是不行,毕竟我大学没学过C#,是才来这公司现学的,上手比较慢,希望您能帮帮我,我去过挺多编程群,都说您在这方面是绝对的权威...
      

  11.   

    我把图补上去了
    http://topic.csdn.net/u/20090626/18/0e7d0af0-2555-479d-9cb5-84175787f2cd.html我在这里连了数据库
    //连接字串
            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);我的数据库是Access,别的库也一样,只是连接串不同罢了。仔细看一下吧。当你能把你的数据显示在报表上的时候,再去考虑其他的需求。
    一步一步来。
      

  12.   

    还有我能问一下么,winform和webform的做法是一样的么?还有您能看一下我21楼的内容么,能给我个介意应该怎么做么?
      

  13.   


    就水晶报表的代码段说,WinForm和WebForm基本没区别。请看我28楼,倒数第2行。
      

  14.   

    这是阿泰哥的教程push里的一段代码,里面红色的那句,里面的那个Server,当我运行后提示我当前上下文不存在Server,这是怎么回事?
    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;    }}
      

  15.   

     String connstr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\CrZen\testall.mdb;";这个是我的一个本地测试数据库,你要按照你的实际情况,替换成你自己的库和自己的表。PS:很高兴你开始做了,但是要注意按照步骤逐一来,代码最好自己敲,不是只拷贝一下。
      

  16.   

    这个我知道,我把你那里的连接串换成
    String connstr = "Data Source=wise;user=wise;password=wise";
    这样没错吧,我连接的是oracle数据库,对了,那个为什么会提示我上下文不存在Server?这是一个什么?变量么?需要提前定义么?
      

  17.   

    Oracle的话你这样前面加上
    using Oracle.DataAccess.Client;后面的那段替换成
     String connstr = @"Data Source=wise;user=wise;password=wise;";
            OracleDataAdapter da = new OracleDataAdapter();
            OracleConnection cn = new OracleConnection(connstr);
            da = new OracleDataAdapter("SELECT * From RPT_CR_TEST1", cn);
            DataSet1 dt1 = new DataSet1();
    da.Fill(dt1, "mytable");
    //..前提是你本机是能连到oracle服务器上的
            
      

  18.   

    连接串我是这么写的,可以么,我引用的是using System.Data.OleDb;
    还有那个@是必写的么,对了,那代码下面的那个string reportPath = Server.MapPath("crystalreport1.rpt");这一句里的Server还是提示找不到是怎么回事?
     String connstr = "Data Source=wise;user=wise;password=wise";
                OleDbDataAdapter da = new OleDbDataAdapter();
                OleDbConnection cn = new OleDbConnection(connstr);
                //
                da = new OleDbDataAdapter("SELECT ID,ALARM_TIEM From sms_alarm", cn);
      

  19.   

    1.新建一个水晶报表
    2.再建一个dataset.xsd
    3.在水晶报表中选择字段资源管理器,数据库字段
    3.建一个form窗体,里面放入crystalReportViewer
    4.接着绑定
    如:
    string sql ="select * from 表"                
    SqlDataAdapter da = new SqlDataAdapter(sql, conn);
    myDataSet myds = new myDataSet();
    da.Fill(myds, "DataTable1");
    CrystalReport1 cr1 = new CrystalReport1();
    cr1.SetDataSource(myds);
    crystalReportViewer1.ReportSource = cr1;
      

  20.   

    你好,我能问一下,就是这个顺序如果打乱可以么,比如先建form,然后在上面放一个crystalReportViewer再建dateset,然后再建一个crystalReport,这样打乱顺序会有影响么?
      

  21.   

    string reportPath = Server.MapPath("crystalreport1.rpt");
    是web写法
    你可以简单的写成
    string reportPath = "c:\crystalreport1.rpt";这样的物理路径,前面的数据库地方你不用改就可以了,我看错了,呵呵
      

  22.   

    在 ConnectionString 中未指定 OLE DB 提供程序。示例为:“Provider=SQLOLEDB;”。
    运行后出现这个问题是怎么回事,是在OleDbConnection cn = new OleDbConnection(connstr);这一句上
    我的整个代码是 //连接字串
                String connstr = "Data Source=wise;user=wise;password=wise";
                OleDbDataAdapter da = new OleDbDataAdapter();
                OleDbConnection cn = new OleDbConnection(connstr);
                //
                da = new OleDbDataAdapter("SELECT ID,ALARM_TIEM From sms_alarm", cn);
                //创建我们的DataSet1实例
                DataSet1 dt1 = new DataSet1();
                //填充dt1
                //注意:表名mytable必须与我们在xsd设计的表名称一致。
                //本例中数据库的表实际名称为RPT_CR_TEST1,而最终是以mytable为准的
                //使用 PUSH模式的优点就在此,可以自由组合SQL
                //前提是表名称和字段名(需要在SQL中使用as别名的方式跟xsd中设计的字段名一致)都要一致
                da.Fill(dt1, "CrystalReport1");            ReportDocument CrystalReport1 = new ReportDocument();
                string reportPath = @"C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\pushing\pushing\Crystalreport1.rpt"; 
                CrystalReport1.Load(reportPath);            //绑定数据集,注意,一个报表用一个数据集。
                CrystalReport1.SetDataSource(dt1);
                crystalReportViewer1.ReportSource = CrystalReport1;
      

  23.   

    OleDbDataAdapter不能识别你这个链接串。
    你还是换上我38楼的代码段吧
      

  24.   

    这一句da.Fill(dt1, "CrystalReport1");提示我
    ORA-12154: TNS: 无法处理服务名
    这是怎么回事,刚才去吃饭了,所以才回..
      

  25.   

    ORA-12154这个错误参考http://edu.cnzz.cn/NewsInfo/2797.aspx
    http://www.cnblogs.com/xh3/archive/2007/04/21/722217.html
      

  26.   

    有时候tnsname里面的配置不同,会导致这个错误信息
    如果你的机器已经能正确连上的话,你可以参考
    http://www.connectionstrings.com/oracle
    换几种链接串试试。这个地方跟水晶报表本身没有任何关系,你可以参考你的项目里的其他代码是怎么连的库。
    因为你这个项目就是用oracle的
      

  27.   

    这个要看机器环境。问一下,你现在的项目用的是oracle,那你现在项目里是怎么连的?
    基本代码是什么,随便贴段出来看看
      

  28.   

      int count = 0;
                 string ConnectionString = "Data Source=wise;user=wise;password=wise";//写连接串    
                OracleConnection conn = new OracleConnection(ConnectionString);//创建一个新连接   
                conn.Open();
                OracleCommand cmd = conn.CreateCommand();
                cmd.CommandText = "select * from(select  * from sms_alarm where is_deal=0 and id<" + a + " order by alarm_time desc) where rownum<=1";//在这儿写sql语句       
                OracleDataReader odr = cmd.ExecuteReader();//创建一个OracleDateReader对象            while (odr.Read())//读取数据,如果odr.Read()返回为false的话,就说明到记录集的尾部了    
                {
                    count++;
                    textBox4.Text = odr.GetOracleString(1).ToString();
                    textBox5.Text = odr.GetOracleString(2).ToString();
                    textBox6.Text = odr.GetInt32(3).ToString();
                    textBox1.Text = odr.GetOracleString(7).ToString();
                    
                               }            odr.Close();
                cmd.Clone();
                conn.Close();
    这是比如我的一段代码,就是连接数据库,然后读到一些信息然后显示在窗体的textbox上
      

  29.   

      string ConnectionString = "Data Source=wise;user=wise;password=wise";//写连接串这个好像没指定服务器吧,
      

  30.   

    你先把数据库连接那块搞好,从项目里面其他地方,搞一个可以连接的代码段过来,
    改下sql语句,检索出数据先然后在处理报表的事。
      

  31.   

    现在连接没问题,主要是dateset数据集那的问题,我要把从数据库里提出来的信息在数据集里面统计好,然后在报表里显示出来..
      

  32.   

    哎,看了这么多,其实很简单
    你需要新建一个强类型的DATASET数据集,这个数据集里装的是你要显示的数据表
    在水晶报表那边画好格式后
    有一个字段资源管理器
    那里有一个项目数据库下的ADO.NET对像,这个里面应该能刷出来那个声明的DATASET
    设置好后你就能看到数据表里的字段
    把要显示的托到要显示的地方(报表详细是数据显示,报表页眉是报表头)
    这样就可以进行显示了
    你可以试一下
      

  33.   

    前段时间我试着用水晶报表连了一下SQL数据库,但是发布后,水晶报表不能用
    我的是网页版的,楼主作的是什么的
      

  34.   

    68楼,我就是那么做的,可是一运行就只能显示出字段名,而显示不出我要查询的内容..
    比如正常应该是
         ID                       字体
          1                         3
         2                         4
         5                         6
    但是我运行之后就是
         ID                          字体
    然后下面什么都没有,DATESET里和代码里的查询语句我也写了也是一至的,可就是显示不了信息..
      

  35.   

    我做的是winform,连的是oracle...
      

  36.   


            private void Form1_Load(object sender, EventArgs e)
            {
                //连接字串
                String connstr = "Data Source=wise;user=wise;password=wise;";
                OracleDataAdapter da = new OracleDataAdapter();
                OracleConnection cn = new OracleConnection(connstr);
                da = new OracleDataAdapter("SELECT ALARM_TIME1,IS_DEAL FROM WISEFLY.SMS_ALARM", cn);
                DataSet1 dt1 = new DataSet1();
                da.Fill(dt1, "sms_alarm");
                string vl = dt1.Tables["sms_alarm"].Rows[0][0].ToString();            //            //创建我们的DataSet1实例            //填充dt1            ReportDocument CrystalReport1 = new ReportDocument();
                string reportPath = @"C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Crystalreport1.rpt";
                CrystalReport1.Load(reportPath);            //绑定数据集,注意,一个报表用一个数据集。
                CrystalReport1.SetDataSource(dt1);
                crystalReportViewer1.ReportSource = CrystalReport1;        }
      

  37.   

    首先恭喜程序终于跑起来了1:跟踪一下dt1是否有数据
    2:报表模板里的用到的表的名称,是叫sms_alarm吗?
      

  38.   

    阿泰哥,我现在这个程序能正常跑起来,也能正常显示了,我现在想实现的是比如,一个DATESET里有两个数据,分别为alarm_time和is_deal,alarm_time我想正常把它放在x轴上,is_deal这个我想把它统计出来,比如说我查的天数,这一天里有几个is_deal,然后就显示出来,这个is_deal在数据库里是一个字段,里面只是有0~3变化的值,打个比方吧,我想找09年9月1号的信息,那这一天一共有几条,我就把这几条给统计出来然后显示在图表上,应该怎么做?
      

  39.   

    da.Fill(dt1, "mytable"); 
    这一句非常重要,mytable其实就是你自己建立的dataset,美女!
      

  40.   

    http://hi.baidu.com/freezesoul/blog/item/d901520fe79c832e6059f3d3.html看这里 看这里
      

  41.   

    谢谢你,我现在正常显示出数据已经没问题了,我只是想再深入的问一下,就是dateset里有两个字段,我想让其中一个当做x轴,另外一个让它统计后再显示在y轴上,比如有几条?
      

  42.   

    A  B
    a1 1
    a1 2
    a1 3
    a2 2
    a2 3
    ----------
    报表设计里
    右键 insert -->chart...
    选择一个type
    data里面 on change of 里面添加字段A
             show values 里面添加字段B-->统计个数就是公式count of B
                                    -->求和就是   sum of B
    ---------------------------------------
    最后就是这样
    _________________________________________
    |                                        |
    |                                        |
    |                                        |      count of B
    |        |                               |
    |        |               |               |
    |________|_______________|_______________|
             a1              a2
                     A是不是这么回事
      

  43.   

    lz你还活着吗,没有被boss秒杀吧?
      

  44.   

    不好意思各位,10.1假期和朋友去旅游了,所以这几天没工作,项目拖后了,因为我用的是oracle数据库,这样项目连数据库时就会必须得在客户机器上装上oracle,而我们的这个项目要在全省发布的,这样的话实现困难太大了,所以BOSS又给了我点时间让我研究网络编程,就是说一个类似代理的方式,让这个代理替我去查数据库,大家有类似的教程的话给我点我学习下,还有水晶报表的问题没解决,我想要估的就是90楼gjw_8888
     说的那样,阿泰哥说的那个我是实现了,我现在想实现的就是90楼说的,唉呀,还没享受完假期就又要开始工作了..
      

  45.   


    是在CrystalReport1.rpt里点右键么,我出现的是中文的,是选插入吧,然后呢,选什么,交叉表么?我用的是2005
      

  46.   

    总算解决了,我能再问问深入的问题么?
    就是我想选取一段时间,然后让图表显示出在数据库里读出的我选取的这段时间内的内容,比如我选了2009-9-1到2009-9-5的,那图表就显示从数据库里提取的这段时间的东西,我选取的时间控件是dateTimePicker,一共有两个,分别为1和2,
    有人说是"select * from 表名 where 数据库中时间字段名>='" + dateTimePicker1.Value.ToString("yyyy-MM-dd") + "' and 数据库中时间字段名<='" + dateTimePicker1.Value.ToString("yyyy-MM-dd") + "'";
      可是我把这个写在后台代码里实现不了啊,这是怎么回事?