0

VBA を使用して Access で GUI を作成します (今学期に初めて見ましたが、私には珍しいようです)。Authorsauthor_idlast_namefirst_nameおよびBooksauthor_id、を含むテーブルを取得したテーブルを取得しbook_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_nameまたはlast_name & " " & first_name) です。ColumnWidths プロパティを 0 (最初の列) に設定すると、次の列が表示されます。
  • テキスト ボックスを使用する場合はLIKE、クエリで演算子を使用しlast_nameて、ユーザー文字列を含むすべての作成者を表示することを検討してください。

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

    スミス、スマイス、アスモデウスが戻ってきます。

于 2012-11-06T10:48:41.210 に答える
0

フォームとサブフォームを設定することをお勧めします。フォームには著者の詳細を含めることができ、サブフォームにはその著者による本を含めることができます。ユーザーが著者名の一部を入力できるテキストボックスをさらに追加できます。その後、フィルターをメイン フォームに適用して、その名前を持つすべての作成者を表示できます。

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

これには多くのバリエーションがあり、ユーザーはコンボまたはリストボックスから名前を選択できます。フォームは、ヘッダーなどにフィルター/検索を含む連続フォームにすることができます。

于 2012-11-06T11:04:33.320 に答える