以连续的形式显示多对多的关系

时间:2012-11-14 19:38:49

标签: vba ms-access ms-access-2010

我无法弄清楚如何以连续的形式显示具有多个相同记录值的列

我有3张桌子

SalesCall
SalesCallId | etc..

Mill
MillId | name...

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

多对多关系的基本设计。

当它是一个简单的表单时,我习惯做一个列表并用SQL查询更改当前ID的控制源。

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

这是之前只有1磨的形式。 enter image description here

我以为我可以把工厂连成一团,但是很难读,这将是很长的路。

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

另外,很高兴提到这是只读的。它不是用于添加或编辑。输入数据的表单已经完成。而且我认为每个记录一个工厂不是一个选项,因为它会让用户感到困惑。

有什么想法吗?

基本上我的问题是:

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

谢谢

5 个答案:

答案 0 :(得分:5)

这是一个包含相关子表单的表单。

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

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中的相关细节线。

correlated subform

在大纲中添加关于工厂名称的适当信息应该不难。

答案 1 :(得分:1)

Junction Table将是您选择的主要表格,您将挂起其他表格。

您可以使用查询编辑器直观地查看它,但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)

的代码

答案 2 :(得分:1)

您可以在一个文本框中列出工厂,方法是将格式设置为富文本,然后将所有工厂放入由<br>标记分隔的相同字段中。

Mill1<br> mill2<br>mill3  

考虑
这意味着文本框必须足够长 2.您必须将查询器连接到查询中的单个字段,这可能是不可行的。

答案 3 :(得分:1)

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

如果一个人被允许有许多喜欢的颜色,那么它的味道很差,称那个简单地将他们的许多颜色选择链接到可用颜色作为“交汇”表。简单地说我们需要一个名为:

的表是更好的
My List Of Favorite colors table.

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

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

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

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

以下表格显示了这一点:

enter image description here

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

请记住,访问权限不允许您在连续子表单中放置连续子表单。但是,您可以放置​​两个连续的表格,如上面的屏幕截图所示,以模拟您想要的相同效果。

令人惊讶的是,提到管理这一切的代码非常少。

对于左侧连续表单,因为链接主表单和子设置设置为主表单记录,因此需要使用NO代码来填充此表单的数据。但是,对于右侧继续表格,并且在leftr侧连续表格中为每个人显示正确的会计数据,访问权限不会自动为您执行此操作。但是,在左侧窗体的当前事件中的一小段代码将被强制访问唤醒并注意右侧继续形式必须被RE填充以显示该特定人的捐赠帐户。

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

me.Parent.Child2.Requery

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

linkChildFields main_id(无论字段的名称是什么 此子表单用于与父表关联 LinkMasterFields [MasterFormLeftSide]。[form]。[ID](“masterFormleft”是的名字 用于在左侧保持连续形式的子窗体控件。)

所以,你需要一点点代码,但不是很多,你现在有一个显示许多信息的屏幕。

答案 4 :(得分:0)

我非常不同意&#34;那些以联结表格思考的人实际上是在思考错误的方式。@Albert D. Kallal's answer中的#34;

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

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

......是:

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

其他一切都可能以这种或那种方式发挥作用,但却是穷人的关系数据库设计。通过在模型设计上做出妥协,在项目的最初阶段,更糟糕的情况很可能还未到来。