2017-03-09 12 views
0

これは何回か尋ねられましたが、何らかの理由で解決策が動作しないことがわかりました。Accessでレコードを追加するときに重複を避ける

データベースレイアウト:FP番号、カウント、場所、MODEL_ID、PK:

私は表1のデータは、フォーム(スキャナIBOB)*上の別のテーブル/サブフォームから引き出さなっている(Scanner_Location)が列を保持してい(FP#、Location PK-SN) 表3(Scanner_Model)サブフォームに表示される最後のデータ列を保持します。

フォームの1つのセクションにFP#と場所を入力し、サブフォームに移動して複数のモデルを選択し、カウント(テキストボックス)を入力します。選択されると、彼らは私の質問を実行する '更新'ボタンをクリックします。 (そのうちの私は更新と追加クエリを持っています)

問題は、単に更新クエリを使用してレコードを追加しないということです。 Appendクエリを使用すると、既存のデータの複製が作成されます。

はここでフローが行われる方法は次のとおりです。

ユーザーは4のカウントと100クリック更新のFP番号とモデル1とモデル2を選択します。 クエリが更新され、情報が正しく入力されます。

ユーザー同じFP番号と数を持つ同じモデル(Model_Select)をもう一度選択すると、Table1には別の主キーを使用して同じ情報が再度入力されます。

目標:

追加クエリは、既存のデータの複製を作成します。私は私の更新をしたいおよび/またはにクエリを追加します。既存のデータを

アップデート - がまだ存在していないすべてのレコードを追加し、同じFPの#を使って何を探して(MODEL_IDとFP#を見る)

INSERT INTO Scanner_Location (Model_ID, FootPrints_Num, Location_ID, Scanner_Loc_Cnt) 
SELECT Scanner_Model.Model_ID, [Forms]![Scanner_IBOB]![fpNum_txt] AS [FP#], 
    [Forms]![Scanner_IBOB]![Location_Cbo_main] AS Location, 
    [Forms]![Scanner_IBOB]![Scanner_Loc_CntTxt] AS [Count] 
    FROM Scanner_Detail 
    RIGHT JOIN Scanner_Model ON Scanner_Detail.Model_ID = Scanner_Model.Model_ID 
    WHERE (((Scanner_Model.SM_Acc_Select)=True) 
     AND ((NOT Exists (SELECT * FROM Scanner_location 
    WHERE (((Forms!Scanner_IBOB!fpNum_txt)=Forms!Scanner_IBOB!fpNum_tx‌​t) 
     And ((Scanner_Model.SM_Acc_Select)=True));))=False)); 
+0

上記は私の追加クエリです。 http://stackoverflow.com/questions/19837911/appending-into-another-table-and-avoiding-duplicates 私を近づけますが、AND NOT EXISTSは機能していないか、正しく理解していません。 – Zdoghype

答えて

0

'Update_SLoc_Acc53'という名前のクエリがありません - 'Update_SLoc_Acc3'と 'Update_SLoc_Acc54'があります。私は 'Update_SLoc_Acc54'をコードで呼び出されたものに変更しました。

クエリは、コンボボックスからLocation_IDを取得していませんでした。私は0

に幅を設定することで、ユーザーからこの列を非表示にすることができます。このクエリは動作しているよう連結列が1に設定したと列のインデックスは0から始まるので、LOCATION_ID列を参照するために0にしてください:

INSERT INTO Scanner_Location (Model_ID, FootPrints_Num, Location_ID, Scanner_Loc_Cnt) 
SELECT Scanner_Model.Model_ID, [Forms]![Scanner_IBOB]![fpNum_txt] AS FPNum, 
     [Forms]![Scanner_IBOB]![Location_Cbo_main] AS Location, 
     [Forms]![Scanner_IBOB]![Scanner_Loc_CntTxt] AS CountMod 
FROM Scanner_Model 
WHERE (((Scanner_Model.SM_Acc_Select)<>False) 
    AND (([Model_ID] & [Forms]![Scanner_IBOB]![fpNum_txt] & 
     [Forms]![Scanner_IBOB]![Location_Cbo_main]) 
     NOT IN (SELECT Model_ID & Footprints_Num & Location_ID FROM Scanner_Location))); 

注フィールド名に#は使用しませんでした。アンダースコアを除いて名前に句読点/特殊文字を使用しないように助言してください。フィールド名としてCountの代わりにCountModも使用しました。

なぜ2つのモデルを選択する必要がありますか?一方が追加され、他方が追加されないとどうなりますか?

私はdb構造について懸念しています。

  1. App_LocationとApp_Detailが両方とも他のテーブルにリンクしているとは思わないでください。 Location_IDがApp_Locationの主キーとLocation_Dataの主キーとなるのはなぜですか?これは1対1の関係です。
  2. Serial_Numberはスキャナのシリアル番号ですか?なぜそれがTelnetの主キーですか?これはまた、1対1の関係をもたらし、その場合にはそれらを組み合わせることもできる。
  3. アプリがスキャナーに関連付けられていて、スキャナーが所在地に関連付けられている場合、アプリに関連付けられた所在地は必要ありません。スキャナとtelnetも同じです。
  4. Scanner_Locationテーブルは何にもリンクされていません。この表の目的が、モデル/フットプリント/場所の数を追跡することである場合、既に推奨されているように、通常これは良い考えではありません。理想的には、カウントデータは、情報が必要なときの生データレコードの集約クエリによって計算される必要があります。
+0

トップから: 場所を引っ張っていないクエリに気づいていただきありがとうございます。私は現在、場所0でテストデータとしてしばらく試していました。そして、私は束縛された列についてそれを知らなかった。 フィールド名として「#」を使用しましたか?もしそうなら、単なるラベルですか?または、フォームオブジェクトとして「番号」という名前のものを参照していますか?私はデータベースのコピーにこれを修正できるように知っておく必要があります。私は 'カウント'の参照を修正します。ありがとうございました。 – Zdoghype

+0

1つのモデルが選択されていて、もう1つが選択されていない場合は問題ありません。 1つのタブはスキャナを選択し、もう1つはベースユニットとともに出荷されるアクセサリを表示します。 (バッテリパック、ドックなど) アプリケーションの場所とアプリケーションの詳細を別のテーブルにリンクする必要があるのはなぜですか?私は、アプリケーションがどこで使われているのか、アプリケーションが何であるのかを把握しています。ロケーションIDこの情報に対して複製されるべきではないため、このテーブルの主キーです。アプリケーション名はスキャナ単位でスキャナとして追加されます。 (連絡先データベースの州指定と考える) – Zdoghype

+0

Serial_Numberは、スキャナのシリアル番号です。はい、なぜそれがTelnetの主キーですか?私はTelnetのためのデータを分離しようとしています。私はScanner_Detailがスキャナのためにあらゆるものを保持することを望んでいません。 (これを行う方法が間違っている場合は、私に知らせてください)しかし、Telnet私はまだ作業中です。正確な情報がそのテーブルにどのように使用されるかは完全にはわかりません。それが単なる数字であれば、Scanner_Detailに入れます。 – Zdoghype

0

はたぶん、IN NOTを使用する、のようなもの:

[いくつかの識別子フィールド] NOT IN([いくつかの識別子フィールド]を選択

レビューEXISTS vs IN

FROM 0
+0

...裁判の多くの後、私は次しまったエラー: 'INSERT INTO Scanner_Location(MODEL_ID、FootPrints_Num、LOCATION_ID、Scanner_Loc_Cnt) SELECT Scanner_Model.Model_ID、[フォーム] [Scanner_IBOB] [fpNum_txt] AS! ([Forms]![Scanner_IBOB]![Scanner_IBOB]![Location_Cbo_main] ASロケーション、[フォーム]![Scanner_IBOB]![Scanner_Loc_CntTxt] AS [数] からScanner_Location 存在しない場所Scanner_IBOB]![FPNum_txt])AND SM_ACC_SELECTとFootPrints_Num([フォーム]![Scanner_IBOB]![FPNum_txt])Scanner_Model FROM(Scanner_Model.SM_Acc_Select =真)) SELECT SM_ACC_SELECT、FPNum_txt ); ' – Zdoghype

+0

" Where Not Exists "の後に構文エラーがあります – Zdoghype

+0

これは意味をなさない:([Forms]![Scanner_IBOB]![FPNum_txt])AND(Scanner_Model.SM_Acc_Select = True))。 2番目のサブクエリではWHERE句もありません。 Countフィールドが集計値を格納するためのフィールドである場合、これは良い方法ではありません。集計データは必要に応じて計算し、保存する必要はありません。いくつかのサンプルデータは、提供したい場合に役立ちます。 CountはAccessの予約語です。予約語は何の名前としても使用しないでください。 – June7

0

Scanner_LocationにマッチしたMODEL_IDFP_Numの有無をチェックし、調整、追加クエリを、次の点を考慮。一致するものが存在しない場合、クエリは選択されたレコードを新しいレコードとしてインポートし、重複しないようにインポートします。また、表の別名は、可読性と副問合せの相関に使用されます。

INSERT INTO Scanner_Location (Model_ID, FootPrints_Num, Location_ID, Scanner_Loc_Cnt) 
SELECT m.Model_ID, [Forms]![Scanner_IBOB]![fpNum_txt] AS [FP#], 
     [Forms]![Scanner_IBOB]![Location_Cbo_main] AS Location, 
     [Forms]![Scanner_IBOB]![Scanner_Loc_CntTxt] AS [Count] 
FROM Scanner_Detail d 
RIGHT JOIN Scanner_Model m ON d.Model_ID = m.Model_ID 
WHERE ((m.SM_Acc_Select = True) 
    AND (NOT EXISTS (SELECT 1 FROM Scanner_Location loc 
        WHERE ((loc.FootPrints_Num = Forms!Scanner_IBOB!fpNum_tx‌​t) 
         AND (loc.Model_ID = m.Model_ID))))); 
関連する問題