Access 中多个表单的脏主键数字
Dirty primary key Number from multiple forms in Access
我有一个科学数据库,它从链接到同一个 entityID 的不同表单中进行测量。我的问题是,虽然我有一个主 table 的自动编号 ID,就像发票结构一样,但子样本表格可以而且应该弄脏主 ID。当我在任何子表单上输入第一个测量值时,我想增加任何子表单的主要 ID,但是当我访问其他子表单之一并为当前输入额外的测量值时,我不想增加主 ID,如果主要 id 是脏的,我不希望 3 个子表单中的任何一个推进自动编号 EntityID,这意味着我似乎无法在可以创建新条目的任何子表单上使用 DMax。但是一旦其中一个子子表单变脏,我就需要引用从其他子表单变脏后生成的主 entityid。有人吗?
|obsid auto pk|
|obsnum long pk| |number| main experiment number|***herein lies the DMax problem***
|meas1id| |number| -required
|obsnum| |number| fk -required
|meas1num| |number|
meas2id number not required
meas2num number
meas3id number not required
meas3num number
您不清楚主窗体(和记录)是否会进行“某种”编辑。
如果您在现有记录上,那么主窗体(和记录)当然已经有记录。
如果你转到一个新的主窗体记录,那么是的,在你跳转或切换焦点到任何子窗体之前,主记录必须变成“脏的”。在 99% 的情况下,没有数据或根本没有输入任何数据的情况是非常非常罕见的,对吧?
因此,Access 将始终自动为您保存主记录(如果它是脏的),因此也会为您生成自动编号 PK。
我想您可能正在跳转到一个新的主记录,并且主窗体上没有或不会进行任何编辑,当然,如果用户将焦点移至子窗体,那么是的,您有麻烦了.
这是一个非常罕见的设置。
然后我会对主 table 做的是添加一个新列,将其命名为 CreateDate。
然后就可以在主窗体中添加这个事件了:
如果用户要键入,或做任何事情,那么我们可以使用 OnInsert 事件,像这样说:
Private Sub Form_BeforeInsert(Cancel As Integer)
If IsNull(Me!CreateDate) Then
Me!CreateDate = Date
End If
End Sub
因此,这将“始终”在主窗体中设置一个变脏的列。
但是,如果我们导航到一个新的空白主记录并键入 NOTHING,则不会自动保存主记录。因此,对于每个子表单,您甚至可以为子表单控件的 on-enter 添加此内容。
Private Sub SbubformColors_Enter()
If IsNull(Me!CreateDate) Then
Me!CreateDate = Date
End If
End Sub
另一种方式?删除导航按钮,并让您的 OWN 按钮将表单跳转到新记录,然后在代码中设置(脏)该 CreateDate 列。再一次,任何对子窗体的焦点更改都会首先触发主窗体记录的自动保存。
因此,只有在导航到空白主新记录并且发生零编辑时才会出现您的问题。在所有其他情况下,主记录的创建 + 自动保存将为您完成,无需代码。
如果出于某种奇怪的原因您确实允许导航到新的主记录并且也不会进行任何编辑,那么您需要为每个子表单控件设置“输入时”代码,并使用上面的代码(例如这个)。
Private Sub SbubformColors_Enter()
If IsNull(Me!CreateDate) Then
Me!CreateDate = Date
End If
End Sub
所以,如果你有 4 个子表单,那么你可以将上面的代码剪切并粘贴到上面。以上将确保主记录存在或变脏,并且在上述事件发生后,主窗体将自动保存(从而创建自动编号PK),然后您可以自由编辑+使用子窗体。
我想有很多方法可以解决上述问题。因此,也许代替添加新列 CreateDate,您可能有一些现有的列可以设置一个值,从而“强制”记录的脏。
编辑:
请记住,Access 可以并将设置和维护自动编号,对于子表单中的所有 table,我们假设这些 table 具有指向主记录的列。换句话说,假定每个子表单 tables 在它们的 tables 中都有一列。也许叫做 main_ID 或类似的东西。
要访问自动“维护”和 insert/setup/maintain 主要 form/record 自动编号 ID?
在每个子表单控件中,设置 link 主字段和 link 子字段设置。执行此操作后,根本不需要任何代码。
事实上,如前所述,如果主记录存在,或者在所有情况下都会创建主记录(比如通过转到新记录),那么只要这条记录变脏(比如通过用户编辑,或我们上面的代码),那么所有子表单(和子 tables)将自动维护。
您不需要使用 dmax,事实上您需要零代码,除非问题是当您刚移动到新记录时主窗体永远不会看到任何编辑。
在主窗体的设计模式中,查看每个子窗体的属性 sheet。您看到(并希望)确保这些设置正确:
我有一个科学数据库,它从链接到同一个 entityID 的不同表单中进行测量。我的问题是,虽然我有一个主 table 的自动编号 ID,就像发票结构一样,但子样本表格可以而且应该弄脏主 ID。当我在任何子表单上输入第一个测量值时,我想增加任何子表单的主要 ID,但是当我访问其他子表单之一并为当前输入额外的测量值时,我不想增加主 ID,如果主要 id 是脏的,我不希望 3 个子表单中的任何一个推进自动编号 EntityID,这意味着我似乎无法在可以创建新条目的任何子表单上使用 DMax。但是一旦其中一个子子表单变脏,我就需要引用从其他子表单变脏后生成的主 entityid。有人吗?
|obsid auto pk|
|obsnum long pk| |number| main experiment number|***herein lies the DMax problem***
|meas1id| |number| -required
|obsnum| |number| fk -required
|meas1num| |number|
meas2id number not required
meas2num number
meas3id number not required
meas3num number
您不清楚主窗体(和记录)是否会进行“某种”编辑。
如果您在现有记录上,那么主窗体(和记录)当然已经有记录。
如果你转到一个新的主窗体记录,那么是的,在你跳转或切换焦点到任何子窗体之前,主记录必须变成“脏的”。在 99% 的情况下,没有数据或根本没有输入任何数据的情况是非常非常罕见的,对吧?
因此,Access 将始终自动为您保存主记录(如果它是脏的),因此也会为您生成自动编号 PK。
我想您可能正在跳转到一个新的主记录,并且主窗体上没有或不会进行任何编辑,当然,如果用户将焦点移至子窗体,那么是的,您有麻烦了.
这是一个非常罕见的设置。
然后我会对主 table 做的是添加一个新列,将其命名为 CreateDate。
然后就可以在主窗体中添加这个事件了:
如果用户要键入,或做任何事情,那么我们可以使用 OnInsert 事件,像这样说:
Private Sub Form_BeforeInsert(Cancel As Integer)
If IsNull(Me!CreateDate) Then
Me!CreateDate = Date
End If
End Sub
因此,这将“始终”在主窗体中设置一个变脏的列。
但是,如果我们导航到一个新的空白主记录并键入 NOTHING,则不会自动保存主记录。因此,对于每个子表单,您甚至可以为子表单控件的 on-enter 添加此内容。
Private Sub SbubformColors_Enter()
If IsNull(Me!CreateDate) Then
Me!CreateDate = Date
End If
End Sub
另一种方式?删除导航按钮,并让您的 OWN 按钮将表单跳转到新记录,然后在代码中设置(脏)该 CreateDate 列。再一次,任何对子窗体的焦点更改都会首先触发主窗体记录的自动保存。
因此,只有在导航到空白主新记录并且发生零编辑时才会出现您的问题。在所有其他情况下,主记录的创建 + 自动保存将为您完成,无需代码。
如果出于某种奇怪的原因您确实允许导航到新的主记录并且也不会进行任何编辑,那么您需要为每个子表单控件设置“输入时”代码,并使用上面的代码(例如这个)。
Private Sub SbubformColors_Enter()
If IsNull(Me!CreateDate) Then
Me!CreateDate = Date
End If
End Sub
所以,如果你有 4 个子表单,那么你可以将上面的代码剪切并粘贴到上面。以上将确保主记录存在或变脏,并且在上述事件发生后,主窗体将自动保存(从而创建自动编号PK),然后您可以自由编辑+使用子窗体。
我想有很多方法可以解决上述问题。因此,也许代替添加新列 CreateDate,您可能有一些现有的列可以设置一个值,从而“强制”记录的脏。
编辑:
请记住,Access 可以并将设置和维护自动编号,对于子表单中的所有 table,我们假设这些 table 具有指向主记录的列。换句话说,假定每个子表单 tables 在它们的 tables 中都有一列。也许叫做 main_ID 或类似的东西。
要访问自动“维护”和 insert/setup/maintain 主要 form/record 自动编号 ID?
在每个子表单控件中,设置 link 主字段和 link 子字段设置。执行此操作后,根本不需要任何代码。
事实上,如前所述,如果主记录存在,或者在所有情况下都会创建主记录(比如通过转到新记录),那么只要这条记录变脏(比如通过用户编辑,或我们上面的代码),那么所有子表单(和子 tables)将自动维护。
您不需要使用 dmax,事实上您需要零代码,除非问题是当您刚移动到新记录时主窗体永远不会看到任何编辑。
在主窗体的设计模式中,查看每个子窗体的属性 sheet。您看到(并希望)确保这些设置正确: