#!/usr/local/bin/perl # ソートの練習(2) # テストデータをプログラム内で設定し、3つのソートキーで並び替えをして集計させる # id=sort2.cgi # update. 98.12.14 # 日本語コード変換ライブラリ(v2.0)の指定 # &ReadParse命令で、$in{ }の変数にフォーム入力データが格納される require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse; # 設置するURLを設定 $reload = 'http://www0.kumagaya.or.jp/cgi-bin/users/chichibu/sort2.cgi'; $bkhmpg = "http://www.kumagaya.or.jp/~chichibu/cgi1.html"; $bunruimei[0]="指定なし"; $bunruimei[1]="店舗"; $bunruimei[2]="売場"; $bunruimei[3]="月次"; $iro="0000FF"; #ブルー $iro2="brown"; #################################### # # # メインルーチン(処理の分岐) # # # #################################### # キーデータをとる $key1=$in{'key1'}; $key2=$in{'key2'}; $key3=$in{'key3'}; if ($in{'action'} eq 'main') { &main; $sw=0 ;&display_rtn;} elsif ($in{'action'} eq 'narabi') { &narabi; } else { &first } #################################### # # # 最初に表示する画面処理 # # # #################################### sub first { # 初期値の設定 # 第一キーは必須 $in{'key1'}=1; $in{'key2'}=0; $in{'key3'}=0; &read; &main; # 最初はそのまま表示する &display_rtn; } # end of first ############################################# # # # データを読む            # # # ############################################# sub read { # データをここで設定する、実際はこのルーチンで配列にセットする $data[0]="秩父店\t食品\t9月\t100000"; $data[1]="上越店\t婦人\t9月\t500000"; $data[2]="和歌山店\t食品\t9月\t200000"; $data[3]="上越店\t食品\t9月\t900000"; $data[4]="秩父店\t食品\t10月\t1000000"; $data[5]="和歌山店\t婦人\t9月\t700000"; $data[6]="和歌山店\t食品\t10月\t800000"; $data[7]="上越店\t婦人\t10月\t300000"; $data[8]="秩父店\t婦人\t9月\t200000"; $data[9]="和歌山店\t食品\t11月\t600000"; $data[10]="秩父店\t食品\t11月\t2000000"; $data[11]="和歌山店\t食品\t12月\t150000"; $data[12]="上越店\t婦人\t11月\t850000"; $data[13]="秩父店\t食品\t12月\t350000"; $data[14]="和歌山店\t婦人\t10月\t980000"; } # end of read ############################################# # # # 生徒名簿表示             # # # ############################################# sub main { # 表示出力処理 print "Content-type: text/html\n\n"; print < ソートの練習(2)

売上集計表

EOM # ボタンを横に並べる print ''; # 上段 print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''."\n"; # 下段 print ''; print '
   第1キー   第2キー   第3キー
'; print '
' . "\n"; print ''."\n"; print '' . "\n"; print '
   '; $sels0="";$sels1="";$sels2="";$sels3=""; if ($key1 == 0) {$sels0 = "SELECTED";} elsif ($key1 == 1) {$sels1 = "SELECTED"; } elsif ($key1 == 2) {$sels2 = "SELECTED"; } elsif ($key1 == 3) {$sels3 = "SELECTED"; } else {$sels1 = "SELECTED"; } print ''. "\n"; print '   '; $sels0="";$sels1="";$sels2="";$sels3=""; if ($key2 == 0) {$sels0 = "SELECTED";} elsif ($key2 == 1) {$sels1 = "SELECTED"; } elsif ($key2 == 2) {$sels2 = "SELECTED"; } elsif ($key2 == 3) {$sels3 = "SELECTED"; } else {$sels0 = "SELECTED"; } print ''. "\n"; print '   '; $sels0="";$sels1="";$sels2="";$sels3=""; if ($key3 == 0) {$sels0 = "SELECTED";} elsif ($key3 == 1) {$sels1 = "SELECTED"; } elsif ($key3 == 2) {$sels2 = "SELECTED"; } elsif ($key3 == 3) {$sels3 = "SELECTED"; } else {$sels0 = "SELECTED"; } print ''. "\n"; print '
'."\n"; print ''. "\n"; } # end of main ########################## #             # #  初期値表示ルーチン  # #             # ########################## sub display_rtn { print "\n"; print "\n"; # 合計値 $total=0; foreach (@data) { ($dt1,$dt2,$dt3,$dt4)=split(/\t/,$_); print ''; print ''; print ''; print ''; # 加算 $total=$total + $dt4; # 3桁カンマ編集 $subdt=$dt4; &kanma; $dt4=$subdt; print ''; print ''."\n"; } # end of foreach # 合計表示 print ''; print ''; $subdt=$total; &kanma; $total=$subdt; print ''; print ''."\n"; print '
店舗売場月次売上
'.$dt1.''.$dt2.''.$dt3.''.$dt4.'
合 計'.$total.'
'; print "\n"; } # end of display_rtn ########################## #            # #  集計値表示ルーチン  # #            # ########################## sub display_rtn2 { # キーの数により表の大きさを調整する $a=0; if ($key1 > 0) { $a++ } if ($key2 > 0) { $a++ } if ($key3 > 0) { $a++ } if ($a == 3) { $haba = "100%" } elsif ($a == 2) { $haba = "70%" } else { $haba = "50%" } print "\n"; print ""; # 第1キー if ($key1 == 1) { print "" } elsif ($key1 == 2) { print "" } elsif ($key1 == 3) { print "" } # 第2キー if ($key2 == 1) { print "" } elsif ($key2 == 2) { print "" } elsif ($key2 == 3) { print "" } # 第3キー if ($key3 == 1) { print "" } elsif ($key3 == 2) { print "" } elsif ($key3 == 3) { print "" } print ""; print "\n"; # 合計値 $total=0; foreach (@data) { # キー自体を分解する ($dt1,$dt2,$dt3)=split(/\t/,$_); # 長さ調節用の*をカットする $dt1=~ s/#//g; $dt2=~ s/#//g; $dt3=~ s/#//g; print ''; print ''; if ($dt2 ne "") { print ''; } if ($dt3 ne "") { print ''; } # 売上 # 加算 $total=$total + $tb{$_}; # 3桁カンマ編集 $subdt=$tb{$_}; &kanma; $dt4=$subdt; print ''; print ''."\n"; } # end of foreach # 合計表示 print ''; # 横わくチェック $cs=1; if ($key2 > 0) { $cs++ } if ($key3 > 0) { $cs++ } print ''; $subdt=$total; &kanma; $total=$subdt; print ''; print ''."\n"; print '
店舗売場月次店舗売場月次店舗売場月次売上
'.$dt1.''.$dt2.''.$dt3.''.$dt4.'
合 計'.$total.'
'; print "\n"; } # end of display_rtn2 ##################### # 並び替え処理 # ##################### sub narabi { &read; # キーの指定がない場合は元の表示にする if ($key1 == 0 && $key2 == 0 && $key3 == 0) { &main; &display_rtn } else { &keyset; &main; # 連想配列からの表示を指示する &display_rtn2; } # else } # narabi ##################### # 連想配列キーセット # ##################### sub keyset { # データを項目ごとに分ける #$i=0; foreach (@data) { ($dt1,$dt2,$dt3,$dt4)=split(/\t/,$_); # 指定キーにより、連想配列のキーをセットする # キーの長さを揃える # 店舗は漢字6文字 $dt1=substr($dt1."############",0,12); # 売場は漢字4文字 $dt2=substr($dt2."########",0,8); # 月をそのまま付けると文字順になってしまうので数字3桁で並ぶように工夫をした $dt3="##".$dt3; # 末尾3桁をとる $dt3=substr($dt3,-4,6); $key=""; # 区切り記号を\tとする # 第一キー if ($in{'key1'} == 1) { $key=$dt1 } elsif ($in{'key1'} == 2) { $key=$dt2 } elsif ($in{'key1'} == 3) { $key=$dt3 } # 第2キー if ($in{'key2'} == 1) { $key="$key\t$dt1" } elsif ($in{'key2'} == 2) { $key="$key\t$dt2" } elsif ($in{'key2'} == 3) { $key="$key\t$dt3" } # 第3キー if ($in{'key3'} == 1) { $key="$key\t$dt1" } elsif ($in{'key3'} == 2) { $key="$key\t$dt2" } elsif ($in{'key3'} == 3) { $key="$key\t$dt3" } # 連想配列に売上を加算する $tb{$key}=$tb{$key}+$dt4; } # end of foreach # ここがポイントです、組み合わされたキーの部分をソートし配列に入れる @key=keys(%tb); @data=(); @data=sort sortsb @key; } # end of keyset; ##################### # 連想配列のキー部をソートする ##################### # 文字列を昇順(降順は$b cmp $a)にソートする sub sortsb { $a cmp $b; } ##################### # 3桁区切りのカンマを入れる ##################### sub kanma { @b = split(//,$subdt); $i=@b; $i--; $c=0; $subdt=""; for ($j=$i ;$j>=0;$j--) { $c++; $subdt=$b[$j].$subdt; if ($c ==3 && $j>0) {$subdt=",$subdt";$c=0} } # end of for } # end of sub ################ end of script ###################