コンボボックスで検索できるAccess2007フォームがあります。新しいレコードを追加するときは、コンボボックスを更新して、新しく追加されたアイテムを含める必要があります。
フォームのAfterInsertイベントで何かを行う必要があると思いますが、何を理解できません。
挿入後にコンボボックスを再バインドして、新しいアイテムがリストに表示されるようにするにはどうすればよいですか?
コンボボックスで検索できるAccess2007フォームがあります。新しいレコードを追加するときは、コンボボックスを更新して、新しく追加されたアイテムを含める必要があります。
フォームのAfterInsertイベントで何かを行う必要があると思いますが、何を理解できません。
挿入後にコンボボックスを再バインドして、新しいアイテムがリストに表示されるようにするにはどうすればよいですか?
コンボボックスが常に最新であることを保証する最も簡単な方法は、フォーカスを取得したらコンボボックスを再クエリすることです。レコードセットが別の場所で更新されても、コンボボックスは常に最新です。OnFocus イベントの単純な TheCombobox.Requery で十分です。
ここには、効率的な答えが 2 つあります。
フォームの AfterInsert イベントを使用して、コンボ ボックスを再クエリします (および OnDeleteConfirm イベント)。ユーザーが更新でき、基になるレコードが更新された場合に更新する必要があるデータがコンボ ボックスに表示されない場合は、これで十分です。
データの更新をコンボ ボックスに反映する必要がある場合は、コンボ ボックスに表示されるデータを編集するために使用されるコントロールの AfterUpdate イベントに再クエリを追加するのが理にかなっています。
たとえば、コンボ ボックスにテーブル内の人物の名前がリストされている場合、方法 2 を使用し、Me!txtFirstName と Me!txtLastName の AfterUpdate イベントで、コンボ ボックスを再クエリします。4 つの場所で同じ操作を行っているため、再クエリを実行するサブルーチンを作成する必要があります。したがって、サブは次のようになります。
Private Sub RequerySearchCombo()
If Me.Dirty Then Me.Dirty = False
Me!MyCombo.Requery
End Sub
コンボ ボックスに表示されているデータが実際に更新された場合にのみ再クエリを実行するようにする理由は、コンボ ボックスにテーブル全体のリストを入力している場合、再クエリに非常に長い時間がかかる可能性があるためです。 1,000 件中 10 件のレコードがあります。
すべての再クエリを保存するもう 1 つの方法は、コンボ ボックスに空白の行ソースを用意し、1 文字または 2 文字を入力した後にのみ入力し、入力した文字に基づいてコンボが表示する結果をフィルター処理することです。そのためには、コンボ ボックスの OnChange イベントを使用します。
Private Sub MyCombo_Change()
Dim strSQL As String
If Len(Me!MyCombo.Text) = 2 Then
strSQL = "SELECT MyID, LastName & ', ' & FirstName FROM MyTable "
strSQL = strSQL & "WHERE LastName LIKE " & Chr(34) & Me!MyCombo.Text & Chr(34) & "*"
Me!MyCombo.Rowsource = strSQL
End If
End Sub
上記のコードは、"LastName, FirstName" を表示するコンボ ボックスで人の名前を検索していることを前提としています。
もう 1 つ重要な注意点があります。完全なテーブル (またはテーブル内のすべてのレコードを返す SQL ステートメント) にバインドされたフォームを検索し、ブックマーク ナビゲーションを使用してレコードを見つける場合、この方法はうまくスケーリングされません。検索されたフィールドのインデックス全体をネットワーク経由でプルする必要があります。上記の架空のコンボ ボックスの場合、FindFirst を使用して、対応する MyID 値を持つレコードに移動するため、取得する必要があるのは MyID のインデックスです (ただし、条件を満たすために必要な数のインデックス ページのみ)。検索は実際にプルされます)。これは、数千レコードのテーブルでは問題になりませんが、約 15 ~ 20K を超えると、ネットワークのボトルネックになる可能性があります。
その場合、ブックマークを使用してナビゲートする代わりに、コンボ ボックスを使用して、結果セットを 1 つのレコードに絞り込むことができます。もちろん、Jet バックエンドを使用しているかサーバー バックエンドを使用しているかに関係なく、これは非常に効率的です。この種の効率性をできるだけ早くアプリケーションに組み込み始めることが強く望まれます。そうすることで、サーバー バックエンドへのアップサイジングがはるかに簡単になります。または、大量の新しいデータでその転換点に達した場合に、古い方法が非効率的すぎてユーザー フレンドリーでなくなる場合でも、かなり簡単になります。
フォームの after update イベントと delete イベントでコンボ ボックスを再クエリします。コンボ ボックスは、ユーザーが新しいレコード、変更、削除のいずれであっても、レコードセットに変更を加えるたびに最新の状態になります。
ユーザーが他の全員の変更をすぐに反映する必要がある場合を除き、コンボ ボックスにフォーカスが移るたびにコンボ ボックスを再クエリしないでください。レコードセットは変更されていません。しかし、その場合、他の誰かが変更を加えたらすぐに、コンボ ボックスだけでなく、フォーム全体を再クエリする必要があります。これは非常に珍しいシナリオです。
更新後:
Private Sub Form_AfterUpdate()
On Error GoTo Proc_Err
Me.cboSearch.Requery
Exit Sub
Proc_Err:
MsgBox Err.Number & vbCrLf & vbCrLf & Err.Description
Err.Clear
End Sub
削除後:
Private Sub Form_Delete(Cancel As Integer)
On Error GoTo Proc_Err
Me.cboSearch.Requery
Exit Sub
Proc_Err:
MsgBox Err.Number & vbCrLf & vbCrLf & Err.Description
Err.Clear
End Sub
あなたのコンボボックスは、コマンドバーのコンボボックスコントロールではなく、フォームのコントロールだと思います。このコンボボックスには、rowsource と呼ばれるプロパティがあり、値リスト (husband;wife;son;girl) または SQL SELECT 命令 (SELECT relationshipDescription FROM Table_relationType) のいずれかになります。
また、フォーム レコードセットはコンボボックス レコードセットと関係があると思います。フォーム レコードセットが適切に更新されたら (afterUpdate イベントだと思います)、コンボ ボックス コントロールの行ソース プロパティを再初期化する必要があります。
レコードソースが SQL 命令の場合:
myComboBoxControl.recordsource = _
"SELECT relationDescription FROM Table_relationType"
または値リストの場合
myComboBoxControl.recordsource = myComboBoxControl.recordsource & ";nephew"
しかし全体として、あなたの要求は非常に奇妙だと思います。テーブルに再帰 (親子) 関係がありますか?
通常、NotInList イベントを使用してコンボにデータを追加します。
Response = acDataErrAdded
コンボを更新します。
Access 2007 Developers Reference には、サンプル コードを含むすべての詳細が記載されています: http://msdn.microsoft.com/en-us/library/bb214329.aspx