博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
水晶报表的推拉模式的具体实现
阅读量:5734 次
发布时间:2019-06-18

本文共 4933 字,大约阅读时间需要 16 分钟。

水晶报表在应用时分两种方法,分别是拉模式(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 += @"\RP\RPT\" + 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参数是自己在报表模板中手动添加的.而不是报表原来的带@的那种, 如果是带@的那种,则传递过去的报表在报表设计中始终显示空白,也就是不起作用.我不知道是何原因,网上也一直未找到原因, 如各位大侠知道,望不吝赐之.下图为设计画面.

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

转载于:https://www.cnblogs.com/Geton/p/4007939.html

你可能感兴趣的文章
面试中会遇到的正则题
查看>>
Spring之旅第八站:Spring MVC Spittr舞台的搭建、基本的控制器、请求的输入、表单验证、测试(重点)...
查看>>
数据结构与算法——常用排序算法及其Java实现
查看>>
你所不知的Webpack-多种配置方法
查看>>
React.js 集成 Kotlin Spring Boot 开发 Web 应用实例详解
查看>>
《图解HTTP》学习笔记(四):返回结果的HTTP状态码
查看>>
翻译连载 | 附录 B: 谦虚的 Monad-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇...
查看>>
Spring 学习笔记(一)Spring核心容器
查看>>
webpack+typescript+threejs+vscode开发
查看>>
python读excel写入mysql小工具
查看>>
如何学习区块链
查看>>
搜索问题的办法
查看>>
微信分销系统商城营销5大重点
查看>>
求职准备 - 收藏集 - 掘金
查看>>
【Java】类的循环初始化是否会引起死锁?
查看>>
htm5新特性(转)
查看>>
Linux-Centos启动流程
查看>>
php 设计模式
查看>>
后端技术精选 - 收藏集 - 掘金
查看>>
Laravel 服务容器
查看>>