【问题标题】:INSERT and UPDATE Parameter queries not working when executed from code从代码执行时,INSERT 和 UPDATE 参数查询不起作用
【发布时间】:2018-10-19 20:08:33
【问题描述】:

在代码中执行时,我无法让三个参数查询返回任何结果。

如果我手动执行查询,它们可以正常工作,当我将相关表、查询和 VBA 代码复制到新数据库中以尝试创建 Minimal, Complete, and Verifiable example 时,它也可以正常工作......

我的三个表是:

表: List_LunchPattern_Names

  • PatternID(自动编号和主键)
  • Pattern_Name(文字)

表: List_LunchPatterns

  • PatternID(数字和主键 - 长整数)
  • Pattern_Step(数字和主键 - 长整数)
  • LunchStart1LunchEnd1LunchStart2LunchEnd2(日期/时间 - 短时间)

表:tmp_LunchPatterns

  • Pattern_Step(数字和主键 - 长整数)
    预填充数字 1 - 7,代表一周中的几天。
  • LunchStart1LunchEnd1LunchStart2LunchEnd2(日期/时间 - 短时间)

三个查询分别是:

查询: 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 部分和所有表/查询复制到一个新数据库并运行它,它工作正常,如果我手动运行每个查询它工作正常,如果我使用上面的这段代码运行它,那么 @ 987654348@ 工作正常,但第二个查询仅部分有效,最后一个根本无效。
第二个查询使用正确的PatternID 添加了 7 条记录,但是即使这 7 条记录必须来自包含预期开始/结束时间的临时表,开始和结束时间也是空白的。

我有什么明显的遗漏吗?

编辑:

为了尽量减少我的问题,我似乎错过了一个非常重要的部分。
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:

这更像是一种练习,以确保我首先正确地测试了所有内容。

这只是我添加到临时表中的最后一条记录,在更新查询期间被忽略 - 我在早期的测试中没有看到这一点,因为我只添加了一条记录。例如,将时间添加到星期一和星期二将仅使用星期一创建一个模式,而星期二仍保留在临时表中 - 即使在我执行查询以清除表之后也是如此。
这使我相信,当我在一段时间内退出控件以单击完成模式的按钮时,该模式直到单击事件完成后才将记录添加到表中,因此在单击事件开始时我应该要么DoEvents要么保存记录.....

【问题讨论】:

  • 恕我直言,如果使用复制代码创建新数据库有效,则问题可能存在于旧数据库中,而不是代码中。几种可能性之一可能是数据库损坏。或者某种全局变量与您的声明有关。但是,不,(在我看来)没有任何明显不正确的地方。
  • Withs 很多,其中一些是嵌套的。我注意到以前我无法诊断的嵌套Withs 的奇怪之处。您可以尝试显式声明所有变量而不使用任何变量吗?
  • @Erikvonasmuth 我会在我回到办公室时尝试一下。我只是希望它不是损坏 - 在之前丢失所有 VBA 之后,我才刚刚从文本文件中重建它。
  • 为什么每次通过时都运行“DML_Clear_tmp_LunchPatterns”?这不是清除所有临时时间段吗?在您提示输入新模式之前,我看不到任何代码可以填充这些代码。除非我遗漏了一些明显的东西——那会导致空白时间
  • 是的,对不起,我应该解释一下。该表单使用List_LunchPatterns 作为其数据源。使用List_LunchPattern_Names 的组合框将表单过滤为相关数据。组合框还有一个 New Pattern 选项,它将源更改为tmp_LunchPatterns 表,允许用户创建一个新的 7 天模式并将其与现有模式进行比较,然后再将其提交到最终表。有点烦现在想一想……使用批量更新而不是临时表可能会更好。

标签: ms-access vba ms-access-2010


【解决方案1】:

事实证明,答案很简单,有点明显,而且在我第一次迭代问题时不太可能得到答案,因为我遗漏了关键点(请参阅问题中的编辑)。

场景是一个Continuous Form 链接到一个包含七个空记录的表,除了列出数字范围 1 到 7 的主键。
用户将数据输入到这些记录中的一个或多个,然后单击保存按钮,将输入的所有记录传输到最终表。

这里的问题是你输入数据的控件和按钮在同一个表单上,所以当你点击按钮时,最后输入的记录没有保存。
在查找事件顺序来解释这一点时,我发现了这一点:

第一季度。如果在主窗体的一个或多个字段中输入数据,并且 用户然后单击打开消息框的按钮,是记录 得救了吗?

不,如果按钮在主窗体上。然而,你有时 想要保存记录(可能打印值)所以在 OnClick 事件你会有类似 If Me.Dirty then Me.Dirty = False in 为了强制保存。

Bytes.com - When is a record saved?

所以答案是添加

If Me.Dirty Then Me.Dirty = False  

btnCreateLunchPattern_Click() 过程的开始。


鉴于此 - 这个问题现在并不适合答案。我应该删除问题吗?改写它以符合答案?问元?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2013-12-03
    相关资源
    最近更新 更多