我需要达到以下报告要求-
我需要根据开始日期和结束日期动态增加数据栏的宽度。 我了解数据栏需要在图表上绘制的指标值。因此,不确定是否可以使用数据栏完成此操作。
我还尝试使用表达式为文本框(用于“时间轴”列)的背景色上色。那是正确的方法吗?
谢谢, 阿姆里塔(Amrita)
答案 0 :(得分:1)
我将使用矩阵进行处理,并相应地设置每个单元格的背景。
为此,我们需要一组日期才能使用。就您而言,由于您似乎只进入月份级别,因此我的日期表仅包含月份和年份。
首先,创建一个新报告并使用以下查询添加数据集。很显然,您将不得不对此进行调整以适合您的数据库,但是您应该明白这一点。我将稍后解释代码。
DECLARE @dates TABLE(Year int, Month int)
INSERT INTO @dates VALUES
(2018,1), (2018,2), (2018,3), (2018,4), (2018,5), (2018,6),
(2018,7), (2018,8), (2018,9), (2018,10), (2018,11), (2018,12),
(2019,1), (2019,2), (2019,3), (2019,4)
DECLARE @t TABLE (GroupName varchar(10), ActivityName varchar(10), StartDate date, EndDate date, RGB varchar(10))
INSERT INTO @t VALUES
('Group 1', 'Activity 1', '2018-01-03', '2018-12-14', '#ED7D31'),
('Group 1', 'Activity 2', '2018-02-03', '2018-06-14', '#AFABAA'),
('Group 2', 'Activity 3', '2018-01-03', '2018-04-14', '#9DC3E8'),
('Group 2', 'Activity 4', '2018-06-03', '2018-07-14', '#2E75B5'),
('Group 2', 'Activity 5', '2018-08-03', '2018-12-14', '#C55B11'),
('Group 2', 'Activity 6', '2018-03-03', '2018-07-14', '#F4B184'),
('Group 3', 'Activity 7', '2018-10-03', '2019-03-14', '#596DF2'),
('Group 3', 'Activity 8', '2009-01-03', '2019-02-14', '#3d7080')
SELECT *
FROM @dates d
LEFT JOIN (
SELECT
*
, (Year(StartDate) * 100) + Month(StartDate) as StartYrMn
, (Year(EndDate) * 100) + Month(EndDate) as EndYrMn
FROM @t
) a
ON ((d.[Year] * 100) + d.[Month]) BETWEEN StartYrMn AND EndYrMn
ORDER BY ActivityName, d.Year, d.Month
第一部分是我们的日期表。我刚刚在数据集中创建了这个数据库,但是您可能希望为此拥有一个永久的数据库表。
第二部分重新创建了示例数据,我将其扩展为跨年边界(现在有一些2019年日期),因此当数据不在一年内时,它仍然可以工作。 我还添加了一个RGB列来存储我们想要的颜色(还有其他方法可以做到这一点,但这是最简单的方法)
最终的SELECT语句将获取基本活动数据,并计算一个StartYrMn和EndYrMn列,这些列仅保存例如2018年12月的201812
之类的值。这是在子查询中完成的
然后,我们将日期表和LEFT JOIN
带到子查询中,以生成一组数据,其中包含每年/每月和活动的一行。您可以在SSMS中运行以上代码以查看结果。
好,那是数据方面的事情……
接下来,在您的报告中添加一个矩阵项。
设置GroupName和ActivityName的行组(GroupName必须是ActivityName的父级)。
现在添加[年]和[月]的列组。同样,[Year]应该是[Month]的父亲
您的报告设计应该看起来像这样(除了我接下来要介绍的月份表达式。
如果现在运行报告,您将在列标题中获得月份数字,为解决此问题,请将Month表达式更改为
=FORMAT(DATESERIAL(2017, Fields!Month.Value, 1), "MMM")
您可以忽略2017年,我们只需要创建一个日期来获取月份名称即可。您可以使用1999它将仍然有效。
现在剩下要做的就是为单元格的背景着色。将Data
单元格的背景颜色设置为以下表达式。
=IIF(IsNothing(Fields!ActivityName.Value), nothing, Fields!RGB.Value)
我们在这里所做的就是说,如果没有数据,请将单元格留空,否则将颜色设置为数据集中的RGB值。
就是这样!
您的最终结果应如下所示……
如果无法使其正常工作。建议您使用我提供的数据集从上述确切步骤开始,然后慢慢进行更改以适合您的数据库。
答案 1 :(得分:0)
答案 2 :(得分:0)
我可以使用以下方法解决上述问题。
首先,我在数据集中创建了两个计算字段,这些字段是从源中的StartDate
和EndDate
字段派生的-
StartYrMn = Year(Fields!Start_Date.Value)*100 + Month(Fields!Start_Date.Value)
EndYrMn = Year(Fields!End_Date.Value) *100 + Month(Fields!End_Date.Value)
以上内容将帮助我比较当年月份的日期值。
接下来,在报表设计区域中,我使用GroupName
作为父组,ActivityName
作为其子组创建了一个矩阵。 (在上面的示例中,艾伦(Alan)描述性地显示了这一点。请同样参考。)
由于SSRS的限制,我无法创建一个字段来获取我所有的月份名称,因此我不得不对所有月份进行硬编码。经过上述更改后,报告应如下所示: Report Design
完成上述操作后,我们现在需要为每个Month文本框编写Fill
表达式,如下所示,以检查currentYrMn是否落在StartYrMn和EndYrMn之间。
=Switch( Fields!StartYrMn.Value <= Year(Today()) & "01" And
Fields!EndYrMn.Value>= Year(Today()) & "01" And Fields!GroupName.Value= "Group1",
"DarkBlue",
Fields!StartYrMn.Value<= Year(Today()) & "01" And
Fields!EndYrMn.Value>= Year(Today()) & "01" And Fields!GroupName.Value= "Group2",
"Gold")
上面的表达式适用于一月。同样,将其转换为其他月份。
最后,我从border lines
单元格的中间删除了data
(使用文本框的Border
设置),以便我的颜色似乎分布在月份范围内,看起来像数据栏。
采用上述方法,我的最终报告将类似于以下内容-