hanbaic.zip 販売管理C.mdb は、Access2003 以前の形式の Microsoft Access のデータベースですが、Microsoft Office 製品で作成したのでは無く、ADODB.Connection や ADOX.Catalog を使用して Windows の基本機能で作成したものです。 今回、こちらでテストした PostgreSQL の正確なバージョンは、『Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production』です。 ※ 実際は、通常の Oracle 11g のインストールされた 10台ほどの Windows7(32ビット) PC でもテストしました hanbaiC_oracle11g_nvarchar.vbs
' ************************************************ ' 管理者権限でコマンドプロンプトで実行を強制して、 ' 最後に pause する ' ************************************************ Set Shell = CreateObject("Shell.Application") Set WshShell = Wscript.CreateObject("WScript.Shell") if Wscript.Arguments.Count = 0 then ScriptFullName = WScript.ScriptFullName Shell.ShellExecute "cmd.exe", "/c cscript.exe """ & ScriptFullName & """ dummy_param & pause", "", "runas", 1 WScript.Quit end if ' ************************************************ ' 基本設定 ' Microsoft ODBC for Oracle で実行できます ' DSN を作成して動作確認して指定して下さい ' ( 参考:http://lightbox.matrix.jp/ginpro/patio.cgi?mode=view&no=225&type=ref ) ' ************************************************ ' このスクリプトが存在するディレクトリを取得 strCurDir = WScript.ScriptFullName strCurDir = Replace( strCurDir, WScript.ScriptName, "" ) strMdbPath = strCurDir & "販売管理C.mdb" ' Oracle のホスト文字列 ' ( ローカル・ネット・サービス名 ) strTarget = "{Oracle in XE}" ' ODBC ドライバ strDBQ = "localhost:1521/XE" ' ネット・サービス名として XE のみでも OK ' スキーマ(ユーザ) strSc = "lightbox" ' パスワード strPwd = InputBox("パスワードを入力して下さい") strDummy = "DUMMY" & Replace(Date,"/","") & Replace(Time,":","") strMessage = "対象 MDB は " & strMdbPath & "です" & vbCrLf & vbCrLf strMessage = strMessage & "▼ Oracleの環境です" & vbCrLf strMessage = strMessage & "ODBC ドライバ : " & strTarget & vbCrLf strMessage = strMessage & "インスタンス : " & strDBQ & vbCrLf strMessage = strMessage & "USER(スキーマ) : " & strSc & vbCrLf strMessage = strMessage & "PASS : " & strPwd & vbCrLf & vbCrLf strMessage = strMessage & "一時テーブル : " & strDummy & vbCrLf & vbCrLf strMessage = strMessage & "既にテーブルが存在する場合はメッセージが出ません" & vbCrLf strMessage = strMessage & "それ以外ではエラーメッセージが出ますが、問題ありません" if vbCancel = MsgBox( strMessage, vbOkCancel ) then Wscript.Quit end if ' ************************************************ ' 処理用文字列設定 ' ************************************************ ' MDB の接続文字列 strConnectMdb = _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & strMdbPath & ";" ' Microsoft の Oracle 用 ODBC ドライバの接続文字列 (1) strConnectOracle = _ "[ODBC;Driver=" & strTarget & ";DBQ=" & strDBQ &";UID=" & strSc & ";PWD=" & strPwd & "]" ' Microsoft の Oracle 用 ODBC ドライバの接続文字列 (2) strConnectOracle2 = _ "Provider=MSDASQL;Driver=" & strTarget & ";DBQ=" & strDBQ &";UID=" & strSc & ";PWD=" & strPwd ' ************************************************ ' 初期処理 ' ************************************************ Set Cn = CreateObject("ADODB.Connection") Set Cn2 = CreateObject("ADODB.Connection") Cn.Open strConnectMdb Cn2.Open strConnectOracle2 ' ************************************************ ' コード名称マスタ ' ************************************************ Query = _ "create table " & strDummy & " (" & _ " 区分 NUMBER(4,0)" & _ " ,コード NVARCHAR2(10)" & _ " ,名称 NVARCHAR2(50)" & _ " ,数値1 NUMBER(8,0)" & _ " ,数値2 NUMBER" & _ " ,作成日 DATE" & _ " ,更新日 DATE" & _ " ,primary key(区分,コード)" & _ ")" Call OracleTransfer( "コード名称マスタ", "[コード名称マスタ]", Query ) ' ************************************************ ' コントロールマスタ ' ************************************************ Query = _ "create table " & strDummy & " (" & _ " キー NVARCHAR2(1)" & _ " ,売上日付 DATE" & _ " ,売上伝票 NUMBER(8,0)" & _ " ,会社名 NVARCHAR2(50)" & _ " ,組織コード NVARCHAR2(4)" & _ " ,起算月 NUMBER(2,0)" & _ " ,primary key(キー)" & _ ")" Call OracleTransfer( "コントロールマスタ","[コントロールマスタ]", Query ) ' ************************************************ ' メッセージマスタ ' ************************************************ Query = _ "create table " & strDummy & " (" & _ " コード NVARCHAR2(4)" & _ " ,メッセージ NVARCHAR2(100)" & _ " ,primary key(コード)" & _ ")" Call OracleTransfer( "メッセージマスタ","[メッセージマスタ]", Query ) ' ************************************************ ' 取引データ ' ************************************************ Query = _ "create table " & strDummy & " (" & _ " 取引区分 NVARCHAR2(2)" & _ " ,伝票番号 NUMBER(8,0)" & _ " ,行 NUMBER(2,0)" & _ " ,取引日付 DATE" & _ " ,取引先コード NVARCHAR2(4)" & _ " ,商品コード NVARCHAR2(4)" & _ " ,数量 NUMBER" & _ " ,単価 NUMBER" & _ " ,金額 NUMBER" & _ " ,更新済 NVARCHAR2(1)" & _ " ,primary key(取引区分,伝票番号,行)" & _ ")" Call OracleTransfer( "取引データ","[取引データ]", Query ) ' ************************************************ ' 商品マスタ ' ************************************************ Query = _ "create table " & strDummy & " (" & _ " 商品コード NVARCHAR2(4)" & _ " ,商品名 NVARCHAR2(50)" & _ " ,在庫評価単価 NUMBER" & _ " ,販売単価 NUMBER" & _ " ,商品分類 NVARCHAR2(3)" & _ " ,商品区分 NVARCHAR2(1)" & _ " ,作成日 DATE" & _ " ,更新日 DATE" & _ " ,備考 NVARCHAR2(2000)" & _ " ,削除フラグ NVARCHAR2(1)" & _ " ,primary key(商品コード)" & _ ")" Call OracleTransfer( "商品マスタ","[商品マスタ]", Query ) ' ************************************************ ' 商品分類マスタ ' ************************************************ Query = _ "create table " & strDummy & " (" & _ " 商品分類 NVARCHAR2(3)" & _ " ,名称 NVARCHAR2(50)" & _ " ,作成日 DATE" & _ " ,更新日 DATE" & _ " ,primary key(商品分類)" & _ ")" Call OracleTransfer( "商品分類マスタ","[商品分類マスタ]", Query ) ' ************************************************ ' 得意先マスタ ' ************************************************ Query = _ "create table " & strDummy & " (" & _ " 得意先コード NVARCHAR2(4)" & _ " ,得意先名 NVARCHAR2(50)" & _ " ,得意先区分 NVARCHAR2(1)" & _ " ,担当者 NVARCHAR2(4)" & _ " ,郵便番号 NVARCHAR2(7)" & _ " ,住所1 NVARCHAR2(100)" & _ " ,住所2 NVARCHAR2(100)" & _ " ,作成日 DATE" & _ " ,更新日 DATE" & _ " ,締日 NUMBER(2,0)" & _ " ,締日区分 NUMBER(1,0)" & _ " ,支払日 NUMBER(2,0)" & _ " ,備考 NVARCHAR2(100)" & _ " ,primary key(得意先コード)" & _ ")" Call OracleTransfer( "得意先マスタ","[得意先マスタ]", Query ) ' ************************************************ ' 社員マスタ ' ************************************************ Query = _ "create table " & strDummy & " (" & _ " 社員コード NVARCHAR2(4)" & _ " ,氏名 NVARCHAR2(50)" & _ " ,フリガナ NVARCHAR2(50)" & _ " ,所属 NVARCHAR2(4)" & _ " ,性別 NUMBER(1,0)" & _ " ,作成日 DATE" & _ " ,更新日 DATE" & _ " ,給与 NUMBER" & _ " ,手当 NUMBER" & _ " ,管理者 NVARCHAR2(4)" & _ " ,生年月日 DATE" & _ " ,primary key(社員コード)" & _ ")" Call OracleTransfer( "社員マスタ","[社員マスタ]", Query ) ' ************************************************ ' 郵便番号マスタ ' ************************************************ Query = _ "create table " & strDummy & " (" & _ " 郵便番号 NVARCHAR2(7)" & _ " ,都道府県名カナ NVARCHAR2(255)" & _ " ,市区町村名カナ NVARCHAR2(255)" & _ " ,町域名カナ NVARCHAR2(255)" & _ " ,都道府県名 NVARCHAR2(255)" & _ " ,市区町村名 NVARCHAR2(255)" & _ " ,町域名 NVARCHAR2(255)" & _ ")" Call OracleTransfer( "郵便番号マスタ","[郵便番号マスタ]", Query ) ' ************************************************ ' 入金予定データ ' ************************************************ Query = _ "create table " & strDummy & " (" & _ " 得意先コード NVARCHAR2(4)" & _ " ,支払日 DATE" & _ " ,伝票合計金額 NUMBER(10,0)" & _ " ,伝票番号 NUMBER(10,0)" & _ ")" Call OracleTransfer( "入金予定データ","[入金予定データ]", Query ) ' ************************************************ ' 商品集計 ' ************************************************ Query = _ "create table " & strDummy & " (" & _ " 商品コード NVARCHAR2(4)" & _ " ,経過月 NUMBER(2,0)" & _ " ,当月売上数量 NUMBER(10,0)" & _ " ,当月売上金額 NUMBER(10,0)" & _ " ,更新日 DATE" & _ " ,組織コード NVARCHAR2(4)" & _ " ,primary key(商品コード,経過月)" & _ ")" Call OracleTransfer( "商品集計","[商品集計]", Query ) ' ************************************************ ' 得意先集計 ' ************************************************ Query = _ "create table " & strDummy & " (" & _ " 請求先 NVARCHAR2(4)" & _ " ,経過月 NUMBER(2,0)" & _ " ,当月売上金額 NUMBER(10,0)" & _ " ,更新日 DATE" & _ " ,組織コード NVARCHAR2(4)" & _ " ,primary key(請求先,経過月)" & _ ")" Call OracleTransfer( "得意先集計","[得意先集計]", Query ) ' ************************************************ ' 社員変更履歴 ' ************************************************ Query = _ "create table " & strDummy & " (" & _ " 社員コード NVARCHAR2(4)" & _ " ,氏名 NVARCHAR2(50)" & _ " ,フリガナ NVARCHAR2(50)" & _ " ,所属 NVARCHAR2(4)" & _ " ,性別 NUMBER(1,0)" & _ " ,作成日 DATE" & _ " ,更新日 DATE" & _ " ,給与 NUMBER" & _ " ,手当 NUMBER" & _ " ,管理者 NVARCHAR2(4)" & _ " ,生年月日 DATE" & _ ")" Call OracleTransfer( "社員変更履歴","[社員変更履歴]", Query ) ' ************************************************ ' ビュー ' ************************************************ Query = _ "create or replace view V_商品一覧 as" & _ " SELECT 商品マスタ.商品コード" & _ " , 商品マスタ.商品名" & _ " , 商品マスタ.販売単価" & _ " , 商品分類マスタ.商品分類" & _ " , 商品分類マスタ.名称 AS 分類名" & _ " , 商品マスタ.商品区分" & _ " , コード名称マスタ.名称 AS 区分名" & _ " from" & _ " (商品マスタ LEFT JOIN 商品分類マスタ" & _ " ON 商品マスタ.商品分類 = 商品分類マスタ.商品分類" & _ " ) LEFT JOIN コード名称マスタ" & _ " ON 商品マスタ.商品区分 = コード名称マスタ.コード" & _ " where" & _ " コード名称マスタ.区分 = 3 and 削除フラグ is NULL" RunOracle( Query ) Query = _ "create or replace view V_売上日付 as" & _ " SELECT コントロールマスタ.売上日付" & _ " FROM コントロールマスタ" & _ " WHERE コントロールマスタ.キー = '1'" RunOracle( Query ) Query = _ "create or replace view V_得意先台帳 as" & _ " SELECT 取引データ.取引先コード" & _ " , 得意先マスタ.得意先名" & _ " , 取引データ.取引日付" & _ " , 取引データ.取引区分" & _ " , 取引データ.伝票番号" & _ " , 取引データ.行" & _ " , 取引データ.商品コード" & _ " , 商品マスタ.商品名" & _ " , 取引データ.数量" & _ " , 取引データ.単価" & _ " , 取引データ.金額" & _ " from" & _ " (取引データ INNER JOIN 商品マスタ" & _ " ON 取引データ.商品コード=商品マスタ.商品コード" & _ " ) INNER JOIN 得意先マスタ" & _ " ON 取引データ.取引先コード=得意先マスタ.得意先コード" & _ " where" & _ " 取引データ.取引区分 = '10'" RunOracle( Query ) Query = _ "create or replace view V_社員一覧 as" & _ " select 社員コード" & _ " ,氏名" & _ " ,フリガナ" & _ " ,名称1.名称 as 性別" & _ " ,所属" & _ " ,名称2.名称 as 所属名" & _ " from 社員マスタ" & _ " ,コード名称マスタ 名称1" & _ " ,コード名称マスタ 名称2" & _ " where to_char(性別) = 名称1.コード" & _ " and 名称1.区分 = 1" & _ " and 所属 = 名称2.コード" & _ " and 名称2.区分 = 2" RunOracle( Query ) Query = _ "create or replace view" & _ " PROC_ERROR" & _ " as" & _ " select * " & _ " from USER_ERRORS" RunOracle( Query ) Query = _ "create or replace view" & _ " PROC_LIST" & _ " as" & _ " select OBJECT_NAME as ""プロシージャ名"" " & _ " ,STATUS as ""状態"" " & _ " ,OBJECT_TYPE as ""タイプ"" " & _ " ,CREATED as ""作成日"" " & _ " ,LAST_DDL_TIME as ""更新日"" " & _ " from USER_OBJECTS " & _ " where OBJECT_TYPE in ('FUNCTION','PROCEDURE') " RunOracle( Query ) Query = _ "create or replace view" & _ " PROC_TEXT" & _ " as" & _ " select * from USER_SOURCE" RunOracle( Query ) ' ************************************************ ' 終了 ' ************************************************ Cn2.Close Cn.Close Wscript.Echo "処理が終了しました" ' ************************************************ ' Oracle 転送 ' ************************************************ function OracleTransfer( strTarget, strTable, QueryCreate ) Dim Query Query = "drop table " & strTarget RunOracle( Query ) RunOracle( QueryCreate ) Query = "insert into " & strConnectOracle & "." & strDummy & _ " select * from " & strTable RunMdb( Query ) Query = "alter table " & strDummy & " rename to " & strTarget RunOracle( Query ) end function ' ************************************************ ' MDB 実行 ' ************************************************ function RunMdb( Query ) on error resume next Cn.Execute Query if Err.Number <> 0then Wscript.Echo Err.Description & vbCrLf & Query end if on error goto 0 end function ' ************************************************ ' Oracle 実行 ' ************************************************ function RunOracle( Query ) on error resume next Cn2.Execute Query if Err.Number <> 0then Wscript.Echo Err.Description & vbCrLf & Query end if on error goto 0 end function
管理者権限でコマンドプロンプトで実行を強制 この処理では必要ありませんが、昨今いろいろそういう場面に遭遇する事が多く、今後の為にと実装しました。コマンドブロンプトで実行した後は、PAUSE によって処理は一旦停止し、コマンドプロンプトのウインドウは閉じずに残ります。 ▼ 管理者実行の確認の後のパスワード入力 ▼ 内容の確認ダイアログ ※ 初回実行はテーブルが無いのでエラーメッセージが出ますが、問題はありません ▼ 2回目以降の表示 ▼ 実行後のテーブルとビュー 処理手順(1) : テーブル作成 テーブルを CREATE 文を使って、Oracle に接続して実行します。 Oracle ODBC ドライバのパラメータは、『E 26 Oracle ODBC Driverの使用』を参照して下さい。接続文字列そのものは、『8.1 簡易接続ネーミング・メソッドの使用』を参照して下さい。 ※ Oracle のマニュアルと言えど、全てが正しく記述されている保証はありません。バージョンの推移やアップデートや現実にドキュメントが全て追いついていない(精査されていない)可能性もあります。 ※ 一般の Oracle で簡易接続ネーミング・メソッドが使え無い場合は、Net Configuration Assistant のネーミングメソッド構成で追加して下さい ※ Oracle の基本情報は、select * from V$PARAMETER を実行した内容と、レジストリの内容を確認するとたいていは得られるはずです。
' Oracle のホスト文字列 ' ( ローカル・ネット・サービス名 ) strTarget = "{Oracle in XE}" ' ODBC ドライバ strDBQ = "localhost:1521/XE" ' ネット・サービス名として XE のみでも OK ' スキーマ(ユーザ) strSc = "lightbox" ' パスワード strPwd = InputBox("パスワードを入力して下さい") ' Microsoft の Oracle 用 ODBC ドライバの接続文字列 (2) strConnectOracle2 = _ "Provider=MSDASQL;Driver=" & strTarget & ";DBQ=" & strDBQ &";UID=" & strSc & ";PWD=" & strPwd
処理手順(2) : インポート 現実には、MDB へ接続して行うエクスポート処理となります。Microsoft Access では、in 構文によって、Access 内から ODBC を使って直接他のデータベースのテーブルを内部デーブルのように参照できるので、 insert into [Oracleのテーブル] select * from [MDB内のテーブル] というSQL文を実行してエクスポートが可能です。 但し、Oracle の ODBC ドライバは バグ(?) があるらしく、複数のスキーマに同一名のテーブルがあるとエラーになるので(バグと言うより、他の DB と構造が違う為)、毎回ダミーのテーブルを作成してインポートして名前変更しています。
strConnectMdb = _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & strMdbPath & ";" strConnectOracle = _ "[ODBC;Driver=" & strTarget & ";DBQ=" & strDBQ &";UID=" & strSc & ";PWD=" & strPwd & "]"
処理手順(3) : VIEW作成 VIEW の作成は、Oracle への接続で行います 関連する記事
VBScriptドキュメント
|
【VBS + ADOの最新記事】
- VBScript : PostgreSQL(9.3.4) に MDB(販売管理C) のデータをインポートする
- VBscript : 新しい Mictrosoft Access(2007以降)へ、古い MDB からデータを移行する
- VBScript : 古い Access2003 までのデータベース作成と新しい Access2007 以降のデータベース作成
- VBScript : ADO で Excel2007(Excel 2010、Excel 2013) にアクセスする( シートをテーブルとして読み込む )
- VBScript : Micrsoft Access 経由で、SQLServer のテーブルのデータを Excel にエクスポートする方法
- VBScript : ADO を使用して、MDB(Access2003) のデータを SQLite ODBC Driver で sqlite3(UTF-8) を作成
- VBScript +ADO / MDB から SQLite3 へ ODBC ドライバを使ってフィールドオブジェクトを使用した同一フォーマットのテーブル間のデータコピー(データベースは自動的に作成されま..
- VBScript : ADO経由の一時PL/SQL でエクスポートを実行する(Data Pump Export)
【VBScript関連のカテゴリ】