1

特定のフィールドの値の概要を表示するコマンド ボタンに関連付けられた単純なクエリがあります。データベースを使用するたびに変更されるテーブルで実行されているため、テーブルにこのフィールドが含まれる場合と含まれない場合があります。フィールド (Language と呼ばれる) がファイルにない場合、ユーザーはコマンド ボタンをクリックし、"Enter Parameter Value" メッセージ ボックスを取得します。キャンセルを押すと、フィールドがファイルに存在しないことを説明するメッセージ ボックスが表示されます。フィールドが見つからない場合は、「パラメーター値の入力」をバイパスしてメッセージに直接移動したいと思います。これが私のコードです:

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

これも失敗し、エラー コーディングに進みますが、失敗しない場合は、はるかに小さいレコードセット (レコードが 0 のレコードセット) になります。

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

という名前のコマンド ボタンがありますLangCountLanguageクリック イベントは、指定されたフィールドがテーブルに存在しない可能性に対処する必要があり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 に答える