我正在构建一个通信/任务日志记录系统,该系统记录传入的通信并基于它们分配任务。
我的数据库有一个笔记系统,因此用户可以对各种事情进行笔记 - 例如,客户记录可能有一个注释,上面写着"该客户总是订购自己的窗框玻璃"。这一切都是通过单个"Notes"表处理的,该表有一个PrimaryNoteTableID
链接到一个静态查找表,该查找表标识注释适用的主表,以及一个PrimaryTablePK
字段,该字段存储该表中记录的PK它应用于该表。
为了避免损坏,建议将备注字段保存在自己的表中,与父表(见此处(保持 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)
其中一些是其他表的外键,应该是不言自明的。
从本质上讲,我遇到的问题是这三个表的条目形式。我发现子表单的访问处理可能非常愚蠢,因此:
- 如果要使用子窗体
- 或子窗体的子窗体,则只能以某种方式显示内容。
- Access 会在您单击以保存之前保存记录。它还将记录保存在子窗体中,这些子窗体无法在窗体代码中使用简单的"me.undo"进行处理,并导致您必须在子窗体中找到记录并使用代码将其删除。 子窗体
- 以愚蠢的方式行事,因为它们分配自动编号 PK 并在子窗体和主窗体之间的链接中拾取这些 PK。
我只想将tblCommTaskLog
中的字段和NoteText
字段放在一个表单上,以便用户填写tblCommTaskLog
(ActionRequired等(和注释文本的详细信息,点击"保存"按钮,然后通过代码正确保存项目,例如:
- 在
tblCommTaskLog
中创建一条新记录,例如 PK 为72
(自动编号(。
在 tblNote
创建一个新记录,其PrimaryNoteTableID
4
对应于tblCommTaskLog
,72
的PrimaryTablePK
和PKNoteID
例如422
(自动编号(。- 在
tblNoteText
中创建一条新记录,NoteID
为 422。
我认为我需要的是一个主表单,其中包含来自tblCommTask
的字段,带有一个未绑定的文本字段来获取NoteText
的输入。我只是不知道如何在tblNote
中创建一条新记录,从该字段中获取AutonumberPK并将其插入tblNoteText
的FK中,以便所有内容都与正确的FK正确链接在一起。我可以使用 SQL 插入,然后在"自动编号"字段上使用 SELECT TOP 来执行此操作吗?使用记录集和上次修改这样做会更好吗?还有其他我没有想到的方法吗?
@whatEvil:
您仍然可以将其设为 1:M。 如果允许您更改主表,请更改它们并添加
- 新列pk_guid:字符串(38(。(如果不使用 {},也可以是 36(
- 添加插入前触发器以自动为每个新记录添加 GUID。
- 像这样:对于插入集之前的每一行 pk_guid = get_uuid((
在你的tbl_note只有
- Note_id : 包
- origin_guid : 字符串(38( fK
- 笔记:
- added_by
- .....
现在,您可以简单地强制执行 1:M 关系。GUID 是"全局唯一标识符"。所有主表都将生成一个唯一的键,您可以在任何阶段简单地连接它们,而无需考虑它属于哪个表或如何保存父表名称。
当然,您需要一个自定义函数来获取 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(更多关于 数据宏 : 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 号。毕竟,autonumber 仅在整个表中是唯一的,而不是在整个数据库中唯一的。为了避免重复,您正在添加另一个键(表标识键(来标识外键属于哪个主表。这听起来都很好,直到您对主表进行一次错误的更新,对注释 ID 的值是错误的。
通过使用 GUID,无论有多少主表参与,你都可以简单地维护 1:m 关系。此外,我个人喜欢GUID的想法,以防您的应用程序增长并且需要整个数据库中的真实唯一ID。完全取决于你想走哪条路,我只是解释了一种方法..