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

#ms-access #between

#ms-access #между

Вопрос:

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

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

Ответ №1:

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

Следующий код создает набор записей на основе вашей базовой таблицы клиентов. После этого создается ваша временная таблица (здесь заполняется только 2 полями из-за нехватки времени). Когда вы перебираете набор записей вашей исходной таблицы, вы удерживаете каждую строку и разделяете время между addmission и dischargedate на блоки по одной неделе.

Впоследствии, после заполнения таблицы, легко создать простой запрос на основе этой таблицы и таблицы с примечаниями weeklyprogress.

Я надеюсь, что моего объяснения было достаточно, и, пожалуйста, обратите внимание, что я еще не тестировал код. Скорее всего, это потребует некоторой настройки от вашего имени. Возможно, я смогу посмотреть на это позже, если у меня будет еще немного времени.

 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] amp; " - " amp; 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
  

Комментарии:

1. Я работаю над реализацией этого. Весь мой опыт работы со сценариями в стиле VB был связан с веб-дизайном, и я никогда не создавал временную таблицу, подобную этой, в Access. Я думаю, что на мне лежит основная тяжесть кода, который отсортирует и создаст временную таблицу со всеми данными. Теперь я пытаюсь выяснить, как получить доступ к этой временной таблице и использовать значения ее полей для моего источника управления в моей форме. Какие-либо дополнительные мысли или направление? Спасибо за приведенный выше ответ. Я нашел это очень информативным и хорошим опытом обучения, поскольку я никогда раньше не пробовал ничего подобного в Access.

2. Возможно, вы можете визуально создавать таблицу и очищать ее каждый раз, как только закончите с ней программно, если это вам больше подходит. Будьте осторожны с этим, если форма откроется до создания таблицы, вы обязательно получите ошибки. Вам придется программно создать свой запрос, если вы собираетесь использовать этот метод. Что вы хотите сделать, это создать строку SQL, состоящую из нужной вам информации из вашей временной таблицы и вашей таблицы weeklyprogress. Затем вы можете открыть свою форму и задать свой запрос в качестве исходного кода. Спасибо, надеюсь, моего ответа достаточно!