2

検索フォームを備えたアクセス データベースがあります。

私は、とりわけ「名前」フィールドを持つ「オブジェクト」テーブルと、「名前」フィールドを持つ「所有者」テーブルを持っています。

2つの間に結合テーブルがあるため、多対多の関係があります

オブジェクトには必ずしも所有者がいるとは限りません。

私の検索フォームには、「オブジェクト名」と「所有者名」という 2 つのバインドされていないフィールドがあります。

私がしたいこと:

  • ユーザーが両方のフィールドを空白のままにすると、すべてのオブジェクト (所有者のいないものを含む) のリストが表示され、そのオブジェクトに所有者がいる場合は、それもリストに表示されます。
  • ユーザーが「オブジェクト名」フィールドに何かを入力すると、入力された部分文字列を含むすべてのオブジェクト (所有者のないものも含む) のリストが表示されます。
  • ユーザーが「所有者名」フィールドに何かを入力すると、所有者名に入力された部分文字列が含まれるすべてのオブジェクトのリストが表示されます (NULL 所有者は無視されます)。

私がこれまでにやったこと:

左外部結合でクエリを作成し、「オブジェクト名」テキストフィールドの値を使用して Object.name の基準を作成しました

ユース ケース 1 と 2 では問題なく動作しますが、ケース 3 では所有者のフィルタリングはありません。

ただし、「所有者名」テキストフィールドに基づいて Owner.name に基準を追加すると、ケース 3 は正常に機能しますが、ケース 1 と 2 は機能しなくなります (左外部結合が廃止されます)。

どうすればこの問題を解決できますか?

4

1 に答える 1

3

次のレコード ソースで連続フォーム フォームを使用できるように思えます...

SELECT Objects.ObjectName, ObjectOwners.OwnerName
FROM (ObjectOwnership INNER JOIN ObjectOwners ON ObjectOwnership.OwnerID = ObjectOwners.OwnerID) INNER JOIN Objects ON Objects.ObjectID = ObjectOwnership.ObjectID
UNION ALL
SELECT Objects.ObjectName, NULL AS OwnerName
FROM ObjectOwnership RIGHT JOIN Objects ON Objects.ObjectID = ObjectOwnership.ObjectID
WHERE ObjectOwnership.ObjectID IS NULL
ORDER BY 1, 2;

...次に、いくつかのテキスト ボックスと「フィルター」コマンド ボタンをフォーム ヘッダーに配置して、フォーム.Filterプロパティを更新し、次のように必要に応じてレコードをフィルター処理します。

Private Sub cmdFilter_Click()
Dim sFilter As String
If IsNull(Me.txtObjectFilter.Value) And IsNull(Me.txtOwnerFilter.Value) Then
    Me.FilterOn = False
Else
    If IsNull(Me.txtObjectFilter.Value) Then
        sFilter = ""
    Else
        sFilter = "ObjectName LIKE ""*" & Me.txtObjectFilter.Value & "*"""
    End If
    If Not IsNull(Me.txtOwnerFilter.Value) Then
        If Len(sFilter) > 0 Then
            sFilter = sFilter & " AND "
        End If
        sFilter = sFilter & "Ownername LIKE ""*" & Me.txtOwnerFilter.Value & "*"""
    End If
    Me.Filter = sFilter
    Me.FilterOn = True
End If
End Sub

フォームを開くと、すべてのレコードが表示されます...

FirstOpened.png

...そして、オブジェクトでフィルタリングできます...

ObjectFilter.png

...または所有者によって...

OwnerFilter.png

...またはその両方。

編集

サブフォームの同様の手法は、上記のクエリを として保存し、それをサブフォーム[ObjectOwner_base_query]の として指定してからRecord Source、VBA コードをわずかに変更して、

Private Sub cmdFilter_Click()
Dim sFilter As String, sSQL As String
sFilter = ""

If Not IsNull(Me.txtObjectFilter.Value) Then
    sFilter = "ObjectName LIKE ""*" & Me.txtObjectFilter.Value & "*"""
End If

If Not IsNull(Me.txtOwnerFilter.Value) Then
    If Len(sFilter) > 0 Then
        sFilter = sFilter & " AND "
    End If
    sFilter = sFilter & "Ownername LIKE ""*" & Me.txtOwnerFilter.Value & "*"""
End If

sSQL = "SELECT * FROM ObjectOwner_base_query"
If Len(sFilter) > 0 Then
    sSQL = sSQL & " WHERE " & sFilter
End If
Me.RecordSource = sSQL
End Sub

(サブフォームのプロパティを変更すると、.FilterAccess の動作がおかしくなる.RecordSourceようです。プロパティを更新すると、より良い結果が得られるようです。)

于 2013-04-19T15:32:17.050 に答える