在访问中使用VBA的GUI。来自查询的记录集

时间:2012-11-06 08:14:08

标签: vba ms-access ms-access-2007 recordset

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

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

我在想我需要创建包含author_id值的临时查询,之后使用像"SELECT [Books].[book_name] AS [Bookname] FROM [Books] WHERE [Books].[author_id] = [test].[ID]"之类的SQLquery创建使用此查询的记录集但是我坚持在这里 - 我试图检查这个东西是否有效但是它说错误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查询)?

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

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

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

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