VBとACCESS連携について

解決


ま〜  2005-10-18 16:22:07  No: 126459  IP: [192.*.*.*]

VBでCSVファイル(複数行のレコードがあります)を読み込んで、ACCESSに保存し(テーブルAとします)、こちらとテーブルB(作成済みとします)のレコードを比較するときに、テーブルAが複数行あって、全ての行についてテーブルBのレコードと比較をしたいと思っているのですが、これはVBで書けるモノなのでしょうか。それともVB上でSQLを書いて制御しないといけないのですか。当初はテーブルAの内容を配列にいれて繰り返すことも考えたのですが、メモリがあふれる可能性がありまして。
お知恵をいただければ幸いです。

編集 削除
あこ  2005-10-18 16:33:34  No: 126460  IP: [192.*.*.*]

VBでも出来ない事はないと思いますが、
素直にSQLを投げたほうが遥かに楽だと思いますよ。

編集 削除
ま〜  2005-10-18 16:54:07  No: 126461  IP: [192.*.*.*]

あこさま
ご回答いただきありがとうございます。
SQLを投げるとすると、CURSORを用いて制御することになるのでしょうか。むしろここの掲示板ではないのでしょうか。

編集 削除
ま〜  2005-10-18 16:55:05  No: 126462  IP: [192.*.*.*]

追記ですが、テーブルAのレコードは1件ごとにテーブルBのレコードと比較することになっております。

編集 削除
特攻隊長まるるう  2005-10-18 17:01:21  No: 126463  IP: [192.*.*.*]

比較って具体的にどういう比較?差分を取りたいとか???

編集 削除
あこ  2005-10-18 17:04:34  No: 126464  IP: [192.*.*.*]

テーブルA、Bそれぞれのレコードセットを取得して、
1レコードずつ比較する。。。
というのはダメでしょうか?

編集 削除
ま〜  2005-10-18 17:09:32  No: 126465  IP: [192.*.*.*]

今やりたいことはあこさまから御指摘いただきましたとおり、テーブルAのあるカラムとテーブルBのあるカラムを比較し、同一であれば抽出するということです。
Recordsetでは1行ずつ取得することは可能なのですか?知識が無いため、御迷惑をお掛けし申し訳ありません。

編集 削除
あこ  2005-10-18 17:19:04  No: 126466  IP: [192.*.*.*]

例えばですよ、

Dim strTmp as String
Set rsTableA = hogehogeA
Set rsTableB = hogehogeB
Do Until(rsTableA.EOF)
    '比較処理
    If rsTableA("Col01") = rsTableB("Col01") Then
       strTmp = rsTableA(ColA)
    End If
    rs.MoveNext
Loop

といった感じで回してみてはどうでしょうか?

編集 削除
あこ  2005-10-18 17:20:40  No: 126467  IP: [192.*.*.*]

訂正
×strTmp = rsTableA(ColA)
○strTmp = rsTableA(Col"01")

編集 削除
ま〜  2005-10-18 17:27:10  No: 126468  IP: [192.*.*.*]

あこさま
御丁寧にご回答いただきありがとうございます。
一点確認なのですが、rs.MoveNextではテーブルBのみ1行ずれるのでしょうか。それともテーブルA、Bともに1行ずつずれるのでしょうか。
大変図々しい質問ではございますが、御教示いただければ幸いです。

編集 削除
あこ  2005-10-18 17:33:25  No: 126469  IP: [192.*.*.*]

あ〜ごめんなさい。
そこまで気が回ってませんでしたorz

テーブルAを1行ずらすなら rsTableA.MoveNext
テーブルBを1行ずらすなら rsTableB.MoveNext

ですね。

ちなみにですが、以下のようなサイトが参考になるかと思います。
http://homepage2.nifty.com/inform/vbdb/

編集 削除
ま〜  2005-10-18 17:45:10  No: 126470  IP: [192.*.*.*]

あこさま

了解致しました。
ということは、以下のように組めばテーブルAとテーブルBで比較した上で、見つかればテーブルAを次の行に移すことができるということでしょうか。

Do Until(rsTableA.EOF)
    '比較処理
    Do Until(rsTableB.EOF)
    If rsTableA("Col01") = rsTableB("Col01") Then
       strTmp = rsTableA(ColA)
    End If
    '見つからなければテーブルBの行を1行ずらす
      rsTableB.MoveNext
    '見つかるまで検索
    Loop
    'レコードBが終了したので、テーブルAを1行ずらす    
    rsTableA.MoveNext
Loop

またSet rsTableA = hogehogeAでRecordSetを定義していると考えればよろしいのでしょうか。

重ね重ね恐縮ですが、御確認いただければと存じます。
宜しくお願い申し上げます。

編集 削除
あこ  2005-10-18 17:56:05  No: 126471  IP: [192.*.*.*]

おおむね間違ってはいないと思いますが、
このままではテーブルBが最終レコードのままですので、
比較処理のLoopが終わったときに、
rsTableB.MoveFirst
を行って下さい。

>またSet rsTableA = hogehogeAでRecordSetを定義していると考えればよろしいのでしょうか。
そう解釈していただいて宜しいかと思います。

編集 削除
ま〜  2005-10-18 18:05:10  No: 126472  IP: [192.*.*.*]

あこさま
御忙しい中、御丁寧にご回答いただきありがとうございます。こちらを元に処理をまとめていきたいと思います。
上記件について、また不明な点がありました場合はこの掲示板にてお願いするかと存じますが、宜しくお願い申し上げます。
#別に回答してくださいと言っているわけではありませんσ(^_^;)
#お世話になりましたという気持ちです。

特攻隊長まるるうさま
私の文章不足に的確に御指摘いただき、ありがとうございます。

編集 削除