2

これはこの質問に多少関連していますが、ユーザー定義関数を定義するよりもエレガントでシンプルなソリューションがあることを望んでいました。

バックグラウンド

基本的に、これはよくある質問です。Access フォームのコンボボックス コントロールの RowSource クエリを動的に変更する必要があります。ねじれは、結果のクエリが実行時に例外をスローする可能性があることです。これは、クエリのソース テーブルが、動的に定義された別のデータベース ファイルに存在し、存在しない可能性があるためです。または、ファイルが存在する場合でも、目的のテーブルまたは列が存在しない可能性があります。

理想的には、割り当てが行われたときにこの問題をキャッチできるようにしたいと考えています。これにより、コンボボックスが無効になり、ユーザーが無効なクエリを呼び出すことができなくなり、フィールドに使用できるデータがないことをエンドユーザーが知ることができます。

たとえば、次のようなものが欲しいです。

Private Sub UpdateComboRows(src as String)
On Error Goto InvalidQueryError
    cmbBox.RowSource = "SELECT [colName] FROM [dBase III;DATABASE=K:\" & src & "].[tblName];"
    ' Something here to invoke RowSource query and throw error
    cmbBox.Enabled = True
Exit Sub

InvalidQueryError:
    cmbBox.RowSource = ""
    cmbBox.Enabled = False
End Sub

または、if-then ステートメントを使用するもの。

質問

これに対する「洗練された」アプローチはありますか、またはダミーのDAOレコードセットを作成しようとして立ち往生していますか? Dropdown イベント以外に Combobox RowSource クエリを呼び出す方法はありますか?

4

1 に答える 1

0

一歩下がって、最初にデータベースが Dir で存在することを確認してから、列が関数内に存在することを確認してください。非常に大まかに。

Function IsDBOk() As Boolean
   On Error GoTo Err_Trap

   ''The default for boolean is false, so 
   ''IsDBOK=False at this point

   sFile=Dir("K:\" & src)

   If sFile<>"" Then
      Dim rs As DAO.Recordset
      Set rs = CurrentDB.OpenRecordset("SELECT [colName] " _
          & "FROM [dBase III;DATABASE=K:\" _
          & src & "].[tblName];")
      If Not rs.Eof() Then
          ''The selection is only okay if the recordset 
          ''contains records, however, you could return
          ''a different error for each problem
          ''file missing, column missing, empty recordset
          IsDBOk = True
      End If
   End If

   Exit Function

   Err_Trap:
     ''A missing column will give error 3061
     ''IsDBOk is already set to false
End Function
于 2012-07-12T22:12:28.623 に答える