2

セットアップ:自分や他の人が行う実験の結果を記録するために、ms アクセス データベースを作成しています。フォームとサブフォームを作成しました。メイン フォームには機器のセットアップに関するフィールドが含まれ、サブフォームにはその機器のセットアップに関する実験が含まれます。リンク マスターとリンクの子は SettingID です。

問題:メインの [settings] フォームのフィールドはコンボ ボックスの選択に制限されていますが、依然として多数の設定の組み合わせがあります。そのため、ユーザーがフォームに情報を入力しているときに、同じ設定のレコードが既に存在していることに気付かない場合があります。SettingID は自動番号であるため、実際には一意のレコードではないのに、一意のレコードのように見えます。

質問:このレコードを作成する前に、同じ設定のレコードが存在するかどうかを確認するために、BeforeInsert イベントでクエリを実行したいと考えています。レコードが存在しない場合は、通常どおり続行します。存在する場合は、ユーザーに警告し、そのレコードに移動します。私はこれを達成する方法について途方に暮れています。これを行うためにこれまでに試みたことは言及する価値はありませんが、誰かがこの投稿に答えるまで何かを理解しようと試み続けています.

4

1 に答える 1

3

インターフェイスをどれだけ使いやすくしたいかによって、2 つのことが必要になると思います。

ユニークなインデックス

値の組み合わせが別の行に重複したくない設定テーブルの列に、複数列の一意のインデックスを追加します。元の投稿へのコメントで KFleschner によって提供されたリンクで方法を読むか、手順に沿ったスクリーンショットを含むこの質問の 2 番目の回答を確認してください: MS アクセス データベースで複数列の一意のインデックスを作成できますか? . これにより、設定テーブルでの重複が禁止されます。

たとえば、設定と実験がコンピューター リグ用で、次の列を含む [設定] テーブルがあるとします。

設定ID、RAM_GB、CPU_GHz

次に、プライマリ キーは (SettingID) になり、複数列の一意のインデックスは (RAM_GB, CPU_GHz) になります。これは、RAM 容量と CPU 速度が同じレコードが 1 つだけ必要なためです。

データベース言語では、主キーである SettingID は代理キーと呼ばれるものになります。そして、新しい複数列の一意のインデックスは、自然キーと呼ばれるものになります。どちらも一意の行を識別するために使用できますが、主キー (代理キー) は、Experiments テーブルの SettingID などの外部キー関係で使用されるものです。

これは、データベース レベルで適用されるため、重複の問題を防ぐことができます。ただし、一致する自然キーを持つレコードにフォームが自動的にジャンプすることはありません。代わりに、Access は、インデックスに違反するレコードを入力したという行に沿ったメッセージでユーザーに警告します。しかし、それ以上はありません。ユーザーは、新しいレコードをキャンセルして、自分で一致するレコードを探す必要があります。

更新イベント前

Before Insert イベントは、新しいレコードの入力の最初の文字でトリガーされます。詳細については、 http://msdn.microsoft.com/en-us/library/office/ff835397.aspxを参照してください。これは早すぎます。Before Update イベントが必要です。そして、次のようにコードをイベントに追加します。

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Set rst = Me.RecordsetClone
    rst.FindFirst "[SettingID] <> " & Me.SettingID & " AND [RAM_GB] = " & Me.RAM_GB & " AND [CPU_GHz] = " & Me.CPU_GHz
    If Not rst.NoMatch Then
        Cancel = True
        If MsgBox("Setting already exist; goto existing record?", vbYesNo) = vbYes Then
            Me.Undo
            DoCmd.SearchForRecord , , acFirst, "[SettingID] = " & rst("SettingID")
        End If
    End If
    rst.Close
End Sub

このコードは、いくつかのことを前提としています。

  1. [RAM_GB]および[CPU_GHz]は、複数列の一意のインデックスの列です。
  2. [SettingID]主キーの列です。

必要に応じて列名などを微調整すると、プロンプトを表示して既存のレコードに自動ナビゲートする方法も得られます。

于 2013-01-30T22:22:13.420 に答える