SSRS - 多个时间表报告

时间:2017-07-21 07:34:57

标签: sql sql-server reporting-services

我目前有一个时间表报告,它使用单个 TimesheetID 。但是,我现在正在考虑通过 WeekEnding 日期将Timesheets分组在一起为员工节省一些时间,并且我希望将每个页面填充到一个报告中。例如,第1页的Joe Bloggs,第2页的Steve Jobs等等......作为一项规则,时间表的长度从未超过1页。

我创建了一个新的报表调用GroupTimesheet。并添加了一个名为General的数据集,其中包含以下信息:

SELECT 
StaffTable.Staffname,
Timesheet.WeekEnding
FROM Timesheet
INNER JOIN StaffTable ON Timesheet.StaffID = StaffTable.StaffID
WHERE Timesheet.WeekEnding = @WeekEnding

接下来我要做什么? 。我在下面有这个查询,其中包含Timesheet行,但仍然引用 TimesheetID 。如果我将此更改为 WeekEnding ,则会显示所有员工的所有TimesheetLines,而不是每个TimesheetID:

SELECT
TimesheetLine.LineDate,
TimesheetLine.StartTime,
TimesheetLine.FinishTime
FROM TimesheetLine
INNER JOIN Timesheet ON TimesheetLine.TimesheetID = Timesheet.TimesheetID
WHERE Timesheet.TimesheetID = @TimesheetID
AND Timesheet.WeekEnding = @WeekEnding

如何设置报告以实现目标?

这是我正在使用的当前数据库设计,带有示例数据:

CREATE TABLE Timesheet (TimesheetID INT IDENTITY (1,1) NOT NULL,
WeekEnding DATE,
StaffID INT)

CREATE TABLE StaffTable (StaffID INT IDENTITY (1,1) NOT NULL,
Staffname VARCHAR(50))

CREATE TABLE TimesheetLine (TimesheetLineID INT IDENTITY (1,1) NOT NULL,
TimesheetID INT,
LineDate DATE,
StartTime VARCHAR(5),
FinishTime VARCHAR(5))

ALTER TABLE Timesheet ADD CONSTRAINT TimesheetID_PK PRIMARY KEY (TimesheetID)
ALTER TABLE StaffTable ADD CONSTRAINT StaffID_PK PRIMARY KEY (StaffID)
ALTER TABLE TimesheetLine ADD CONSTRAINT TimesheetLineID_PK PRIMARY KEY (TimesheetLineID)

ALTER TABLE Timesheet ADD CONSTRAINT StaffID_T2ST FOREIGN KEY (StaffID) REFERENCES StaffTable (StaffID)
ALTER TABLE TimesheetLine ADD CONSTRAINT TimesheetID_TL2T FOREIGN KEY (TimesheetID) REFERENCES Timesheet (TimesheetID)

--DATA
INSERT INTO StaffTable VALUES ('Joe Bloggs')
INSERT INTO StaffTable VALUES ('Steve Jobs')

INSERT INTO Timesheet VALUES ('2017-07-23', 1)
INSERT INTO Timesheet VALUES ('2017-07-23', 2)

INSERT INTO TimesheetLine VALUES (1, '2017-07-17', '09:00', '17:30')
INSERT INTO TimesheetLine VALUES (1, '2017-07-18', '09:00', '17:30')
INSERT INTO TimesheetLine VALUES (1, '2017-07-19', '09:00', '17:30')
INSERT INTO TimesheetLine VALUES (1, '2017-07-20', '09:00', '17:30')
INSERT INTO TimesheetLine VALUES (1, '2017-07-21', '09:00', '17:30')

INSERT INTO TimesheetLine VALUES (2, '2017-07-17', '08:00', '17:00')
INSERT INTO TimesheetLine VALUES (2, '2017-07-18', '08:00', '17:00')
INSERT INTO TimesheetLine VALUES (2, '2017-07-19', '08:00', '17:00')
INSERT INTO TimesheetLine VALUES (2, '2017-07-20', '08:00', '17:00')
INSERT INTO TimesheetLine VALUES (2, '2017-07-21', '08:00', '17:00')

2 个答案:

答案 0 :(得分:2)

如果您已经有一个可以正确输出单个时间表的报告,那么您没有太多工作要做。我们可以将此报告用作子报告。

创建新报告。 添加数据集' dsTimesheets'查询为SELECT TimeSheetID FROM Timesheet WHERE Weekending = @WeekEnding

添加一个简单的表/ tablix,其中包含一列,一行,并将其数据集设置为dsTimesheets,这将作为我们的循环。在Tablix单元格中,插入子报表并将子报表的参数设置为TimesheetID。你想要拉伸单元格,使其符合报告的宽度,我猜也是如此。

此时报告应该有效,只要每个星期值有几个条目(您的样本数据只有一个)。

一旦您对此进行了测试,您可以通过右键单击行组并将分页符属性设置为“...”之间来完成此操作。

您还可以更改dsTimesheets查询以加入您的员工表,以便按员工姓名等订购时间表。

答案 1 :(得分:1)

只要有可能,您的SSRS报表设计最简单的方法就是拥有一个包含所需数据的数据源的SQL查询。

  

如果我仅将其更改为WeekEnding,则会显示所有员工的所有TimesheetLines

这听起来像你的目标 - 一个只输入日期参数​​的报告,它为所有员工提供了所有相关的时间表。如果您一起加入所有三个表,您可以看到哪些员工与哪些时间表行相关:

SELECT
    StaffTable.StaffID,
    StaffTable.StaffName,
    Timesheet.TimesheetID,
    Timesheet.WeekEnding,
    TimesheetLine.TimesheetLineID,
    TimesheetLine.LineDate,
    TimesheetLine.StartTime,
    TimesheetLine.FinishTime
FROM
    StaffTable
    INNER JOIN Timesheet ON StaffTable.StaffID = Timesheet.StaffID
    INNER JOIN TimesheetLine ON Timesheet.TimesheetID = TimesheetLine.TimesheetID
WHERE
    Timesheet.WeekEnding = @WeekEnding

使用此功能,您可以使用表格或列表设置报告,可以StaffIDTimesheetID 对其进行分组(如果工作人员有多个时间表,同一周)。您可能还希望将分组中的分页符设置为“在组的每个实例之间”。