- 締切済み
VBAでDBから取得したデータを突き合わせる
VBAでOracleに接続し、取得したレコードを突き合せようとしています。 2つのテーブル(TBL_A、TBL_B)からレコードを1件ずつ取得し、 それぞれのレコードの項目を突き合わせて一致しているかを確認します。 2つのテーブルは以下のような状態です。 【TBL_A】 社員番号,SYAIN_NO,VARCHAR2(10) 社員名 ,SYAIN_NM,VARCHAR2(50) 【TBL_B】 社員番号,SYAIN_NO,VARCHAR2(10) 社員名 ,SYAIN_NM,VARCHAR2(50) レコードを取得する際、 以下のようなユーザ定義型変数に値を設定しています。 Dim TBL_A_REC As SYAIN Dim TBL_B_REC As SYAIN Type SYAIN SYAIN_NO As String SYAIN_NM As String End Type 今後、各テーブルに生年月日のカラム(BIRTH)を追加する可能性があり、生年月日も突き合わせたいです。 先日、こちらで質問してユーザ定義型変数を動的に増やすことは不可能であるとご回答を頂きました。 ユーザ定義型変数を用いずにDBから取得した値を設定し、 突き合わせを行う良い方法はあるのでしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- y04010351
- ベストアンサー率57% (22/38)
参考程度の回答になります。 EXCEL(VBA)から、オラクル接続&データ取り込みした方が、 ACCESS、VB6よりも、比較が簡単にできそうな、感じがします。
- ShowMeHow
- ベストアンサー率28% (1424/5027)
オラクルのsqlの文法を知らないのですみません。 1.社員番号でJOINした、レコードセットをADOかなんかで取得して、 一件ずつ比べていく 2.TBL_Aにあって、TBL_Bにないレコードを抽出する 3.TBL_Bにあって、TBL_Aにないレコードを抽出する で網羅できると思います。 1.に関しては DIM CON AS NEW ADODB.CONNECTION DIM RST AS NEW ADODB.RECORDSET strCON = "Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;User Id=myUsername;Password=myPassword;" strSQL = "SELECT TBL_A.*, TBL_B.* FROM TBL_A INNER JOIN TBL_B ON TBL_A.SHAIN_NO = TBS_B.SHAIN_NO" CON.OPEN STRCON RST.OPEN STRSQL,ADOPENKEYSET,ADLOCKOPTIMISTIC DO WHILE NOT RST.EOF IF RST.FIELDS(1) <> RST.FIELDS(?) THEN ’判定 DEBUG.PRINT RST.FIELDS(1) ’処理 END IF ...... LOOP RST.CLOSE CON.CLOSE みたいな感じで、
お礼
一方のテーブルにしか存在しないレコードはないので 2、3のケースは想定していません。 DB接続はoo4oを介して行っていますが ADOの方式も試してパフォーマンスを比べてみようと思います。 ご回答ありがとうございました。
- ShowMeHow
- ベストアンサー率28% (1424/5027)
オラクル使ったことない私が言うのも何ですが、 不一致分だけ抽出するのではダメなんですか?
補足
ご回答ありがとうございます。 確かに不一致レコードのみ抽出するSQLでも良いのですが、 実際のところ各テーブルには社員番号と社員名だけではなく、 他に30項目ほどあります。 (質問に全て記述すると長くなってしまうと思い 省略しております。すみません。) 項目には空白除去や、前ゼロ削除等の加工をした上で 突き合わせる項目もあります。 また、突き合わせた結果として各レコードをファイルに出力します。 そのためSQLでは単純に抽出だけを行います。
お礼
ACCESSとVBは開発環境がないので選択肢にはありませんでしたが、 使用できる機会があったらそちらも試してみようと思います。 ご回答ありがとうございました。