Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 出现在文本框中的记录主键,其中控制源不是PK字段_Ms Access_Vba - Fatal编程技术网

Ms access 出现在文本框中的记录主键,其中控制源不是PK字段

Ms access 出现在文本框中的记录主键,其中控制源不是PK字段,ms-access,vba,Ms Access,Vba,我在Access 2010数据库中遇到问题,当我移动到链接窗体上的另一个控件时,新记录的主键也被添加到一个不相关的字段中 我的最小数据库由一个名为Teams的表组成。表中有四个字段: +-----------------+-----------+-----------+--------------+ | TeamID | TeamName | CostCode | SortOrder | +-----------------+-----------+---------

我在Access 2010数据库中遇到问题,当我移动到链接窗体上的另一个控件时,新记录的主键也被添加到一个不相关的字段中

我的最小数据库由一个名为
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