如何在Microsoft访问表单中创建免费标记字段?

时间:2016-12-19 03:09:50

标签: forms ms-access many-to-many

设置

Access 2007

这是一个简化的方案。它几乎与我的实际用例相同,只是更容易解释。我的电影和流派之间有多对多关系,表结构如下。

表:电影 id autonumber 名称文字

表:类型 id autonumber 名称文字

表:movie_genres movie_id号码 genre_id号

我想要一个允许我列出给定电影的所有类型的表单。但也允许我创建新类型,而无需打开单独的表单。类似于免费标记在Drupal或Wordpress等cms网站中的工作方式。

我的尝试1

我已经成功创建了一个表单,允许我使用指向movie_genres表的子表单和指向流派表的组合框来显示所有标签。此表单设置还允许我选择现有值作为新类型。然而,它不允许我创造新的流派。

如果我输入的值不存在,我会收到警告"您输入的文字不是列表中的项目。"

如果我尝试将组合框更改为"限制列表:否"我收到警告:"第一个可见列...不等于绑定列。"如果我将第一个可见列设置为绑定列,则组合框只显示数字而不是名称,这很愚蠢,因为信息存在。

此简化案例的表格如下:

enter image description here

我的尝试2

我还可以使用指向流派名称的常规文本框创建指向movie_genres和genres表的子表单。这允许我创建新值,但它不允许我从现有值中进行选择。没有这张照片。

在此表单上创建一个组合框与第二个表单相同。

问题再次

如何创建支持创建和列出现有流派的电影表单项?

1 个答案:

答案 0 :(得分:1)

您可以使用“NotInList”事件轻松地将新值添加到流派列表中。保留Limit To List: Yes并使用与以下代码类似的代码:

Private Sub GenreName_NotInList(NewData As String, Response As Integer)
    ' Prompt user to verify they wish to add new value.
    If MsgBox("Genre '" & NewData & "' is not in list. Add it?", _
         vbOKCancel) = vbOK Then
        ' Set Response argument to indicate that data
        ' is being added.
        Response = acDataErrAdded
        ' Add string in NewData argument to row source.
        DoCmd.SetWarnings False
        DoCmd.RunSQL "INSERT INTO Genres (GenreName) SELECT '" & NewData & "';"
        DoCmd.SetWarnings True
    Else
    ' If user chooses Cancel, suppress error message
    ' and undo changes.
        Response = acDataErrContinue
        Me.GenreName.Undo
    End If
End Sub