JSON数据源提供多值参数的实现
一、应用场景
(1)报表的数据内容需要根据某个参数进行过滤。
(2)该参数是一个多值参数,即从一个下拉列表中选择一个或多个项目。
(3)报表需要自动运行,因此参数必须有默认值。
(4)参数默认值无法在设计报表时就确定下来。
二、实现方案
问题的核心是:报表自动运行是无人值守的,没有人机交互的机会,因此“必需性(Required)”报表参数必须有默认值,但是某些报表的参数取值是与业务系统有关的,无法在设计报表模板时就确定好参数的默认值。
解决这一问题的思路是:编写一个Web Service,专门用来提供参数值,以JSON字串的形式传给报表系统;设计报表时,将参数默认值设置为对Web Service的调用,而不是普通的常数值。
具体实现步骤如下:
(1)在ActiveReports Server的Site下编写Web Service,提供Web Method以返回JSON字串。
(2)使用报表设计器,设计JSON数据源和数据集。
(3)设置多值参数的默认值为JSON数据集的字段值。
三、细节说明
(一)提供JSON数据源的Web Service
在ARS安装目录(默认为C:\ActiveReports 11 Server\)的Site子目录下,新建一个WebApi.asmx文件,内容只有一行代码:
<%@ WebService Language="C#" CodeBehind="~/App_Code/WebApi.cs" class="WebApi" %>
在Site\App_Code新建一个WebApi.cs文件,核心代码如下:
[System.Web.Script.Services.ScriptService] // 此行原为被注释的状态,必须取消注释
public class WebApi : System.Web.Services.WebService
{
…
[WebMethod]
public void GetArrayAsJson() // 返回值类型本应为string,需要改为void
{
string[] IDs = new string[]
{
"2","4","5","6" //此处根据业务系统状况,决定具体返回值
};
Context.Response.Write(new JavaScriptSerializer().Serialize(IDs));
Context.Response.ContentType = "application/json";
Context.Response.End();//采用直接回写Response的方式来返回JSON,避免WebMethod返回多余的Tag
//return new JavaScriptSerializer().Serialize(IDs);因为标准JSON会包含多余的Tag,因此注释掉此语句
}
注意:
(1)返回值是一个数组(Array),数组元素必须是string类型,即使返回值用于过滤的数据库字段(比如【雇员ID】)的数据类型是int,也不能用整型数组({2,4,5,6})。
(2)由于标准Web Service返回的内容包含<string>这样的Tag(形如:<string xmlns = "http://tempuri.org/" >["2","4","5","6"]</string>),而报表要求不含Tag的数据(即只要["2","4","5","6"]),因此,WebMethod不能用普通的Return语句,而应直接用Response.Write方法,相应地,需要将WebMethod的返回值类型从string改为void。
(3)特别重要:为保证Web Service可被报表调用,需要修改C:\ActiveReports 11 Server\Site文件夹下的web.config文件,在<system.web>部分添加以下内容:
<webServices>
<protocols>
<add name= "HttpPost"/>
<add name= "HttpGet"/>
</protocols>
</webServices>
(二)设计JSON数据源和数据集
在报表设计器中,添加数据源ParameterJSON:
将Schema选为【内嵌】,输入下面的内容:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "array",
"items": {
"type": "string"
}
}
在【内容】部分,选择【外部文件或网址】,输入如下网址:
http://localhost:8080/WebApi.asmx/GetArrayAsJson
在数据源下添加数据集Parameters,在【查询】部分,选择[*]节点即可:
(三)设计多值参数及其默认值
添加参数EmpId,选中【多值】:
【可选值】部分,添加候选的参数值,例如:1/Peter, 2/John …等,如下图:
【默认值】部分,选择【来自于查询语句】,然后选择数据集为前面创建的JSON数据集Parameters:
【值字段】选择默认的Field1。
点击【确定】保存,然后预览报表:
点开参数栏,可以看到从JSON数据源取得的2,4,5,6等几个ID值,已经将勾选框中的对应条目选中。等同于手工勾选的效果。
JSON数据源提供多值参数的实现的更多相关文章
- C#方法的六种参数,值参数、引用参数、输出参数、参数数组、命名参数、可选参数
方法的参数有六种,分别是值参数.引用参数.输出参数.参数数组.命名参数.可选参数. 值参数 值参数是方法的默认类型,通过复制实参的值到形参的方式把数据传递到方法,方法被调用时,系统作两步操作: 在栈中 ...
- [.NET] 使用Json.NET提供依赖注入功能(Dependence Injection)
[.NET] 使用Json.NET提供依赖注入功能(Dependence Injection) 前言 在一些小型项目的开发情景里,系统不需要大型DI Framework所提供的:单一对象生成.生命周期 ...
- C#_delegate - 值参数和引用参数
值参数不能加,引用参数可以. 引用参数是共享的 using System; using System.Collections.Generic; using System.Linq; using Sys ...
- Json.NET提供依赖注
Json.NET提供依赖注 [.NET] 使用Json.NET提供依赖注入功能(Dependence Injection) 前言 在一些小型项目的开发情景里,系统不需要大型DI Framework所提 ...
- C#值参数和引用参数
一.值参数 未用ref或out修饰符声明的参数为值参数. 使用值参数,通过将实参的值复制到形参的方式,把数据传递到方法.方法被调用时,系统做如下操作. 在栈中为形参分配空间. 复制实参到形参. 值参数 ...
- [C++学习历程]基础部分 C++中的函数中的值参数、地址参数、引用参数实际例子
本文地址:http://blog.csdn.net/sushengmiyan/article/details/20406269 作者:sushengmiyan // sushengmiyanTest. ...
- python-在定义函数时,不定长参数中,默认值参数不能放在必选参数前面
如果一个函数的参数中含有默认参数,则这个默认参数后的所有参数都必须是默认参数,否则会报错:SyntaxError: non-default argument follows default argum ...
- Java如何大批量从json数据源中按指定符号隔字符串,并修改、删除数据
原文出自:https://blog.csdn.net/seesun2012 package com.seesun2012.com; /** * Java大批量修改.删除数据,按指定标识符分隔字符串 * ...
- python基础(二)--多值参数以及类
1.多值参数函数 def 函数名(*args , **kwargs): ....... 多值参数函数顾名思义能够传入多个参数,args表示传入的元组,kwargs表示传入的字典 def functio ...
随机推荐
- java中包命名常见规则
做java的都知道java的包.类.接口.枚举.方法.常量.变量等等模型都有一套约定的命名规则! 学习每一种语言都应该学习对应语法和命名规则,以保持一个良好的编码风格.一来显示自己的专业.二来方便阅读 ...
- HTTP标头
HTTP头信息 头信息由“键:值”组成.它们描述客户端或者服务器的属性.被传输的资源以及应该实现连接. 四种不同类型的头标 通用头标:即可用于请求,也可用于响应,是作为一个整体而不是特定资源与事务相关 ...
- phpcms V9 内容模型管理
[1]理解模型 模型,系统知识的抽象表示.既然抽象了,那就得脑补一下.大家都是面向对象设计的专业人员,类就很抽象的,对比类的定义想象一下模型的概念. 举个例子,一般新闻类的信息,都具有标题.内容.作者 ...
- jQuery使用serialize()表单序列化时出现中文乱码问题&js获取url中的参数,并保证获取到的参数不乱码
序列化中文时之所以乱码是因为.serialize()调用了encodeURLComponent方法将数据编码了 解决方法就是进行解码 原因:.serialize()自动调用了encodeURIComp ...
- args[0]
java程序有一个主方法,是这样的public static void main(String [] args)你说的args[0]就是你用命令行编译运行java程序时,传入的第一个参数,比如你运行一 ...
- 《在纹线方向上进行平滑滤波,在纹线的垂直方向上进行锐化滤波》 --Gabor增强的具体实践
<在纹线方向上进行平滑滤波,在纹线的垂直方向上进行锐化滤波> --Gabor增强的具体实践 一.问 ...
- win7和u盘redhat7.1双系统安装总结
最近win7系统越用越卡,又没钱买mac只能想办法装以下linux系统,听说redhat服务器用的比较多,就想尝试一下装一个redhat.当然,和所有人一样,搜索了很多资料.我选择装双系统,因为要抛弃 ...
- Swift高级语法学习总结(转)
Swift高级语法学习总结 1.函数 1.1 func funcNmae()->(){} 这样就定义了一个函数,它的参数为空,返回值为空,如果有参数和返回值直接写在两个括号里就可以了 1.2 参 ...
- 《简明python教程》笔记一
读<简明Python教程>笔记: 本书的官方网站是www.byteofpython.info 安装就不说了,网上很多,这里就记录下我在安装时的问题,首先到python官网下载,选好安装路 ...
- UAT SIT QAS DEV PET
UAT: User Acceptance Testing 用户验收测试SIT: System Integration Testing 系统集成测试PET: Performance Evaluation ...