![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
素人質問で申し訳ありませんが教えてください。実は或る伝票管理テーブルがあり、そのリスト中の実質的なキーコードである「伝票番号」フィールドには重複可能なインデックスを設定してあります。それとは別に主キーを設定してはいますが、それはオートナンバーとしてデータをソートするくらいにしか使っていません。
この伝票管理テーブルは外部の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
雲を掴むような話で申し訳ありませんが、こんなことが可能なのかどうかご教示頂ければ幸甚です。宜しくお願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
ADOなど全レコードを個別に捉えられる仕組み(プログラム)を使えば
両ファイル(テーブル)を共通キーでそれぞれソートしておき
マッチングのロジックで両者の全レコードを比較していけば、
同じキーでマッチングしたとき、対応するフィールドを比較すればよい。
純然たるロジックの骨格部分は10行ぐらいで済むものです。
ーー
SQLで出来るかどうか。複雑になりそう。
実質的に2者間のデータ比較をするケースが殆どで、多くて3者間の比較で何とかなりそうなので、DAOを使って何とかマッチングの仕組みを作ってみます。アドバイスありがとうございました。
実はADOは勉強したことも使ったこともないのですが、DAOに比べて今回のような場合に有利ですか。もし優位性があるなら是非とも勉強してみたいと思います。
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にアクセスしたりテキストデータを読み込んだりと課題はまだまだあります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLローダーCSV取込で、囲み文...
-
テーブルの最後(最新)のレコー...
-
BLOBやCLOBのパフォーマンスを...
-
int型フィールドにnullを登録で...
-
配列に指定した値が含まれてい...
-
SELECTした合計値をそのまま割...
-
Null値件数をカウントする式に...
-
Datetime型とTimestamp型の使い...
-
一つのフィールドに複数の情報...
-
Insert文直後に自動採番(auto_i...
-
phpmyadminで条件付きの検索置...
-
重複しないデータのみを抽出
-
ACCESSでの桁数のあわせ方
-
ファイルメーカー10で重複デー...
-
固定長データのテキストファイ...
-
ACCESSのクエリで空白以降を別...
-
group byの並び順を変えるだけ...
-
select文の実行結果に空白行を...
-
AccessのSQL文で1件のみヒット...
-
並べ替えについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLローダーCSV取込で、囲み文...
-
テーブルの最後(最新)のレコー...
-
int型フィールドにnullを登録で...
-
2回実行のSQL文を1回にしたい
-
SELECTした合計値をそのまま割...
-
テーブルのフィールドの一番長...
-
配列に指定した値が含まれてい...
-
BLOBやCLOBのパフォーマンスを...
-
ACCESSのクエリで空白以降を別...
-
固定長データのテキストファイ...
-
【MySQL】 DECIMAL(2,1) に 13...
-
Null値件数をカウントする式に...
-
入力データの半角スペースと全...
-
ファイルメーカー10で重複デー...
-
重複しないデータのみを抽出
-
タイムスタンプ型を抽出条件に...
-
複数フィールド対してLIKE '% ...
-
一つのフィールドに複数の情報...
-
ACCESSでの桁数のあわせ方
-
MySQLでの近似値順での値の取得...
おすすめ情報