0

大量のレコードを収容するデータベースを構築しているので、サーバー上で最も簡単な検索機能が必要です。次のコードを使用していますが、大規模なデータベースでは持続できないことがわかっています。検索ボックスを見て、クエリを実行して検索結果を絞り込みます。

Private Sub SearchFor_Change()
'Create a string (text) variable
Dim vSearchString As String

'Populate the string variable with the text entered in the Text Box SearchFor
vSearchString = SearchFor.Text

'Pass the value contained in the string variable to the hidden text box SrchText,
'that is used as the sear4ch criteria for the Query QRY_SearchAll
SrchText.Value = vSearchString

'Requery the List Box to show the latest results for the text entered in Text Box
'SearchFor
Me.SearchResults.Requery


'Tests for a trailing space and exits the sub routine at this point
'so as to preserve the trailing space, which would be lost if focus was shifted from   
'Text Box SearchFor
 If Len(Me.SrchText) <> 0 And InStr(Len(SrchText), SrchText, " ", vbTextCompare) Then
 'Set the focus on the first item in the list box
 Me.SearchResults = Me.SearchResults.ItemData(1)
 Me.SearchResults.SetFocus
 'Requery the form to refresh the content of any unbound text box that might be feeding 
 'off the record source of  the List Box
 DoCmd.Requery
 'Returns the cursor to the the end of the text in Text Box SearchFor,
 'and restores trailing space lost when focus is shifted to the list box
  Me.SearchFor = vSearchString
  Me.SearchFor.SetFocus
  Me.SearchFor.SelStart = Me.SearchFor.SelLength

  Exit Sub
  End If
  'Set the focus on the first item in the list box
   Me.SearchResults = Me.SearchResults.ItemData(1)
   Me.SearchResults.SetFocus

   'Requery the form to refresh the content of any unbound text box that might be 
   'feeding off the record source of  the List Box
  DoCmd.Requery

'Returns the cursor to the the end of the text in Text Box SearchFor
 Me.SearchFor.SetFocus

If Not IsNull(Len(Me.SearchFor)) Then
Me.SearchFor.SelStart = Len(Me.SearchFor)
End If

理想的には、複数の検索フィールドと、クエリを実行してリスト ボックスに結果を返す 1 つの「検索」ボタンを含むフォームが必要です。

また、ユーザーが検索結果から選択したものをダブルクリックすると、選択したレコードが編集モードのフォームで開かれるように設定する方法もわかりません。

どんな助けでも大歓迎です、ありがとう!

4

1 に答える 1

2

まず、1 つの投稿で 2 つの質問をしました。ダブルクリックで選択範囲を編集モードで開くことに関する 2 番目の質問に回答することをお勧めします。

私が理解している限り、あなたは現在のコードのパフォーマンスだけでなく、それが提供する機能や柔軟性の欠如についても懸念しています。

性能について:

  • フィルターを実行するために change メソッドを使用しないでください。本当に change メソッドを使用したい場合は、タイマー間隔を 500 (ms) などに設定してから、Timer イベントでフィルターを実行するためだけに使用してください。これは、ユーザーが 0.5 秒間入力を停止するまでフィルターが発生しないというものでした。
  • 「あいまい」検索は避けてください (テキスト フィールドでのアスタリスク/パーセントの使用)。現在は使用していないようです。あいまい検索は通常、ソフトウェアをより使いやすくしますが、パフォーマンスに重大な影響を与えると、使いにくくなります。
  • 大量のデータを扱う場合、ほとんどのパフォーマンスの向上は、アプリケーションの動作方法を慎重に再構築すること、SQL Server にアップグレードすること、およびサーバーとネットワークをより優れたハードウェアにアップグレードすることによってもたらされます。JET/ACE バックエンド データベース コンテナーを使用する場合にのみ、多くの改善を行うことができます。ADO を使用した SQL Server と ODBC リンク テーブルはどちらも、JET/ACE を使用した DAO よりもいくつかの利点があります。ODBC リンク テーブルは遅延読み込みを提供しますが、ADO は切断されたレコードセットのようなものを提供し、サーバーへの追加のコールバックなしでフィルター処理できます (これには制限があります)。
  • すでに述べたように、アプリケーションがどのように機能し、どのように設計されているかを慎重に再考する必要があるかもしれません。必要な複雑なクエリの量と、許可/要求されるテキストベースの検索の量を制限しようとすることをお勧めします。より多くのルックアップ/参照テーブルを使用します。think like カテゴリをテキストとして保存する代わりに、長い数値の CategoryID として保存することを検討してください。インデックス付きの数値フィールドに対するクエリは、通常、テキスト ベースのフィールドに対するクエリよりも優れたパフォーマンスを発揮します。クエリでアスタリスクを使用して LIKE を使用している場合は特にそうです。

質問の残りの部分 (柔軟性と機能) に関しては、複数のコントロールの値に基づいて基準/WHERE ステートメントを作成する手順を作成することを検討してください。あなたのような状況では、私のコードは次のようになります (以下)。説明の検索/フィルターでアスタリスク (あいまい検索) を使用したことに注意してください。パフォーマンスが悪い場合は、それを取り除き、代わりにユーザーが独自のアスタリスクを入れられるようにすることを検討する必要があります。

Private Sub cmdSearch_Click()
    Call SetRowSource
End Sub

Private Sub txtSearch_AfterUpdate()
    Call SetRowSource
End Sub

Private Sub cboCategoryID_AfterUpdate()
    Call SetRowSource
End Sub

Private Sub txtBrand_AfterUpdate()
    Call SetRowSource
End Sub

Private Sub SetRowSource()
    Dim sSQL as String
    sSQL = "SELECT ItemID, Description, Brand FROM tblItems "
    sSQL = sSQL & GetWhere
    Me.lstSearchResults.RowSource = sSQL
End Sub

Private Function GetWhere() as String
    Dim sWhere as String
    If Nz(Me.cboCategoryID, 0) <> 0 Then
        sWhere = sWhere & "CategoryID = " & Me.cboCategoryID & " AND "
    End If
    If Nz(Me.txtSearch, "") <> "" Then
        sWhere = sWhere & "Description LIKE '*" & Replace(Me.txtSearch, "'", "''") & "*' AND "
    End If
    If Nz(Me.txtBrand, "") <> "" Then
        sWhere = sWhere & "Brand = '" & Replace(Me.txtBrand, "'", "''") & "' AND "
    End If
    If sWhere <> "" Then
        sWhere = Left(sWhere, Len(sWhere)-5)
        GetWhere = "WHERE " & sWhere
    End If
End Function

私は、Access コミュニティでは少し変わっていると思いますが、通常、自分のコントロールが他のコントロールを参照することを許可していません。あなたの場合、リストボックスの RowSource は、それが配置されているフォームのコントロールを参照します。さまざまな理由から、SQL ステートメントを VBA コードで作成することを好みます。特に、SQL ステートメントが変更/フィルター処理される可能性がある場合はそうです。もう 1 つ考えられるのは、リストボックスの代わりにデータシート フォームを使用することです。フォームの RecordSource を設定し、WHERE ステートメントをフォームの Filter プロパティに適用するだけです。データシート フォームは、列のサイズを変更したり、プログラマーの助けを借りずに並べ替えたりできるため、ユーザーにとってより柔軟です。いつでもコントロールをロックして、編集できないようにすることができます。このようにデータシートを使用する場合、DoubleClick イベントを使用してレコードを開くことができると思います。

于 2013-10-05T14:11:43.900 に答える