2017-04-19 12 views
0

複数のサブフォームを含むタブ付きフォームを使用するSQL Serverへのアクセスクライアントがあります。基本的には、メインフォーム上で商品が選択され、タブは異なる関連テーブルに保存された商品のさまざまなプロパティ(オプション、色、目など)を編集/挿入するためのアクセス権を与えます。各サブフォームは独自のレコードソースを使用しますが、製品番号のメインフォームに同期されます。MS Accessタブ付きフォーム複数のOnCurrentの起動

サブフォームにコンボボックスがあり、「オプション」と呼ばれ、「where」句で製品番号を使用するクエリのデータを入力したいと考えています。それは私がする必要があるものです。どのように私はRowSourceをSQL文字列と同じに設定するために、オプションのサブフォームのOnCurrentイベントを使用することでした。それは動作しますが、OnCurrentイベントは、Optionsサブフォームにフォーカスがあるかどうかに関わらず、メインフォームで新製品が選択されるたびに発生します。オプションがフォーカスを取得すると、再び発生します。また、オプションではデータシートレイアウトが使用されるため、レコードソースを変更する必要がなくても、選択したすべてのレコードが起動されます。

これは機能しますが、非常に多くの不要なデータが(非常に)リモートSQL Serverに往復することになります。ですから、サブフォーム全体で動作する別のイベントがあります。サブフォーム内の各レコードではなく、1回だけ実行するのが理想です。私はGot Focusを試みましたが、それは決して解雇されませんでした。そして、新製品が選択されたとき(もちろん)、OpenイベントとLoadイベントは発生しません。または、オプションのサブフォームレコードソースを設定する必要がある別の場所がありますか?

はここでイベントコードです:任意の助け

Private Sub Form_Current() 
    Dim sql As String 
    sql = "SELECT O.[OptionID], O.[Caption] FROM ProductOptions AS O WHERE o.[OptionTypeID] in (1,2,8,9) AND o.ProductNumber = " 
    sql = sql & "'" & Nz(Forms![products main form]!ProductNumber, "99test") & "'" 
    oidSelect1.RowSource = sql 
End Sub 

感謝。

ジム

+0

あなたは、物語に記載されているように、レコードソースではなくコンボボックスのRowSourceを設定していますか?なぜコードを使ってコンボボックスのRowSourceを設定するのですか? RowSourceプロパティにSQL文を入れてから、コンボボックスのGotFocusイベントをコーディングするだけで、RowSourceのRequeryが実行されるのはなぜですか? – June7

+0

Hmmm、フィルタ(where句)は、現在編集中の製品ごとに変更されるため、動的に設定する必要があります。また、選択された各レコードのコンボボックスのクエリーにGotFocusを使用しないでください。 – user3091705

+0

コンボボックスのRowSource SQL文のWHERE句は、ProductNumberへの参照を持つため、動的になります(これはグリッド表示なので、コンボボックスは各行に複製されます)。セスの答えは、私がコンボボックスGotFocusイベントを使用してクエリーをトリガーする以外は、これらの行に沿ったものです。彼はメインフォームへの依存について良い点を作っている。通常、主コンボボックスと従属コンボボックスは同じ形式です。また、エイリアス値を表示するルックアップ付きコンボボックスは、連続またはデータシートのフォームでうまく動作しません。 – June7

答えて

0

私はこれを行うための適切な方法は、動的にコンボボックスの値集合ソースを変更しないことであると考えています。代わりに、クエリ・デザイナを使用してrowsourceを問合せに設定し、サンプル・コードに示されているように「メイン・フォーム」から値を読み取るようにしてください。Forms![products main form]!ProductNumber。

次に、MAIN FORMs AfterUpdateイベントを使用してコンボボックスのリフレッシュをトリガーします。これは、MainForm!MySubForm.Form( "mycombobox")のようなものになります。 (私はその構文が正確に正しいとは限りません...私のアクセス構文は錆びています。)

私は自分の答えが嫌いです。その理由は、サブフォームとその親の間の依存関係をハードコーディングしているためです。あなたは他の場所でそのサブフォームを決して使用しないとうまくいくかもしれません。これを回避するために、いくつかのアクセス開発者は、メインフォームの更新後イベントから設定したテキストボックスを持つ隠しフォームを使用します。次に、このフォーム用に作成した隠しフォームのテキストボックスを参照するようにクエリが更新されます。

これを行う方法は他にもあります(たとえば、パブリック関数など)。しかし、申し訳ありませんが、それはあなたが求めていたものではありません。私の最初の方法がうまくいく。しかし、初めてそのサブフォームを再利用する必要があります。リファクタリングする必要があり、隠れたフォームソリューションがうまく機能します。

関連する問題