【问题标题】:Form not working unless underyling query re-saved除非重新保存underyling查询,否则表单不起作用
【发布时间】:2016-10-05 22:19:56
【问题描述】:

我是 Access 的新手,我试图从我在这里找到的有用信息中拼凑出一些东西。

我有一个表单,它需要根据表单标题中的组合框选择来填充字段。该表单基于具有以下条件的基础查询,字段“StudID”[Forms]![frmStudConsentUpdate]![cmbStud] 其中 cmbStud 是我的组合框。组合框拉入 StudID、StudFN、StudLN,其中 StudID 作为绑定列。更新后事件请求表单 (Me.Requery)。这很好用,但前提是我首先在设计视图中打开表单,打开记录源并保存它。我根本没有做任何改变,但是一旦我完成了这个表格就可以工作了。否则,当我在组合框中选择一个学生时,什么也不会发生。关于我需要做些什么来完成这项工作而不必重新保存基础查询有什么想法吗?

【问题讨论】:

  • 表面上看起来还可以,可以上传你的数据库吗?如果是这样,我会看看。

标签: ms-access


【解决方案1】:

这是 MS Access 中的旧错误,我不知道他们为什么仍然没有修复它: 如果底层表单的查询在标准表单的控件中,并且表单被过滤了一次(在启动时或手动/使用 VBA),它不接受来自表单控件的新值并使用旧值。

解决方法:创建公共函数,它返回控件的值并在条件中使用它而不是[Forms]![frmStudConsentUpdate]![cmbStud]。您需要为每个控件创建函数或使用此函数:

Public Function GetControlValue(strFormName As String, strControlName As String, Optional strSubFormControlName As Variant, Optional varDefault As Variant) As Variant
' Returns : Variant, value of control in form/subform
' Comments:
' Params  :
'           strFormName
'           strControlName
'           strSubFormControlName
'           varDefault - value returned if control is not accessible
'----------------------------------------------------------------------------
On Error GoTo ErrorHandler

If IsMissing(strSubFormControlName) Or Nz(strSubFormControlName, "") = "" Then
    GetControlValue = Forms(strFormName).Controls(strControlName).Value
Else
    GetControlValue = Forms(strFormName).Controls(strSubFormControlName).Form.Controls(strControlName).Value
End If

ExitHere:
    On Error Resume Next
    Exit Function

ErrorHandler:
    If Not IsMissing(varDefault) Then
        GetControlValue = varDefault
    End If
    Resume ExitHere
End Function

在标准中使用函数调用GetControlValue("frmStudConsentUpdate","cmbStud") 而不是[Forms]![frmStudConsentUpdate]![cmbStud]

【讨论】:

  • 非常感谢,谢尔盖。我能够实现您的解决方案并创建公共函数,并且更改了查询条件。但是,在组合框中选择值后,表单仍然无法更新,除非我打开基础查询并先保存它。我可能错过了一步吗?
  • 尝试将记录源中的查询保存为已保存的查询并选择它作为记录源
  • 我也想过同样的事情,但也没有用。
  • 我想我在不使用干扰过滤器的情况下找到了不同的解决方案。非常感谢您的帮助!
【解决方案2】:

在您的 cmbStud 组合框的 afterupdate 中,创建将记录源刷新到的代码

me.recordsource = "SELECT * FROM {yourQueryName} WHERE StudID = '" & me!cmbStud & "'"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多