玩转SSRS第六篇---客户端报表进阶

上一篇介绍了客户端报表的基本开发。此篇讲介绍如何给客户端报表自定义开发数据源。

通过上一篇我们知道可以通过Dataset的方式给报表添加数据源,这种方式通过UI操作的方式相对来说比较简单。此外我们也可以通过其它方式为客户端报表提供数据源,使数据的组织更灵活。下面将介绍通过项目代码的方式为报表提供数据源。

回顾第三篇我们建立的SSRS报表,它的数据集的结构:

首先,基于上一篇建立的asp.net项目的基础上,添加一个类,这个类的结构将跟上面报表数据集中的结构一模一样。右键项目名称然后Add->New Item…

左侧选择Code,右侧选择Class,为项目添加一个类。

打开创建的类文件,将里面的代码全部替换成:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

 

namespace WebApplication3

{

public class ReportItem

{

public string ProductCategory { get; set; }

public string ShipDate { get; set; }

public double ProductStandardCost { get; set; }

public double SalesAmount { get; set; }

public double TaxAmount { get; set; }

}

}

可以看到这个类结构的定义和先前 SSRS报表的数据集结构是一样的。

接下来再在这个文件中加入另外一个类,ReportTools,用来暴露公共方法为客户端报表提供数据。

public class ReportTools

{

public List<ReportItem> GetReport(string Year)

{

List<ReportItem> result = new List<ReportItem>();

 

SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["AdventureWorksDW2012ConnectionString"].ConnectionString);

conn.Open();

 

StringBuilder sb = new StringBuilder();

sb.AppendLine("SELECT ST.EnglishProductSubcategoryName AS ProductCategory");

sb.AppendLine(",LEFT([ShipDateKey],6) AS [SHIPDATE]");

sb.AppendLine(",SUM([ProductStandardCost]) AS [ProductStandardCost]");

sb.AppendLine(",SUM([SalesAmount]) AS SalesAmount");

sb.AppendLine(",SUM([TaxAmt]) AS [TaxAmt]");

sb.AppendLine("FROM [AdventureWorksDW2012].[dbo].[FactInternetSales] F");

sb.AppendLine("LEFT JOIN [dbo].[DimProduct] P ON F.ProductKey=P.ProductKey");

sb.AppendLine("LEFT JOIN [dbo].[DimProductSubcategory] ST ON P.[ProductSubcategoryKey]=ST.[ProductSubcategoryKey]");

sb.AppendLine("WHERE LEFT([ShipDateKey],4)=" + Year);

sb.AppendLine("GROUP BY ST.EnglishProductSubcategoryName, LEFT([ShipDateKey],6)");

 

SqlCommand comm = new SqlCommand(sb.ToString(), conn);

 

SqlDataReader dr = comm.ExecuteReader();

 

while (dr.Read())

{

ReportItem ri = new ReportItem();

ri.ProductCategory = dr[0].ToString();

ri.ShipDate = dr[1].ToString();

ri.ProductStandardCost = Convert.ToDouble(dr[2]);

ri.SalesAmount = Convert.ToDouble(dr[3]);

ri.TaxAmount = Convert.ToDouble(dr[4]);

 

result.Add(ri);

}

 

dr.Close();

conn.Close();

 

return result;

}

}

这段代码主要是讲SQL语句的结果装在到List集合类里。

为客户端报表添加完提供数据源的方法后,需要将项目编译一下,这样后续的客户端报表工具就可以检测出新创建的数据结构。

然后,添加另外一张客户端报表。

为报表添加一个数据集:

在数据集属性界面中,数据源直接选择项目的名称,然后在Available datasets: 选择刚才建立的方法:ReportTools(GetReport)。

可以看到检测出的数据结构跟 在SSRS下是一样的。

接下来,参照第三篇中的方法设计报表。

下面为这个报表创建一个承载它的asp.net页面,并且为它添加ScriptManager控件以及ReportViewer控件,选择此篇新建立的报表。

随后,系统为其自动生成了一个ObjectDataSource控件。

为页面添加一个DropDownList控件。

点击DropDownList控件向右的箭头,点击Edit Items…

为控件手动添加一些值。

点击OK关闭ListItem编辑器,回到设计界面。

选择DropDownList控件,在属性列表里修改AutoPostBack的属性为True。

DropDownList控件相关设置完毕,点击ObjectDataSource向右的箭头,选择Configure Data Source…

数据源配置界面,直接点Next。

可以看到系统检测到了报表中配置的方法,直接点击Next。

由于方法为报表数据源指定了一个参数,所以这里需要指定通过什么方式为数据源传进参数。

这里在参数源选择Control ,也就是指定参数的值是通过控件的值传入的。在ControlID指定刚才加入的DropDownList控件。

点击Finish完成数据源控件的配置。

最后,回到 aspx页面的Source视图,更改 ReportViewer控件的属性ReportPath,并且将默认的报表属性去掉:

接下来,将新建的asp.net页面,设置成开始页面,然后点击F5运行。

可以看到效果跟SSRS服务器端报表是一样的。

通过最近两篇对客户端报表的介绍,相信大家对客户端报表已经有了一个了解。一定程度上来说,在你不想去单独部署和维护一个报表服务的前提下,客户端报表确实是一个不错的选择方案。而且借助Coding的方式,数据的生成相对来说也更随意一些,比如从分析服务中加载数据到客户端报表中,也可以参考我先前的一篇随笔:

http://www.cnblogs.com/aspnetx/archive/2012/06/20/2556916.html

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓APP_ 布局(3) —— FrameLayout帧布局

摘自&#xff1a;安卓APP_ 布局&#xff08;3) —— FrameLayout帧布局 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-04-05 20:41:02 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/115447658 帧布局的机制 从左上角开始绘制。 若有重叠&…

wpf page 界面渲染完成后执行自动操作_Vue项目骨架屏自动生成方案(dps)

什么是骨架屏什么是骨架屏呢&#xff1f;骨架屏(Skeleton Screen)是指在页面数据加载完成前&#xff0c;先给用户展示出页面的大致结构&#xff08;灰色占位图&#xff09;&#xff0c;在拿到接口数据后渲染出实际页面内容然后替换掉。Skeleton Screen 是近两年开始流行的加载控…

js等待当前线程内ajax完成,理解javascript定时器中的单线程

一、JavaScript 引擎是单线程的可以从下面的代码中看到&#xff0c;第一个用setTimeout中的代码是死循环&#xff0c;由于是单线程&#xff0c;下面的两个定时器就没机会执行了。setTimeout( function(){ while(true){} } , 100);setTimeout( function(){ alert(你好!setTimeou…

虚拟机安装与概述(3)

创建虚拟机点击”文件“菜单——新建——”新建虚拟机“命令点击新建虚拟机&#xff0c;进入新建虚拟机向导&#xff01;配置类型选择“标准”&#xff0c;然后点击下一步打开新建虚拟机安装向导&#xff0c;安装从&#xff1a;安装盘镜像文件&#xff08;iso&#xff09;点击”…

安卓APP_ 布局(4) —— TableLayout表格布局

摘自&#xff1a;安卓APP_ 布局&#xff08;4) —— TableLayout表格布局 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-04-11 22:55:50 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/115448051 如果直接在TableLayout中写入控件&#xf…

多个文件同时写 linux sd卡_相机报错:“记忆卡已锁定”别着急,都是写保护在搞事情...

我的相机存储卡突然被锁定了&#xff01;这是什么情况&#xff1f;这个问题&#xff0c;刚刚就出现在了我的小伙伴身上。可能您也曾经遇到过这种情况&#xff0c;只是各品牌相机所提示的不同罢了&#xff0c;其主原因都是存储卡误开启了写保护。SD卡写保护是使用中比较简单却又…

vue+webpack+npm dev环境下内存溢出解决办法

increase-memory-limit转载于:https://www.cnblogs.com/kenwar/p/9639766.html

道闸系统服务器价格,小区道闸系统价格服务客户

开优先功能在道闸运行过程中&#xff0c;无论闸杆是处于开闸过程、关闸过程或停止状态&#xff0c;如输出开闸信号&#xff0c;则闸杆马上执行开闸(上行)动作&#xff0c;防止因各种原因造成的砸车现象。遥控开关闸功能通过配置专用的三联电子开关和遥控电子开关&#xff0c;可…

JavaScript this 小结

this关键字引用的是包含它的函数作为某个对象的方法被调用时的那个对象。———《JavaScript.Dom高级程序设计》 这句话拆开来看 this包含this的函数函数被调用时 以函数作为方法的对象 就是说&#xff0c;当函数被调用时&#xff0c;这个函数属于某个对象的方法&#xff0c;这…

安卓APP_ 布局(5) —— GridLayout网格布局

摘自&#xff1a;安卓APP_ 布局&#xff08;5) —— GridLayout网格布局 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-04-12 00:08:31 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/115609773 布局比表格更加灵活方便。 父容器对子控件的…

windows xp https页面找不到_Windows 提权快速查找 Exp

微软官方时刻关注列表网址&#xff1a;https://technet.microsoft.com/zh-cn/library/security/dn639106.aspx比如常用的几个已公布的exp&#xff1a;KB2592799&#xff0c;KB3000061&#xff0c;KB2592799等。快速查找未打补丁的exp&#xff0c;可以最安全的减少目标机的未知错…

无盘服务器读写缓存,无盘系统中实现网络磁盘本地写缓存控制的方法

1. 一种无盘系统中实现网络磁盘本地写缓存控制的方法&#xff0c;所述的无盘系统中包括通过 网络与远程服务器相连接的客户端&#xff0c;其特征在于&#xff0c;所述的方法包括以下步骤&#xff1a;(1)客户端进行启动和初始化操作&#xff1b;(2)客户端根据服务器所设置的参数…

安卓APP_ 布局(6) —— ConstrainLayout约束布局(重要)

摘自&#xff1a;安卓APP_ 布局&#xff08;6) —— ConstrainLayout约束布局&#xff08;重要&#xff09; 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-04-12 10:49:42 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/115610335 Constra…

自动化测试的框架介绍和选择

上面六个自动化测试框架主要都是针对web的。我也去官方文档稍微了解了一下这些框架的具体实现方法和例子。得到一下观点。 Serenity&#xff1a;国内使用的比例貌似不是很高&#xff0c;所以首先被我pass掉了。 Gauge&#xff1a;这是一个较新的测试框架&#xff0c;还在开发中…

url.getinputsteam 获取不完整_年度营销方案合集,活动策划,规划推广,全内容完整套用告别加班...

Hello大家好&#xff0c;我是帮帮。今天跟大家分享一组年度营销方案合集&#xff0c;活动策划&#xff0c;规划推广&#xff0c;全内容完整套用&#xff0c;告别加班。为了让大家能更稳定的下载模板&#xff0c;我们又开通了全新下载方式(见文章末尾)&#xff0c;以便大家可以轻…

360怎样修改wifi服务器地址,360安全路由器IP地址设置的具体操作方法介绍

360安全路由器IP地址怎么设置&#xff1f;我们在正确安装360安全路由器和将电脑的IP地址设置为自动获取后&#xff0c;就可以进行360安全路由器IP设置&#xff0c;下面小编就为大家带来360安全路由器IP设置方法。360安全路由器IP设置方法&#xff1a;1、打开电脑浏览器&#xf…

Java二元运算和三元运算速度测试

2019独角兽企业重金招聘Python工程师标准>>> Test: public class Test { public static void main(String args[]) { long time System.currentTimeMillis(); for(long i0; i< 2000000000; i) { if(false){String s null;} else{String s null;}; } System.ou…

安卓APP_ 控件(10)—— ListView可上下滑动的列表(重要)与ViewHolder优化

摘自&#xff1a;安卓APP_ 控件&#xff08;10&#xff09;—— ListView可上下滑动的列表&#xff08;重要&#xff09;与ViewHolder优化 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-04-12 23:28:27 网址&#xff1a;https://blog.csdn.net/weixin_44742824/artic…

如何阅读一本书 pdf_如何快速阅读一本书?

/ 01 /阅读的重要性不言而喻。芒格说过&#xff0c;“我见过的聪明人&#xff0c;没有一个不读书的&#xff0c;一个都没有。”但是读什么样的书&#xff1f;如何过目不忘&#xff1f;怎样高效阅读&#xff1f;却是一门学问。大一时我读了500本书&#xff0c;每天在班里讲三本书…

弹性布局----Flex

1.背景 传统的布局方案基于盒状模型,依赖display position float 的方式实现,灵活性较差,对于那些特殊的布局非常不方便. 2009年,W3C提出了一种新的方案--Flex布局. 2.什么是Flex布局? Flex是Flexible Box的缩写,意为"弹性布局",用来为盒模型提供最大的灵活性,以便…