里程碑的SSRS图表

时间:2018-10-15 18:08:56

标签: reporting-services charts

我需要创建一个SSRS报告以显示项目里程碑的实际开始日期与计划开始日期(选择为输入参数) 该图表应如下所示: Milestone_Table_Chart 我已经在单独的表中创建了表。但是,我不知道应该使用哪种图表类型,以及如何设置图表? (图表数据,类别组和系列组)。

(数据来自SQL Server,SSRS版本14.0.1016.285; SSDT 15.6.4)

非常感谢

1 个答案:

答案 0 :(得分:1)

这看起来可能有点长,但是它很简单,请坚持使用它:)

首先,我不知道您的数据结构,所以我做了一些假设。您可能需要对其中的某些内容进行重做才能使它适应,但我尝试使其保持简单。

方法将是使用子报表来绘制点并使用主报表来显示整个表格。考虑到这一点,由于我们将有多个数据集引用我们的数据,因此在开始以下操作之前,我向示例数据库中添加了一些表。

第一个是一个包含月份和年份的简单表,如果有日期表,则可以在日期表上使用视图,但是现在可以使用。

CREATE TABLE prjYearMonth (Year int, Month int)

INSERT INTO prjYearMonth VALUES
(2018, 8),
(2018, 9),
(2018, 10),
(2018, 11),
(2018, 12),
(2019, 1),
(2019, 2)

接下来是项目里程碑表

CREATE TABLE prjMileStones (msID int, msLabel varchar(50), msPlannedStart date, msActualStart date)

INSERT INTO prjMileStones VALUES
(1, 'Milestone 1', '2018-10-30', '2018-12-13'),
(2, 'Milestone 2', '2018-11-12', '2018-12-10'),
(3, 'Milestone 3', '2018-10-21', '2018-12-25'),
(4, 'Milestone 4', '2018-10-18', '2018-11-28'),
(5, 'Milestone 6', '2019-01-08', '2019-01-29')

好的,现在开始报告...

创建一个新的空报告,然后使用以下查询添加数据集

SELECT 
    * 
    FROM prjYearMonth d
    LEFT JOIN prjMileStones t on (d.Year = YEAR(t.msPlannedStart) AND d.Month = Month(t.msPlannedStart))
                or (d.Year = YEAR(t.msActualStart) AND d.Month = Month(t.msActualStart))

现在将矩阵项添加到报告中。添加在msLabel上进行分组的行组。

接下来添加两个列组。首先是按月分组的组,然后添加按年分组的父组。

在行组上添加列,以便最终获得4列msID; msLabel; msPlannedStart; msActualStart。

最后(现在)将“月表达式”字段(列标题中的那个)设置为

= Format(DATESERIAL(2017, Fields!Month.Value, 1), "MMM")

这只会为我们提供月份名称,而不是数字(2017年无关紧要,任何年份都可以)。现在,只需按要求设置格式即可。

您报告的设计应如下所示。

enter image description here

如果我们现在运行报告,我们将得到它。

enter image description here

现在要绘制点...

为此,我们将创建一个小的子报表。子报表将接受3个参数。年,月,msID(主表中的里程碑ID)。对于此子报表,我们将需要稍微不同的结构数据,但是可以在数据集查询中完成工作,因此数据库本身不需要任何新的信息。

因此,创建一个新报告,我们称它为_subMonthChart。

接下来,使用以下查询添加数据集。

DECLARE @t TABLE(msID int, msLabel varchar(50), PlannedOrActual varchar(1), msStartDate date)

INSERT INTO @t 
    SELECT msId, mslabel, 'P', msPlannedStart FROM prjMileStones
    UNION ALL
    SELECT msId, mslabel, 'A', msActualStart FROM prjMileStones


SELECT 
    1 AS Y, Day(msStartDate) as Day, PlannedOrActual 
    FROM prjYearMonth d
    LEFT JOIN @t t on (d.Year = YEAR(t.msStartDate) AND d.Month = Month(t.msStartDate))
    WHERE [Year] = @Year and [Month] = @Month and msID = @msID

您的报告现在应该具有自动创建的3个参数,将所有三个参数都编辑为“允许为空”。

注意:数据集中的Y只是一些任意值,可以帮助在图表上进行绘制。我将Y轴的范围设置为0-2,所以1会位于中间。

接下来,添加带有标记的折线图。暂时不用担心大小... 将值设置为Y 将类别组设置为Day 将系列组设置为PlannedOrActual

右键单击水平轴,选择属性,然后将“轴类型”设置为“标量”,关闭“始终包含零”,然后设置“最小值= 1”,“最大值= 31”,“间隔= 1”,“间隔类型=默认值”。

请注意,对于没有31天的月份中的数据,绘图点将不准确,但足够接近您的目的。

右键单击“垂直轴”,选择属性,然后设置Mn = 0,Max = 2,时间间隔= 1,时间间隔类型=默认值

接下来,右键单击系列行之一,然后选择属性。将标记设置为Diamond,将标记大小设置为8pt,然后将标记颜色设置为=IIF(Fields!PlannedOrActual.Value = "P", "Blue", "Green")

报告设计应如下所示(尤其是选中突出显示的位)

enter image description here

现在让我们基于示例数据快速测试子报表,我将参数设置为2019、1和5,并获得以下结果。...

enter image description here

我们可以看到,这个里程碑的一月的两个日期被绘制在大致正确的位置。

就在附近... 接下来,右键单击两个轴并关闭“显示轴”,以便我们将其隐藏。 现在,将图表调整为适合主报表单元格的大小。在我的示例中,我将尺寸设置为2cm,1.2cm,并将其移动到报告的左上方。然后将报告设置为与图表相同的大小(在我的情况下,再次为2cm,1.2cm)。

保存子报告并返回主报告...

对于行和列相交的“数据”单元格,设置大小以匹配子报表大小(2cm,1.2cm),然后右键单击该单元格并插入子报表。

右键单击新插入的子报表项,然后选择属性。

从下拉列表中选择_subMonthChart作为子报表。

单击参数选项卡。为每个参数(年/月/ msID)添加一个条目,并将其值设置为数据集中的相应字段。

最后!!!将包含子报表的单元格上的边框设置为全面具有边框,以使其与您的模型匹配。.

您的报告设计现在应如下所示……

enter image description here

现在,当报表运行时,它将把月份,年份和里程碑ID传递到每个单元格中的子报表中,这些子报表又将根据需要绘制日期。

当我们运行报告时,我们最终应该得到这个...

enter image description here

这可能需要一些改进,但是希望您可以以此为基础。如果遇到问题,建议您重新创建该示例的全部内容,使其正常运行,然后换出数据库部分以适合您当前的数据库。