MS 访问子窗体数据输入



我正在构建一个通信/任务日志记录系统,该系统记录传入的通信并基于它们分配任务。

我的数据库有一个笔记系统,因此用户可以对各种事情进行笔记 - 例如,客户记录可能有一个注释,上面写着"该客户总是订购自己的窗框玻璃"。这一切都是通过单个"Notes"表处理的,该表有一个PrimaryNoteTableID链接到一个静态查找表,该查找表标识注释适用的主表,以及一个PrimaryTablePK字段,该字段存储该表中记录的PK它应用于该表。

为了避免损坏,建议将备注字段保存在自己的表中,与父表(见此处(保持 1:1 的关系,这就是我所做的。

添加新通信和任务时,用户通常需要添加以下内容:

  • 与之通信的人员的详细信息。
  • 通信的主题。
  • 所需的操作类型和该操作的截止日期。
  • 附有已讨论内容的详细信息的说明等。

考虑到这一点,我有:

tblCommTaskLog字段CommDateActionRequiredTypeID(FK)ActionDeadlineDaysCommAccountID(FK)等。

tblNoteNoteID(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对应于tblCommTaskLog72PrimaryTablePK和PK NoteID例如 422(自动编号(。
  • tblNoteText 中创建一条新记录,NoteID为 422。

我认为我需要的是一个主表单,其中包含来自tblCommTask的字段,带有一个未绑定的文本字段来获取NoteText的输入。我只是不知道如何在tblNote中创建一条新记录,从该字段中获取AutonumberPK并将其插入tblNoteText的FK中,以便所有内容都与正确的FK正确链接在一起。我可以使用 SQL 插入,然后在"自动编号"字段上使用 SELECT TOP 来执行此操作吗?使用记录集和上次修改这样做会更好吗?还有其他我没有想到的方法吗?

@whatEvil:

您仍然可以将其设为 1:M。 如果允许您更改主表,请更改它们并添加

  1. 新列pk_guid:字符串(38(。(如果不使用 {},也可以是 36(
  2. 添加插入前触发器以自动为每个新记录添加 GUID。
  3. 像这样:对于插入集之前的每一行 pk_guid = get_uuid((

在你的tbl_note只有

  1. Note_id : 包
  2. origin_guid : 字符串(38( fK
  3. 笔记:
  4. added_by
  5. .....

现在,您可以简单地强制执行 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。完全取决于你想走哪条路,我只是解释了一种方法..

相关内容

最新更新