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學習筆記 系列匯總 -- 持續更新中


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM