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

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

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

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

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


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

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

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

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

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