空白报表如何通过编程方式指定数据库文件?比如我现在有个sf.mdb,通过openfiledialog浏览到后如何让预定格式的1.rpt连接到这个文件?如何让用户可以指定某一表?又如何让某一表的全部或者某些字段成为显示列?我现在连是否可以办到这些都不太明白,高人指教~!

解决方案 »

  1.   

    你我也在考虑相同的问题,你看用DataSet可以不。
      

  2.   

    有没有高人解释下下面说的方法?============================================动态设置数据源(采用push方式)   
        
      1.根据报表的结构字段,建立一个xsd文件,用来存放数据。   
        
      2.新建一个报表,注意建立的时候要浏览到该xsd文件,   
        
            建好后找到该报表的属性"自定义工具",把原来的   
        
          "CrystalDecisions.VSDesigner.CodeGen.ReportCodeGenerator"   
        
          改为"CrystalDecisions.VSShell.CodeGen.ReportCodeGenerator"   
        
          这样就会产生一个按照你报表名命名的zsmxb.cs文件,其实就是下面的类zsmxb   
        
            同时建立一个页面,把CrystalReportViewer控件放到页面,   
        
            并且要在该页面文件的顶部申明一下报表的类,   
        
            public   class   Fr_zsmxb   :   System.Windows.Forms.Form   
            {   
                      zsmxb   crReportDocument;   
        
                    .........   
        
      3.建立报表结构   
        
            DataSet   dss=new   DataSet();   
            DataTable   dt=new   DataTable("zsmxb");   
            dt.Columns.Add("cchbh",System.Type.GetType("System.String"));   
            dt.Columns.Add("nglf",System.Type.GetType("System.Decimal"));   
            dt.Columns.Add("ncf",System.Type.GetType("System.Decimal"));   
            dt.Columns.Add("nqyf",System.Type.GetType("System.Decimal"));   
            dt.Columns.Add("nzsf",System.Type.GetType("System.Decimal"));   
            dt.Columns.Add("ntcf",System.Type.GetType("System.Decimal"));   
            dt.Columns.Add("ngz",System.Type.GetType("System.Decimal"));   
            dt.Columns.Add("nzjf",System.Type.GetType("System.Decimal"));   
            dt.Columns.Add("nylf",System.Type.GetType("System.Decimal"));   
            dt.Columns.Add("nwxf",System.Type.GetType("System.Decimal"));   
            dt.Columns.Add("nsy",System.Type.GetType("System.Decimal"));   
            dt.Columns.Add("nqtf",System.Type.GetType("System.Decimal"));   
            dt.Columns.Add("nxj",System.Type.GetType("System.Decimal"));   
            dss.Tables.Add(dt);   
        
            注意:这里的DataTable   dt=new   DataTable("zsmxb");这句中表名"zsmxb"要和你的xsd文件中的表名要一样,   
        
          同时,dt的字段名、类型,都要和xsd文件一样,否则回产生"查询引擎错误"。   
        
      4.为这个ds传入数据   
        
            for(int   i=0;i<this.ds.Tables["zsmxb"].Rows.Count;i++)   
            {   
              DataRow   dr=dt.NewRow();   
              dr["cchbh"]=this.ds.Tables["zsmxb"].Rows[i]["cchbh"];   
              dr["nglf"]=this.ds.Tables["zsmxb"].Rows[i]["nglf"];   
              dr["ncf"]=this.ds.Tables["zsmxb"].Rows[i]["ncf"];   
              dr["nqyf"]=this.ds.Tables["zsmxb"].Rows[i]["nqyf"];   
              dr["nzsf"]=this.ds.Tables["zsmxb"].Rows[i]["nzsf"];   
              dr["ntcf"]=this.ds.Tables["zsmxb"].Rows[i]["ntcf"];   
              dr["ngz"]=this.ds.Tables["zsmxb"].Rows[i]["ngz"];   
              dr["nzjf"]=this.ds.Tables["zsmxb"].Rows[i]["nzjf"];   
              dr["nylf"]=0;   
              dr["nwxf"]=0;   
              dr["nsy"]=0;   
              dr["nqtf"]=this.ds.Tables["zsmxb"].Rows[i]["nqtf"];   
              dr["nxj"]=System.Convert.ToDecimal(dr["nglf"].ToString())+System.Convert.ToDecimal(dr["ncf"].ToString();           
        
            dt.Rows.Add(dr);   
            }     
        
      这里的ds是同过查询得到的,这里只是举个例子。   
        
      5.把得到的报表数据源dss绑定到水晶报表。   
        
            crReportDocument=new   zsmxb();   
            crReportDocument.SetDataSource(dss);   
            crystalReportViewer1.ReportSource   =   crReportDocument;
      

  3.   

    可以 动态换数据源。不过代码记不起来(有点多),等明天我去公司看看。
    还有你后面的几个问题,你是用vs2003?是的话,打开一个报表文件是可以设置连接源的,一般双击oledb(选择连接驱动的对话框)来选择你要连接的模式,等数据源确定后,就可以把字段往报表中拖了。
      

  4.   

    你是用vs2003?是的话,打开一个报表文件是可以设置连接源的=====================我知道。但这是在设计报表的阶段啊。我的报表设计好了后,在程序运行中,又如何让用户可以选择数据源呢》?如果方便的话,你的代码可否简要地发往:[email protected].多谢兄台!
      

  5.   

    aihui109() 兄弟出来说个话呀。。
      

  6.   

    可以在程序运行中改变数据源,不过好像只能适应改Web.config里链接源的那种。
    我们公司开发部不能上网啊。兄弟你急不?我明天去用纸抄(脑袋笨,实在记不住)。
      

  7.   

    呵呵。。太感谢了。那劳费你了。不过我的代码用在winform上。。无论如何,对我有很大的参考价值。。再次感谢兄台出手!
      

  8.   

    using System;
    using CrystalDecisions.Shared;
    using CrystalDecisions.CrystalReports.Engine;namespace WebComPoc
    {
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    public class Print
    {
    public Print()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    } public static void SetDatabaseLogonInfo(CrystalDecisions.CrystalReports.Engine.ReportDocument source)
    {
    CrystalDecisions.Shared.TableLogOnInfo logOnInfo = new CrystalDecisions.Shared.TableLogOnInfo();
    int i = 0;
    for(i = 0;i <source.Database.Tables.Count; i ++)
    {
    //设置服务器名
    logOnInfo.ConnectionInfo.ServerName = "bssrv";
    //数据源
    logOnInfo.ConnectionInfo.DatabaseName = "sbms";
    //登录名
    logOnInfo.ConnectionInfo.UserID = "sa";
    //密码
    logOnInfo.ConnectionInfo.Password = ""; source.Database.Tables[i].ApplyLogOnInfo(logOnInfo);
    }
    //设置子报表
    for(i= 0;i<source.ReportDefinition.ReportObjects.Count;i++)
    {
    if(source.ReportDefinition.ReportObjects[i].Kind == ReportObjectKind.SubreportObject)
    {
    ReportDocument subReport = source.OpenSubreport(((SubreportObject)(source.ReportDefinition.ReportObjects[i])).SubreportName);
    //子报表
    SetDatabaseLogonInfo(subReport);
    }
    }
    }
    }
    }
      

  9.   

    是啊。我这是web的,希望能给你提示。
    这个函数用在 水晶报表 的显示之前。
    source.Load("报表路径"),得到source传到上面的函数中去。