У меня проблемы с получением трех параметров запросов для возврата любых результатов при выполнении в коде.
Запросы работают нормально, если я выполняю их вручную, и когда я скопировал соответствующие таблицы, запросы и код VBA в новую базу данных, чтобы попытаться создать Минимальный, Полный и проверяемый пример , он работал нормально а также ....
Мои три таблицы:
Таблица: List_LunchPattern_Names
PatternID
(автонумерация и первичный ключ)
Pattern_Name
(Текст)
Таблица: List_LunchPatterns
PatternID
(номер и первичный ключ - длинное целое)
Pattern_Step
(номер и первичный ключ - длинное целое)
LunchStart1
, LunchEnd1
, LunchStart2
и LunchEnd2
(Дата / Время - Короткое время)
Таблица: tmp_LunchPatterns
Pattern_Step
(номер и первичный ключ - длинное целое)
Предварительно заполнены номерами 1 - 7, обозначающими дни недели.
LunchStart1
, LunchEnd1
, LunchStart2
и LunchEnd2
(Дата / Время - Короткое время)
Три запроса:
Запрос: DML_Add_NewLunchPattern_Name
PARAMETERS New_Pattern_Name Text ( 255 );
INSERT INTO List_LunchPattern_Names ( Pattern_Name )
VALUES (New_Pattern_Name);
Запрос: DML_Add_NewLunchPattern
PARAMETERS Pattern_Identifier Long;
INSERT INTO List_LunchPatterns (
PatternID, Pattern_Step, LunchStart1,
LunchEnd1, LunchStart2, LunchEnd2
)
SELECT Pattern_Identifier, Pattern_Step, LunchStart1
, LunchEnd1, LunchStart2, LunchEnd2
FROM tmp_LunchPatterns;
Запрос: DML_Clear_tmp_LunchPatterns
UPDATE tmp_LunchPatterns
SET LunchStart1 = NULL, LunchEnd1 = NULL
, LunchStart2 = NULL, LunchEnd2 = NULL;
Код находится за кнопкой в форме List_LunchPatterns
:
Private Sub btnCreateLunchPattern_Click()
Dim sResult As String
Dim sExisting As Variant
Dim lNewID As Long
Dim db As DAO.Database
On Error GoTo ERR_HANDLE
sResult = InputBox("Please provide a unique name for the new lunch pattern.", "Lunch Patterns")
sResult = Trim(sResult)
If Len(sResult) = 0 Then
'No entry.
Else
sExisting = DLookup("Pattern_Name", "List_LunchPattern_Names", "Pattern_Name='" & sResult & "'")
If sExisting <> "" Then
'Existing entry.
MsgBox "'" & sResult & "' already exists. Please choose another name.", vbOKOnly + vbInformation
Else
'Valid answer.
Set db = CurrentDb
'Add the new name to the pattern name list.
'Add the temporary times into the final table.
'Clear the temporary table, requery the combo-box for the new name
With db
With .QueryDefs("DML_Add_NewLunchPattern_Name")
.Parameters("New_Pattern_Name") = sResult
.Execute
End With
lNewID = DLookup("PatternID", "List_LunchPattern_Names", "Pattern_Name='" & sResult & "'")
With .QueryDefs("DML_Add_NewLunchPattern")
.Parameters("Pattern_Identifier") = lNewID
.Execute
End With
.QueryDefs("DML_Clear_tmp_LunchPatterns").Execute
End With
With Me
.cmbPattern_Selector.Requery
.cmbPattern_Selector = lNewID
.RecordSource = "List_LunchPatterns"
FilterForm Me, "PatternID=" & .cmbPattern_Selector
End With
End If
End If
EXIT_PROC:
On Error GoTo 0
Exit Sub
ERR_HANDLE:
DisplayError Err.Number, Err.Description, "Form_List_LunchPatterns.btnCreateLunchPattern_Click()"
Resume EXIT_PROC
End Sub
Процедура FilterForm
, используемая в нижней части кода:
Public Sub FilterForm(frm As Object, FilterString As String)
On Error GoTo ERR_HANDLE
With frm
.Filter = FilterString
.FilterOn = True
End With
EXIT_PROC:
On Error GoTo 0
Exit Sub
ERR_HANDLE:
Select Case Err.Number
Case Else
DisplayError Err.Number, Err.Description, "mdl_FormFilter.FilterForm()"
Resume EXIT_PROC
End Select
End Sub
Вопрос:
Если я копирую часть кода QueryDefs и все таблицы / запросы в новую базу данных и запускаю ее, она работает нормально, если я вручную запускаю каждый запрос, он работает нормально, если я запускаю его, используя этот блок кода выше, тогда DML_Add_NewLunchPattern_Name
работает нормально, но второй запрос работает только частично, а последний вообще не работает.
Второй запрос добавляет семь записей, используя правильный PatternID
, но время начала и окончания пустое, хотя эти семь записей должны быть получены из временной таблицы, которая содержит время начала / окончания, как и ожидалось.
Есть что-то очевидное, что я пропускаю?
Edit:
Пытаясь свести вопрос к минимуму, похоже, я упустил довольно важную часть.
Таблица List_LunchPattern_Names
используется для заполнения поля со списком в форме, которая фильтрует записи, отображаемые с List_LunchPatterns
, до соответствующего шаблона.
Row Source
для поля со списком:
SELECT DISTINCT 0 AS PatternID
, '<New Pattern>' AS Pattern_Name
FROM SingleRecord
UNION SELECT PatternID, Pattern_Name
FROM List_LunchPattern_Names
ORDER BY PatternID
Первый вариант в поле со списком - создать новый шаблон. При выборе этого параметра формы RecordSource
изменяются на временную таблицу, так что новый шаблон можно вводить и проверять по существующим шаблонам перед финализацией.
Код для этого приведен ниже, и я думаю, проблема в том, что форме требуется обновление или запрос, чтобы завершить изменение источника записи.
Private Sub cmbPattern_Selector_AfterUpdate()
On Error GoTo ERR_HANDLE
With Me
'If the selected pattern is different from the currently
'active pattern unhide the Assign Pattern button.
If Not IsNull(OpenArgs) Then
If .cmbPattern_Selector <> Split(OpenArgs, "|")(2) Then
.btnAssignLunchPattern.Visible = True
End If
End If
If .cmbPattern_Selector <> 0 Then
.cmbPattern_Selector.SetFocus
.btnCreateLunchPattern.Visible = False
.RecordSource = "List_LunchPatterns"
FilterForm Me, "PatternID=" & .cmbPattern_Selector
Else
.btnCreateLunchPattern.Visible = True
.RecordSource = "tmp_LunchPatterns"
.btnAssignLunchPattern.Visible = False
End If
End With
EXIT_PROC:
On Error GoTo 0
Exit Sub
ERR_HANDLE:
DisplayError Err.Number, Err.Description, "Form_List_LunchPatterns.cmbPattern_Selector_AfterUpdate()"
Resume EXIT_PROC
End Sub
Редактировать 2:
Это превращается в большее упражнение, чтобы убедиться, что я сначала все правильно проверил.
Это только последняя запись, которую я добавляю в временную таблицу, которая игнорируется во время запросов на обновление - я не видел этого в более ранних тестах, так как добавлял только одну запись. Например, добавление времени к понедельнику и вторнику создаст шаблон с использованием только понедельника, а вторник останется во временной таблице - даже после того, как я выполню запрос для очистки таблицы.
Это заставляет меня поверить, что когда я выхожу из элемента управления для периода времени, чтобы нажать кнопку, которая завершает шаблон, запись которого не добавляется в таблицу до тех пор, пока не завершится событие click, поэтому в начале события click я должен либо DoEvents
, либо сохраните запись .....