プロが教えるわが家の防犯対策術!

回答お願いします。

[メインデータ]というアクセスファイルがあり、検査記録のテーブルがあります。
検査記録のテーブルには判定フィールドがあり合格、不合格が入力されます。
この不合格が入力されたレコードを、別のaccessファイル[異常記録]の社内異常記録テーブルにコピーしてきたいです。
この検査記録のフィールド名と社内異常記録のフィールド名は異なっています。

手順としては、
①異常記録ファイルに検査記録のリンクテーブルを作成する。
②クエリにてリンクテーブルから不合格のレコードを選択し、社内異常記録テーブルに追加する。
という方法を教えてもらったのですが、問題がでたので教えてもらいたいです。

この不合格のレコードは検査記録テーブルにそのまま残さなければならないデータなので、②の不合格レコードを抽出し追加するクエリを実行すると、毎回同じ不合格のレコードも追加されてしまいます。
例えば、検査記録に10件の不合格レコードがあり追加クエリで10件の不合格データを社内異常記録テーブルに移します。その後2件不合格のレコードが検査記録に入力されたとします。この時点で検査記録テーブルには12件の不合格レコードがあります。ここでもう一度追加クエリで不合格のレコードを追加クエリで移すと先の10件+12件で22件のレコードになってしまいます。当然前の10件は重複したレコードになっています。

これを解決する方法はありますか?
削除クエリで追加クエリ前に全データを削除も考えたのですが、社内異常記録のテーブルには手入力する箇所が複数あるので削除は使えません。
リンクテーブルも下手に触ってしまうと検査記録に支障が出てしまうので、出来ればリンクテーブルを使わない方法があれば教えてもらいたいです。

ややこしい話ですので、その都度追記させてもらいますのでよろしくお願いします。

質問者からの補足コメント

  • 異常記録ファイルの検査記録テーブルはリンクテーブルとしてのみ使うので、これを更新したりするつもりはありません。
    この検査記録のテーブルから社内異常記録のテーブルに必要なフィールドのデータを追加クエリで移したいのですが、先に書いたように重複してしまうのですが、これは"インデックスあり/重複なし"で対応出来るのでしょうか?
    検査記録テーブルには検査番号というオートナンバー型のフィールドがあるのでこの番号と重複しないものなど出来るのでしょうか?
    社内異常記録テーブルに直接入力したいものはフォームを使って入力するつもりですので、そこは問題ないと思っています。

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/05/18 12:43
  • メインデータ.accdb
      検査記録
        検査番号 オートナンバー型 主キー・インデックス有
        社名   テキスト型 インデックス無
        品名    同上
        測定値1 同上
        測定値2  同上
        判定 同上
    異常記録.accdb
      社内異常記録
        No オートナンバー型 主キー・インデックス有
        検査番号  テキスト型 インデックス無
        社名    同上
        品名    同上
        測定値 同上
    です。インデックスがよく分からないので何処が必要かが分かりません。
    検査番号、社名、品名は同フィールドにいき、測定値1と2は/で区切って、社内異常記録の測定値フィールドでデータを結合したいです
    判定は抽出条件のみ使うだけでデータを移す必要はありません
    よろしくお願いします

    No.3の回答に寄せられた補足コメントです。 補足日時:2015/05/19 15:34

A 回答 (4件)

スッキリと分かるようになりました。


以下は異常記録.accdbのパスをE:\folderU\異常記録.accdbにしてある場合のSQL文です。
そちらの環境に合わせて変更してください。
そのSQL文をメインデータ.accdbの新規クエリのSQLビューにコピペし
出来た更新クエリを走らせてみてください。

INSERT INTO 社内異常記録 ( 検査番号, 社名, 品名, 測定値 ) IN 'E:\folderU\異常記録.accdb'
SELECT 検査番号, 社名, 品名, 測定値1 & '/' & 測定値2 AS 測定値
FROM 検査記録
WHERE 検査番号 NOT IN (SELECT 検査番号 FROM 社内異常記録 IN 'E:\folderU\異常記録.accdb');

なお、確認ですが
異常記録.accdb
  社内異常記録
    No オートナンバー型 主キー・インデックス有
    検査番号  テキスト型 インデックス無
    社名    同上
    品名    同上
    測定値 同上
の検査番号フィールドには、メインデータ.accdbの検査番号が入るのですよね?
でしたら、データ型を長整数型にしてください。
また、念のため、インデックス有・重複なしに設定しておいた方が安全のように思えます。
あと、Noというフィールド名は適切でないので、IDなどに変更をお勧めします。
    • good
    • 0
この回答へのお礼

有難うございます。
無事に狙い通りのシステムが完成出来ました。
この度は有難うございました。

お礼日時:2015/05/20 14:05

ん~と・・・念のため、


ファイル名やオブジェクト名が分かりにくいので下記のように
列挙してもらえますか?

ファイルA.accdb
  テーブルA名
    フィールドA名 データ型 主キー・インデックスの有無
    フィールドB名 同上
    フィールドC名 同上
    ・・・・・
    
ファイルB.accdb
  テーブルB名
    フィールドA名 データ型 主キー・インデックスの有無
    フィールドB名 同上
    フィールドC名 同上
    ・・・・・

ファイルAからファイルBへ書き込むものとします。

ファイルAのテーブルAの各フィールドとテーブルBのフィールドとの対応も。
この回答への補足あり
    • good
    • 0

社内異常記録テーブルの中の適切なフィールドに


主キーを設定するか、インデックスあり/重複なしにすれば
追加クエリの際に重複するモノは弾かれます。

追加クエリを行った後で
検査記録のテーブルのレコードに付け足したい内容があり修正した場合、
これを更新クエリで変更するためには更新日時のフィールドが必要になってくると思います。
または
社内異常記録テーブルに追加日時フィールドを設定し
追加クエリ時の日時を記録するようにします。
重複クエリで
追加日時フィールドに最大、その他はグループ化などとすれば
最新のモノの一覧が得られるのではと思います。
・・・
何にせよ、テーブルのデザインが大きな鍵になっているのは間違いないかと。
この回答への補足あり
    • good
    • 0

元テーブルに、データが発生した日時を記録しておく。

 テーブルを作って、追加クエリの最終実行時間を記録しておき、再度追加クエリを走らせる際には、抽出条件でそれ以降に発生したデータのみを対象とする。

昇順で、インデックス振っているなら、それを使っても良い。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A