2016-04-14 33 views
0

私が参加し、テーブルを持って、2つのテーブルからのFKを構成されています。これらの2つのフィールドは複合ユニークキーインデックス用に設定されており、可能であればDlookUpで重複をチェックする必要があります。ここに私が試みたものがあります:アクセスVBA - 重複をチェックするためのDLookup(複合一意キー)

Nz(DLookup("PK_JoinTable", "JoinTable", "FK_FirstTable = " & Me.FK_FirstTable & "AND FK_SecondTable= " & Me.FK_SecondTable & _ 
        " AND PK_JoinTable <> " & Nz(Me.PK_JoinTable, 0)), 0) 

このケースではDLookUpを使用できますか?

編集:ここに私の表のデザインです...

JoinTable 

PK_JoinTable 
FK_FirstTable 
FK_SecondTable 

これらの外部キーテーブルのフィールドが一意のインデックスを持っています。私は、コンボボックスを介して両方のテーブルに参加するデータを入力するフォームを持っています。そして、私は重複したエントリを防ぐ必要があります。 Before_Updateイベントと「Save」ボタンのClickイベントの両方で。

Dim Duplicates As Long 

Duplicates = Nz(DLookup("PK_JoinTable", "JoinTable", "FK_FirstTable = " & Me.FK_FirstTable & "AND FK_SecondTable= " & Me.FK_SecondTable & _ 
         " AND PK_JoinTable <> " & Nz(Me.PK_JoinTable, 0)), 0) 

If Duplicates > 0 Then 

      Cancel = True 
     MsgBox "Duplicate entry. This record will not be saved !, vbCritical 
     DoCmd.RunCommand acCmdUndo 
     Exit Sub 

     Else 
      ' nothing 
     End If 
+0

ことは可能ですが、それは私に従っ良い方法はありません。 Dlookupは1つの値のみを返し、1つのテーブルのみを照会できます。純粋なSQLとレコードセットを使用するか、クエリを作成する方がよいでしょう。これに助けが必要な場合は、質問を編集してtableS構造体とデータサンプル –

+0

@ ThomasGを追加してください。私の編集した質問をご覧ください。少し明確ですが、間違って何か明らかにあります – LuckyLuke82

+0

:あなた 'Dlookup'では、あなたは' PK_JoinTable'という名前の列に取り組み、私はあなたのテーブル構造体で説明し、この列は表示されません。だから、まだ混乱している。 –

答えて

1

は、はい、それはDlookupでこれを行うことは可能ですが、あなたはあなたの中に小さなミスがあった、あなたはAND FK_SecondTableの前にスペースを逃した:

Nz(DLookup("PK_JoinTable", "JoinTable", "FK_FirstTable = " & Me.FK_FirstTable & " AND FK_SecondTable= " & Me.FK_SecondTable & _ 
        " AND PK_JoinTable <> " & Nz(Me.PK_JoinTable, 0)), 0) 

また、このアプローチを試すことができますDlookupと同じことを達成しますが、IMOがより明確になり、クエリがより複雑になり、デバッグや調整が容易になると、より多くの可能性がもたらされます。

Dim RST As Recordset 
Dim strSQL as string 

strSQL = "SELECT DISTINCT(Attribute) FROM Table_Setting WHERE Attribute NOT IN (SELECT Attribute FROM Table_Setting WHERE BookType='" & strBookType & "')" 

Set RST = CurrentDb.OpenRecordset(strSQL) 
If Not RST.BOF Then 

    ' Looks like we have duplicates 

    RST.Close 
    Set RS = Nothing 

    Cancel = True 
    MsgBox "Duplicate entry. This record will not be saved !", vbCritical 
    DoCmd.RunCommand acCmdUndo 
    Exit Sub   

End If 
+0

あなたは正しい、どんなに愚かな間違いだった。私はこれもテストしますが、私のコードも動作します。大きな感謝のトーマス!!! – LuckyLuke82

0

は、あなただけのクエリで一緒にこれらのテーブルを指して、必要に応じてクエリにのDLookupを実行する必要があります。これが今の私の全体のコード(ボタンのclick_event)です。複合キーが特に必要な場合は、エイリアス列の下で必要な列を連結することができます。

あなたの全体的な目標を達成するには、はるかに簡単な方法がありますが、細かいことはおそらく... が提供されたと回答しました。あなたの更新質問で

...重複を避けるために、単純な方法は、3つのカラムオフに基づいて一意のインデックスを作成することです。コメント欄でご説明した後

+0

私の編集した質問をご覧ください。私はあなたが今理解することを願っています。 – LuckyLuke82

+0

私の更新された回答を参照してください。 –

+0

重複を回避することは既に有効です。私のコードから、Access組み込みのmsgboxを避けようとしています。だから私はなぜこれが私を助けてくれるのかわかりません、アクセスウィンドウはまだポップアップです。それとも別のことを意味しましたか? – LuckyLuke82

1

ます(Ctrl + Gでイミディエイトウィンドウを開きます)それを、あなたのDLookupコールをデバッグする別の文字列にWHERE部分を構築し、Debug.Printします。

strSql = "FK_FirstTable = " & Me.FK_FirstTable & _ 
     "AND FK_SecondTable= " & Me.FK_SecondTable & _ 
     " AND PK_JoinTable <> " & Nz(Me.PK_JoinTable, 0) 
Debug.Print strSql 
Duplicates = Nz(DLookup("PK_JoinTable", "JoinTable", strSql), 0) 

あなたがMe.FK_FirstTableANDの間のスペースが不足していることがわかります。

+0

素敵なアンドレ、私はいつも私の問題を解決しましたが、これは知っていいです。ありがとう!! – LuckyLuke82

0

データベース関数はウルデータベースに複雑さを取り除くためにできるだけ多くの外部キーを使用するには、AA試みは、同様に非常に重要であり、私が使用することをお勧めのDLookupと大きい場合のデバッグが非常に複雑になります。それが大きければ、それだけです。

関連する問題