#!/usr/local/bin/perl # 注文書入力用商品マスタの保守(掲示板形式) # id=syohino.cgi # update. 99.3.29 # 日本語コード変換ライブラリ(v2.0)の指定 # &ReadParse命令で、$in{ }の変数にフォーム入力データが格納される require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse; # 設置するURLを設定 $reload = 'http://www0.kumagaya.or.jp/cgi-bin/users/chichibu/syohino.cgi'; $bkhmpg = "http://www.kumagaya.or.jp/~chichibu/cgi1.html"; $file = "/dialup/chichibu/cgi-bin/syohino.dat"; # パスワードを設定する場合のみ(半角ならば10文字以内) $pwd=""; # データ確認デバッグモード(通常は$test=""、各画面で変数状態を見たいときは"on") $test=""; # 分類名配列 $bunruimei[1]="清酒"; $bunruimei[2]="ワイン"; $bunruimei[3]="特産品"; $bunruimei[4]="その他"; # 分類毎の表示色 $buncol[1]="#000000"; # 黒 $buncol[2]="#0000FF"; # 青 $buncol[3]="#007700"; # 緑 $buncol[4]="#FF00FF"; # ピンク # 備考欄の最大文字数 $mojisu=100; ############################################# # # # ヘルプ画面を表示する          # # # ############################################# sub help { # 表示出力処理 print "Content-type: text/html\n\n"; print < 商品マスタメンテの説明 EOM print ''; print ''; print "\n"; print ''; print '
項目説明
'; print "機能について\n"; print ''; print "(1) 登録後に訂正や削除ができます、訂正削除パスワードの設定が必要かは任意です。\n"; print '
'; print "(2) 表示の順序を変更することができます、表示順序に何も設定しなければ後に追加されます、表示順序番号は10単位になっていますからこの番号を変更することにより移動できます。\n"; print '
'; print "(3) 商品名は必須にしてあります。\n"; print '
'; print "(4) 表示は明細と1列と2列形式、また1画面に表示させる行数も変えることができます。それから記入時に設定した分類を指定することができます。\n"; print '
'."\n"; # 戻る print '
'; print '
' . "\n"; print '' . "\n"; &hidpara; print '' . "\n"; print '
'. "\n"; print '
'; } #################################### # # # メインルーチン(処理の分岐) # # # #################################### # 全体の流れを決定する $page=$in{'page'}; if ($in{'action'} eq 'main') { &main; } elsif ($in{'action'} eq 'kinyu') { &kinyu; } elsif ($in{'action'} eq 'help') { &help; } elsif ($in{'action'} eq 'check') { ✓ &kakunin; } elsif ($in{'action'} eq 'update') { &update; } elsif ($in{'action'} eq 'meisai') { &meisai; } elsif ($in{'action'} eq 'next') { &next; } elsif ($in{'action'} eq 'back') { &back; } # 詳細表示画面 elsif ($in{'action'} eq 'teisei') {&teisei; &main;} elsif ($in{'action'} eq 'nexts') { &nexts; } elsif ($in{'action'} eq 'backs') { &backs; } else { &first; } # なくても良いが最終出口を示す exit; ############################################# # # # データを読む           # # # ############################################# sub read { ###### if ($bunrui == 0) {$bunrui=9} ###### # データを読み各連想配列に入れる #   1 2  3 4     5 6  7 8   9 # 商品番号、表示順、商品名、商品説明、価格、種類、登録日、開始日、終了日 open(DB,"$file"); flock(DB,2); $j=0; @data=(); while () { $bundt = $_; &bunkai; # 9は全部、他は指定分類のみ、指定なしも全件 if ($bunrui == 9) { $data[$j]=$_ ;$j++} elsif ($bunrui == $syurui) { $data[$j]=$_ ;$j++} } # end of while flock(DB,8); close(DB); # データ数 $cnt=@data; } # end of read ############################################# # # # 登録データを読む(訂正削除用配列)  # # # ############################################# sub read2 { # データを読み各連想配列に加算する open(DB,"$file"); flock(DB,2); @data=; flock(DB,8); close(DB); # データ数 $cnt=@data; # 各レコードを連番をキーにした連想配列にセットする # 商品番号をキーにすると単一にはならない場合があるので $idx=0; foreach (@data) { # 連想配列にセット chop($_); $idxdt{$idx}= $_; # カウントアップ $idx++; } # end of foreach } # end of read2 ############################################# # # # データを読む(全件)          # # # ############################################# sub read3 { open(DB,"$file"); flock(DB,2); @data=; flock(DB,8); close(DB); } # end of read3 ######################## #            # # 項目分解ルーチン   # #            # ######################## sub bunkai { #   1 2  3 4     5 6  7 8   9 # 商品番号、表示順、商品名、商品説明、価格、種類、登録日、開始日、終了日 ($syono,$seqno,$hinmei,$biko,$kakaku,$syurui,$tymd,$ymd1,$ymd2) = split(/\t/,$bundt); # 内容の改行を元に戻す $biko =~ s/&k/\n/g; # 表示用に変換する $biko2 = $biko; $biko2 =~ s/\n/
/g; } # end of bunkai ############################################# # # # 最初に処理するルーチン         # # # ############################################# sub first { # 初期値セット $in{'page'}=1; # 内容は全件 $in{'bunrui'}=9; # 表示は明細 $in{'hyoji'}=3; $in{'gyosu'}=10 ; &main; } # end of first ############################################# # # # メイン処理画面を表示する    # # # ############################################# sub main { # 表示用変数 $page = $in{'page'}; $bunrui = $in{'bunrui'} ; $hyoji = $in{'hyoji'} ; $gyosu = $in{'gyosu'} ; &read; # ページ数計算 if ($hyoji == 2) { $page_max = ($cnt /(2*$gyosu)) + 1;} else { $page_max = ($cnt / $gyosu) + 1;} # 整数部をとりだす ($page_max,$dummy)=split(/\./,$page_max); # 表示出力処理 print "Content-type: text/html\n\n"; print < 商品マスタの保守 EOM print ''; print ''; print ''; print "\n"; print ''; print "\n"; print "\n"; print '
'; print ''."\n"; print '商品マスタの保守'."\n"; print '   登録件数表示頁最終頁
'; print '
' . "\n"; print '' . "\n"; print '' . "\n"; &hidpara; print '
'; print '
'."\n"; print '
' . "\n"; print '' . "\n"; print '' . "\n"; &hidpara; print '
'. "\n"; print '
'."\n"; print '
' . "\n"; print '' . "\n"; print '
' . "\n"; print '
$cnt$page$page_max
'."\n"; # 前頁表示 # ボタンを並べる # 上段 print ''; print ''; # 前頁表示 print ''; print ''; # 次頁表示 print ''; print ''; print ''; print '
'; if ($page == 1) { print ' '; } else { print '
' . "\n"; print '' . "\n"; &hidpara; print '' . "\n"; print '
'; } # end of if print '
  '; if ($page == $page_max) { print ' '; } else { print '
' . "\n"; print '' . "\n"; &hidpara; print '' . "\n"; print '
'. "\n"; } # end of if print '
  '; print '
' . "\n"; print ''."\n"; print '' . "\n"; print '' . "\n"; print '
   '; $sels1="";$sels2="";$sels3="";$sels4="";$sels9=""; if ($bunrui == 9) {$sels9 = "SELECTED";} elsif ($bunrui == 1) {$sels1 = "SELECTED"; } elsif ($bunrui == 2) {$sels2 = "SELECTED"; } elsif ($bunrui == 3) {$sels3 = "SELECTED"; } elsif ($bunrui == 4) {$sels4 = "SELECTED"; } else {$sels9 = "SELECTED"; } print ''. "\n"; print '   '; $selh1="";$selh2="";$selh3=""; if ($hyoji == 1) {$selh1 = "SELECTED";} elsif ($hyoji == 2) {$selh2 = "SELECTED"; } else {$selh3 = "SELECTED"; } print ''. "\n"; print '   '; $sel5="";$sel10="";$sel30="";$sel40="";$sel50=""; if ($gyosu == 5) {$sel5 = "SELECTED";} elsif ($gyosu == 10) {$sel10 = "SELECTED"; } elsif ($gyosu == 30) {$sel30 = "SELECTED"; } elsif ($gyosu == 40) {$sel40 = "SELECTED"; } elsif ($gyosu == 50) {$sel50 = "SELECTED"; } else {$sel20 = "SELECTED"; } print ''. "\n"; print '   
'."\n"; print ''. "\n"; # 該当データが0件の場合 if ($cnt == 0) { print '

'; print '
該当データは0件です、選択内容を変えてご覧ください
'."\n"; return } # end of if # 最初は詳細形式を表示する if ($hyoji == 1) { &disp1; } elsif ($hyoji == 2) { &disp2; } else { &disp3; } } # end of main ################################# # hiddenパラメータ共通項目  # ################################# sub hidpara { print ''."\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; } # end of hidpara ########################## #            # #  詳細表示ルーチン  # #            # ########################## sub disp3 { print "\n"; print "\n"; # 行数分だけ繰り返す for($i=1; $i<=$gyosu; $i++) { # 1列目はページカウンタ*行数+$i $lno=$gyosu * ($page - 1) + $i; $no=$lno-1; # 項目分解処理 $bundt=$data[$no]; &bunkai; # 分類別色 $iro=$buncol[$bunrui]; print ''; print ''."\n"; # 出力順序 print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; # 最終データを表示したら抜ける if ($lno >= $cnt) { last } } # end of for print '
表示順序商品番号商品名商品説明価格分類開始日
終了日
登録日
'; $act="meisai"; print ''.$lno.''; print '
'."\n"; if ($test eq "on") { print '
'.$bundt.''."\n"; } # テスト表示 print '
'.$seqno.''.$syono.''.$hinmei.''.$biko2.''.$kakaku.''.$bunruimei[$syurui].''.$ymd1.'
'.$ymd2.'
'.$tymd.'
'; print "\n"; } # end of disp3 ########################## #            # #  1列表示ルーチン  # #            # ########################## sub disp1 { print "\n"; print "\n"; # 行数分だけ繰り返す for($i=1; $i<=$gyosu; $i++) { # 項目分解処理 # 1列目はページカウンタ*行数+$i $lno=$gyosu * ($page - 1) + $i; $no=$lno-1; # 項目分解処理 $bundt=$data[$no]; &bunkai; # 分類別色 $iro=$buncol[$bunrui]; print ''; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''; # 最終データを表示したら抜ける if ($lno >= $cnt) { last } } # end of for print '
商品番号商品名価格開始日
終了日
'; $act="meisai"; print ''.$lno.''; print '
'."\n"; print '
'.$syono.''.$hinmei.''.$kakaku.''.$ymd1.'
'.$ymd2.'
'; print "\n"; } # end of disp1 ########################## #            # #  2列表示ルーチン  # #            # ########################## sub disp2 { print "\n"; print "\n"; # 行数分だけ繰り返す for($i=1; $i<=$gyosu; $i++) { # 1列目はページカウンタ*2*行数+$i $lno=2 * $gyosu * ($page - 1) + $i; $no=$lno-1; # 項目分解処理 $bundt=$data[$no]; &bunkai; # 分類別色 $iro=$buncol[$bunrui]; print ''; print ''."\n"; # 2列目は1列目+行数 $rno=$lno + $gyosu; if ($rno <= $cnt) { $no=$rno-1; # 項目分解処理 $bundt=$data[$no]; &bunkai; print ''."\n"; print ''; } # end of if # 最終データを表示したら抜ける if ($lno >= $cnt) { last } } # end of for print '
商品名商品名
'; $act="meisai"; print ''.$lno.''; print '
'."\n"; print '
'.$hinmei.''; $act="meisai"; print ''.$rno.''; print '
'."\n"; print '
'.$hinmei.'
'; print "\n"; } # end of disp2 ####################################### # # # 新規記入処理          # # # ####################################### sub kinyu { print "Content-type: text/html\n\n"; print < 商品マスタの新規登録

商品マスタの新規登録

EOM # 外側の飾り線(画面の設定によってはわくとして表示しないことがある) print ''; print ''; print '' . "\n"; print '' . "\n"; print '表示順序 ' . "\n"; print '   (最後に追加する場合は設定なし)' . "\n"; print '

'; print '商品番号 
' . "\n"; print '
'; print '記入内容はどこに入れますか? '. "\n"; print '

'; print '商品名 
' . "\n"; print '
'; print '商品説明(漢字の場合100文字以内)'; print '
'; print '' . "\n"; print '

'; print '価格 
' . "\n"; print '
'; # 登録日セット &nichiji; print '取扱開始日 
' . "\n"; print '
'; print '取扱終了日 
' . "\n"; print '
'; if ($pwd ne "") { print 'パスワード 
' . "\n"; print '
'; } # end of if print '
'; print '  ' . "\n"; print '
'; # 共通データ渡し &hidpara; # 登録日セット &nichiji; print '' . "\n"; print ''. "\n"; # 戻る print '
'; print '' . "\n"; print '' . "\n"; &hidpara; print '' . "\n"; print ''. "\n"; # 外側の飾り線 print '
'; print ''. "\n"; } # end of kinyu ############################ # 登録日セットルーチン # ############################ sub nichiji { ($byo,$fun,$ji,$dd,$mm,$yy,$yobi) = localtime; $mm++; # 2桁化 $mm = sprintf("%.2d",$mm); $dd = sprintf("%.2d",$dd); $ji = sprintf("%.2d",$ji); $fun = sprintf("%.2d",$fun); $byo = sprintf("%.2d",$byo); # 西暦4桁処理 if ($yy < 70) { $yy = $yy + 2000;} else { $yy = $yy + 1900;} # 登録日時 $tymd=$yy.$mm.$dd; } # end of sub ########################################## # # # 入力されたデータのチェックルーチン # # # ########################################## sub check { # なにも入力がない場合 if ($in{'hinmei'} eq "") { &error(2); } # 開始日と終了日の関係がおかしい場合 if ($in{'ymd1'} > $in{'ymd2'}) { &error(4); } # パスワードチェック if ($pwd ne "" && $in{'passwd'} ne $pwd) { &error(3); } } # end of check ############################################# # # # 入力データ登録確認画面ルーチン     # # # ############################################# sub kakunin { print "Content-type: text/html\n\n"; print < 商品マスタ入力データの確認

商品マスタ入力データの確認


EOM # フォーム入力データ &form_data; print ''; # 分類名 if ($seqno == 999999) { $msg="最後に追加" } else { $msg = $seqno } print ""."\n"; print ""."\n"; print ""."\n"; print ""."\n"; # 表示用に改行コードを<BR>タグにする $biko2 = $biko; $biko2 =~ s/&k/
/g; print ""."\n"; print ""."\n"; print ""."\n"; print ""."\n"; if ($pwd ne "") { print ""."\n"; } # end of if print "
表示順序$msg
商品番号$syono
分類$bunruimei[$syurui]
商品名$hinmei
商品説明$biko2
価格$kakaku
開始日$ymd1
終了日$ymd2
パスワード$passwd
"."\n"; # 確認 print '
' . "\n"; print '' . "\n"; # データ追加 $value = "$syono\t$seqno\t$hinmei\t$biko\t$kakaku\t$syurui\t$tymd\t$ymd1\t$ymd2\n"; if ($test eq "on") { print "追加データ=$value\n"; } &update; print '
'; print ''."\n"; print '
'."\n"; &hidpara; print "
\n"; print "\n"; print "\n"; } # end of kakunin ############################################# # # # フォーム入力データセットルーチン    # # # ############################################# sub form_data { $syono=$in{'syono'}; # フォームから未入力ならば最大値を設定する $seqno=$in{'seqno'}; if ($seqno eq "") { $seqno = 999999 } # 削除パスワードならスルーさせる elsif ($seqno eq "clr") { } else { # 全角を半角にする $ckhan=$seqno; &hankaku; $seqno=$ckhan; } # end of if $hinmei=$in{'hinmei'}; $kakaku=$in{'kakaku'}; # 全角を半角にする $ckhan=$kakaku; &hankaku; $kakaku=$ckhan; $syurui=$in{'syurui'}; $biko=$in{'biko'}; $passwd=$in{'passwd'}; $tymd=$in{'tymd'}; $ymd1=$in{'ymd1'}; # 全角を半角にする $ckhan=$ymd1; &hankaku; $ymd1=$ckhan; $ymd2=$in{'ymd2'}; # 全角を半角にする $ckhan=$ymd2; &hankaku; $ymd2=$ckhan; # 開始日との関係 if ($ymd1 > $ymd2) { &error(4); } if (length($ymd1) != 8) { &error(6); } if (length($ymd2) != 8) { &error(7); } # メッセージの改行のみをカットする @chk = split(/\n/,$biko); $msg=""; foreach (@chk) { if (length($_) > 1) { $msg=$msg.$_."\n"; } # end of if } # end of foreach $biko=$msg; $biko=~ s/\015\012/\n/g; $biko=~ s/\015/\n/g; $biko =~ s/\n/&k/g; # 文字数チェック if (length($biko) > $mojisu) { $biko = substr($biko,0,$mojisu); } # タグの無効化 $ckdt=$syono ; &tagck ; $syono=$ckdt; $ckdt=$seqno ; &tagck ; $seqno=$ckdt; $ckdt=$hinmei ; &tagck ; $hinmei=$ckdt; $ckdt=$kakaku ; &tagck ; $kakaku=$ckdt; $ckdt=$biko ; &tagck ; $biko=$ckdt; $ckdt=$ymd1 ; &tagck ; $ymd1=$ckdt; $ckdt=$ymd2 ; &tagck ; $ymd2=$ckdt; } # end of form_data ############################### # タグの無効化サブルーチン ############################### sub tagck { $ckdt =~ s//>/ig; $ckdt =~ s///ig; $ckdt =~ s/\,//g; } ############################### # 全角を半角にする ############################### sub hankaku { $ckhan =~ s/0/0/g; $ckhan =~ s/1/1/g; $ckhan =~ s/2/2/g; $ckhan =~ s/3/3/g; $ckhan =~ s/4/4/g; $ckhan =~ s/5/5/g; $ckhan =~ s/6/6/g; $ckhan =~ s/7/7/g; $ckhan =~ s/8/8/g; $ckhan =~ s/9/9/g; # 数字以外を除く $ckhan=~s/[^0-9]//g; } # end of hankaku ########################################## # # # 次ページ表示処理         # # # ########################################## sub next { $in{'page'}++; &main; } # end of sub ########################################## # # # 前ページ表示処理         # # # ########################################## sub back { if ($page > 1) { $in{'page'}-- } &main; } # end of sub ##################### # ファイル登録 ##################### sub update { # 登録済みデータを読み配列にセットする if ($seqno eq "clr") { @data=() } else { &read3 } ################ push(@data,$value); ################ # 表示順序に従い並び替えて登録する @idxdt=(); foreach (@data) { chop($_); $bundt=$_; &bunkai; # 連想配列にセット $idxdt{$seqno} = $_; } # end of foreach # 次にソートサブへ @key=keys(%idxdt); @keydata=(); @keydata=sort by_seqno @key; # ファイルへ登録するソート後データ @new=(); # 表示順番を新たに付け直す(とりあえず10おき) $newno=10; foreach (@keydata) { ($syono,$seqno,$hinmei,$biko,$kakaku,$syurui,$tymd,$ymd1,$ymd2) = split(/\t/,$idxdt{$_}); $seqno=$newno; $value = "$syono\t$seqno\t$hinmei\t$biko\t$kakaku\t$syurui\t$tymd\t$ymd1\t$ymd2\n"; push(@new,$value); $newno=$newno + 10; } # end of foreach # ファイル登録 if (!open(WRITE,">$file")) { &error(0); } flock(WRITE,2); print WRITE @new; flock(WRITE,8); close (WRITE); } # end of update ############################################# # # # チェックエラー表示画面ルーチン    # # # ############################################# sub error { # &error(xx); で呼び出されたルーチンは、()内の数字が $error に代入される。 $error = $_[0]; if ($error eq "0") { $error_msg = 'ファイルがない、またはOPENできない。'; } elsif ($error eq "2") { $error_msg = '商品名が入力されていません。'; } elsif ($error eq "3") { $error_msg = 'パスワード不一致のため登録・訂正できません'; } elsif ($error eq "4") { $error_msg = '取扱開始日が終了日より大きい'; } ###elsif ($error eq "5") { $error_msg = '表示順序の入力データに数字以外が入っている'; } elsif ($error eq "6") { $error_msg = '取扱開始日の年月日が8桁ではない'; } elsif ($error eq "7") { $error_msg = '取扱終了日の年月日が8桁ではない'; } print "Content-type: text/html\n\n"; print '商品マスタの保守' . "\n"; print '' . "\n"; print '

商品マスタの入力で下記のエラーが発生しました

' . "\n"; print '

'; print "$error_msg\n"; print '

'; # リロードでもどると入力データが消えてしまうので print 'ブラウザ画面の戻るをクリックする'."\n";; print '' . "\n"; # サブルーチンからプログラムを抜けるので exit; } ############################################# # # # 明細データの訂正・削除ルーチン    # # # ############################################# sub meisai { &read2; # キー # 配列番号(次前データ移動用) $tbno=$in{'tbno'}; $in{'bunrui'}=$in{'syurui'}; # 実配列番号は−1 $tbno--; # 項目分解処理 $bundt=$idxdt{$tbno}; &bunkai; &meisai_display; } # end of meisai ############################################# # # # 明細データの訂正・削除ルーチン    # # (次前データ処理用) # ############################################# sub meisai2 { &read; # 項目分解処理 $bundt=$data[$tbno]; &bunkai; &meisai_display; } # end of meisai2 ############################################# # # # 明細データの共通表示ルーチン     # # # ############################################# sub meisai_display { # 明細表示データbヘ配列a{1 $mno=$tbno+1; print "Content-type: text/html\n\n"; print < 商品マスタの訂正

商品マスタの訂正

EOM print "
a@$mno / $cnt
\n"; ################ if ($test eq "on") {print "syono=$syono,bundt=$bundt\n" } ################ print '
' . "\n"; # 外側の飾り線 print ''; print ''; print '表示順序 ' . "\n"; print '   (最後に追加する場合は設定なし)' . "\n"; print '

'; print '商品番号 
' . "\n"; print '
'; if ($syurui == 2) {$sel2 = "SELECTED";} elsif ($syurui == 3) {$sel3 = "SELECTED"; } elsif ($syurui == 4) {$sel4 = "SELECTED"; } else {$sel1 = "SELECTED"; } print '記入内容はこの分類に入っています '. "\n"; print '

'; print '商品名 
' . "\n"; print '
'; print '備考'; print '
'; print '' . "\n"; print '
'; print '価格 
' . "\n"; print '
'; print '取扱開始日 
' . "\n"; print '
'; print '取扱終了日 
' . "\n"; print '
'; print '
'; # パスワードを設定した場合のみ表示する if ($pwd ne "") { print '訂正削除パスワード ' . "\n"; print '
'; print ''; print '*訂正又は削除する場合に必要です。'; print ''; print '

'; } # end of if # 訂正か削除か選択する print '
'; print '
'; print '訂正削除なし' . "\n"; print '   '; print '訂正します' . "\n"; print '   '; print '削除します' . "\n"; print '   '; print ''."\n"; print ''."\n"; &hidpara; # 初回登録日も渡す print '' . "\n"; print '' . "\n"; print '
'."\n"; print '
'. "\n"; ############################ # ボタンを並べる #print '
'; print ''; print ''; # 戻る print ''; print ''; # 前データ print ''; print ''; # 次データ print '
'; print '
' . "\n"; print '' . "\n"; &hidpara; print '' . "\n"; print '
'. "\n"; print '
   '; if ($tbno == 0) { print '  '; } else { print '
' . "\n"; print '' . "\n"; print '' . "\n"; &hidpara; print '' . "\n"; print '
'; } # end of if print '
   '; if (($tbno+1) == $cnt) { print '  '; } else { print '
' . "\n"; print '' . "\n"; print '' . "\n"; &hidpara; print '' . "\n"; print '
'. "\n"; } # end of if print '
'."\n"; # 外側の飾り線 print ''; print ''. "\n"; } # end of meisai ########################################## # # # 次データ表示処理(詳細)     # # # ########################################## sub nexts { $tbno=$in{'tbno'}; $tbno++; &meisai2; } # end of nexts ########################################## # # # 前データ表示処理(詳細)     # # # ########################################## sub backs { $tbno=$in{'tbno'}; if ($tbno > 0) { $tbno--; } &meisai2; } # end of backs ##################### # データ訂正 ##################### sub teisei { # 訂正削除なしの場合 if (($in{'action'} eq 'teisei') && ($in{'syori'} == 0)) { return } # フォーム入力データ &form_data; # 訂正の場合入力項目チェックへ if (($in{'action'} eq 'teisei') && ($in{'syori'} == 1)) { &check } &read2; # キー $tbno=$in{'tbno'}; # 訂正パスワードチェック if ($pwd ne "") { if ($pwd ne $passwd) { &error(3) } } # end of if ######################## ######################## # 削除の場合 if (($in{'action'} eq 'teisei') && ($in{'syori'} == 2)) { &sakujo; return } # ここからは訂正選択時処理 # データ訂正 $value = "$syono\t$seqno\t$hinmei\t$biko\t$kakaku\t$syurui\t$tymd\t$ymd1\t$ymd2"; $idxdt{$tbno}=$value; &file_write; # 訂正後は全件表示 $in{'bunrui'}=9; } # end of teisei ##################### # データ削除 ##################### sub sakujo { # データ削除 delete $idxdt{$tbno}; &file_write; } # end of sakujo ########################## # ファイル登録共通処理 # ########################## sub file_write { # キー部を取り出す @key=keys(%idxdt); # 表示順序に従い並び替えて登録する @new=(); foreach (@key) { $bundt=$idxdt{$_}; &bunkai; # 連想配列にセット $new{$seqno} = $idxdt{$_}; } # end of foreach # 次にソートサブへ @key=keys(%new); @keydata=(); @keydata=sort by_seqno @key; # 表示順番を新たに付け直す(とりあえず10おき) $newno=10; @new2=(); foreach (@keydata) { ($syono,$seqno,$hinmei,$biko,$kakaku,$syurui,$tymd,$ymd1,$ymd2) = split(/\t/,$new{$_}); $seqno=$newno; $value = "$syono\t$seqno\t$hinmei\t$biko\t$kakaku\t$syurui\t$tymd\t$ymd1\t$ymd2\n"; push(@new2,$value); $newno=$newno + 10; } # end of foreach # ファイル登録 if (!open(WRITE,">$file")) { &error(0); } flock(WRITE,2); print WRITE @new2; flock(WRITE,8); close (WRITE); } # end of write #################################### # # # キーを昇順にソートする     # # # #################################### sub by_date { $a cmp $b } ##################### # 連想配列のキー部をソートする ##################### sub by_seqno { $a <=> $b; } ################ end of script ###################