一、应用场景

(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数据源提供多值参数的实现的更多相关文章

  1. C#方法的六种参数,值参数、引用参数、输出参数、参数数组、命名参数、可选参数

    方法的参数有六种,分别是值参数.引用参数.输出参数.参数数组.命名参数.可选参数. 值参数 值参数是方法的默认类型,通过复制实参的值到形参的方式把数据传递到方法,方法被调用时,系统作两步操作: 在栈中 ...

  2. [.NET] 使用Json.NET提供依赖注入功能(Dependence Injection)

    [.NET] 使用Json.NET提供依赖注入功能(Dependence Injection) 前言 在一些小型项目的开发情景里,系统不需要大型DI Framework所提供的:单一对象生成.生命周期 ...

  3. C#_delegate - 值参数和引用参数

    值参数不能加,引用参数可以. 引用参数是共享的 using System; using System.Collections.Generic; using System.Linq; using Sys ...

  4. Json.NET提供依赖注

    Json.NET提供依赖注 [.NET] 使用Json.NET提供依赖注入功能(Dependence Injection) 前言 在一些小型项目的开发情景里,系统不需要大型DI Framework所提 ...

  5. C#值参数和引用参数

    一.值参数 未用ref或out修饰符声明的参数为值参数. 使用值参数,通过将实参的值复制到形参的方式,把数据传递到方法.方法被调用时,系统做如下操作. 在栈中为形参分配空间. 复制实参到形参. 值参数 ...

  6. [C++学习历程]基础部分 C++中的函数中的值参数、地址参数、引用参数实际例子

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/20406269 作者:sushengmiyan // sushengmiyanTest. ...

  7. python-在定义函数时,不定长参数中,默认值参数不能放在必选参数前面

    如果一个函数的参数中含有默认参数,则这个默认参数后的所有参数都必须是默认参数,否则会报错:SyntaxError: non-default argument follows default argum ...

  8. Java如何大批量从json数据源中按指定符号隔字符串,并修改、删除数据

    原文出自:https://blog.csdn.net/seesun2012 package com.seesun2012.com; /** * Java大批量修改.删除数据,按指定标识符分隔字符串 * ...

  9. python基础(二)--多值参数以及类

    1.多值参数函数 def 函数名(*args , **kwargs): ....... 多值参数函数顾名思义能够传入多个参数,args表示传入的元组,kwargs表示传入的字典 def functio ...

随机推荐

  1. 很好用的request转换为实体方法还有判断实体所有参数不能为空的方法

    /// <summary> /// 模型辅助处理类 /// 2016-04-18 /// </summary> public class ModelHelper { /// & ...

  2. C#在高性能计算领域为什么性能却如此不尽人意

    C#的优雅,强大IDE的支持,.net下各语言的二进制兼容,自从第一眼看到C#就被其良好的设计吸引.一直希望将其应用于高性能计算领域,长时间努力却效果却不尽如人意. 对于小的测试代码用例而言,C#用2 ...

  3. 【转】PowerShell入门(十一):编写脚本模块

    转至:http://www.cnblogs.com/ceachy/archive/2013/03/08/PowerShell_Script_Module.html 现在通过编写模块就可以在PowerS ...

  4. Nim Game

    简单规律: 如果你面前的石子数为1,2,3必赢 4必输: 所以4+1(5),4+2(6),4+3(7)你必赢,因为你总是有办法让对方面对4,而前面分析过了4是必输的: 所以当你面对n的时候,如果n-1 ...

  5. LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 Debug/firstapi.exe :

    #include <windows.h> #include <iostream.h> void main() { char SourceFileName[MAX_PATH]; ...

  6. div嵌套导致子区域margin-top失效不起作用的解决方法

    有两个嵌套关系的div,如果外层div的父元素padding值为0, 那么内层div的margin-top或者margin-bottom的值会"转移"给外层div,使父元素产生上外 ...

  7. Cenots7编译Opencv3.1错误:下载ippicv,解决方案

    在centos7上安装Opencv的时候,停在了下载ippicv的地方,一直都下载不下来. ippicv是一个并行计算库,其实可以不用的. 如果不想用这个并行计算库,在做Cmake的时候用参数关闭即可 ...

  8. 浏览器请求URL原理

    访问服务器url其实是访问DNS服务器,浏览器询问DNS服务器锁访问的url的IP是什么, 找到之后就会返回结果,找不到就继续去其他DNS中寻找,找到路径之后就会返回一个html文档,浏览器会解析这个 ...

  9. Python之路,Day1 - Python基础1

    本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...

  10. sql server CTE递归使用测试

    --CTE递归查询 if(object_id(N'menu') > 0) drop table menu CREATE TABLE MENU ( name nvarchar(50) NOT NU ...