相关问题:多值字段是一个好主意吗?
我知道多值字段类似于多对多关系。在MS Access应用程序中,替换多值字段的最佳方法是什么? 我有一个包含多值字段的应用程序。我不确定如何完全取消这些字段,并以单值字段的形式实现完全相同的逻辑。
当我想将多值关系移动到单值关系时,表关系的实现方式是什么。
谢谢。
相关问题:多值字段是一个好主意吗?
我知道多值字段类似于多对多关系。在MS Access应用程序中,替换多值字段的最佳方法是什么? 我有一个包含多值字段的应用程序。我不确定如何完全取消这些字段,并以单值字段的形式实现完全相同的逻辑。
当我想将多值关系移动到单值关系时,表关系的实现方式是什么。
谢谢。
ID -> Numeric, primary key
Title -> Text
Surname -> Text
Address -> Text
Country -> Numeric
ID -> Numeric, primary key
Country -> Text
您可以看到已选择Enforce Referential Integrity(强制引用完整性),这意味着您必须在CountryID字段中具有null或来自countries表的一个国家。
要查看数据,您可以创建查询:
SELECT
MainTable.ID,
MainTable.Title,
MainTable.Surname,
MainTable.Address,
Country.Country
FROM Country
INNER JOIN MainTable
ON Country.ID = MainTable.CountryID;
但是最重要的是要有一个允许数据输入的表单。您可以使用向导创建表单,但在此之后,您需要右键单击 CountryID 并将其更改为组合框或者使用向导添加组合框或列表框,第二种选项可能是最简单的。下面是来自向导的大部分步骤:
现在您在表单上拥有了一个下拉国家列表。
另请参见:创建表单以向多个表中添加记录
在 Access 2010 中,有新的方法可以在用户输入不存在于可能值表中的数据时向组合框添加值。在早期版本(虽然我不确定2007年是否有),您将使用 Not In List 事件将项目添加到查找表中,在2010年,您可以选择将列表项编辑表单添加到属性表中。
创建表之间的关系。这将需要在表上定义适当的索引(此处不详细说明)。
(还可以为值表[例如代码表]单独创建ID字段,但这只会使后续查询和控件等变得复杂。在这种情况下,连接表将包含另一个ID字段而不是直接的值。)
在标准的VBA模块中,创建像
Public Function GetCodeList(ByVal CustomerID As Integer) As String
Dim sSQL As String
Dim qry As QueryDef
Dim rs As Recordset2
sSQL = "PARAMETERS [CustID] LONG;" & _
" SELECT * FROM [Customer Codes] WHERE [CustomerID] = [CustID]"
Set qry = CurrentDb.CreateQueryDef("", sSQL)
qry.Parameters("CustID") = CustomerID
Set rs = qry.OpenRecordset(dbOpenForwardOnly, dbReadOnly)
Dim sCodes As String
sCodes = ""
Dim bFirst As Boolean
bFirst = True
Do Until rs.EOF
sCodes = sCodes & IIf(bFirst, "", ",") & rs("Code")
bFirst = False
rs.MoveNext
Loop
rs.Close
qry.Close
GetCodeList = sCodes
End Function
在不重复的情况下使用主表的有用查询需要创建某种形式的聚合查询(即Group By、Count等)。简单的选择可以在单个查询中完成,例如
SELECT Customer.CustomerID, Customer.[CustomerName], GetCodeList([CustomerID]) AS Codes, Count(Customer.CustomerID) AS CountOfID
FROM Customer LEFT JOIN [Customer Codes] ON Customer.ID = [Customer Codes].CustomerID
WHERE ((([Customer Codes].Code)="Current" Or ([Customer Codes].Code)="Free"))
GROUP BY Customer.ID, Customer.[CustomerName], GetCodeList([ID]);
从技术上讲,该问题是关于将MVF“移动”到另一个实现的。要点是将值表(例如示例中的代码表)与MVF列表中的相同值填充。这可能是一个手动过程,但取决于如何填充MVF的ComboBox。然后编写一个查询,将每个MVF复制到连接表(例如[客户代码])中,以便为同一主记录服务,类似于:
INSERT INTO [Customer Codes] ( CustomerID, Code )
SELECT Customer.CustomerID, Customer.TestMVF.Value
FROM Customers
WHERE (((Customers.TestMVF.Value) Is Not Null));
总体来说,完整的实现绝非一项简单的任务,但如果您发现MVF存在太多问题,或者想要迁移到另一个数据库,了解这种变化是必要的。
在Access数据库中,没有什么可以替代MVF。虽然有一些查询技巧可以模仿MVF,但你可能会发现MVF的功能更加优越。1. 它快速且非常易于实现,无需编写代码或SQL。2. 它是可视化的,因此对用户来说很直观。有些事情你无法用MVF完成,所以你需要认真衡量哪个更为重要。