繁体   English   中英

MS Access子表单数据输入

[英]MS Access sub-subform data entry

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

我的数据库有一个便笺系统,以便用户可以对各种事情做便笺-例如,客户记录中可能有一个便笺,上面写着“该客户总是订购自己的窗框玻璃”。 所有这些操作都通过一个单独的“ Notes”表进行处理,该表具有一个PrimaryNoteTableID和一个PrimaryTablePK字段,该静态查找表标识了该注释所适用的主表,该静态查找表标识了该注释所适用的主表, PrimaryTablePK字段存储了该表在该表中的记录。

为了避免损坏,建议将备注字段保留在自己的表中,该表与它们的父表保持1:1的关系( 请参阅此处 ),这是我所做的。

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

  • 通讯对象的详细信息。
  • 交流的主题。
  • 所需的操作类型以及该操作的期限。
  • 详细讨论内容等的注释。

考虑到这一点,我有:

tblCommTaskLog ,其字段为CommDateActionRequiredTypeID(FK)ActionDeadlineDaysCommAccountID(FK)等。

tblNote具有: NoteID(PK)PrimaryNoteTableID(FK) PrimaryTablePK(FK)EnteredByUserID(FK)EntryDate EnteredByUserID(FK)EntryDate

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

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

本质上,我遇到问题的是这三个表的输入表单。 我发现子窗体的Access处理可能非常愚蠢,例如:

  • 如果要使用子窗体或子窗体的子窗体,则只能以某种方式显示事物。
  • 单击保存之前,Access会保存记录。 它还将记录保存在子窗体中,而这些子窗体无法通过窗体代码中的简单“ me.undo”进行处理,从而导致您不得不在子窗体中找到记录并使用代码将其删除。
  • 子表单在分配自动编号PK并在子表单和主表单之间的链接中进行选择的方式方面以愚蠢的方式起作用。

我想只是从田野tblCommTaskLogNoteText一种形式的领域,从而使从细节用户填写tblCommTaskLog (ActionRequired等)和注释文本,点击“保存”按钮,然后通过代码这些项目已正确保存,例如:

  • tblCommTaskLog创建一个新记录,例如PK为72 (自动编号)。
  • 一个新的记录中创建tblNotePrimaryNoteTableID4对应于tblCommTaskLog ,一个PrimaryTablePK72和PK NoteID例如422 (自动编号)。
  • tblNoteText创建一个新记录,其NoteID为422。

我认为我需要的是一种主要形式,其中包含来自tblCommTask的字段以及未绑定的文本字段,以接收NoteText的输入。 我只是不知道如何在tblNote创建新记录,从该字段中获取AutonumberPK并将其插入tblNoteText的FK中, tblNoteText使所有内容都与正确的FK正确链接在一起。 我可以使用SQL INSERT然后在Autonumber字段上使用SELECT TOP来做到这一点吗? 使用Recordsets和Lastmodified这样做会更好吗? 还有我没有想到的其他方法吗?

@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. add_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

编辑:想法是在每个主表(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 = zh-CN&rs = en-CA&ad = CA

为什么这样呢? 当前,您的主表正在生成自动编号,一个或多个表可能具有相同的ID号。 毕竟,自动编号仅在整个表中唯一,而不在整个数据库中唯一。 为避免重复,您要添加另一个键(表标识键)以标识外键所属的主表。 这听起来很不错,直到您对主表进行了一次错误的更新,并为便笺ID设置了错误的值。

通过使用GUID,无论有多少个主表参与,您都可以简单地保持1:m关系。 我个人也喜欢GUID的想法,以防您的应用程序增长并且在整个数据库中需要真正的唯一ID。 这完全取决于您,您想走哪条路,我只是解释了一种方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM