Запросить несколько записей между неделями, где нет записи в дочерней таблице

Я пытаюсь определить лучший метод обработки этого запроса с помощью 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 не будет записи, если она еще не проверила и не подтвердила эту неделю. Таким образом, форма в основном будет выглядеть так:

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-запрос, который может сократить некоторые из циклов.


person user41814    schedule 01.07.2014    source источник


Ответы (1)


Я бы решил эту проблему, создав новую таблицу. Поскольку вы хотите разделить дату и время между датой поступления и выписки на несколько строк, я думаю, что было бы лучше разделить клиента на несколько записей в таблице.

Следующий код создает набор записей на основе вашей базовой таблицы клиентов. После этого он создает вашу временную таблицу (здесь заполнено только 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
person Jens    schedule 01.07.2014
comment
Я работаю над реализацией этого. Весь мой опыт работы со сценариями в стиле VB был связан с веб-дизайном, и я никогда не создавал такую ​​временную таблицу в Access. Я думаю, что на мне лежит основная часть кода, который разберет и создаст временную таблицу со всеми данными. Теперь я пытаюсь выяснить, как получить доступ к этой временной таблице и использовать значения ее полей для моего источника управления в моей форме. Любые дополнительные мысли или направление? Спасибо за ваш ответ выше. Я нашел это очень информативным и хорошим опытом обучения, поскольку я никогда не пытался ничего подобного раньше в Access. - person user41814; 02.07.2014
comment
Возможно, вы можете визуально создать таблицу и очистить ее каждый раз, когда закончите с ней программно, если это вам больше подходит. Будьте осторожны с этим, если форма откроется до создания таблицы, вы обязательно получите ошибки. Вам придется программно создать свой запрос, если вы собираетесь использовать этот метод. Что вы хотите сделать, так это создать строку SQL, состоящую из информации, которую вы хотите получить из вашей временной таблицы и таблицы еженедельного прогресса. Затем вы можете открыть свою форму и установить свой запрос в качестве исходного кода. Спасибо, надеюсь, мой ответ достаточен! - person Jens; 02.07.2014