zoukankan      html  css  js  c++  java
  • Dynamic CRM 2013学习笔记(二十六)报表设计:Reporting Service报表 动态参数、参数多选全选、动态列、动态显示行字体颜色

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

    下面介绍详细的方法:

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

    动态参数:

    首先定义一个Dataset:

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

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

    image

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

    多选、全选:

    image

    效果图如下:

    image

    传入的参数在主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:

    image

    如果没有值就hide起来:

    image

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

    到此,动态显示列完成。

    三、 动态显示行字体颜色

    首先选中整个行:

    image

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

    image

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

    注意 Black, Green都要带引号。

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

  • 相关阅读:
    JSP标签介绍
    JSP四大作用域属性范围
    JSP九大内置对象及四个作用域
    maven:Fatal error compiling: 无效的目标发行版: 1.8.0_45 -> [Help 1]
    浅谈Session与Cookie的区别与联系
    Servlet入门实践
    安卓常用布局基本属性
    安卓常用布局
    Android开发中Handler的经典总结
    三种方法写监听事件
  • 原文地址:https://www.cnblogs.com/fengwenit/p/4210144.html
Copyright © 2011-2022 走看看