2010年05月04日


VBScript : ADO経由のOracle接続で CSV出力と日付更新

TO_DATE 関数を使わないとエラーになります。

関連する Microsoft のリンク

接続 プロバイダ
CursorLocationEnum
Connection オブジェクトのプロパティ、メソッド、およびイベント
Recordset オブジェクトのプロパティ、メソッド、およびイベント


関連する 記事

PHP : COM 経由の Oracle アクセスの簡単なコード


' ***********************************************************
' SQLExpress 2005 / ODBC / {SQL Server}
' ADO : 文字列更新
' FileSystemObject : CSV出力
' ***********************************************************
strTarget = "Oracle11gMS"
strUser = "lightbox"
strPass = "LIGHTBOX"

' ***********************************************************
' ADO + FileSystemObject
' ***********************************************************
Set Cn = CreateObject( "ADODB.Connection" )
Set Rs = CreateObject( "ADODB.Recordset" )
Set Fso = CreateObject( "Scripting.FileSystemObject" )

' **********************************************************
' 接続文字列
' **********************************************************
ConnectionString = _
	"Provider=MSDASQL" & _
	";DSN=" & strTarget & _
	";UID=" & strUser & _ 
	";PWD=" & strPass & _ 
	";" 

' **********************************************************
' 接続
' クライアントカーソル(3)を使う事が推奨されます
' **********************************************************
Cn.CursorLocation = 3
on error resume next
Cn.Open ConnectionString
if Err.Number <> 0 then
	WScript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

Query = "select * from 社員マスタ"

' **********************************************************
' レコードセット
' オブジェクト更新時はレコード単位の共有的ロック(3)を
' 使用します( デフォルトでは更新できません )
' ※ デフォルトでも SQLによる更新は可能です
' **********************************************************
'Rs.LockType = 3
on error resume next
Rs.Open Query, Cn
if Err.Number <> 0 then
	Cn.Close
	Wscript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

' **********************************************************
' 出力ファイルオープン
' **********************************************************
Set Csv = Fso.CreateTextFile( "社員マスタ.csv", True )

' **********************************************************
' タイトル出力
' **********************************************************
Buffer = ""
' 社員コードと氏名のみ
For i = 0 to 1
	if Buffer <> "" then
		Buffer = Buffer & ","
	end if
	Buffer = Buffer & Rs.Fields(i).Name
Next
Csv.WriteLine Buffer

' **********************************************************
' データ出力
' **********************************************************
UpdateCnt = 0
Do While not Rs.EOF
	Buffer = ""
	Buffer = Buffer & Rs.Fields("社員コード").Value
	Buffer = Buffer & "," & Rs.Fields("氏名").Value

	' 更新
	strDay = (UpdateCnt mod 10) + 1
	Query = "update 社員マスタ set 生年月日 = TO_DATE('2005/01/" & strDay & "')"
	Query = Query & " where 社員コード = '" 
	Query = Query & Rs.Fields("社員コード").Value
	Query = Query & "'"
	Cn.Execute( Query )

	Csv.WriteLine Buffer
	Rs.MoveNext
	UpdateCnt = UpdateCnt + 1
Loop

' **********************************************************
' ファイルクローズ
' **********************************************************
Csv.Close
' **********************************************************
' レコードセットクローズ
' **********************************************************
Rs.Close
' **********************************************************
' 接続解除
' **********************************************************
Cn.Close



タグ:VBScript Oracle ADO
posted by at 2010-05-04 11:04 | VBScript | このブログの読者になる | 更新情報をチェックする

2009年07月12日


VBScript の Split

VBScript では、動的に配列作るのは少しだけ面倒なので、
Split で作成するのが便利です
str = "A,B,C"
aData = Split(str, ",")

result = ""

For I = 0 To Ubound(aData)
	If result <> "" Then
		result = result & ","
	End If
	result = result & aData(I)

Next

MsgBox( result )


タグ:String
posted by at 2009-07-12 21:01 | VBScript | このブログの読者になる | 更新情報をチェックする

2009年07月05日


コントロールブレイクのセオリー

0001,A01,100
0001,A01,200
0001,A03,300
0002,A03,400

上記 CSV データを読み込んで処理します。
データの意味は社員コード、商品分類、売上金額です。
結果は以下のようになります
( 商品分類合計と得意先合計の出力 )
0001	A01	300
0001	A03	300
0001		600
0002	A03	400
0002		400

Set Fso = CreateObject( "Scripting.FileSystemObject" )

strPath1 = "data.csv"
strPath2 = "sum.txt"

Set objHandle1 = Fso.OpenTextFile( strPath1, 1 )
Set objHandle2 = Fso.OpenTextFile( strPath2, 2, True )

sBreak1 = ""
sBreak2 = ""
nSum1 = 0
nSum2 = 0

sLineData = ""

Do While not objHandle1.AtEndOfStream
	Buffer = objHandle1.ReadLine
	aData = Split(Buffer,",")

	' 初回以外
	if sBreak1 <> "" then
		' 最上位レベルのブレイク
		if sBreak1 <> aData(0) then
			' 商品分類計の処理
			sLineData = sBreak1 & vbTab & sBreak2 & vbTab & nSum2
			nSum2 = 0
			objHandle2.WriteLine sLineData

			' 得意先計の処理
			sLineData = sBreak1 & vbTab & "" & vbTab & nSum1
			nSum1 = 0
			objHandle2.WriteLine sLineData
		else
			' 下位レベルのブレイク
			if sBreak2 <> aData(1) then
				' 商品分類計の処理
				sLineData = sBreak1 & vbTab & sBreak2 & vbTab & nSum2
				nSum2 = 0
				objHandle2.WriteLine sLineData
			end if
		end if
	end if

	nSum1 = nSum1 + CLng( aData(2) )	' 得意先計
	nSum2 = nSum2 + CLng( aData(2) )	' 商品分類計

	' 次のデータが読まれる前に、現在のデータを保存
	sBreak1 = aData(0)	' 得意先
	sBreak2 = aData(1)	' 商品分類

Loop


' **********************************************************
' データ終了で最終ブレイク
' **********************************************************
if sBreak1 <> "" then
	' 商品分類計の処理
	sLineData = sBreak1 & vbTab & sBreak2 & vbTab & nSum2
	objHandle2.WriteLine sLineData

	' 得意先計の処理
	sLineData = sBreak1 & vbTab & "" & vbTab & nSum1
	objHandle2.WriteLine sLineData
end if

Call objHandle2.Close()
Call objHandle1.Close()

注意事項
  • AtEndOfStream は、最後のデータを読むと True になります
  • ブレイクキーは次のデータが読まれる直前に保存します
  • 得意先がブレイクすると、商品分類は無条件にブレイクします
  • ブレイク処理が終了した場合、該当する集計データはクリアします
  • 最終ブレイクはループの外で発生します
  • 0件データを想定する必要があります


posted by at 2009-07-05 00:26 | VBScript | このブログの読者になる | 更新情報をチェックする

2009年06月10日


デスクトップのショートカットのアイコン情報を取得する


ブラウザでダウンロード

目的とは直接関係ありませんが、処理結果を容易に確認できるように、
Cscript.exe で強制的に実行するようになっています。

※ この後、dll/exe等からアイコンを画像化 を使用する予定になっています

Crun が実行されると、自分自身を実行しているのが Wscript.exe か
Cscript.exe か判断して、Cscript.exe で無い場合は Cscript.exe で
再度実行し、自分自身は終了します
' **********************************************************
' 1) デスクトップ一覧
' 2) 一覧中のショートカットからアイコン情報を取得
' **********************************************************
Call Crun()

Set Shell = WScript.CreateObject( "Shell.Application" )
Set WshShell = WScript.CreateObject( "WScript.Shell" )

' デスクトップ
Set objFolder = Shell.NameSpace( 0 )

Set objFolderItems = objFolder.Items()
' 一覧の数
nCount = objFolderItems.Count

' デスクトップ一覧の列挙
For i = 0 to nCount - 1

	strPath = objFolderItems.Item(i).Path
	' パスをピリオドで分解
	aData  = Split( strPath, "." )
	' 配列の上限値より、一番左端にある拡張子を取得
	strTarget = aData( Ubound( aData ) )
	' 大文字に変換
	strTarget = Ucase( strTarget )

	if strTarget = "LNK" then
		Set oShellLink = WshShell.CreateShortcut(strPath)
		strTarget = oShellLink.IconLocation
		strTarget = WshShell.ExpandEnvironmentStrings(strTarget)
		if strTarget = ",0" then
			' アイコンは、TargetPath の 0 番目のアイコンを使用
			Wscript.Echo oShellLink.TargetPath
		else
			' アイコンは、strTarget を , で分解して抽出
			Wscript.Echo strTarget
		end if
	end if

Next

' **********************************************************
' Cscript.exe で実行を強制
' ウィンドウをアクティブにし、最大化ウィンドウとして表示(3)
' Cscript.exe の実行終了後 pause で一時停止
' **********************************************************
Function Crun( )

	Dim str,WshShell

	str = WScript.FullName
	str = Right( str, 11 )
	str = Ucase( str )
	if str <> "CSCRIPT.EXE" then
		str = WScript.ScriptFullName

		Set WshShell = CreateObject( "WScript.Shell" )

		strParam = " "
		For I = 0 to Wscript.Arguments.Count - 1
			if instr(Wscript.Arguments(I), " ") < 1 then
				strParam = strParam & Wscript.Arguments(I) & " "
			else
				strParam = strParam & Dd(Wscript.Arguments(I)) & " "
			end if
		Next
		Call WshShell.Run( "cmd.exe /c cscript.exe " & Dd(str) & strParam & " & pause", 3 )
		WScript.Quit
	end if

End Function
' **********************************************************
' 文字列を " で囲む関数
' **********************************************************
Function Dd( strValue )

	Dd = """" & strValue & """"

End function

■ 関連する記事
Cscript.exe で実行を強制


タグ:WSH
posted by at 2009-06-10 16:01 | VBScript | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します