2014-12-01 110 views
0

我正在构建一个通信/任务日志系统,用于记录传入通信并根据它们分配任务。MS Access子子表单数据输入

我的数据库都有一个注解系统,使用户可以对各种事物的笔记 - 例如客户记录可能会有一个注明“此客户总是订购他们自己的窗框玻璃”的注释。这一切都是通过一个具有PrimaryNoteTableID的单个“注释”表来处理的,该表链接到标识该笔记适用的主表的静态查找表,以及存储该表中记录的PK的PrimaryTablePK字段,其​​适用于。

为了避免腐败,建议将备注字段保留在他们自己的表中,并与他们的父表(see here)保持1:1的关系,这正是我所做的。

当增加新的通信和任务,用户通常会希望添加以下内容:通信是与人的

  • 详细信息。
  • 沟通的主题。
  • 所需的操作类型和该操作的截止日期。
  • 有哪些已经讨论等细节的说明

考虑到这一点,我有:

tblCommTaskLog与领域CommDateActionRequiredTypeID(FK)ActionDeadlineDaysCommAccountID(FK)

tblNote与:NoteID(PK)PrimaryNoteTableID(FK),PrimaryTablePK(FK),EnteredByUserID(FK),EntryDate

tblNoteTextNoteTextID(PK)NoteID(FK)NoteText(Memo)

一些是外键应该是不言自明的其他表。

本质上讲我遇到有问题的是与这三张表条目的形式。我发现子窗体的访问操作可以是非常愚蠢的,这样的:如果你想使用一个子窗体或子窗体的子窗体

  • 你就会陷入到某种方式显示的东西。
  • 访问保存记录,然后点击保存。它还将表单中的记录保存在表单的代码中无法用简单的“me.undo”处理的子表单中,并导致您必须在子表单中找到记录并使用代码将其删除。
  • 子窗体行事愚蠢的方式,只要他们的方式分配自动编号的PK和孩子并掌握形式之间的联系挑选那些了。

我想只是一种形式从tblCommTaskLog领域和NoteText领域,使用户在从tblCommTaskLog细节填充(ActionRequired等。)和注释文本,点击“保存”按钮,然后通过代码的项目被正确地保存,使得:

  • 一个新的记录被tblCommTaskLog与创建例如72(Autonumber)的PK。
  • 一个新记录被创建tblNote4一个PrimaryNoteTableID其对应于tblCommTaskLog,的72一个PrimaryTablePK和PK NoteID例如422(Autonumber)。
  • 一个新的记录被tblNoteText创造了422

一个NoteID我想我需要的是一个主要形式与tblCommTask等领域的未绑定的文本字段采取输入NoteText。我只是不知道如何在tblNote中创建新记录,从该字段获取AutonumberPK并将其插入到tblNoteText的FK中,以便所有内容都可以正确链接到正确的FK。我可以用SQL INSERT和自动编号字段上的SELECT TOP来做到这一点吗?记录集和Lastmodified这样做会更好吗?有没有其他方法我没有想到?

+0

多少主表,你呢?你为什么不用每个[客户,用户,xxx,asdb]的注释表,这样你就可以执行一个简单的1:m关系? – 2014-12-01 16:26:02

+0

目前有11个表格需要存储关于它们的注释。我确定这是做事情的最好方法[这里](http://stackoverflow.com/questions/25992670/notes-system-in-database)。 – WhatEvil 2014-12-01 16:29:31

+0

我没有在自己的表中存储笔记(备忘录类型),并且没有在多年内遭受损坏的数据库。还有其他一些更重要的事情,例如分解FE/BE。 – Fionnuala 2014-12-01 18:05:10

回答

-1

@whatEvil:

你仍然可以制成1:M。如果您可以更改主表,请更改它们并添加

  1. 新列pk_guid:String(38)。 (如果不使用{也可以为36})
  2. 添加插入前触发器以自动为每个新记录添加GUID。
  3. 类似:对于pk_guid = get_uuid()插入之前各行设置
在tbl_note

只是

  1. Note_id:PK
  2. origin_guid:字符串(38)FK
  3. 笔记:
  4. added_by
  5. .....

现在你可以简单地执行1:M的关系。 GUID是“全球唯一标识符”。所有主表都将生成一个唯一的键,您可以在任何阶段简单地加入它们,而不必考虑它属于哪个表或如何保存父表名。

当然,你需要一个自定义函数来获取的GUID:使用此代码来创建一个

Public Function GET_UUID() As String 
    With CreateObject("Scriptlet.TypeLib") 
     GET_UUID = VBA.Left(.GUID, 38) 
    End With 
End Function 

编辑: 的想法是在每个主表的一个全球唯一的ID(GUID/UUID)。然后将用于加入您的主要和笔记表。注意:您需要在每个主表中添加一个触发器(插入之前)以生成GUID。还要注意,MS接入称之为DataMacro(检查,如果您的版本支持datamacro) 更多关于datamacro:https://support.office.com/en-ca/article/Create-a-data-macro-b1b94bca-4f17-47ad-a66d-f296ef834200?ui=en-US&rs=en-CA&ad=CA

为什么这样? 当前您的主表正在生成自动编号,有可能一个或多个表具有相同的ID号。毕竟,自动编号在整个数据库中并不是唯一的。为避免重复,您要添加另一个密钥(表标识密钥)以标识外键属于哪个主表。这听起来很不错,除非您对主表进行了错误的更新,并将错误的值更改为备注ID。通过使用GUID

,你将能够简单地维持1:M关系,无论有多少主表参加。此外,我个人喜欢使用GUID的想法,以防万一您的应用程序增长并且需要在整个数据库中使用真正独特的ID。它完全取决于你想要去的方式,我只是解释一个方法..

+0

这不仅仅是不必要地使我的整个数据库复杂化吗?如果我这样做,我将不得不在每一个表单中乱动BeforeUpdate事件,不是吗? – WhatEvil 2014-12-01 17:20:04