MS Access查询自定义函数接受表单文本输入为值

时间:2016-09-01 08:44:27

标签: sql vba access

G'day,大家。

我一整天都在反对这个问题,直到今天,我还没找到任何答案,所以我很感激你的帮助。

我有什么:

  • 包含文本字段的Access表单
  • 作为表单数据源的查询
  • 在模块中定义的名为RegExp的自定义函数

RegExp将两个值作为输入:string(从表中获取)和pattern(从表单中获取)。 RegExp返回一个布尔值,这反过来会使查询结果变得稀疏。

该功能完全正常并且符合预期,但这只是用户填写文本字段时的情况。如果该字段留空,则不返回任何结果(如果是这种情况,则该函数甚至不会被调用)。

所以这是查询中的特定语句:

... AND (RegExp(tblRole.Description,Trim([Forms]![frmFindRole]![txtRegExp]))<>False) AND ...

(基本上,总结一下,用户在文本字段中键入值,将前导和尾随空格修剪掉,转换为VBA模块内的正则表达式,然后根据什么布尔值对查询结果进行过滤函数返回)。

此表单上有许多控件,在我添加txtRegExp文本字段之前,它们有效。现在,如果填写txtRegExp,查询只返回结果,我不知道为什么。我已经尝试添加更多检查,但查询已经太复杂了,我还没有成功。

如果要求提供其他代码示例,我明天就可以提供。

提前谢谢。

P.S。 Nz会有帮助吗?如果是,那我将如何使用呢?

2 个答案:

答案 0 :(得分:0)

基于您在评论中提供的一些解释

假设这是在KeyUp事件上触发的代码:

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)

    Me.Requery

End Sub

将表单的记录源的默认SQL存储在局部变量中的某个位置。在此示例中,我认为您将其存储在SQLdefault字符串中。

在重新查询之前,检查文本框是否为空,如果是,则相应地更改表单的记录源SQL:

private SQLdefault as string

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)

    Dim SQL As String

    If Nz(txtRegExp, "") = "" Then
        SQL = SQLdefault 
        SQL = Replace(SQL, "AND (RegExp(tblRole.Description,Trim([Forms]![frmFindRole]![txtRegExp]))<>False)", "")
        Me.RecordSource = SQL ' Normally this is enought to requery, if not uncomment below
        'Me.Requery
    Else
        Me.RecordSource = SQLdefault ' Normally this is enought to requery, if not uncomment below
        ' Me.Requery
    End If

End Sub

在这个例子中,我只删除了SQL部分包含:

AND (RegExp(tblRole.Description,Trim([Forms]![frmFindRole]![txtRegExp]))<>False)

如果不正确,请用别的东西替换它。

这显然不是最优雅的解决方案,但很难为您提供最佳解决方案。

答案 1 :(得分:0)

我已设法通过将initial query修改为include a check来获取txtRegExp的值。

我仍然不完全确定为什么它失败了一个空白的txtRegExp值。我有一种感觉,当提供NULL作为第二个参数时,RegExp函数以某种方式不会触发。

我非常感谢Thomas G提供的所有帮助。