类别之间的交汇处

问题描述

我正在建立一个自由手语翻译的数据库我有一个主题表tblClient,其中包含有关自由职业者客户的信息。有一个查询表tlkClient ClientType显示了各种类型的客户端(根据条件分类-聋,聋/盲等)。还有一个名为tlkClient Modality的表。下表列出了口译员提供的不同手语类型。您可以从“客户端”表中选择客户端的首选方式。

现在棘手的部分。如果客户端是某种类型,则某些模式(基本上只是手语的风格)不可用。例如,您不能对聋哑人使用“常规”(视觉)手语。这是因为常规手势语取决于能够看到的人。取而代之的是,将使用“触觉ASL”,它是手语的移交版本。基本上,我想根据所选择的客户端类型来限制模式列表。

为了开始我的关联,我在tlkClient ClientType和tlkClient Modality表之间建立了一个联结表。在这里,我将创建正确的允许的客户类型和方式对。另外,并没有真正必要的“交界场”来证明这种关系的合理性。我正在考虑创建一个“虚拟字段”,以作为证明这种关系的理由。

稍后,在针对客户的表单中,我将在模式组合框中编辑行源查询,以取决于在客户类型框中选择的选择。这可以通过检查联结表中的哪些记录与客户端类型组合框中的选择相匹配来实现。

在这里正确吗?在两个查找表之间建立连接表似乎很奇怪。有什么问题吗?

注意-我想远离VBA,但是我要编写宏来实现这些目标。任何想法将不胜感激。

下面是关系的照片。

Relationshipsphoto

解决方法

以适合您业务案例的任何正常形式保存表格。您的选择只会更改信息的存储方式,这意味着您必须更改编写查询的方式,因为信息可能位于其他位置。我选择了客户端和客户端类型之间的多对多关系。 enter image description here 您要从客户端组合框中设置模态组合框的内容。这是视图而不是模型的问题,因此我们更改视图而不是数据的组织。关键是从客户端组合框的afterupdate事件设置模式组合框的记录源。 首先显示结果:如果客户聋了,我们得到:

enter image description here

如果服务对象是盲人或盲人和聋人,我们会得到:

enter image description here

Private Sub cmbClient_AfterUpdate()
Dim RegularASL As Integer: RegularASL = 1
Dim TactileASL As Integer: TactileASL = 2
Dim ClientID As Integer: ClientID = Me.cmbClient
If ClientisBlindandDeaf(ClientID) Then
cmbModality.RowSource = "SELECT * FROM tlkClientModality WHERE ClientModalityID = " & TactileASL
ElseIf isClientBlind(ClientID) Then
cmbModality.RowSource = "SELECT * FROM tlkClientModality WHERE ClientModalityID = " & TactileASL
Else
cmbModality.RowSource = "SELECT * FROM tlkClientModality WHERE ClientModalityID = " & RegularASL
End If
cmbModality.Requery 'reload cmbmodality data
Me.Refresh 'repaint cmbmodality
End Sub
Public Function isClientBlind(ClientID As Integer) As Boolean
'Get rid of * in names vba can't parse the *
Dim isblind: isblind = 2
Dim ClientClientTypeID As Variant 'allows null return type
ClientClientTypeID = DLookup("ClientClientTypeID","tlkClientClientType","ClientID = " & ClientID & " AND ClientTypeID = " & isblind)
If IsNull(ClientClientTypeID) Then
isClientBlind = False
Else
isClientBlind = True
End If
End Function
Public Function isClientDeaf(ClientID As Integer) As Boolean
Dim isdeaf: isdeaf = 1
Dim ClientClientTypeID As Variant 'allows null return type
ClientClientTypeID = DLookup("ClientClientTypeID","ClientID = " & ClientID & " AND ClientTypeID = " & isdeaf)
If IsNull(ClientClientTypeID) Then
isClientDeaf = False
Else
isClientDeaf = True
End If
End Function

Public Function ClientisBlindandDeaf(ClientID As Integer) As Boolean
If isClientBlind(ClientID) And isClientDeaf(ClientID) Then
ClientisBlindandDeaf = True
Else
ClientisBlindandDeaf = False
End If
End Function

注意:cmbModality的设置就像绑定到整个tlkModality表一样,然后使用记录源更改对其进行有效过滤。