Запросы INSERT и UPDATE Parameter не работают при выполнении из кода - PullRequest
0 голосов
/ 09 мая 2018

У меня проблемы с получением трех параметров запросов для возврата любых результатов при выполнении в коде.

Запросы работают нормально, если я выполняю их вручную, и когда я скопировал соответствующие таблицы, запросы и код 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, либо сохраните запись .....

1 Ответ

0 голосов
/ 11 мая 2018

Оказывается, ответ был прост, отчасти очевиден и вряд ли получит ответ на моей первой итерации вопроса, поскольку я пропустил ключевые моменты (см. Правки в вопросе).

Сценарий представляет собой Continuous Form, связанный с таблицей, содержащей семь пустых записей, за исключением первичного ключа, перечисляющего диапазон номеров от 1 до 7.
Пользователь вводит данные в одну или несколько из этих записей изатем нажимает кнопку Сохранить , которая переносит все записи, введенные в финальную таблицу.

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

Q1.Если данные вводятся в одно или несколько полей главной формы, а затем пользователь нажимает кнопку, открывающую окно сообщения, сохраняется ли запись?

Нет, если кнопка находится на главной форме.Однако иногда требуется сохранить запись (возможно, для печати значений), чтобы в событии OnClick для принудительного сохранения было что-то вроде If Me.Dirty, тогда Me.Dirty = False.

Bytes.com - Когда сохраняется запись?

Поэтому ответом было добавить

If Me.Dirty Then Me.Dirty = False  

к началу процедуры btnCreateLunchPattern_Click().


В свете этого - вопрос сейчас не совсем соответствует ответу.Должен ли я просто удалить вопрос?Переписать это так, чтобы оно соответствовало ответу?Спроси на мета?
...