素人質問で申し訳ありませんが教えてください。実は或る伝票管理テーブルがあり、そのリスト中の実質的なキーコードである「伝票番号」フィールドには重複可能なインデックスを設定してあります。それとは別に主キーを設定してはいますが、それはオートナンバーとしてデータをソートするくらいにしか使っていません。
この伝票管理テーブルは外部の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で質問しましょう!
似たような質問が見つかりました
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Access(アクセス) Accessのクエリの結果を、既存のエクセルに追加したい 2 2022/07/31 22:44
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- Oracle sqlのupdate文で質問です。 テーブルBの番号をキーにテーブルAの身長をテーブルBの身長に更新 2 2022/11/02 15:15
- Access(アクセス) アクセスの更新クエリでカレントレコードのみ更新したい 1 2022/06/02 23:32
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- その他(データベース) IT用語について質問です。 以前ITパスポートの試験を受けた際にデータベースが何の集まりかについての 2 2022/12/10 12:29
- Excel(エクセル) Excelでデータを抽出するに良い方法 9 2023/02/06 12:42
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLローダーCSV取込で、囲み文...
-
テーブルの最後(最新)のレコー...
-
テーブルのフィールドの一番長...
-
BLOBやCLOBのパフォーマンスを...
-
2回実行のSQL文を1回にしたい
-
SELECTした合計値をそのまま割...
-
SELECT * from tは掛け算ではな...
-
固定長データのテキストファイ...
-
SQL文について質問です。GROUP ...
-
フィールド表示順序の変更
-
ACCESSでの桁数のあわせ方
-
重複しないデータのみを抽出
-
MySQL5.1で varchar(100)のもの...
-
int型フィールドにnullを登録で...
-
配列に指定した値が含まれてい...
-
入力データの半角スペースと全...
-
文字2桁、3桁交じりの文字列...
-
select文の実行結果に空白行を...
-
単一グループのグループ関数で...
-
2つの列が同じ値の行を取得するSQL
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLローダーCSV取込で、囲み文...
-
テーブルの最後(最新)のレコー...
-
2回実行のSQL文を1回にしたい
-
int型フィールドにnullを登録で...
-
SQLです下記の問合せを行うクエ...
-
SELECTした合計値をそのまま割...
-
BLOBやCLOBのパフォーマンスを...
-
テーブルのフィールドの一番長...
-
配列に指定した値が含まれてい...
-
Null値件数をカウントする式に...
-
固定長データのテキストファイ...
-
ACCESSのクエリで空白以降を別...
-
【MySQL】 DECIMAL(2,1) に 13...
-
複数フィールド対してLIKE '% ...
-
ファイルメーカー10で重複デー...
-
MySQLでの近似値順での値の取得...
-
NULLの挿入の仕方が…?
-
CSVからNULL値をインポート
-
MYSQLで月ごとの集計をおこない...
-
ファイルメーカーのフィールド...
おすすめ情報