水晶报表中的月度考勤报告

问题描述 投票:0回答:1

我正在做一个学生出勤项目。我在数据库的表格中记录出勤情况。

我想创建一份每月出勤报告。我找到了一个存储过程来做到这一点。

桌子

CREATE TABLE Attend
(
   NAME VARCHAR(50),
   DATE DATETIME ,
   PRESENT_STATUS VARCHAR(10)
)

存储过程:

CREATE PROCEDURE GET_ATTENDANCEREPORT
    @STARTDATE DATETIME,
    @ENDDATE DATETIME
AS 
BEGIN
    WITH DATERANGE AS
    (
         SELECT DT = DATEADD(DD,0, @STARTDATE)
         WHERE DATEADD(DD, 1, @STARTDATE) <= @ENDDATE
         UNION ALL
         SELECT DATEADD(DD, 1, DT)
         FROM DATERANGE
         WHERE DATEADD(DD, 1, DT) <= @ENDDATE
    )
    SELECT * 
    INTO #TMP_DATES
    FROM DATERANGE

    DECLARE @COLUMN VARCHAR(MAX)

    SELECT @COLUMN = ISNULL(@COLUMN + ',', '') + '[' + CAST(CONVERT(DATE, T.DT) AS VARCHAR) + ']' 
    FROM #TMP_DATES T

    DECLARE @Columns2 VARCHAR(MAX)
    SET @Columns2 = SUBSTRING((SELECT DISTINCT ', ISNULL(['+ CAST(CONVERT(DATE, DT) as varchar) + '],''N/A'') AS ['+CAST(CONVERT(DATE , DT) as varchar )+']' 
                               FROM #TMP_DATES 
                               GROUP BY dt 
                               FOR XML PATH('')), 2, 8000)

    DECLARE @QUERY VARCHAR(MAX)

    SET @QUERY = 'SELECT NAME, ' + @Columns2 +
                 ' FROM (SELECT A.NAME, B.DT AS DATE, A.PRESENT_STATUS FROM Attend A RIGHT OUTER JOIN #TMP_DATES B ON A.DATE = B.DT) X
                   PIVOT
                      (MIN([PRESENT_STATUS])
                       FOR [DATE] IN (' + @COLUMN + ')) P
                   WHERE ISNULL(NAME,'''')<>''''
    '

    EXEC (@QUERY)

    DROP TABLE #TMP_DATES
END

但是我想在 Crystal Report 中创建报表。

我希望它看起来像这样:

因为当我在 Crystal Report 中使用存储过程时,它不起作用,因为创建列需要我输入开始日期和结束日期,这是一个无法固定的变量。

我想要 Crystal Report 中的报告

sql-server vb.net crystal-reports
1个回答
0
投票

创建一个 DAYS 表,其中包含“年”、“月”、“日期”、“DayLetter”列,并为每一天填充一条记录。如果您谷歌主题“日期维度表的脚本”,您应该找到示例。

使用“日期”列对出勤表进行外部联接。

在 Crystal 中,插入交叉表。使用显示字符串表达式来显示所需的数据。

© www.soinside.com 2019 - 2024. All rights reserved.