2014-07-01 27 views
0

我試圖確定如何使用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 

我創建的形式,審計人員可以打開,以確定她需要檢查每一個客戶,看看他們是否有自己的weeklyprogressnotes這一週完成了哪些周。周 - 周運行,如果她還沒有檢查並確認那周,那麼在WeeklyProgressNotes表中將沒有記錄。所以形式將基本上是這樣的:

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語句來選擇所有客戶端,然後創建一個函數,確定他們在特定周內的入學日期以及他們在特定周的出院日期,然後創建一個循環與另一個帶有BETWEEN子句的SQL語句,用於確定WeeklyProgressNotes表中是否有條目。如果沒有,那麼我會顯示上述信息。我不確定是否有一個更容易,更少搜索密集的方式來做到這一點。也許一個SQL查詢可以削減一些循環。

回答

0

我會解決這個問題的方法是創建一個新表。既然你想把日期時間分成多行,我認爲最好是把客戶分成多個記錄。

以下代碼根據您的基本客戶端表創建記錄集。之後,它會創建您的臨時表(由於缺少時間,此處只填充2個字段)。當循環訪問原始表的記錄集時,您需要保留每一行,並按照一週的時間段將分配時間和排出時間分開。

之後,一旦您填充了表格,就可以很容易地根據此表格和包含每週進度註釋的表格創建一個簡單的查詢。

我希望我的解釋足夠了,請注意我還沒有測試過代碼。它很可能需要您代表一些調整。如果我有更多時間在我手上,也許我可以稍後再看。

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 
+0

我正在執行此操作。我對VB風格腳本的體驗都與網頁設計有關,並且我從來沒有在Access中創建過這樣的臨時表。我認爲,我的代碼首當其衝,將整理所有數據並創建臨時表。現在我試圖找出如何訪問該臨時表並將其字段值用於我的表單中的控制源。任何額外的想法或方向?感謝您的上述回覆。我發現它具有豐富的信息量和良好的學習體驗,因爲我以前從來沒有在Access中嘗試過這樣的事情。 – user41814

+0

您可以在視覺上創建表格並在每次完成編程後將其清空,如果這樣更適合您。 要小心,如果表格在表格創建之前打開,您肯定會收到錯誤。如果您要使用此方法,您將不得不以編程方式創建查詢。你想要做的是創建一個由你的臨時表和你的weeklyprogress表所需的信息組成的SQL字符串。然後,您可以打開您的表單並將您的查詢設置爲源代碼。謝謝,希望我的回答足夠了! – Jens

相關問題