Я создаю базу данных с помощью MS Access, которая позволяет пользователю выбрать человека и неделю и просмотреть смены, которые этот человек собирается делать.

Вот моя проблема, у меня есть код, работающий с использованием DLookup для поиска сотрудника, использующего pid, и поиска определенного дня следующим образом:

'Look up shifts
If IsNull(DLookup("Monday", "tblShifts", "[SPID]= " & SPID)) Then
    MsgBox "Sorry missing shifts", vbCritical, "Error"
Else
    selectedDate = Form_frmMain.cboWeekCommencing.Value
    'MsgBox selectedDate 'shows selected date
    MonShift = DLookup("Monday", "tblShifts", "[SPID]= " & SPID & " AND [WeekBegin]= #" & selectedDate & "#")
    TueShift = DLookup("Tuesday", "tblShifts", "[SPID]= " & SPID & " AND [WeekBegin]= #" & selectedDate & "#")
    WedShift = DLookup("Wednesday", "tblShifts", "[SPID]= " & SPID & " AND [WeekBegin]= #" & selectedDate & "#")
    ThurShift = DLookup("Thursday", "tblShifts", "[SPID]= " & SPID & " AND [WeekBegin]= #" & selectedDate & "#")
    FriShift = DLookup("Friday", "tblShifts", "[SPID]= " & SPID & " AND [WeekBegin]= #" & selectedDate & "#")
    SatShift = DLookup("Saturday", "tblShifts", "[SPID]= " & SPID & " AND [WeekBegin]= #" & selectedDate & "#")
End If

Изображение формы, используемой в базе данных:
Изображение формы, используемой в базе данных

Выбор таблицы, используемой в DLookup: Выбор таблицы, используемой в DLookup

На приведенном выше изображении раскрывающийся список дат заполняется из следующего кода при загрузке формы:

thisWeek = Date - Weekday(Date, vbMonday) + 1
nextWeek = Date - Weekday(Date, vbMonday) + 8
weekAfter = Date - Weekday(Date, vbMonday) + 15

cboWeekCommencing.AddItem (thisWeek)
cboWeekCommencing.AddItem (nextWeek)
cboWeekCommencing.AddItem (weekAfter)

Каждый из них относится к началу недели 22/05/2017, 29/05/2017, 05/06/2017. Когда изменяется либо список, либо раскрывающийся список, вызывается верхняя функция для заполнения смен, однако, когда я выбираю недели из 22/05/2017 и 29/05/2017, все работает нормально, но когда {{X5 }} выбран DLookup возвращает значения NULL.

Несколько вещей, которые я пробовал, - это изменить недели на более поздние, опять же, все работает нормально, если дата установлена на 19/06/2017 или 26/06/2017, но снова не работает, когда {{X2} } используется в качестве даты.

Все работает нормально, когда используется только идентификатор персонала.

У кого-нибудь есть идеи, почему это может произойти?

0
Matt Jackson 27 Май 2017 в 22:56

2 ответа

Лучший ответ

Это потому, что Access неправильно интерпретирует ваши даты. Даты в Access SQL (и, следовательно, DLookUp) должны быть в формате США. Поскольку 22/05/2017 в США будет 22-м месяцем, а этого не существует, Access предполагает, что это европейский формат даты. Но это всегда должен быть американский формат, поэтому 05/06/2017 будет интерпретироваться как 6 мая (см. Документация Аллена Брауна).

Так что измени это:

selectedDate = Form_frmMain.cboWeekCommencing.Value

К этому:

selectedDate = Format$(Form_frmMain.cboWeekCommencing.Value, "\#mm\/dd\/yyyy\#")

Предполагая, что cboWeekCommencing имеет тип Дата / Время.

1
Erik A 27 Май 2017 в 20:21

Когда вы написали # XX / YY / ZZZZ # выражение в запросе MS Access SQL. MS Access пытается распознать дату. Сначала MS Access пытается распознать дату в формате # MM / DD / YYYY #. И только при неудачной попытке он пытается распознать дату в формате # DD / MM / YYYY #.

В вашем примере 19/06/2017 распознается как 19 июня 2017 г., а 05/06/2017 распознается как 06 мая 2017 г.

Я рекомендую использовать формат # MM / DD / YYYY # каждый раз в запросе MS Access SQL.

1
Oleg Belousov 27 Май 2017 в 20:24