【发布时间】:2018-10-19 20:08:33
【问题描述】:
在代码中执行时,我无法让三个参数查询返回任何结果。
如果我手动执行查询,它们可以正常工作,当我将相关表、查询和 VBA 代码复制到新数据库中以尝试创建 Minimal, Complete, and Verifiable example 时,它也可以正常工作......
我的三个表是:
表: 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 部分和所有表/查询复制到一个新数据库并运行它,它工作正常,如果我手动运行每个查询它工作正常,如果我使用上面的这段代码运行它,那么 @ 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