次のレコード ソースで連続フォーム フォームを使用できるように思えます...
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
フォームを開くと、すべてのレコードが表示されます...
...そして、オブジェクトでフィルタリングできます...
...または所有者によって...
...またはその両方。
編集
サブフォームの同様の手法は、上記のクエリを として保存し、それをサブフォーム[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
(サブフォームのプロパティを変更すると、.Filter
Access の動作がおかしくなる.RecordSource
ようです。プロパティを更新すると、より良い結果が得られるようです。)