在“Weeks”之间查询多个记录,其中子表中没有记录

时间:2014-07-01 10:31:34

标签: ms-access between

我正在尝试确定如何使用Access 2013处理此查询的最佳方法。我有一个包含以下内容的客户端表:

clientID    fName    lName    admissionDate    dischargeDate
1            John      Doe        05/06/2014       06/27/2014
2            Jane      Doe        04/24/2014       05/15/2014
3            Steven    Smith      05/15/2014       NULL/Empty
4            Chris     Davis      06/12/2014       NULL/Empty

然后有一个WeeklyProgressNotes表,负责审核客户端图表的人员。它不包含实际的每周进度,它只包含一个是/否字段和一个日期字段,用于完成每周进程的日期。如下所示:

noteID     completed     dateCompleted     clientID
1            yes              05/08/2014          1
2            yes              05/14/2014          1
3            yes              04/25/2014          2

我正在创建一个表格,审核员可以打开该表格,以确定每个客户需要检查哪些周,以查看他们是否在本周完成了他们的每周进度。如果她还没有检查并确认那个星期,那么WeeklyPunressNotes表中将没有记录。所以表单基本上是这样的:

fName    lName       week              completed        date      clientID(hidden)
John      Doe       5/19/14-5/25/14    Checkbox          Null        1
John      Doe       5/26/14-6/1/14     Checkbox          Null        1
John      Doe       6/2/14-6/8/14      Checkbox          Null        1
John      Doe       6/9/14-6/15/14     Checkbox          Null        1
John      Doe       6/16/14-6/22/14    Checkbox          Null        1
John      Doe       6/23/14-6/29/14    Checkbox          Null        1
Jane      Doe       4/28/14-5/4/14     Checkbox          Null        2

依旧.......

我考虑过创建一个SQL语句来选择所有客户端,然后创建一个函数来确定他们在特定周内的入场日期和他们的出院日期与特定周,然后用另一个SQL语句创建一个循环所有周的BETWEEN子句,并确定WeeklyProgressNotes表中是否有条目。如果没有,那么我会显示上述信息。我不确定是否有一种更简单,更少搜索的方式。也许是一个可以在某些循环中完成的SQL查询。

1 个答案:

答案 0 :(得分:0)

我解决这个问题的方法是创建一个新表。由于您希望将添加和排出日期之间的日期时间分成多行,我认为最好将客户端拆分为表中的多个记录。

以下代码根据您的基本客户端表创建记录集。之后它会创建您的临时表(由于时间不足,此处仅填充了2个字段)。当你遍历原始表的记录集时,你保持每一行,并在一周的时间段内分配添加和退出之间的时间。

之后,一旦填充了表格,就可以很容易地创建一个基于此表的简单查询和带有weeklyprogressnotes的表格。

我希望我的解释已经足够了,请注意我还没有测试过代码。很可能需要代表您进行一些调整。如果我有更多的时间在手上,也许我可以稍后再看一下。

Sub showrecords()
Dim gvweek As String
Dim rs As Recordset
Dim rstemp As Recordset
Dim tdfNew As TableDef

gvweek = ""

Set tdfNew = CurrentDb.CreateTableDef("Tbl_Temporary")
With tdfNew
    .Fields.Append .CreateField("fName", dbText)
    .Fields.Append .CreateField("week", dbText)
End With

Set rs = CurrentDb.OpenRecordset("Clients")
With rs
    Do Until .EOF
        .MoveFirst
            Do Until DateAdd("dd", 7, ![admissionDate]) > ![dischargeDate]
                gvweek = ![admissionDate] & " - " & DateAdd("dd", 7, ![admissionDate])
                    Set rstemp = CurrentDb.OpenRecordset("Tbl_Temporary")
                        With rstemp
                            .AddNew
                            ![fName] = rs![fName]
                            ![week] = gvweek
                            .Update
                        End With
                    rstemp.Close
                    Set rstemp = Nothing
            Loop
        gvweek = ""
        .MoveNext
    Loop
End With

rs.Close
Set rs = Nothing
DoCmd.DeleteObject acTable, "Tbl_Temporary"
End Sub