MS Access - 使用子表单过滤时禁止保存提示

Posted

技术标签:

【中文标题】MS Access - 使用子表单过滤时禁止保存提示【英文标题】:MS Access - Suppress Save Prompt When Using Subform Filtering 【发布时间】:2019-07-21 19:34:22 【问题描述】:

我有一个表单设置,它有一个子表单窗口和几个命令按钮。子表单在交叉表查询中加载,允许用户在导出之前将数据操作到所需的数据集(使用命令按钮完成导出)。此操作仅供一次性使用,并在表单关闭时丢弃。当表单关闭时,系统会提示我保存交叉表查询。我想找到一种方法来关闭此提示并放弃更改。

澄清:表单打开,查询加载,用户将数据过滤到他们想要查看/导出的数据,当表单关闭时,会提示保存查询。此提示仅在已应用过滤器时出现。

我最初尝试设置一个表单以用作子表单,但很快意识到添加新列时不会创建新控件(这就是我使用交叉表的全部原因)。当使用“关闭表单”命令按钮关闭表单时,我有这行代码

DoCmd.Close , , acSaveNo

效果很好。当以任何其他方式关闭表单时,会出现提示(用“x”关闭表单、退出数据库等)。 我不想关闭警告,因为这将保存对交叉表查询的更改。我一直在到处研究解决方法,但我正在使用并且必须使用交叉表查询这一事实成为一个重要因素。

我用于将交叉表查询过滤应用于导出命令的代码:

Private Sub ExportCmd_Click()

Dim NewSQL As String
Dim strPart1 As String
Dim strPart2 As String
Dim strPart3 As String
Dim OrigSQL As String

On Error GoTo Cancelled_Export

OrigSQL = CurrentDb.QueryDefs("basicrecordextractcrosstab").SQL
If Forms("exportlogdataform").Controls("Child290").Form.Filter & vbNullString = vbNullString Then
    NewSQL = OrigSQL
Else
    strPart1 = Left(OrigSQL, InStr(1, OrigSQL, "GROUP BY", vbTextCompare) - 1)
    strPart2 = "WHERE " & Replace(Forms("exportlogdataform").Controls("Child290").Form.Filter, "[BasicRecordExtractCrosstab].", "", , , vbTextCompare)
    strPart3 = Right(OrigSQL, Len(OrigSQL) - Len(strPart1))
    NewSQL = strPart1 & strPart2 & Chr(13) & strPart3
End If

CurrentDb.QueryDefs("basicrecordextractcrosstab").SQL = NewSQL

DoCmd.OutputTo acOutputQuery, "BasicRecordExtractCrosstab", "ExcelWorkbook(*.xlsx)", "", True, "", , acExportQualityPrint

Restore_SQL_Def:

CurrentDb.QueryDefs("basicrecordextractcrosstab").SQL = OrigSQL

Exit Sub

Cancelled_Export:
    If Err = 2501 Then
        MsgBox "Export to Excel Action Cancelled", vbInformation + vbOKOnly, "Export Cancelled"
    ElseIf Err = 2302 Then
        MsgBox "Unable to save export file.  Make sure the file is not currently open.", vbExclamation + vbOKOnly, "Export Failed"
    Else
        MsgBox Err & ": " & Error$
    End If

Resume Restore_SQL_Def

End Sub

【问题讨论】:

测试代码。它不会更改子表单上显示的查询,但会导出更改后的 SQL。当我用 X 关闭表单时不会触发提示。无法复制问题。 当过滤器应用于数据(即特定日期的所有条目)时会出现此问题。我假设正在发生的是过滤器正在改变导致保存提示的查询设计。 也进行了测试。没有提示。 有趣....我将不得不看看我是否可以将数据库的模型放在一起进行测试/评估。如果您对执行这些操作的替代技术有任何想法,我很想听听。 【参考方案1】:

我不想走这条路,但我硬编码了默认 SQL 定义并在表单加载时关闭了警告。我在表单的关闭事件中重新打开了警告。

Private Sub Form_Load()

Dim OrigSQL as String

OrigSQL = "Default SQL Def string here"

CurrentDb.QueryDefs("basicrecordextractcrosstab").SQL = OrigSQL

DoCmd.SetWarnings False

End Sub
Private Sub Form_Close()

DoCmd.SetWarnings True

End Sub

【讨论】:

以上是关于MS Access - 使用子表单过滤时禁止保存提示的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 2003 - Unbound Form 使用 INSERT 语句保存到表中;子表单呢?

MS Access:数据表属性(作为子表单)- 表单未打开,错误:2489?

根据 MS Access 中的用户过滤子表单

MS Access 验证规则未在子表单中触发

子表单在 MS Access 中的主表单之前打开

MS Access 365 - 创建包含链接文件的子表单