enter link description here我在这里尝试根据员工ID打孔生成与每日出勤相关的报告。我链接了3个表,第一个是“ EdailyEvents(存储所有Punch记录),第二个是“ EAllocations”(存储所有员工详细信息,包括他们的项目编号和组号,称为“ FCode”),第三个表是EPosted(存储所有工作的)在关注点审核后数小时)。
过程是。员工标记出勤后。记录将交给他的上级,由他的组号(FCODE)进行审查。一旦上级审核并发布了工时,这些内容将转到“ EPosted表”。
所以我想做的是。根据每个项目的编号和未完成审核的日期,从EAllocations表生成FCode列表。以下是我使用的查询。我需要根据他的分配日期“ EReportDate”生成报告,这意味着如果报告日期>审阅日期,则报告不应显示为待处理。我的问题是,当我使用此行代码“ EAllocations.ERportDate <= @ ToDate”时当员工报告日期大于审阅日期时,向我显示待审。例如:员工已在2019年11月28日报告并分配(在EAllocations中以黄色突出显示),但在报告中显示他的评论从21-11-2019到30-11-2019(显示为“ P”,如报告中标记)尚待审核我正在选择日期范围以生成报告。 @fromDate是21-11-2019&@ToDate是30-11-2019。
CREATE PROCEDURE [dbo].[Pro_Pending]
-- ==================================================
-- DECLARE VARIABLES
-- ==================================================
@FromDate as date,
@ToDate as date,
@Pending as Varchar(1)='P'
AS
BEGIN
DECLARE
@LFromDate as date,
@LToDate as date
SET @LFromDate=@FromDate
SET @LToDate=@ToDate
SET NOCOUNT ON;
SELECT
EAllocations.EFCode AS 'FCODE NO.',
EDailyEvents.EPunchDate AS 'DATE',
EAllocations.EProjectNo 'PROJECT NO.',
EAllocations.EAdminName 'SITE ADMIN',
@PENDING AS 'STATUS'
FROM EAllocations
INNER JOIN
EDailyEvents ON EDailyEvents.EToken=EAllocations.EToken
WHERE
EAllocations.EReleaseDate IS NULL
AND
EAllocations.ERportDate<=@ToDate AND NOT EXISTS(SELECT EPosted.ETokenNo FROM EPosted
WHERE
EDailyEvents.EToken=EPosted.ETokenNo AND EDailyEvents.EPunchDate=EPosted.EPunchDate) AND EDailyEvents.EPunchDate BETWEEN @LFromDate AND @LToDate
OR
EAllocations.EReleaseDate >=EDailyEvents.EPunchDate
AND
EAllocations.ERportDate<=@ToDate AND NOT EXISTS(SELECT EPosted.ETokenNo FROM EPosted
WHERE
EDailyEvents.EToken=EPosted.ETokenNo AND EDailyEvents.EPunchDate=EPosted.EPunchDate) AND EDailyEvents.EPunchDate BETWEEN @LFromDate AND @LToDate
ORDER BY EAllocations.EFCode
END
我认为您已经解决了复杂的问题。我相信这是您要查找的代码:
CREATE PROCEDURE [dbo].[Pro_Pending]
-- ==================================================
-- DECLARE VARIABLES
-- ==================================================
@FromDate as date,
@ToDate as date,
@Pending as Varchar(1)='P'
AS
BEGIN
DECLARE
@LFromDate as date,
@LToDate as date
SET @LFromDate=@FromDate
SET @LToDate=@ToDate
SET NOCOUNT ON;
SELECT EAllocations.EFCode AS 'FCODE NO.',
EDailyEvents.EPunchDate AS 'DATE',
EAllocations.EProjectNo 'PROJECT NO.',
EAllocations.EAdminName 'SITE ADMIN',
@PENDING AS 'STATUS'
FROM EAllocations
INNER JOIN EDailyEvents
ON EDailyEvents.EToken=EAllocations.EToken
WHERE (
EAllocations.EReleaseDate IS NULL
OR EAllocations.EReleaseDate >=EDailyEvents.EPunchDate
)
AND EAllocations.ERportDate<=@ToDate
AND NOT EXISTS(
SELECT EPosted.ETokenNo
FROM EPosted
WHERE EDailyEvents.EToken=EPosted.ETokenNo
AND EDailyEvents.EPunchDate=EPosted.EPunchDate
)
AND EDailyEvents.EPunchDate BETWEEN @LFromDate AND @LToDate
ORDER BY EAllocations.EFCode
END