我正在建立一个通信/任务记录系统,它记录传入的通信并根据它们分配任务。
我的数据库有一个笔记系统,以便用户可以记录各种事情 - 例如客户记录可能有一个说明"该客户总是订购他们自己的窗框玻璃"。这一切都是通过单个" Notes"具有PrimaryNoteTableID
的表,该表链接到静态查找表,该表标识了该注释适用的主表,以及PrimaryTablePK
字段,用于存储该表适用于该表的记录的PK。 / p>
为了避免损坏,建议将备忘录字段保存在他们自己的表中,与父表(see here)保持1:1的关系,这就是我所做的。
添加新通信和任务时,用户通常需要添加以下内容:
考虑到这一点,我有:
tblCommTaskLog
包含字段CommDate
,ActionRequiredTypeID(FK)
,ActionDeadlineDays
,CommAccountID(FK)
等。
tblNote
与:NoteID(PK)
,PrimaryNoteTableID(FK)
,PrimaryTablePK(FK)
,EnteredByUserID(FK)
,EntryDate
。
tblNoteText
与NoteTextID(PK)
,NoteID(FK)
,NoteText(Memo)
其中一些是其他表的外键,应该是不言自明的。
基本上我遇到问题的是使用这三个表进入的表单。我发现子表单的访问处理可能非常愚蠢,例如:
我希望在一个表单上包含tblCommTaskLog
和NoteText
字段中的字段,以便用户填写tblCommTaskLog
的详细信息(ActionRequired等)。 )和注释文本,点击"保存"按钮,然后通过代码正确保存项目,以便:
tblCommTaskLog
中创建了一条新记录,例如PK为72
(自动编号)。tblNote
中创建了一条新记录,PrimaryNoteTableID
4
对应tblCommTaskLog
,PrimaryTablePK
72
和PK NoteID
例如422
(自动编号)。tblNoteText
中创建了一条新记录,NoteID
为422。我认为我需要的是一个主要表单,其中tblCommTask
的字段带有未绑定的文本字段,可以获取NoteText
的输入。我只是无法弄清楚如何在tblNote
中创建新记录,从该字段获取AutonumberPK并将其插入到tblNoteText
的FK中,以便所有内容都正确地链接在一起FKS。我可以使用SQL INSERT,然后在Autonumber字段上执行SELECT TOP吗?使用Recordsets和Lastmodified,我会更好吗?还有其他一些我没想过的方法吗?
答案 0 :(得分:-1)
@whatEvil:
你仍然可以将其作为1:M。如果允许您更改主表,请更改它们并添加
只有
现在你可以简单地强制实施1:M的关系。 GUID是"全球唯一标识符"。所有主表都将生成一个唯一键,您可以在任何阶段简单地加入它们,而无需考虑它属于哪个表或如何保存父表名。
当然,您需要一个自定义函数来获取GUID:使用此代码创建一个
Public Function GET_UUID() As String
With CreateObject("Scriptlet.TypeLib")
GET_UUID = VBA.Left(.GUID, 38)
End With
End Function
修改强> 我们的想法是在每个主表(GUID / UUID)中都有一个全局唯一ID。然后,它将用于加入您的主表和注释表。注意:您需要在每个主表中添加一个触发器(插入之前)以生成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关系。如果您的应用程序增长并且在整个数据库中需要真正的唯一ID,我个人也喜欢使用GUID的想法。它完全取决于你想要去哪种方式,我只是解释了一种方法..