0

使用 VBA 在 Access 中制作 GUI(我在这个学期第一次看到它,这对我来说看起来很不寻常)。我得到了Authors我有列的表格,author_id和带有列的表格,。我在表单上有按钮,单击时应要求用户输入作者姓氏,然后搜索并显示该作者的所有书籍。last_namefirst_nameBooksauthor_idbook_name

因此,我尝试从 Authors 表中查找作者 ID,然后从 Books 表中显示 author.author_id 等于 books.author_id 的所有书籍。

我在想我需要创建包含 author_id 值的临时查询,然后使用 SQLquery 使用此查询创建记录集,"SELECT [Books].[book_name] AS [Bookname] FROM [Books] WHERE [Books].[author_id] = [test].[ID]"但我卡在这里 - 我试图检查这件事是否有效,但它说有一个错误3061

Private Sub authorlist_Click()

    Dim dbs As Database, authorsRS, booksRS As Recordset, queryStr, idbynameQuery, srchASurStr, strOutput, srId As String, qdf As QueryDef

    Set dbs = CurrentDb()

    srchASurStr = InputBox("Input author surname, please", , , 100, 100)

    strQuery = "SELECT [Authors].[author_id] AS [ID] FROM [Authors] WHERE [Authors].[last_name] =  " & srchASurStr & ""



    Set authorsRS = dbs.OpenRecordset(strQuery, dbOpenSnapshot)

    With dbs
        Set qdf = .CreateQueryDef("test", strQuery)
        DoCmd.OpenQuery "test"
        .QueryDefs.Delete "test"
    End With


End Sub

那么你能帮我了解一下有什么问题吗?是否有更简单的方法来显示某个作者的所有书籍(可能不使用 SQL 查询)?

4

2 回答 2

1

SQL 语句中的字符串值需要用单引号 ( ') 或双引号 ( ") 括起来:

SELECT author_id FROM authors WHERE last_name = "Smith"

如果不带引号写:

SELECT author_id FROM authors WHERE last_name = Smith

Smith将被理解为字段名称而不是字符串值。所以你的代码应该是这样的:

'Chr returns a string from a character code. 34 is the code for "
strQuery = "SELECT author_id FROM authors WHERE last_name = " & Chr(34) & srchASurStr & Chr(34)

在 VBA 中,您可以通过将字符串加倍来转义双引号:

strQuery = "SELECT author_id FROM authors WHERE last_name = """ & srchASurStr & """"


SQL 注入:请记住,如果用户在其中输入一个字符串",则可能会出现错误,因为生成的 SQL 语句具有无效的语法:

SELECT author_id FROM authors WHERE last_name = "Smi"th"

避免这个问题的正确方法是使用参数。


一些注意事项:

  • 您可以在查询中引用表单控件:[Forms]![FormName]![ControlName]. 因此,您可以创建一个基于表单文本框过滤的已保存查询,而不是使用输入框。
  • 考虑使用组合框让用户从列表中进行选择,而不是让用户键入自由文本。组合框可以有多个列,组合框的值是第一列 ( author_id),显示的值是另一个表达式 (last_namelast_name & " " & first_name)。如果将 ColumnWidths 属性设置为 0(对于第一列),则将显示下一列
  • 如果您更喜欢使用文本框,请考虑LIKE在查询中使用运算符,以显示last_name包含用户字符串的所有作者:

    SELECT author_id FROM authors WHERE last_name LIKE "%sm%"

    将返回 Smith、Smythe 和 Asmodeus。

于 2012-11-06T10:48:41.210 回答
0

我建议你设置一个表单和子表单。表单可以包含作者详细信息,子表单可以包含该作者的书籍,您可以进一步添加一个文本框,用户可以填写部分作者姓名。然后,您可以将过滤器应用于主表单以显示具有该名称的所有作者。

Me.Filter = "Author Like '*" & Me.Search & "*'"
Me.FilterOn = True

对此有许多变体,用户可以从组合或列表框中选择名称。该表单可以是在标题中带有过滤器/搜索等的连续表单。

于 2012-11-06T11:04:33.320 回答