• 水晶报表的推拉模式的具体实现


    水晶报表在应用时分两种方法,分别是拉模式(PULL)、推模式(PUSH)。

    拉模式:在水晶报表生成时的数据源是从水晶报表文件中的SQL语句从数据库中提取的,在编程时不用重写SQL语句,但要加上登录信息.

    推模式:在水晶报表生成时的数据源,是用编程时重写水晶报表中SQL语句而生成的dataset对像。也就是说,推模式是用dataset组装水晶报表。

    1. 拉模式实现: DATATABLE不用在代码中实现,直接把参数和登陆信息传递给报表即可.

       public ReportDocument CrystalReports(string strReportFileName, string spName, SqlParameter[] inputParameters)
            {
                //获取报表路径
                // string strReportPath = Application.StartupPath.Substring(0, Application.StartupPath.Substring(0,Application.StartupPath.LastIndexOf("\")).LastIndexOf("\"));
                string strReportPath = Application.StartupPath;
                strReportPath += @"RPRPT" + strReportFileName;
                //得到dt数据源
               // DataTable dt = db.GetDataTable(spName, inputParameters);
                //ReportDocument对象加载rpt文件并绑定到数据源dt
                ReportDocument reportDoc = new ReportDocument();
                try
                {
                    reportDoc.Load(strReportPath);
                  //  reportDoc.SetDataSource(dt); //DataView是接口IEnumerable的实现子类,此处使用了“接口”的多态特性
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message, "软件提示");
                    throw e;
                }
    
               
              
                //水晶报表动态链接数据库
                TableLogOnInfo logOnInfo = new TableLogOnInfo();
                logOnInfo.ConnectionInfo.ServerName = OperatorFile.GetIniFileString("DataBase", "Server", "",
                                                                                    Application.StartupPath +
                                                                                    "\DBConfig.ini");
                // logOnInfo.ConnectionInfo.DatabaseName = "RPTTOOL";
                logOnInfo.ConnectionInfo.DatabaseName = OperatorFile.GetIniFileString("DataBase", "DB", "",
                                                                                Application.StartupPath + "\DBConfig.ini");
                logOnInfo.ConnectionInfo.UserID = OperatorFile.GetIniFileString("DataBase", "User", "",
                                                                                Application.StartupPath + "\DBConfig.ini");
                logOnInfo.ConnectionInfo.Password = OperatorFile.GetIniFileString("DataBase", "Password", "",
                                                                                  Application.StartupPath + "\DBConfig.ini");
    
                // 对报表中的每个表依次循环(把连接信息存入每一个Table中)
                foreach (Table tb in reportDoc.Database.Tables)
                {
                    tb.ApplyLogOnInfo(logOnInfo);
                }
    
               
                
               // reportDoc.Database.Tables[0].ApplyLogOnInfo(logOnInfo);
    
                for (int i = 0; i < inputParameters.Length; i++)
                {
                    // reportDoc.SetParameterValue(i, inputParameters[i].Value); inputParameters[i].ParameterName.ToString()
                    reportDoc.SetParameterValue(i, inputParameters[i].Value);
    
                }
                //返回ReportDocument对象 
                return reportDoc;
                
            }

    2. 推模式.

     private void button1_Click(object sender, EventArgs e)
            {
                string spName = "P_Test ";
    
                if (textBox1.Text != string.Empty)
                {
                    para = textBox1.Text;
                }
                else
                {
                    para = "admin";
                }
    
    
                SqlParameter[] param = new SqlParameter[]{ new SqlParameter("@OperatorCode",para)
                   
                 };
    
                string strReportPath = Application.StartupPath + "\P_Test.rpt";
                //得到dt数据源
                this.DataBase();
                DataTable dt = this.GetDataTable(spName, param);
                //ReportDocument对象加载rpt文件并绑定到数据源dt
                ReportDocument reportDoc = new ReportDocument();
                try
                {
                    reportDoc.Load(strReportPath);
                    //DataView是接口IEnumerable的实现子类,此处使用了“接口”的多态特性
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "软件提示");
                }
    
    
    
                ParameterFields paramFields = new ParameterFields();
                ParameterField paramField = new ParameterField();
                ParameterDiscreteValue discreteVal = new ParameterDiscreteValue();
                // ParameterRangeValue rangeVal = new ParameterRangeValue();
    
    
                paramField.Name = "kj";
                discreteVal.Value = para;
                paramField.CurrentValues.Add(discreteVal);
                paramFields.Add(paramField);
    
              
               
                reportDoc.SetDataSource(dt);
                crystalReportViewer1.ParameterFieldInfo = paramFields; //this.GetParameterFields();
                this.crystalReportViewer1.ReportSource =  reportDoc;
                
                
               // ((TextObject)reportDoc.ReportDefinition.ReportObjects["txt_para"]).Text = para;
    
                   
                  
            }

    这里的KJ参数是自己在报表模板中手动添加的.而不是报表原来的带@的那种, 如果是带@的那种,则传递过去的报表在报表设计中始终显示空白,也就是不起作用.我不知道是何原因,网上也一直未找到原因, 如各位大侠知道,望不吝赐之.下图为设计画面.

    文章中只是稍加描述,如大家有不清楚的,可以联系. 本人将尽最大努力帮助大家, 以期达到共同进步.

  • 相关阅读:
    从POJ1958引发对n盘m塔Hanoi问题的思考
    SPOJGSS3 Can you answer these queries III
    【模板】SPFA判负环(洛谷P3385)
    【模板】强联通缩点(洛谷P3387)
    Luogu P2186 小Z的栈函数
    Luogu P2129 小Z的情书
    LGBT学分块
    LGBT玩扫雷
    A 美丽的子树
    B(升降序列)
  • 原文地址:https://www.cnblogs.com/Geton/p/4007939.html
Copyright © 2020-2023  润新知