1

私は、Access 2007 を使用してユーザーの収集品コレクションを維持するための簡単なアプリを作成する任務を負いました。いくつかの要求があり、作成して実装しました。それらは:

  1. 彼のすべての収集品を一覧表示する 1 つのメイン フォーム
  2. 同じメイン フォームの下にタブ付きのコントロールがあり、各タブにはメイン フォームとは異なる条件に基づいてデータを実際に「フィルター処理」するサブフォームが含まれています。たとえば、1 番目のサブフォームは、メイン フォームでコレクタブル フィギュアの名前を取得し、サブフォームでその名前を使用する他のすべてのレコードを表示します。つまり、フィギュアが「Darth Vader」の場合、サブフォームには「Darth Vader」という名前を持つすべての収集品がリストされます。

ユーザーのリクエストに応じてアプリケーションを作成しましたが、これまでのところ、私たちの両方を悩ませていることが 1 つあります。サブフォームの最初のレコードは、メイン フォームと同じです。私たちは両方ともそれが冗長で迷惑だと感じています。確かに、私の Access スキルはせいぜい弱いので、これは簡単な修正かもしれませんが、サブフォームの重複レコードを削除する方法はありますか? メインフォームに「Figure ID」を含めないようにサブフォームに where 句を実装しようとしました。問題は、サブフォームまたはメイン フォームを開くときに、メイン フォームの FigureID を要求するパラメーター プロンプトのように動作していることです。Figure ID を入力すると機能しますが、プロンプトは明らかに望ましくないものです。

ご参考までに:

  1. メイン フォームは、基本的に "Figures" テーブルおよびその他の関連テーブルからすべてのレコードを選択するクエリに基づいています。
  2. サブフォーム コントロールをタブ コントロールにドロップすると、サブフォームが作成され、必要なマスター フィールドと子フィールドがリンクされました。
4

1 に答える 1

1

frmMain という名前のフォームがあるとします。このフォームには、レコード ソースに次の 2 つのフィールドが含まれています。および図名。フォームには、FigureID レコード ソース フィールドにバインドされている txtFigureID という名前のテキスト ボックス コントロールも含まれています。

frmMain には、frmSub という名前のフォームに基づくサブフォーム コントロールも含まれています。frmSub のレコード ソースには、FigureID フィールドと Figure_name フィールドも含まれます。サブフォーム コントロールのリンク マスター/子フィールド プロパティは Figure_name です。したがって、frmSub は、Figure_name が frmMain の現在のレコードの対応する値と一致するすべての行を表示します。

ここで、frmSub で frmMain の現在のレコードである特定のレコード (一意の FigureID 値で識別される) を除外する場合は、frmSub のレコード ソース クエリに WHERE 句を追加します。

WHERE FigureID <> Forms!frmMain!txtFigureID

ここでは推測にすぎませんが、説明が実際の状況に十分に近いことを願っています。そうでない場合は、サブフォームのレコード ソースとして使用している SQL を示してください。

編集: frmMain を最初に開いたときにのみ、パラメーター プロンプトが表示されます。その後、frmMain でレコード間を移動できます。frmSub は、表示したいレコードのみを表示します ... パラメータ値を再度入力するように求める必要はありません。

これが発生する理由は、サブフォームがその親フォームの前にロードされるためです...そのため、サブフォームがロードされたときに親フォームのコントロールは使用できません。

解決策は、レコード ソースに WHERE 条件を指定せずにサブフォームを保存することだと思います。次に、メイン フォームが読み込まれると、サブフォームのレコード ソースを書き換えて WHERE 条件を含めることができます。

したがって、frmMain の load イベントでは次のようになります。

Private Sub Form_Load()
    Dim strSql As String
    strSql = "SELECT FigureID, Figure_name FROM YourTable" & vbCrLf & _
        "WHERE FigureID <> Forms!frmMain!txtFigureID"
    Debug.Print strSql
    Me.subformControlName.Form.RecordSource = strSql
End Sub

subformControlNameに注意してください。フォームではなく、コントロールです。サブフォーム コントロールは、含まれるフォームと同じ名前を持つ場合があります。しかし、それは別の名前かもしれません。

于 2011-07-09T13:45:39.677 に答える