Ms access 出现在文本框中的记录主键,其中控制源不是PK字段
我在Access 2010数据库中遇到问题,当我移动到链接窗体上的另一个控件时,新记录的主键也被添加到一个不相关的字段中 我的最小数据库由一个名为Ms access 出现在文本框中的记录主键,其中控制源不是PK字段,ms-access,vba,Ms Access,Vba,我在Access 2010数据库中遇到问题,当我移动到链接窗体上的另一个控件时,新记录的主键也被添加到一个不相关的字段中 我的最小数据库由一个名为Teams的表组成。表中有四个字段: +-----------------+-----------+-----------+--------------+ | TeamID | TeamName | CostCode | SortOrder | +-----------------+-----------+---------
Teams
的表组成。表中有四个字段:
+-----------------+-----------+-----------+--------------+
| TeamID | TeamName | CostCode | SortOrder |
+-----------------+-----------+-----------+--------------+
| AutoNumber (PK) | Text(255) | Text(255) | Long Integer |
+-----------------+-----------+-----------+--------------+
此表由记录源
链接到名为编辑团队
的表单表单上有三个控件:
+-----------------+-------------+-----------+------------------------------------+
| Control: | TextBox | TextBox | ComboBox |
+-----------------+-------------+-----------+------------------------------------+
| Name: | txtCostCode | txtTeamID | cmbTeamName |
| Control Source: | CostCode | TeamID | - |
| Row Source: | - | - | SELECT TeamID, TeamName FROM Teams |
+-----------------+-------------+-----------+------------------------------------+
组合框
绑定到第1列,Limit to List=Yes
当您在记录之间移动时,表单有一些代码可以使组合框与表单的其余部分保持同步:
Private Sub Form_Current()
If Not IsNull(Me.txtTeamID) Then
Me.cmbTeamName.Requery
Me.cmbTeamName = Me.txtTeamID
If Me.cmbTeamName <> 0 Then
'Some other code that adds stuff to a subform.
Me.Refresh
End If
Else
Me.cmbTeamName = 0
End If
End Sub
在前面的程序中也使用了这一点:
Public Sub GoToBookmark(frm As Form, FieldName As String, FieldValue As String)
Dim rst As DAO.Recordset
Dim rst_Type As Long
On Error GoTo ERR_HANDLE
Set rst = frm.RecordsetClone
FieldName = "[" & FieldName & "]"
Select Case rst.Fields(FieldName).Type
Case 4 'dbLong
rst.FindFirst FieldName & "=" & FieldValue
Case 10 'dbText
rst.FindFirst FieldName & "='" & FieldValue & "'"
End Select
If Not (rst.BOF And rst.EOF) Then
frm.Recordset.Bookmark = rst.Bookmark
End If
rst.Close
EXIT_PROC:
Set rst = Nothing
On Error GoTo 0
Exit Sub
ERR_HANDLE:
'Commented out so I don't have to post the DisplayError procedures.
'DisplayError Err.Number, Err.Description, "mdl_GoToBookMark.GoToBookmark()"
Resume EXIT_PROC
End Sub
问题:当我在组合框中键入新的团队名称时,它会询问我是否要将其添加到团队列表中,然后它会添加团队并将我移动到成本代码文本框中,在该文本框中我可以键入成本代码(如果可用)。
如果成本代码不可用,则控件应保持空白,但当我移动到另一个控件或记录(即控件失去焦点)时,该记录的主键会显示在成本代码文本框中,并在我更改记录时保存(失去焦点只会将其放在文本框中,直到记录保存后才会显示在表中).您的问题在于以下几行:
Response=acDataErrAdded
此行触发Access,将焦点字段设置为刚添加的值(一旦失去焦点)。因为你把注意力转移到另一个领域,你会有这种奇怪的行为
将其更改为
Response=acDataErrContinue
(这基本上是告诉Access不要关心您输入的内容,并让您自己处理),您的代码应该按照预期的方式运行。Funky behavior。我怀疑在NotInList
事件过程中执行所有这些操作对于访问来说有点太多了。请注意,Me.Requery
也会触发Form\u Current()
,因此我认为这两种Me.cmbTeamName
操作都是多余的。你能上传一个独立的示例数据库到filehoster吗?我很高兴在NotInList
事件中没有发生太多事情。那将是一个真正的痛苦来解决。我将再看一看Me.Requery
,尽管在GoToBookMark
调用的任一侧使用它似乎有点过分,即使第二个调用只重新查询控件。我会让你知道…第一次看的时候,我确实可以删除第一次重新查询,并将第二次更改为重新查询整个表单。我得检查一下它没有损坏任何东西,但现在看起来一切都很好。谢谢埃里克。这就成功了。我终于摆脱了最后一个讨厌的bug,它并没有真正影响DB的运行(代价代码比PK大得多,所以当它是错误的数字时,这一点很明显),总是需要学习一些新的东西。
Private Sub cmbTeamName_NotInList(NewData As String, Response As Integer)
With DoCmd
.SetWarnings False
If MsgBox("Add '" & NewData & "' as a new team?", vbYesNo + vbQuestion) = vbYes Then
.RunSQL "INSERT INTO Teams(TeamName, CostCode, SortOrder) " & _
"VALUES ('" & NewData & "', Null," & DCount("TeamID", "Teams") + 1 & ")"
Response = acDataErrAdded
Me.cmbTeamName = Me.cmbTeamName.ItemData(0) 'Move to an item that exists so Requery doesn't fire NotInList.
Me.Requery
GoToBookmark Me, "TeamName", NewData
Me.cmbTeamName.Requery
Me.cmbTeamName = DLookup("TeamID", "Teams", "TeamName='" & TeamName & "'")
Me.txtCostCode.SetFocus
Else
Response = acDataErrContinue
Me.cmbTeamName.Undo
End If
.SetWarnings True
End With
End Sub
Public Sub GoToBookmark(frm As Form, FieldName As String, FieldValue As String)
Dim rst As DAO.Recordset
Dim rst_Type As Long
On Error GoTo ERR_HANDLE
Set rst = frm.RecordsetClone
FieldName = "[" & FieldName & "]"
Select Case rst.Fields(FieldName).Type
Case 4 'dbLong
rst.FindFirst FieldName & "=" & FieldValue
Case 10 'dbText
rst.FindFirst FieldName & "='" & FieldValue & "'"
End Select
If Not (rst.BOF And rst.EOF) Then
frm.Recordset.Bookmark = rst.Bookmark
End If
rst.Close
EXIT_PROC:
Set rst = Nothing
On Error GoTo 0
Exit Sub
ERR_HANDLE:
'Commented out so I don't have to post the DisplayError procedures.
'DisplayError Err.Number, Err.Description, "mdl_GoToBookMark.GoToBookmark()"
Resume EXIT_PROC
End Sub