4

注: 私は Access に比較的慣れていないので、ご容赦ください... 私が学んだことはすべて、必要に応じて Google を検索することでした。

そのため、データベースを検索することのみを目的としてフォームを作成しています。あるユースケースでは、ユーザーは複数のオプションを選択して検索をフィルタリングするオプションを持っています。プライバシー上の理由から、「青、緑、赤、茶色」と言うことができます。ユーザーは、これらの色の任意の組み合わせを選択することができます。データベース テーブルには、主キー (この場合は ItemID) があります。表の他の列は上記の色です (青、緑、赤、茶)。このデータは構造化されているため (注: 複数の理由で変更できません)、Access が提供するものを使用するのではなく、VBA でこの SQL クエリを作成する必要があります。

「検索」ボタンが押されたときにクエリを作成して実行するために使用しているコードは次のとおりです。

Set qdf = Nothing

*Logic to create SQL query... variable to hold query is called sqlStr*

Set qdf = CurrentDb.CreateQueryDef("TemporaryQuery", sqlStr)
DoCmd.OpenQuery qdf.Name

多くの検索の結果、これは、ADO を使用する以外に、VBA で SQL クエリを作成し、VBA で実行できる唯一の方法であることがわかりました。この方法の欠点は、機能する一方で、クエリが作成されることです。クエリを再度実行するには、クエリを閉じて削除する必要があります。これは、これを使用するユーザーには受け入れられません。

私が見つけたすべての例 (ご容赦ください) は ADO を使用していますが、これは機能しませんでした。2 つのデータベースがあり、1 つはクエリとフォーム用、もう 1 つはデータ自体用です。データを含むデータベースには、クエリとフォームを使用してデータベースにリンクされたテーブルがあります。そのセットアップで ADO が動作するかどうかはわかりませんが、動作する場合は、まだわかりません。

Java/Webdev のバックグラウンドから Access を使用することは、(私の意見では) 本来あるべきことをより複雑にしているように見えるので、少しイライラしています。これを正しく機能させるのを手伝ってくれる人はいますか?

お時間をいただきありがとうございます...それは大歓迎です!

4

1 に答える 1

5

私はこれらの声明に困惑しています...

「この方法の欠点は、機能する一方で、クエリが作成されることです。クエリを再度実行するには、クエリを閉じて削除する必要があります。これは、これを使用するユーザーには受け入れられません。」

なぜそれがユーザーにとって懸念事項なのか理解できません。クエリを手動で削除する必要はありません --- を使用して VBA で削除できますDoCmd.DeleteObject。実際、クエリを修正するだけでよいようです。その場合は、最初に古いバージョンを削除してから、新しいクエリを作成する必要はありません。.SQLクエリのプロパティ を変更するだけです。

ユーザーの問題が、 TemporaryQueryをナビゲーション パネルに表示することさえ望まない場合(煩雑すぎますか?)、その名前をUSysTemporaryQueryに変更します。そうすれば、パネル プロパティがシステム オブジェクトを表示するように設定されている場合にのみ表示されます。

まだあなたが望むものではないかもしれないコードサンプルを提供します。しかし、おそらく他の誰かがそれを便利だと思うでしょう。

Const cstrQueryName As String = "TemporaryQuery"
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim sqlStr As String

'*Logic to create SQL query... variable to hold query is called sqlStr*
' Apparently you have that piece worked out.  I'll use a simple query ...
sqlStr = "SELECT * FROM Dual;"

Set db = CurrentDb
If Not QueryExists(cstrQueryName) Then
    Set qdf = db.CreateQueryDef(cstrQueryName)
Else
    Set qdf = db.QueryDefs(cstrQueryName)
End If
qdf.sql = sqlStr
Set qdf = Nothing
Set db = Nothing
DoCmd.OpenQuery cstrQueryName

保存したクエリを後で破棄したい場合は、次の操作を行います...

If QueryExists(cstrQueryName) Then
    DoCmd.DeleteObject acQuery, cstrQueryName
End If

これは上記のコードのヘルパー関数です...

Public Function QueryExists(ByVal pName As String) As Boolean
    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim blnReturn As Boolean
    Dim strMsg As String

On Error GoTo ErrorHandler

    blnReturn = False ' make it explicit
    Set db = CurrentDb
    Set qdf = db.QueryDefs(pName)
    blnReturn = True

ExitHere:
    Set qdf = Nothing
    Set db = Nothing
    QueryExists = blnReturn
    Exit Function

ErrorHandler:
    Select Case Err.Number
    Case 3265 ' Item not found in this collection.
    Case Else
        strMsg = "Error " & Err.Number & " (" & Err.Description _
            & ") in procedure QueryExists"
        MsgBox strMsg
    End Select
    GoTo ExitHere

End Function
于 2013-06-27T20:10:44.320 に答える