我正在尝试确定如何使用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查询。
答案 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