• 締切済み

複数のフィールドを比較してデータが更新されているフィールド名を抽出したい!

素人質問で申し訳ありませんが教えてください。実は或る伝票管理テーブルがあり、そのリスト中の実質的なキーコードである「伝票番号」フィールドには重複可能なインデックスを設定してあります。それとは別に主キーを設定してはいますが、それはオートナンバーとしてデータをソートするくらいにしか使っていません。 この伝票管理テーブルは外部のTXTファイルを一括して取り込む受け皿として存在していて、アクセス上で各フィールドにキー入力することはありません。 このように「伝票番号」フィールドには同じ番号のものが複数存在するのですが、同じ番号の中で一番最初のものが新規に登録されたもので、2番目以降にくるものが変更として登録されたものですが、残念ながらどのフィールドが更新されたのか判らないので、その都度一項目ずつマニュアルでチェックしている為にとても時間が掛かっています。 それぞれのデータには「伝票番号」以外に合計10項目くらいのフィールドが存在しています。 アクセスで何とか処理できないものかと思いあぐねている内容としては、同じ「伝票番号」をもつデータを時系列的に2データずつ比較します。(直近データ同士の比較) その上で、 (1)10項目のフィールド全てのデータが両者で全くイコールならば、新しい方の行を削除する。 (2)いずれかのフィールドのデータが更新されていれば、主キー同士の番号と更新されているフィールド名を抽出して、別のテーブルにその結果を放り投げる。 例えば、『800888』という「伝票番号」をもったデータが4個テーブル中に存在していて、それぞれに10、25、40、80という主キーが付番されているとして、 (1) 25は10に対し、フィールドKとNのデータが更新されている。 (2) 40は25と全てのデータが全く同じ。 (3) 80は40(=25)とフィールドDとPのデータが違う。 となった場合、まず伝票管理テーブルから主キー40の行を削除し、その上で下記のようなデータを抽出できればうれしいのですが。 10/25: K N 25/80: D P 雲を掴むような話で申し訳ありませんが、こんなことが可能なのかどうかご教示頂ければ幸甚です。宜しくお願いします。

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

ADOなど全レコードを個別に捉えられる仕組み(プログラム)を使えば 両ファイル(テーブル)を共通キーでそれぞれソートしておき マッチングのロジックで両者の全レコードを比較していけば、 同じキーでマッチングしたとき、対応するフィールドを比較すればよい。 純然たるロジックの骨格部分は10行ぐらいで済むものです。 ーー SQLで出来るかどうか。複雑になりそう。

Nick925
質問者

お礼

実質的に2者間のデータ比較をするケースが殆どで、多くて3者間の比較で何とかなりそうなので、DAOを使って何とかマッチングの仕組みを作ってみます。アドバイスありがとうございました。 実はADOは勉強したことも使ったこともないのですが、DAOに比べて今回のような場合に有利ですか。もし優位性があるなら是非とも勉強してみたいと思います。

noname#140971
noname#140971
回答No.1

普通はデータをインポートするアプリケーションを作成します。 例えば、VBなどでテキストファイル一覧を表示し選択するという画面。 選択が終ればプログレスバーなどを表示して処理。 処理結果を画面に表示するという代物です。 これは瞬時に終ると思います。 これを手作業でやるとなるとミスも発生するでしょう。 まあ、完全自動化がテーマでしょうね。 課題1、ファイルシステムオブジェクト等を使ってテキストデータを取り込む。 課題2、ADO等を使ってアクセスデータを読み込む。 課題3、テスト結果に従って削除・更新する。 生産出荷履歴: ID__動態区分__作業区分__年月日______商品マスター_ID___数量 1___生産______通常______2008/03/01__A-101:キーボード____10 2___出荷______通常______2008/03/02__A-101:キーボード_____7 3___生産______通常______2008/04/03__A-101:キーボード_____2 4___出荷______返品______2008/04/04__B-102:モニター_______4 [イミディエイト] ? DBSelect("SELECT * FROM 生産出荷履歴 WHERE ID=1") 1;1;1;2008/03/01;1;10; 例えば、ADOを利用すればこのように検索条件を指定してレコード情報を取得できます。 ? CNNExecute("DELETE FROM 生産出荷履歴 WHERE ID=2") True これで、ID=2 のレコードは削除されました。 ? CNNExecute("UPDATE 生産出荷履歴 SET 年月日='2008/04/14' WHERE ID=4") True ? DBSelect("SELECT * FROM 生産出荷履歴 WHERE ID=4") 4;2;2;2008/04/14;2;4; これで、ID=4 の年月日は更新されました。 まあ、このように DBSelect()、CNNExecute()関数の類を使えば割と簡単に・・・。 が、VBからAccessにアクセスしたりテキストデータを読み込んだりと課題はまだまだあります。

Nick925
質問者

お礼

アドバイスありがとうございました。頂いたヒントを元にしてもう少し悩んでみます。

関連するQ&A