MS Access子子表单数据条目

时间:2014-12-01 16:10:51

标签: sql database forms vba ms-access

我正在建立一个通信/任务记录系统,它记录传入的通信并根据它们分配任务。

我的数据库有一个笔记系统,以便用户可以记录各种事情 - 例如客户记录可能有一个说明"该客户总是订购他们自己的窗框玻璃"。这一切都是通过单个" Notes"具有PrimaryNoteTableID的表,该表链接到静态查找表,该表标识了该注释适用的主表,以及PrimaryTablePK字段,用于存储该表适用于该表的记录的PK。 / p>

为了避免损坏,建议将备忘录字段保存在他们自己的表中,与父表(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)

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

基本上我遇到问题的是使用这三个表进入的表单。我发现子表单的访问处理可能非常愚蠢,例如:

  • 如果您想使用子表单或子表单的子表单,您将被锁定以某种方式显示内容。
  • 在您点击保存之前,Access会保存记录。它还可以保存子表单中的记录,这些子表单不能用简单的“me.undo"在表单的代码中,您必须在子表单中找到记录并使用代码将其删除。
  • 子表单以愚蠢的方式行事,因为他们分配自动编号PK并在子表单和主表单之间的链接中选择它们。

我希望在一个表单上包含tblCommTaskLogNoteText字段中的字段,以便用户填写tblCommTaskLog的详细信息(ActionRequired等)。 )和注释文本,点击"保存"按钮,然后通过代码正确保存项目,以便:

  • tblCommTaskLog中创建了一条新记录,例如PK为72(自动编号)。
  • tblNote中创建了一条新记录,PrimaryNoteTableID 4对应tblCommTaskLogPrimaryTablePK 72和PK NoteID例如422(自动编号)。
  • tblNoteText中创建了一条新记录,NoteID为422。

我认为我需要的是一个主要表单,其中tblCommTask的字段带有未绑定的文本字段,可以获取NoteText的输入。我只是无法弄清楚如何在tblNote中创建新记录,从该字段获取AutonumberPK并将其插入到tblNoteText的FK中,以便所有内容都正确地链接在一起FKS。我可以使用SQL INSERT,然后在Autonumber字段上执行SELECT TOP吗?使用Recordsets和Lastmodified,我会更好吗?还有其他一些我没想过的方法吗?

1 个答案:

答案 0 :(得分:-1)

@whatEvil:

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

  1. new column pk_guid:String(38)。 (如果你不使用{})
  2. ,也可以是36岁
  3. 添加before insert触发器以自动为每个新记录添加GUID。
  4. 类似于:插入集之前的每一行pk_guid = get_uuid()
  5. 你的tbl_note中的

    只有

    1. Note_id:pk
    2. origin_guid:string(38)fK
    3. 注意:
    4. added_by
    5. .....
    6. 现在你可以简单地强制实施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的想法。它完全取决于你想要去哪种方式,我只是解释了一种方法..