#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. Затем вы можете открыть свою форму и задать свой запрос в качестве исходного кода. Спасибо, надеюсь, моего ответа достаточно!