上次介绍过CRM里开始报表的一些注意事项:Dynamic CRM 2013学习笔记(十五)报表入门、开发工具及注意事项,本文继续介绍报表里的一些动态效果:动态显示参数,参数是从数据库里查询出来的;参数可以多选或全选;动态地显示列,列不是固定的;根据某一字段的值来动态地显示整行字体的颜色。

下面介绍详细的方法:

一、动态参数、参数多选全选

动态参数:

首先定义一个Dataset:

SELECT DISTINCT new_countryId, new_codename AS name FROM new_country WHERE new_codename IS not null

然后指定参数的数据来源:

注意,这里参数Value 字段一定要用主健,也就是说如果value也用name,将查询不到结果。

多选、全选:

效果图如下:

传入的参数在主Dataset里通过in来查询:

ct.new_countryid IN ( @country )

二、 动态列

最近有个需求,要把全年所有的星期相关的数据查询出来,每个月的最后一周后面显示本月的合计。月是固定的,好处理,但每个月有几周却不是固定的,这时候就没办法固定的查询出数据,然后直接拖到报表里了。解决思路如下:

1. 列名和列各定义一个Dataset, 先看下列名的定义:

先定义一个临时表,每月最多5周,所以每月前面都定义5周。

--创建临时表,用来存储活动的周名称

CREATE TABLE #weekColumn

    (

      Start VARCHAR(10) ,

      W1 VARCHAR(100) ,

      W1Remark VARCHAR(100) ,

      W2 VARCHAR(100) ,

      W2Remark VARCHAR(100) ,

      W3 VARCHAR(100) ,

      W3Remark VARCHAR(100) ,

      W4 VARCHAR(100) ,

      W4Remark VARCHAR(100) ,

      W5 VARCHAR(100) ,

      W5Remark VARCHAR(100) ,

      Month1 VARCHAR(100) ,

      W6 VARCHAR(100) ,

      W6Remark VARCHAR(100) ,

      W7 VARCHAR(100) ,

      W7Remark VARCHAR(100) ,

      W8 VARCHAR(100) ,

      W8Remark VARCHAR(100) ,

      W9 VARCHAR(100) ,

      W9Remark VARCHAR(100) ,

      W10 VARCHAR(100) ,

      W10Remark VARCHAR(100) ,

      Month2 VARCHAR(100) ,

      ...

然后遍历所有月,根据规定的格式,定义周、月的列名:

DECLARE month_cursor CURSOR

FOR

    SELECT  new_monthid ,

            new_name ,

            new_month

    FROM    filterednew_month

    WHERE   new_year = YEAR(GETDATE())

    ORDER BY new_name

 

OPEN month_cursor

 

FETCH NEXT FROM month_cursor INTO @monthid, @monthName, @monthNo

 

WHILE @@FETCH_STATUS = 0 

    BEGIN

  

        SET @index = ( @monthNo - 1 ) * 5 + 1

 

        -- 3. get all weeks

        DECLARE week_cursor CURSOR

        FOR

            SELECT  new_name ,

                    new_week_no

            FROM    filterednew_week

            WHERE   new_monthid = @monthid

 

        OPEN week_cursor

        FETCH NEXT FROM week_cursor INTO @weekName, @weekNo

        WHILE @@FETCH_STATUS = 0 

            BEGIN

 

                SET @sql = 'W' + CAST(@index AS VARCHAR(100));

                SET @sqlName = 'W' + CAST(@index AS VARCHAR(100)) + 'Remark';

                          

                SET @sql = ' update #weekColumn set ' + @sql + '='''

                    + @weekName + '''' + ',' + @sqlName + '=''Remark'''

                EXEC(@sql);

                SET @index += 1

                    

                FETCH NEXT FROM week_cursor   INTO @weekName, @weekNo

            END

        CLOSE week_cursor

        DEALLOCATE week_cursor    

 

        SET @sql = 'Month' + CAST(@monthNo AS VARCHAR(100));

        SET @sql = ' update #weekColumn set ' + @sql + '=''' + @monthName

            + ''''

        EXEC(@sql);

        SET @index += 1

 

        FETCH NEXT FROM month_cursor INTO @monthid, @monthName, @monthNo

    END

CLOSE month_cursor;

DEALLOCATE month_cursor; 

最后查询这个临时表就可以得到所有的列名:

SELECT  *
FROM    #weekColumn;

2. 列值的Dataset定义:

首先也是定义包含所有周、月的临时表,也是每月前定义5周,跟列名对应起来。

接着,遍历所有月,确定当前数据是本月的哪一周:

--查找是本月的第几周                 

PRINT @monthNo

SELECT  @whichWeek = rn

FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY w.new_week_no ) RN ,

                   w.new_week_no

         FROM      filterednew_week w

                   JOIN filterednew_month m ON w.new_monthid = m.new_monthId

         WHERE     m.new_month = @monthNo

       ) mw

WHERE   mw.new_week_no = @weekNo

再确定数据插入的位置:

-- 确定插入位置

SET @index = ( @monthNo - 1 ) * 5 + @whichWeek

PRINT @index

PRINT @monthNo

PRINT @whichWeek

SET @sqlOrderQty = 'W' + CAST(@index AS VARCHAR(100))

    + 'OrderQty';

SET @sqlQty = 'W' + CAST(@index AS VARCHAR(100)) + 'Qty';

 

SET @sqlRemark = 'W' + CAST(@index AS VARCHAR(100)) + 'Remark';

 

SET @sql = ' update #weekColumn set ' + @sqlOrderQty + '='

    + CAST(ISNULL(@orderQty, '0') AS VARCHAR(100)) + ','

    + @sqlQty + '=' + CAST(ISNULL(@qty, 0) AS VARCHAR(100))

    + ',' + @sqlRemark + '=''' + ISNULL(@remark, '') + ''''

    + ' WHERE   ReportIndex = '

    + CAST(@ReportIndex AS VARCHAR(100));                             

PRINT @sql

EXEC(@sql);

3. 报表上处理

列名要用简单处理下,要用列名的Dataset,如下显示的第一周的列名:

=First(Fields!W1.Value, "columns_DataSet")

另外,每个月的前一周有可能是要hide的,因为有可能没有第5周,右健整个列,选择 Column Visibility:

如果没有值就hide起来:

=iif(isnothing(First(Fields!W5.Value, "columns_DataSet")),true,false)

到此,动态显示列完成。

三、 动态显示行字体颜色

首先选中整个行:

然后在行的Font-> Color里定义颜色:

=IIF(Fields!versions.Value = "Demand Plan", "Black", "Green")

注意 Black, Green都要带引号。

Dynamic CRM 2013学习笔记 系列汇总 -- 持续更新中

Dynamic CRM 2013学习笔记(二十六)报表设计:Reporting Service报表 动态参数、参数多选全选、动态列、动态显示行字体颜色的更多相关文章

  1. Dynamic CRM 2013学习笔记(十六)用JS控制Tab可见,可用

    一个Form里经常会有好几个Tab,有时要根据一些条件设置哪些Tab可用,可见.下面就介绍下如何用JS对Tab进行控制. 1. 控制可见   function setTabVisableByName( ...

  2. Dynamic CRM 2013学习笔记(十二)实现子表合计(汇总,求和)功能的通用插件

    上一篇 Dynamic CRM 2013学习笔记(十一)利用Javascript实现子表合计(汇总,求和)功能 , 介绍了如何用js来实现子表合计功能,这种方法要求在各个表单上添加js方法,如果有很多 ...

  3. Dynamic CRM 2013学习笔记(十)客户端几种查询数据方式比较

    我们经常要在客户端进行数据查询,下面分别比较常用的几种查询方式:XMLHttpRequest, SDK.JQuery, SDK.Rest. XMLHttpRequest是最基本的调用方式,JQuery ...

  4. Dynamic CRM 2013学习笔记(十五)报表设计:报表入门、开发工具及注意事项

    本文是关于CRM 2013报表开发入门介绍,包括开发工具的使用,以及不同于普通Reporting service的相关注意事项. 一.CRM报表简介 报表有两种,SQL-based报表和Fetch-b ...

  5. Dynamic CRM 2013学习笔记(十四)复制/克隆记录

    经常有这样的需求,一个单据上有太多要填写的内容,有时还关联多个子单据,客户不想一个一个地填写,他们想从已有的单据上复制数据,克隆成一条新的记录.本文将介绍如何克隆一条记录,包括它的子单据以生成一条新的 ...

  6. Dynamic CRM 2013学习笔记(十八)根据主表状态用JS控制子表自定义按钮

    有时要根据主表的审批状态来控制子表上的按钮要不要显示,比如我们有一个需求审批通过后就不能再上传文件了. 首先打开Visual Ribbon Editor, 如下图,我们可以利用Enable Rules ...

  7. Dynamic CRM 2013学习笔记(十九)自定义审批流1 - 效果演示

    CRM的项目,审批流是一个必须品.为了更方便灵活地使用.配置审批流,我们自定义了一整套审批流.首先来看下它的效果: 1. 审批模板 这是一个最简单的审批流,首先指定审批实体,及相关字段,再配置流程节点 ...

  8. Dynamic CRM 2013学习笔记 系列汇总

    这里列出所有 Dynamic CRM 2013学习笔记 系列文章,方便大家查阅.有任何建议.意见.需要,欢迎大家提交评论一起讨论. 本文原文地址: Dynamic CRM 2013学习笔记 系列汇总 ...

  9. Dynamic CRM 2013学习笔记(二十)字段改变事件的二种实现方法

    CRM里有二种方式实现字段change事件,一种是在form里,一种完全通过js来实现.本文介绍下二者的用途及区别. 1. Form里用法 这种方式估计其实也是添加一个js的function. 这种方 ...

随机推荐

  1. 转(Delphi 新窑洞):使用delphi 开发多层应用(十七)使用RTC web 服务器返回JSON

    RTC作为delphi 的最专业的web 应用服务器,如果客户端要使用JSON 的话,那么使用RTC 应该也是一种 非常好的选择.下面我们做一个使用RTC web 服务器返回数据库JSON 的例子. ...

  2. 关于php Hash算法的一些整理总结

    最近在公司内部的分享交流会上,有幸听到了鸟哥的关于php底层的一些算法的分享,虽然当时有些问题没有特别的明白,但是会后,查阅了各种各样的相关资料,对php的一些核心的hash算法有了进一步的理解和认识 ...

  3. make: g77: Command not found

    编译cblas时报错,这时,修改Makefile.in中的编译文件中的g77为gfortran

  4. MAT内存问题分析定位

    MAT内存问题分析定位 1.下载安装MemoryAnalyzer工具. 2.使用DDMS将对应线程的内存日志导出来后,使用hprof-conv工具进行转换,用MAT打开转换后的hprof文件.

  5. DHCP服务器的开始方式

    方法一:采用DHCP服务器接口开启的方式 [Huawei]dhcp enable [Huawei]int g0/0/0[Huawei-GigabitEthernet0/0/0]ip add 192.1 ...

  6. sed命令手册

    sed 是一种在线编辑器,它一次处理一行内容. 处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space). 接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内 ...

  7. oracle 客户端重新安装遇到的问题

    前一阵,因为把ORACLE客户端的密码忘记了,在网上也找了好多方法,试着不重新安装找回密码,可是都行不通,没有办法重新装.安装时遇到一些问题,因为我是WIN7,64位系统,安装的oracle11g64 ...

  8. Python:迭代器

    迭代器:可以被next()函数调用并不断返回下一个值的对象称为迭代器. 可迭代对象:可以直接作用于for循环的对象. 基本方法:iter()和next() 迭代器创建: 例1: list = ['a' ...

  9. CentOS7搭建NAS,包括NFS、ISCSI

    第一步:安装 更新系统 yum update 安装iftop yum install epel-release yum install iftop 安装NFS yum install nfs-util ...

  10. 小甲鱼python视频弟十一讲(课后习题)

    1.修改列表里的值 list1 = [,,[,,,[,,,,] list1[] = print(list1) list1[][][] = '?' print(list1) 2.列表的排序(sort) ...