2012-11-06 40 views
0

使用VBA在Access中进行GUI(第一次在本学期中看到它,它对我来说看起来很不寻常)。我得到了表Authors其中我列author_id,last_name,first_name和表Books与列author_id,book_name。 我在按钮上点击应该要求用户输入作者姓,然后搜索并显示该作者的所有书籍。在访问中使用VBA的GUI。查询中的记录集

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

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

+0

你有表吗?顺便说一下,这些字段名称会让你疯狂 - 大多数人建议避开除列表和表名之外的其他字符(如果你真的必须),例如姓氏。 – Fionnuala

+0

是的我有一个表格 – DanilGholtsman

回答

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_name或或last_name & " " & first_name)。如果将ColumnWidths属性设置为0(对于第一列),则将显示下一列
  • 如果您希望使用文本框,请考虑在查询中使用LIKE运算符来显示所有作者,其中last_name包含用户字符串:

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

    将返回史密斯,史迈士和阿斯莫德。

+0

但它仍然无法打开记录集 – DanilGholtsman

+0

@DanilGholtsman它给你什么错误? strQuery在错误时的价值是什么? ('View - > Locals Window') –

+0

well查询还行,我认为cuz'idbynameQuery:“SELECT [Authors]。[author_id] AS [ID] FROM [Authors] WHERE [Authors]。[last_name] = Dostoevsky”:Variant/String' 它用黄色突出显示这个 > Set authorsRS = dbs.OpenRecordset(strQuery,dbOpenSnapshot) 并且表示运行时错误3061并且应该有更多的参数 – DanilGholtsman

0

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

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

有一些在这个变化中,用户可以选择从一个组合或列表框的名字。该表单可以是一个连续的表单,在标题中有一个过滤器/搜索等。

+0

哦,我总是避免使用所有这些主表格,实际上不知道如何正确使用它。我在哪里可以找到一些关于它的教程和示例? – DanilGholtsman

+1

http://office.microsoft.com/en-ie/access-help/create-a-form-that-c​​ontains-a-subform-a-one-to-many-form-HA010098674.aspx – Fionnuala