SQLの窓

2014年05月08日


VBScript : PostgreSQL(9.3.4) に MDB(販売管理C) のデータをインポートする

hanbaic_postgreSQL.zip


販売管理C.mdb は、Access2003 以前の形式の Microsoft Access のデータベースですが、Microsoft Office 製品で作成したのでは無く、ADODB.Connection や ADOX.Catalog を使用して Windows の基本機能で作成したものです。



今回、こちらでテストした PostgreSQL の正確なバージョンは、『PostgreSQL 9.3.4, compiled by Visual C++ build 1600, 32-bit』です。

hanbaiC_postgres.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

' ************************************************
' 基本設定
' ************************************************
' このスクリプトが存在するディレクトリを取得
Set Fso = CreateObject( "Scripting.FileSystemObject" )
strCurPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strCurPath )
Set obj = obj.ParentFolder
strCurDir = obj.Path
strMdbPath = strCurDir & "\販売管理C.mdb"

strTarget = "{PostgreSQL ODBC Driver(UNICODE)}"	' ODBC ドライバ
strServer = "localhost"
strPort = "5432"
strDB = "lightbox"
strUser = "postgres"
strPass = InputBox("パスワードを入力して下さい")


strMessage = "対象 MDB は " & strMdbPath & "です" & vbCrLf & vbCrLf

strMessage = strMessage & "▼ PostgreSQLの環境です" & vbCrLf
strMessage = strMessage & "ODBC ドライバ : " & strTarget & vbCrLf
strMessage = strMessage & "Server : " & strServer & vbCrLf
strMessage = strMessage & "Port : " & strPort & vbCrLf
strMessage = strMessage & "DB : " & strDB & vbCrLf
strMessage = strMessage & "USER : " & strUser & vbCrLf
strMessage = strMessage & "PASS : " & strPass & 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 & ";"

strConnectPS = _
	" in '' [ODBC" & _
	";Driver=" & strTarget & _
	";Servername=" & strServer & _
	";Port=" & strPort  & _
	";DATABASE=" & strDB & _
	";UID=" & strUser & _ 
	";PWD=" & strPass & _ 
	";]" 

strConnectPS2 = _
	"Provider=MSDASQL" & _
	";Driver=" & strTarget & _
	";Servername=" & strServer & _
	";Port=" & strPort  & _
	";DATABASE=" & strDB & _
	";UID=" & strUser & _ 
	";PWD=" & strPass & _ 
	";" 

' ************************************************
' 初期処理
' ************************************************
Set Cn = CreateObject("ADODB.Connection")
Set Cn2 = CreateObject("ADODB.Connection")
Cn.Open strConnectMdb
Cn2.Open strConnectPS2

RunSS( "drop view V_商品一覧" )
RunSS( "drop view V_売上日付" )
RunSS( "drop view V_得意先台帳" )
RunSS( "drop view V_社員一覧" )

' ************************************************
' コード名称マスタ
' ************************************************
Query = _
"create table コード名称マスタ (" & _
"	区分 INT" & _
"	,コード VARCHAR(10)" & _
"	,名称 VARCHAR(50)" & _
"	,数値1 INT" & _
"	,数値2 INT" & _
"	,作成日 DATE" & _
"	,更新日 DATE" & _
"	,primary key(区分,コード)" & _
")"
Call SSTransfer( "コード名称マスタ", Query )

' ************************************************
' コントロールマスタ
' ************************************************
Query = _
"create table コントロールマスタ (" & _
"	キー VARCHAR(1)" & _
"	,売上日付 DATE" & _
"	,売上伝票 INT" & _
"	,会社名 VARCHAR(50)" & _
"	,組織コード VARCHAR(4)" & _
"	,起算月 INT" & _
"	,primary key(キー)" & _
")"
Call SSTransfer( "コントロールマスタ", Query )

' ************************************************
' メッセージマスタ
' ************************************************
Query = _
"create table メッセージマスタ (" & _
"	コード VARCHAR(4)" & _
"	,メッセージ VARCHAR(100)" & _
"	,primary key(コード)" & _
")"
Call SSTransfer( "メッセージマスタ", Query )

' ************************************************
' 取引データ
' ************************************************
Query = _
"create table 取引データ (" & _
"	取引区分 VARCHAR(2)" & _
"	,伝票番号 INT" & _
"	,行 INT" & _
"	,取引日付 DATE" & _
"	,取引先コード VARCHAR(4)" & _
"	,商品コード VARCHAR(4)" & _
"	,数量 INT" & _
"	,単価 INT" & _
"	,金額 INT" & _
"	,更新済 VARCHAR(1)" & _
"	,primary key(取引区分,伝票番号,行)" & _
")"
Call SSTransfer( "取引データ", Query )

' ************************************************
' 商品マスタ
' ************************************************
Query = _
"create table 商品マスタ (" & _
"	商品コード VARCHAR(4)" & _
"	,商品名 VARCHAR(50)" & _
"	,在庫評価単価 INT" & _
"	,販売単価 INT" & _
"	,商品分類 VARCHAR(3)" & _
"	,商品区分 VARCHAR(1)" & _
"	,作成日 DATE" & _
"	,更新日 DATE" & _
"	,備考 VARCHAR(2000)" & _
"	,削除フラグ VARCHAR(1)" & _
"	,primary key(商品コード)" & _
")"
Call SSTransfer( "商品マスタ", Query )

' ************************************************
' 商品分類マスタ
' ************************************************
Query = _
"create table 商品分類マスタ (" & _
"	商品分類 VARCHAR(3)" & _
"	,名称 VARCHAR(50)" & _
"	,作成日 DATE" & _
"	,更新日 DATE" & _
"	,primary key(商品分類)" & _
")"
Call SSTransfer( "商品分類マスタ", Query )

' ************************************************
' 得意先マスタ
' ************************************************
Query = _
"create table 得意先マスタ (" & _
"	得意先コード VARCHAR(4)" & _
"	,得意先名 VARCHAR(50)" & _
"	,得意先区分 VARCHAR(1)" & _
"	,担当者 VARCHAR(4)" & _
"	,郵便番号 VARCHAR(7)" & _
"	,住所1 VARCHAR(100)" & _
"	,住所2 VARCHAR(100)" & _
"	,作成日 DATE" & _
"	,更新日 DATE" & _
"	,締日 INT" & _
"	,締日区分 INT" & _
"	,支払日 INT" & _
"	,備考 VARCHAR(100)" & _
"	,primary key(得意先コード)" & _
")"
Call SSTransfer( "得意先マスタ", Query )

' ************************************************
' 社員マスタ
' ************************************************
Query = _
"create table 社員マスタ (" & _
"	社員コード VARCHAR(4)" & _
"	,氏名 VARCHAR(50)" & _
"	,フリガナ VARCHAR(50)" & _
"	,所属 VARCHAR(4)" & _
"	,性別 INT" & _
"	,作成日 DATE" & _
"	,更新日 DATE" & _
"	,給与 INT" & _
"	,手当 INT" & _
"	,管理者 VARCHAR(4)" & _
"	,生年月日 DATE" & _
"	,primary key(社員コード)" & _
")"
Call SSTransfer( "社員マスタ", Query )

' ************************************************
' 郵便番号マスタ
' ************************************************
Query = _
"create table 郵便番号マスタ (" & _
"	郵便番号 VARCHAR(7)" & _
"	,都道府県名カナ VARCHAR(255)" & _
"	,市区町村名カナ VARCHAR(255)" & _
"	,町域名カナ VARCHAR(255)" & _
"	,都道府県名 VARCHAR(255)" & _
"	,市区町村名 VARCHAR(255)" & _
"	,町域名 VARCHAR(255)" & _
")"
Call SSTransfer( "郵便番号マスタ", Query )

' ************************************************
' 入金予定データ
' ************************************************
Query = _
"create table 入金予定データ (" & _
"	得意先コード VARCHAR(4)" & _
"	,支払日 DATE" & _
"	,伝票合計金額 INT" & _
"	,伝票番号 INT" & _
")"
Call SSTransfer( "入金予定データ", Query )

' ************************************************
' 商品集計
' ************************************************
Query = _
"create table 商品集計 (" & _
"	商品コード VARCHAR(4)" & _
"	,経過月 INT" & _
"	,当月売上数量 INT" & _
"	,当月売上金額 INT" & _
"	,更新日 DATE" & _
"	,組織コード VARCHAR(4)" & _
"	,primary key(商品コード,経過月)" & _
")"
Call SSTransfer( "商品集計", Query )

' ************************************************
' 得意先集計
' ************************************************
Query = _
"create table 得意先集計 (" & _
"	請求先 VARCHAR(4)" & _
"	,経過月 INT" & _
"	,当月売上金額 INT" & _
"	,更新日 DATE" & _
"	,組織コード VARCHAR(4)" & _
"	,primary key(請求先,経過月)" & _
")"
Call SSTransfer( "得意先集計", Query )

' ************************************************
' 社員変更履歴
' ************************************************
Query = _
"create table 社員変更履歴 (" & _
"	社員コード VARCHAR(4)" & _
"	,氏名 VARCHAR(50)" & _
"	,フリガナ VARCHAR(50)" & _
"	,所属 VARCHAR(4)" & _
"	,性別 INT" & _
"	,作成日 DATE" & _
"	,更新日 DATE" & _
"	,給与 INT" & _
"	,手当 INT" & _
"	,管理者 VARCHAR(4)" & _
"	,生年月日 DATE" & _
")"
Call SSTransfer( "社員変更履歴", Query )

' ************************************************
' ビュー
' ************************************************
Query = _
"create view V_商品一覧 as" & _
"	SELECT 商品マスタ.商品コード" & _
"	, 商品マスタ.商品名" & _
"	, 商品マスタ.販売単価" & _
"	, 商品分類マスタ.商品分類" & _
"	, 商品分類マスタ.名称 AS 分類名" & _
"	, 商品マスタ.商品区分" & _
"	, コード名称マスタ.名称 AS 区分名" & _
" from" & _
"	(商品マスタ LEFT JOIN 商品分類マスタ" & _
"	ON 商品マスタ.商品分類 = 商品分類マスタ.商品分類" & _
"	) LEFT JOIN コード名称マスタ" & _
"	ON 商品マスタ.商品区分 = コード名称マスタ.コード" & _
" where" & _
"	コード名称マスタ.区分 = 3 and 削除フラグ is NULL"
RunSS( Query )

Query = _
"create view V_売上日付 as" & _
"	SELECT コントロールマスタ.売上日付" & _
"	FROM コントロールマスタ" & _
"	WHERE コントロールマスタ.キー = '1'"
RunSS( Query )

Query = _
"create view V_得意先台帳 as" & _
"	SELECT 取引データ.取引先コード" & _
"	, 得意先マスタ.得意先名" & _
"	, 取引データ.取引日付" & _
"	, 取引データ.取引区分" & _
"	, 取引データ.伝票番号" & _
"	, 取引データ.行" & _
"	, 取引データ.商品コード" & _
"	, 商品マスタ.商品名" & _
"	, 取引データ.数量" & _
"	, 取引データ.単価" & _
"	, 取引データ.金額" & _
" from" & _
"	(取引データ INNER JOIN 商品マスタ" & _
"	ON 取引データ.商品コード=商品マスタ.商品コード" & _
"	) INNER JOIN 得意先マスタ" & _
"	ON 取引データ.取引先コード=得意先マスタ.得意先コード" & _
" where" & _
"	取引データ.取引区分 = '10'"
RunSS( Query )

Query = _
"create view V_社員一覧 as" & _
" select 社員コード" & _
"	,氏名" & _
"	,フリガナ" & _
"	,名称1.名称 as 性別" & _
"	,所属" & _
"	,名称2.名称 as 所属名" & _
" from 社員マスタ" & _
"	,コード名称マスタ 名称1" & _
"	,コード名称マスタ 名称2" & _
" where 性別 = CAST(名称1.コード as int4)" & _
"   and 名称1.区分 = 1" & _
"   and 所属 = 名称2.コード" & _
"   and 名称2.区分 = 2"
RunSS( Query )

' ************************************************
' 終了
' ************************************************

Cn2.Close
Cn.Close

Wscript.Echo "処理が終了しました"

' ************************************************
' PS 転送
' ************************************************
function SSTransfer( strTable, QueryCreate )

	Dim Query

	Query = "drop table " & strTable
	RunSS( Query )

	RunSS( QueryCreate )

	Query = "insert into " & strTable & " " & strConnectPS & _
	" select * from " & strTable
	RunMdb( 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

' ************************************************
' PS 実行
' ************************************************
function RunSS( 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 文を使って、Postgres に接続して実行します。
strConnectPS2 = _
	"Provider=MSDASQL" & _
	";Driver=" & strTarget & _
	";Servername=" & strServer & _
	";Port=" & strPort  & _
	";DATABASE=" & strDB & _
	";UID=" & strUser & _ 
	";PWD=" & strPass & _ 
	";" 


処理手順(2) : インポート

現実には、MDB へ接続して行うエクスポート処理となります。Microsoft Access では、in 構文によって、Access 内から ODBC を使って直接他のデータベースのテーブルを内部デーブルのように参照できるので、
insert into [PostgreSQLのテーブル] select * from [MDB内のテーブル] というSQL文を実行してエクスポートが可能です。
strConnectMdb = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & strMdbPath & ";"

strConnectPS = _
	" in '' [ODBC" & _
	";Driver=" & strTarget & _
	";Servername=" & strServer & _
	";Port=" & strPort  & _
	";DATABASE=" & strDB & _
	";UID=" & strUser & _ 
	";PWD=" & strPass & _ 
	";]" 


処理手順(3) : VIEW作成

VIEW の作成は、PostgreSQL への接続で行います


関連する記事


posted by lightbox at 2014-05-08 15:32 | VBS + ADO | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり