当主表(“一”表)中的主键字段与相关表(“多”表)中的外部键字段建立了关系后,在基于相关表(“多”表)而建的窗体中,外部键字段的控件可以设为组合框,通过键盘或鼠标,输入或选择组合框中已存的值,也就是引用“一”表所有的数据。
此时,组合框的“行来源类型(RowSourceType)”属性为“表/查询”;“行来源(RowSource)”属性为一查询或SQL语句,同时必须设置“结合列(或绑定列)(BoundColumn)”属性;而“限于列表”属性必须设为“是”,这是为了确保在相关表(“多”表)中的外部键字段必须与主表(“一”表)中的主键字段有一一对应的关系。从中也可以看出,输入数据必须先输入主表(“一”表)的数据,然后才能在相关表(“多”表)中,引用主表(“一”表)的数据。
当组合框为结合(或绑定)时,上述一些属性必须如上所述。假如在组合框中输入新值,将会触发“不在列表中(NotInList)”事件。在该事件中写上适当的代码就能将新值添加到组合框所结合(或绑定)的表中。
在使用该事件时,Access提供了两个变量,NewData 和Response 。
当输入的值不在列表中时,Access把这一新值写入NewData变量中。通过访问NewData可将新值添加到主表中。
Response有三个值可取:acDataErrDisplay (默认值)、acDataErrContinue和acDataErrAdded 。
书写形式为:
Response = acDataErrDisplay
Response = acDataErrContinue
Response = acDataErrAdded
它们的含义为:
1、acDataErrDisplay为用户显示默认的消息。当不答应用户将新值添加到组合框的列表中时,可以使用它。
2、acDataErrContinue 不为用户显示默认的消息。假如要为用户显示自定义消息时,可以使用它。例如,事件过程能显示一个自定义对话框以询问用户是否要保存新的输入项。假如回答为 Yes,事件过程将新的输入项添加到列表中,并将 Response 参数设置为 acDataErrAdded。假如回答是 No,事件过程将 Response 参数设置为 acDataErrContinue。
3、acDataErrAdded 不为用户显示消息,但在 NotInList 事件过程中将输入项添加到组合框列表中。在输入项被添加后,Microsoft Access 将通过重新查询组合框来更新列表。然后 Microsoft Access 重新检查字符串和组合框列表,并将 NewData 参数中的值保存到组合框绑定到的字段中。假如字符串不在列表中,则 Microsoft Access 将显示一条错误消息。
①当主表只有一个字段可以添加新值时,不必另建主表输入窗体,用"Insert Into表名称(字段名) Values ('" & NewData & "');"语句将新值直接追加到主表中。以下参考代码:
Private Sub 控件名_NotInList(NewData As String, Response As Integer)
DoCmd.SetWarnings False
DoCmd.RunSQL "Insert Into 表名称(字段名) Values ('" & NewData & "');"
Response = acDataErrAdded
DoCmd.SetWarnings True
End Sub
②假如,主表有多个字段需要添加新值时,必须另建基于主表的输入窗体。在主表窗体的“加载”事件中写入:
Private Sub Form_Load()
If Len(Me.OpenArgs) Then Me.与“多”表窗体中相同字段的控件名 = Me.OpenArgs
End Sub
而在“多”表的“不在列表中”的事件中,写入以下参考代码:
Private Sub 控件名_NotInList(NewData As String, Response As Integer)
If MsgBox("是否要添加新值吗?", vbInformation + vbYesNo, "寻问") Then
DoCmd.OpenForm "主表窗体名称", , , , acFormAdd, acDialog, NewData
Response = acDataErrAdded
End If
End Sub