3

我不知道如何以连续形式显示对同一记录具有多个值的列

我有 3 张桌子

SalesCall
SalesCallId | etc..

Mill
MillId | name...

SalesCallMills    <------ Junction table 
Id | SalesCallId | MillID 

多对多关系的基本设计。

当它是一个简单的表单时,我习惯于做一个列表,并通过一个 SQL 查询来改变当前 ID 的控制源。

以连续形式显示此内容的常见做法是什么?

这是以前的形式,当时只有 1 个磨机是可能的。

在此处输入图像描述

我以为我可以连接磨坊,但它会很难阅读,而且会很长。

所以我考虑了一个列表,但我认为不可能更改每条记录的控制源。

另外,值得一提的是这是只读的。它不是用于添加或编辑。输入数据的表格已经制作完成。而且我认为每条记录一个工厂不是一种选择,因为它真的会让用户感到困惑。

用我的数据库设计显示多值列的正确方法是什么?

4

5 回答 5

6

这是一个具有相关子表单的表单。

这两个表单通过链接子字段和主字段同步:

Link Master Fields: Forms!Form7![SalesCall Subform].Form.SaleID
Link Child Fields: SalesCallId

以及子表单 #1 的当前事件中的一些代码

Private Sub Form_Current()
Me.Parent.[SalesCallMills subform].Form.Requery
End Sub

在子表单#1 中选择一行会在子表单#2 中显示相关的详细信息行。

相关子表格

将诸如工厂名称之类的适当信息添加到总体大纲中应该不难。

于 2012-11-14T20:55:07.790 回答
1

<br>您可以通过将格式设置为富文本,然后将所有工厂放入由标签分隔的同一字段中,从而在文本框中列出工厂。

Mill1<br> mill2<br>mill3  

注意事项
1. 这意味着文本框必须足够长。
2. 您必须在查询中将工厂连接到单个字段中,这可能不可行。

于 2012-11-14T21:00:57.960 回答
1

在传统意义上的经典中,两个表之间确实没有多对多关系这样的事情,但是通过将相关表一个接一个地拼凑在一起,你最终会得到相同的结果多对多关系,但从技术上讲,这不是两个表之间发生的情况。实际上,您总是在从父表向下工作到子表。那些从连接表的角度思考的人实际上是在思考错误的方式。

如果允许一个人拥有许多最喜欢的颜色,那么将简单地将他们的多种颜色选择与可用颜色联系起来的表称为“连接”表是不合口味的。最好简单地说明我们需要一个名为:

My List Of Favorite colors table.

上表可能链接到其他表的事实是没有实际意义的。事实上,它可能有不止一列是外键,然后它就不是一个简单的联结表,但在当天它正在做同样的事情。

无论如何,在 Access 中,您肯定可以显示两个连续表单来显示以这种方式建模的数据。

假设每个周末我们都必须接受人们的大量捐款。这意味着我们有一个主表,其中包含有关此捐赠活动的日期和时间等信息。我们的下一张桌子会有人和他们的捐款金额。之后的下一个表格将是收取捐款金额,并将他们的资金分成不同的账户。这是一个经典的会计分配问题,几乎从 QuickBooks 到任何时候的每个会计软件包都必须实施。事实证明,在使用 access 时,只需很少的代码就可以解决这个经典的分发问题。

对这些类型的表单进行建模的技巧是将多个子表单放置在一个主表单中。

以下表格显示了这一点:

在此处输入图像描述

如果您查看顶部,则有一条主记录,其中包含有关此批次运行以及日期和时间的信息。现在,左边是很多人和捐款金额。右边是一个人的捐款分成许多不同的账户。所以我要显示很多人,我还要显示捐赠可能被分配到的许多帐户。

请记住,访问不允许您将连续子表单放置在连续子表单内。但是,您当然可以将两个连续的表单并排放置,如上面的屏幕截图所示,以模拟您想要的相同效果。

令人惊讶的是,上面提到的管理整个事情的代码很少。

对于左侧连续表单,由于链接主子设置设置为主表单记录,因此该表单无需代码即可填充数据。但是,对于右侧连续表单跟随并在左侧连续表单中显示每个人的正确会计数据,访问不会自动为您执行此操作。但是,左侧表单的当前事件中的一小段代码将强制访问唤醒并注意右侧继续表单必须重新填充以显示该特定人的捐赠帐户。

放置在左侧 on-current 事件中的一行代码将解决此问题:

me.Parent.Child2.Requery

我使用的右侧连续表单上的链接主/子设置:

linkChildFields main_id(该子表单中用于关联回父表的字段名称) LinkMasterFields [MasterFormLeftSide].[form].[ID](“masterFormleft”是您控制的子表单的名称用于保持左侧的连续形式)。

因此,您将需要一点点代码,但不需要大量代码,并且您现在拥有一个显示与许多信息相关的许多信息的屏幕。

于 2012-11-14T22:27:58.697 回答
1

连接表将是您选择的主要支柱,您将把其他表挂在上面。

您可以使用查询编辑器直观地查看它,但 SQL 语句如下所示:

SELECT *
FROM (SalesCallMills 
        INNER JOIN SalesCall
        ON SalesCallMills.ID=SalesCall.SalesCallID) 
     INNER JOIN Mill
     ON SalesCallMills.ID=Mill.MillID;

(Access 喜欢多表连接周围的括号,因此虽然它们对于纯 SQL 语句不是必需的,但如果没有它们,Access 将无法正常工作)

要在一行中查看每个 SalesCall 的所有 Mills,您必须将简单查询抛在后面,并编写自己的 (vba) 函数

http://allenbrowne.com/func-concat.html有一个示例,代码允许您将当前表单上的Mills字段设置为类似=ConcatRelated("name", "Mill", "MillID= " & SalesCallMills.ID)

于 2012-11-14T20:27:29.010 回答
0

我非常不同意“那些从连接表的角度思考的人实际上是在思考错误的方式”。@Albert D. Kallal 的回答中。

确实,m:n 关系不能直接在关系数据库中实现。这就是为什么一个也是唯一一个理智的设计:

+----------+           +---------+
| Patients |--- m:n ---| Doctors |
+----------+           +---------+ 

... 是:

+----------+           +-----------------+           +---------+
| Patients |--- 1:n ---| PatientsDoctors |--- n:1 ---| Doctors |
+----------+           +-----------------+           +---------+

其他一切都可能以一种或另一种方式工作,但这是穷人的关系数据库设计。并且在模型设计上做出妥协,在项目的一开始,更糟的情况很可能还没有到来。

于 2015-03-16T21:33:38.060 回答