1

我有一个与命令按钮相关的简单查询,该按钮显示特定字段中值的摘要。它在每次使用数据库时都会更改的表上运行,因此有时该表将包含此字段,有时则不会。当字段(称为语言)不在文件中时,用户单击命令按钮并获得“输入参数值”消息框。如果他们点击取消,他们就会得到我的消息框,解释该字段在文件中不存在。如果找不到该字段,我想绕过“输入参数值”并直接转到消息。这是我的代码:

Private Sub LangCount_Click()
DoCmd.SetWarnings False

On Error GoTo Err_LangCount_Click

    Dim stDocName As String

    stDocName = "LanguageCount"
    DoCmd.OpenQuery stDocName, acNormal, acEdit

Err_LangCount_Click:
    MsgBox "No Language field found in Scrubbed file"
Exit_LangCount_Click:
    Exit Sub

     DoCmd.SetWarnings True
End Sub
4

2 回答 2

2

在运行查询之前,您可以尝试根据查询打开记录集:

Set rs = CurrentDb.QueryDefs("query1").OpenRecordset

如果查询有任何问题,这将直接进入错误编码。

或者,如果它始终是语言字段并且始终在同一个表中,您可以:

sSQL = "select language from table1 where 1=2"
CurrentDb.OpenRecordset sSQL

这也将失败并转到您的错误编码,但如果它没有失败,您将拥有一个小得多的记录集,一个零记录。

您可以使用 ADO 模式轻松获取表中的字段列表:

Dim cn As Object ''ADODB.Connection
Dim i As Integer, msg As String

    Set cn = CurrentProject.Connection
    Set rs = cn.OpenSchema(adSchemaColumns, Array(Null, Null, "Scrubbed"))

    While Not rs.EOF
        i = i + 1
        msg = msg & rs!COLUMN_NAME & vbCrLf
        rs.MoveNext
    Wend

    msg = "Fields: " & i & vbCrLf & msg

    MsgBox msg

更多信息: http: //support.microsoft.com/kb/186246

于 2012-06-21T15:37:55.880 回答
1

您有一个名为 的命令按钮LangCount。它的点击事件必须处理一个名为的字段在您的表Language中不存在的可能性。Scrubbed

Language因此,请考虑为什么当该字段不存在时用户应该能够单击该命令按钮。当该字段不存在时,您知道它OpenQuery不起作用(对吗?)......所以只需禁用命令按钮。

看看以下方法是否为您指出了一些有用的东西。

Private Sub Form_Load()
    Me.LangCount.Enabled = FieldExists("Language", "Scrubbed")
End Sub

如果在打开表单后 Scrubbed 的结构没有改变,这可能会起作用。如果表单还包括修改Scrubbed结构的选项,LangCount.Enabled则从该操作进行更新。

这是一个快速且肮脏(经过最少测试,无错误处理)FieldExists()的功能,可帮助您入门。

Public Function FieldExists(ByVal pField As String, _
        ByVal pTable As String) As Boolean
    Dim blnReturn As Boolean
    Dim db As DAO.Database
    Dim fld As DAO.Field
    Dim tdf As DAO.TableDef
    Set db = CurrentDb
    ' next line will throw error #3265 (Item not found in this collection) '
    ' if table named by pTable does not exist in current database '
    Set tdf = db.TableDefs(pTable)
    'next line is not actually needed '
    blnReturn = False
    For Each fld In tdf.Fields
        If fld.Name = pField Then
            blnReturn = True
            Exit For
        End If
    Next fld
    Set fld = Nothing
    Set tdf = Nothing
    Set db = Nothing
    FieldExists = blnReturn
End Function
于 2012-06-21T16:34:33.997 回答