【水晶报表内功心法】--数据过滤

阿泰 2009-07-13 01:42:46
加精
索引

.【水晶报表内功心法】--序言
.【水晶报表内功心法】--推拉之间
.【水晶报表内功心法】--PULL模式样板招式
.【水晶报表内功心法】--PUSH模式样板招式
.【水晶报表内功心法】--信手拈来,掌控对象
....
....
.【水晶报表内功心法】--完美Excel(上)
.【水晶报表内功心法】--完美Excel(下)
============================================================
周末比上班忙,好不容易等老婆和孩子都睡下了,才终于能静下心来写点东西,不知不觉地都是后半夜了。

在讲解了PULL和PUSH模式后,有一个问题随着而来。
两篇文章中,都从数据表中取了完整的数据,而实际应用中,我们一般只会用到其中的一部分数据,也就是要对数据进行过滤。
数据过滤的操作,在这里我归并为两个要点:一是要实现数据过滤,二是要把过滤条件显示在报表上。

1:PUSH模式下的数据过滤方法

这两个要点的实现,在PUSH模式下是非常方便的,我这里也只是做一下说明
只要在
 da = new OleDbDataAdapter("SELECT * From RPT_CR_TEST1", cn);
加上过滤条件即可

而过滤条件可以通过参数传递给报表,进行显示
myReport.SetParameterValue(参数名,参数值);


很容易理解吧。

2:PULL模式下的数据过滤的几种实现方法

之前经常看到一些代码里,为了实现数据过滤,用PULL制作了模板,然后用PUSH方式再SetDataSource一个动态记录集过去的错误做法。
PULL模式下,用到的是“记录选定公式”。
这里我直接在模板里操作一下,因为PULL模式是直接连数据库的,所以可以立刻看到效果

我们的初始模板是这样的,

目标是要显示出图上粉色标注出的数据,也就是Scores<=11

(1)在模板上点右键,插入,特殊字段,记录选定公式


看到这个图,估计有些朋友会想到前面我们文章里用到的ReportObject,不错,这个也是报表对象
不过我们这里暂时不是用报表对象的操作功能

(2)在这个“记录选定公式”上点右键,选“选择专家”


(3)在这个界面上选我们要控制的字段“Scores”,点确定


(4)在后面的界面上,设定条件为 小于或等于 11


点“显示公式”,可以看到我们设置的条件,在这个公式框里,可以输入更复杂的过滤条件,如多个字段的过滤条件等
要注意,该过滤条件,必须符合当前数据的语法。


确定后我们要的结果就出来了,上面是选定的条件。


后面要说很重要的一点,就是这个过滤条件,是推到服务器端去执行的,而不是先拉下数据,再过滤
下面是我在执行过程中在SQL性能监视器中的抓图(这个图可能被被缩小,请另存到本地看)

注意绿色的部分,条件已经直接附加上去了。

(5)如果要删除条件的话,仅仅把前面在模板上的那个记录选定公式拿掉是不行的。
再次进入刚才我们设置的那个界面,点“删除”才可以。


(6)
这个是模板上的设定,而且是个固定的值,那么怎么结合到代码中,实现灵活控制呢?其实代码很简单。

前面是讲解了原理的,实际上操作中,根本不用上述的任何操作。(白讲了?呵呵,我更希望大家能明白他具体是怎么去实现的)
只要在代码中加一行就可以了。

这是我们的基础代码

myReport = new ReportDocument();
string reportPath = Server.MapPath("Crystalreport1.rpt");
myReport.Load(reportPath);

//定义水晶报表的数据库连接信息
ConnectionInfo connectionInfo = new ConnectionInfo();
connectionInfo.DatabaseName = "crZenSample";
connectionInfo.UserID = "sa";
connectionInfo.Password = "*****";
connectionInfo.ServerName = "ataipc";
//设置报表里的认证信息(这个方法参见之前的文章)
SetDBLogonForReport(connectionInfo, myReport);
CrystalReportViewer1.ReportSource = myReport;


只需要这么一句,真的。~~
//注意字段名称要遵照水晶报表里的语法规则 表名.字段 ,语句要符合当前数据库的语法
//此代码段放在CrystalReportViewer1.ReportSource = myReport;前后均可
myReport.RecordSelectionFormula = "{RPT_CR_TEST1.Scores} <=11";


这是方法一。

(7)延续上面的例子,忽略掉(6),结合起来参数来实现。这个实现起来稍微有点繁琐,不过在某些场合用的到。
新一个数值型参数testP


(8)编辑我们的记录选定公式,使其大于参数{?testP}


(9)预览一下,输入13


效果出来了


再跟踪一下SQL,仍然是组合好传给数据库的


(10)写代码,使用此方法,因为记录选定公式已经内嵌在报表中,代码中只需要控制参数就行了。

CrystalReportViewer1.ReportSource = myReport;
//此句可以出现在CrystalReportViewer1.ReportSource = myReport;之前或之后
myReport.SetParameterValue("testP", 13);


(11)部分人的参数是这样写的。。好复杂。。

//把参数代码段放到CrystalReportViewer1.ReportSource = myReport;后面
CrystalReportViewer1.ReportSource = myReport;

ParameterFields paramFields = new ParameterFields();
ParameterField paramField = new ParameterField();
ParameterDiscreteValue discreteVal = new ParameterDiscreteValue();
paramField.ParameterFieldName = "testP";
discreteVal.Value = 13;
paramField.CurrentValues.Add(discreteVal);
paramFields.Add(paramField);
CrystalReportViewer1.ParameterFieldInfo = paramFields;


之所以要说一下这个复杂的代码,是因为用这个复杂代码的目的,本来是为了做区间参数和多值参数的
其目的主要是为了实现过滤条件里的
{表名.字段} in (1,2,3,4,5){表名.字段} between 100 and 200这种效果

而实际上,这样的代码完全可以写在我们所说的方法1里面
myReport.RecordSelectionFormula = "{RPT_CR_TEST1.Scores} <=11";
界面上加一个简单的文本参数提示即可,不需要那么复杂,呵呵。
给使用这种方法的朋友,减轻点工作量,呵呵。


其他:
1:实际上PUSH模式报表也可以用这种方法的,操作方法和基本代码都一样
但是因为其本身不连接数据库,所以这个条件不会被推送到数据库执行
而是在当前数据下依赖于报表能力的一个过滤,反而增加了报表的负担和数据的传输量
一般是不建议使用的。


写完这一篇,整个数据层面的基础体系就基本完善了。

预告:第一阶段小结与答疑

...全文
5404 62 打赏 收藏 转发到动态 举报
写回复
用AI写文章
62 条回复
切换为时间正序
请发表友善的回复…
发表回复
dh1230 2011-12-06
  • 打赏
  • 举报
回复
如果有时要显示全部怎么办?
lanpeng11 2011-10-21
  • 打赏
  • 举报
回复
涛哥 ?
CtrlJava 2011-05-09
  • 打赏
  • 举报
回复
LICHUNLI1022 2010-12-08
  • 打赏
  • 举报
回复
感谢,收获很大!
willy2013 2010-11-27
  • 打赏
  • 举报
回复
感谢阿泰!
a174740341 2010-09-14
  • 打赏
  • 举报
回复
阿泰好人
justin18 2010-09-01
  • 打赏
  • 举报
回复
辛苦了~
reason159 2010-08-26
  • 打赏
  • 举报
回复
阿泰哥,辛苦了
ggxboy1986 2010-07-21
  • 打赏
  • 举报
回复
qiang
boylsc 2010-04-28
  • 打赏
  • 举报
回复
刚刚接触报表,感觉泰哥讲的很详细,很基础!
谢谢!!!
  • 打赏
  • 举报
回复
阿泰,不是一般人。
走向下一篇。
  • 打赏
  • 举报
回复
来晚了,但是坚持学习。
h821291419 2010-01-09
  • 打赏
  • 举报
回复
好东西
Silvia_King 2009-12-14
  • 打赏
  • 举报
回复
向泰哥学习
无语中V5 2009-09-21
  • 打赏
  • 举报
回复
学习了,谢谢。
小可丁儿 2009-07-29
  • 打赏
  • 举报
回复
才看到 依然感谢
xueyuan01 2009-07-27
  • 打赏
  • 举报
回复
up
w20011025 2009-07-23
  • 打赏
  • 举报
回复
mark
单线程加锁 2009-07-23
  • 打赏
  • 举报
回复
UP
gwf25sz 2009-07-23
  • 打赏
  • 举报
回复
做高手很不容易啊~~!
不简单~!
加载更多回复(39)
内容概要:本文系统研究了基于豪猪优化算法(CPO)的多无人机协同集群在三维空间中的避障路径规划问题,聚焦于实现以最低成本为目标的航迹优化,综合考虑路径长度、飞行高度、威胁规避及转弯角度等多个关键因素。通过构建精细化的三维环境模型与多无人机协同机制,采用Matlab平台实现CPO算法的仿真与验证,充分展示了该算法在复杂动态障碍环境下的高效搜索能力与全局优化性能。研究不仅涵盖了路径规划的数学建模与目标函数设计,还深入探讨了算法的收敛特性与鲁棒性,为智能群体系统在实际场景中的应用提供了理论依据与技术支撑。; 适合人群:具备一定编程基础和优化算法背景,从事无人机系统控制、智能路径规划、群体协同、人工智能与自动化等相关领域的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于多无人机协同执行侦察、灾害监测、应急救援、区域巡检等复杂任务中的自主路径规划;②为智能优化算法在三维动态环境下的路径决策问题提供可复现的技术范例;③支持研究人员对CPO算法与其他主流群智能算法(如PSO、GWO、WOA等)进行性能对比与改进研究,推动路径规划技术的发展。; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点理解目标函数的多维度建模方式与CPO算法的迭代优化流程,可通过调整环境参数与约束条件进行仿真实验,对比不同算法在相同场景下的路径质量与收敛速度,从而深入掌握其优势与适用边界。
内容概要:本文围绕电动汽车参与电力系统运行备用的能力评估展开深入研究,利用Matlab代码实现对电动汽车集群提供运行备用服务的建模与仿真分析。研究重点在于量化电动汽车作为分布式灵活资源参与电网辅助服务的潜力,通过构建精细化的数学模型,分析其可调功率容量、响应速度、时空分布特性及聚合能力,并采用多面体聚合、内近似模型与闵可夫斯基和等先进方法精确刻画其可调度能力边界。研究进一步结合大规模电动汽车接入场景,探讨其在多时间尺度调度框架下参与调峰、调频等辅助服务的优化策略,评估其对提升高比例可再生能源电网灵活性与稳定性的贡献,最终通过仿真验证所提模型与方法的有效性与实用性。; 适合人群:具备电力系统分析、智能电网、新能源汽车或优化调度等相关专业背景,熟悉Matlab/Simulink仿真工具,从事科研、工程应用的高校研究生、科研人员及电力行业工程师。; 使用场景及目标:①精确评估大规模电动汽车集群在不同约束条件下可提供的运行备用容量;②研究电动汽车在日前、日内及实时调度中的动态响应能力与优化调度策略;③为高渗透率新能源电力系统提供基于移动储能的灵活性资源解决方案,支撑电网安全经济运行。; 阅读建议:建议结合Matlab代码与技术文档同步学习,重点关注多面体聚合建模、能力边界计算及优化调度算法的设计与实现,可进一步拓展至V2G(车辆到电网)、需求响应等互动场景进行二次开发与应用验证。
打开链接下载源码: https://pan.quark.cn/s/a4b39357ea24 OpenCV(开源计算机视觉库)中的DNN(Deep Neural Network)模块是一种功能强大的工具,其目的是用于深度学习模型的操作。该模块使得开发人员能够在OpenCV环境中直接运用已经训练好的深度学习网络,以执行图像识别、目标检测、图像分割等多种功能。DNN模块能够兼容多种深度学习框架的模型,包括TensorFlow、Caffe、ONNX等。 一、DNN模块概述 OpenCV的DNN模块是为了简化深度学习模型的集成过程而专门设计的,它允许开发人员加载预先训练好的神经网络模型,并在图像数据上执行前向传播操作。借助这个模块,用户可以选用GPU或者CPU来提升计算效率,从而构建出高效的应用程序。 二、目标检测案例 在OpenCV的DNN模块中,目标检测是一个常见的应用情形。例如,可以选用SSD(Single Shot Multibox Detector)、YOLO(You Only Look Once)或者 Faster R-CNN 等模型进行实时的目标检测。这些模型能够识别并定位图像中的多个对象,并返回每个对象的类别和边界框坐标。 三、模型转换:PB到PBTXT 在OpenCV中运用TensorFlow模型时,通常需要处理的是`.pb`格式的模型文件,这是TensorFlow的二进制模型文件格式。然而,为了能够读取模型的结构信息,我们需要`.pbtxt`格式的文本文件。转换过程涉及解析`.pb`文件并将其结构信息导出为`.pbtxt`格式,这样做可以让人清晰地了解网络层和参数的配置。在OpenCV中,可以使用`tf.train.write_graph()`函数将.pb...

4,818

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧