Sharepoint SSRS-动态数据条
我需要达到以下报告要求- 我需要根据开始和结束日期动态增加数据栏的宽度。 我知道数据栏需要在图表上绘制一个度量值。因此,我不确定这是否可以使用数据栏来完成 我还尝试使用表达式为文本框(时间轴列)的背景色着色。这样对吗 谢谢,Sharepoint SSRS-动态数据条,sharepoint,reporting-services,Sharepoint,Reporting Services,我需要达到以下报告要求- 我需要根据开始和结束日期动态增加数据栏的宽度。 我知道数据栏需要在图表上绘制一个度量值。因此,我不确定这是否可以使用数据栏来完成 我还尝试使用表达式为文本框(时间轴列)的背景色着色。这样对吗 谢谢, Amrita在文本框属性中使用表达式 我将使用矩阵处理此问题,并相应地设置每个单元格的背景 为此,我们需要一组日期。在您的情况下,由于您似乎只进入月份级别,所以我的日期表只包含月份和年份 首先,创建一个新报告,并使用以下查询添加一个数据集。很明显,您必须调整它以适应您的
Amrita在文本框属性中使用表达式
我将使用矩阵处理此问题,并相应地设置每个单元格的背景 为此,我们需要一组日期。在您的情况下,由于您似乎只进入月份级别,所以我的日期表只包含月份和年份 首先,创建一个新报告,并使用以下查询添加一个数据集。很明显,您必须调整它以适应您的数据库,但您应该了解这一点。我将很快解释代码
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
。这是在子查询中完成的
然后,我们将日期表和左连接到子查询,以生成一组数据,其中包含每年/每月和活动的一行。您可以在SSMS中运行上述代码以查看结果
好了,数据端完成了
接下来,将矩阵项添加到报告中
为GroupName和ActivityName设置行组(GroupName需要是ActivityName的父级)
现在为[Year]和[Month]添加列组。同样地,【年】应该是【月】的父项
您的报表设计应该是这样的(除了我接下来要介绍的月份表达式)
如果您现在运行报告,您将在列标题中获得月数,因此要解决此问题,请将月份表达式更改为
=FORMAT(DATESERIAL(2017, Fields!Month.Value, 1), "MMM")
你可以忽略2017年,我们只需要创建一个日期来获取月份名称。你可以使用1999年,它仍然有效
现在剩下要做的就是给单元格的背景上色。将数据
单元格的背景色设置为以下表达式
=IIF(IsNothing(Fields!ActivityName.Value), nothing, Fields!RGB.Value)
这里我们要做的就是说,如果没有数据,请将单元格留空,否则将颜色设置为数据集中的RGB值
就这样
你的最终结果应该是这样的
如果您无法使其工作。我建议您使用我提供的数据集从上面的确切步骤开始,然后慢慢进行更改以适应您的数据库。我可以使用以下方法解决上述问题
首先,我在数据集中创建了两个计算字段,这两个字段来自源的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的限制,我无法创建一个字段来获取所有月份的名称,因此我必须对所有月份进行硬编码。在进行上述更改后,报告应如下所示:
完成上述操作后,我们现在需要为每个月编写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")
=Switch(Fields!StartYrMn.Value=Year(Today())&“01”和Fields!GroupName.Value=“Group1”,
“暗蓝色”
Fields!StartYrMn.Value=Year(Today())&“01”和Fields!GroupName.Value=“Group2”,
“黄金”)
上面的表达式适用于一月。同样,将其转换为其他月份
最后,我删除了数据
单元格中间的边框线
(使用文本框的边框
设置),这样我的颜色看起来像是分布在整个月份范围内的数据条
采用上述方法,我的最终报告如下所示:
您能否显示您现有的实际数据。这将决定解决此问题的最佳方法。是什么使每行独立,您是只有两个日期,开始日期和结束日期,还是所有日期都可用。您是否有某种可用的日期表?用尽可能多的信息更新您的问题,您会得到更好的回答ses。感谢您的回复!我已经更新了我的查询,提供了更多详细信息,包括我正在使用的数据集和报告要求。感谢您的回复!这太棒了!非常感谢您为此付出了这么多努力。我的头脑非常清楚,这让我更接近于解决方案的进度。但是,这里唯一的挑战是,我的数据源是SharePoint列表,我需要考虑如何在此处获取工作数据集。再次感谢您!如果您对处理这种情况下的SP列表有任何意见,请告诉我。谢谢!不幸的是,我没有使用SharePoint,因此无法在那里提供太多帮助。谢谢应该在您的问题中添加SharePoint标记。非常感谢!