#!/usr/local/bin/perl # 商品マスタの保守 # id=syohin.cgi # update. 98.3.31 # 使用上の注意・・・Windows専用です(Macと混在させると文字化けするおそれがあります) # 日本語コード変換ライブラリ(v2.0)の指定 # &ReadParse命令で、$in{ }の変数にフォーム入力データが格納される require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse; # 設置するURLを設定 $reload = 'http://www0.kumagaya.or.jp/cgi-bin/users/chichibu/syohin.cgi'; $bkhmpg = "http://www.kumagaya.or.jp/~chichibu/cgi1.html"; $file = "/dialup/chichibu/cgi-bin/syohin.dat"; # 最大登録数(通常は設定不要) $max=15; # 分類名配列 $bunruimei[1]="特撰"; $bunruimei[2]="上撰"; $bunruimei[3]="金印"; #################################### # # # メインルーチン(処理の分岐) # # # #################################### # 全体の流れを決定する if ($in{'action'} eq 'main') { &main; } elsif ($in{'action'} eq 'check1') { &check1; } elsif ($in{'action'} eq 'check2') { &check2; } elsif ($in{'action'} eq 'syokai2') { &syokai2; } elsif ($in{'action'} eq 'delete') { &delete; } else { &first; } # なくても良いが最終出口を示す exit; ############################################# # # # 登録データを読む(訂正削除用配列)  # # # ############################################# sub read { # データを読み各連想配列に加算する # 1    2 3 4 5  6   7   8 # 商品コード、商品名、規格、価格、特徴、分類、リンク先,初回登録日 open(DB,"$file"); flock(DB,2); @data=; flock(DB,8); close(DB); # 各レコードを商品コードをキーにした連想配列にセットする foreach (@data) { ($syocd9,$hinmei9,$kikaku9,$dkakaku9,$naiyo9,$bunrui9,$linksaki9,$torokubi9) = split(/\t/,$_); # キーを変数名に入れて1レコード全体をセットする $idxdt{$syocd9} = $_; } # end of foreach } # end of read ######################## #            # # 項目分解ルーチン   # #            # ######################## sub bunkai { # 商品コード、商品名、規格、価格、特徴、分類、リンク先,初回登録日 ($syocd9,$hinmei9,$kikaku9,$kakaku9,$naiyo9,$bunrui9,$linksaki9,$torokubi9) = split(/\t/,$bundt); # 内容の改行を元に戻す $naiyo9 =~ s/&k/\n/g; # 表示用に変換する $naiyo2 = $naiyo9; $naiyo2 =~ s/\n/
/g; } # end of bunkai ############################################# # # # 最初に処理するルーチン         # # # ############################################# sub first { # 初期値セット $in{'syori'}=0; # メッセージフラグ0 $msgkb=0; #商品コード入力画面へ $syocd=""; &main; } # end of first ################################# # # # 処理の選択と商品コード入力  # # # ################################# sub main { # 表示出力処理 print "Content-type: text/html\n\n"; print < 商品マスタ作成 3/25 EOM # タイトルと照会終了を横に並ばせる print '
'; print "商品マスタ処理の選択\n"; print '   '; print '
' . "\n"; print '' . "\n"; print '' . "\n"; print '
' . "\n"; print '
     '; print '
' . "\n"; print '' . "\n"; print '
' . "\n"; print '
'; # 処理の選択 print '
' . "\n"; print '' . "\n"; # 外側 print ''; print ''; print '
'; # 選択ボタン用 print ''; print ''; print '
'; # 選択された処理の色を変える(処理には関係ない、おまけ) $col0="black";$col1="black";$col2="black";$col3="black"; if ($in{'syori'} == 0) { $sel0="checked" ;$col0="blue";} elsif ($in{'syori'} == 1) { $sel1="checked" ;$col1="blue"; } elsif ($in{'syori'} == 2) { $sel2="checked" ;$col2="blue"; } elsif ($in{'syori'} == 3) { $sel3="checked" ;$col3="blue"; } print "\n"; print "照会\n"; print "\n"; print '
'; print "\n"; print "追加\n"; print "\n"; print '
'; print "\n"; print "訂正\n"; print "\n"; print '
'; print "\n"; print "削除\n"; print "\n"; print '
'; print '
   '; # 次に商品コード入力 print '商品コード '."\n"; print '   '; # エラーメッセージ(商品コード右横に表示させる) if ($msgkb==1) { $ermsg="商品コード未登録エラー";} elsif ($msgkb==2) { $ermsg="商品コードが既に登録されています";} elsif ($msgkb==3) { $ermsg="商品コード未入力エラー";} elsif ($msgkb==90) { $ermsg="削除終了";} elsif ($msgkb==91) { $ermsg="削除はしませんでした";} if ($msgkb != 0) { print ''; print "$ermsg\n"; print ''; } # end of if print '
'; print '

'; # 操作メッセージとボタンを並べる print ''; print ''; print '
'; print ''; print "操作:処理を選択し、商品コード入力後次へをクリックする\n"; print ''; print '   '; print '' . "\n"; print '
'; print '
'. "\n"; print "\n"; } # end of main ########################################## # # # 入力されたデータのチェックルーチン # # # ########################################## sub check1 { $msgkb=0; $syocd=$in{'syocd'}; $syori=$in{'syori'}; # 存在チェック &read; # 商品コード未入力エラー if ($syocd eq "") { $msgkb=3; &main; exit} if ($syori == 0 && $idxdt{$syocd} eq "") { $msgkb=1; &main; exit } elsif ($syori == 1 && $idxdt{$syocd} ne "") { $msgkb=2; &main; exit } elsif ($syori == 2 && $idxdt{$syocd} eq "") { $msgkb=1; &main; exit } elsif ($syori == 3 && $idxdt{$syocd} eq "") { $msgkb=1; &main; exit } # データ項目分解 if ($syori != 1) { $bundt=$idxdt{$syocd}; &bunkai } # チェック通過 if ($syori == 0) { &syokai } elsif ($syori == 1) { &tuika } elsif ($syori == 2) { &teisei } elsif ($syori == 3) { &sakujo } } # end of check1 ############################################# # # # 照会処理(商品コード入力時)     # # # ############################################# sub syokai { # 処理区分は0 $syori=0; $syocd=$in{'syocd'}; print "Content-type: text/html\n\n"; print < 商品マスタの保守 EOM print '
' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; # タイトルと照会終了を横に並ばせる print '
'; print "商品マスタの照会処理\n"; print '   '; print '' . "\n"; print '
'; # 共通ルーチンへ &display_rtn; print '
'. "\n"; print ''. "\n"; } # end of syokai ############################################# # # # 商品データ表示共通ルーチン      # # # ############################################# sub display_rtn { print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print '
商品コード'.$syocd.'
商品名'.$hinmei9.'
分類'.$bunruimei[$bunrui9].'
特徴'.$naiyo2.'
規格'.$kikaku9.'
価格'.$kakaku9.'
リンク先'.$linksaki9.'
登録日'.$torokubi9.'
'."\n"; } # end of display_rtn ############################################# # # # 照会処理(全件       )    # # # ############################################# sub syokai2 { &read; print "Content-type: text/html\n\n"; print < 商品マスタの保守 EOM print '
' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '
'; print "全件照会\n"; print '   '; print '' . "\n"; print '
'; print "\n"; print "\n"; $no=0; # すべて表示する foreach (@data) { chop($_); $bundt=$_; &bunkai; $no++; # 項目分解処理 print ''; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; print ''; } # end of foreach print '
商品コード商品名規格価格登録日
'.$no.''.$syocd9.''.$hinmei9.''.$kikaku9.''.$kakaku9.''.$torokubi9.'
'; print "\n"; } # end of syokai2 ############################################# # # # 新規追加処理             # # # ############################################# sub tuika { # 処理区分は1 $syori=1; $syocd=$in{'syocd'}; print "Content-type: text/html\n\n"; print < 商品マスタの保守 EOM print '
'; print "商品マスタの追加処理\n"; print '   '; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print ''; print '
'; # 外側の飾り線 print ''; print ''; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print "商品コード  $syocd\n"; print '

'; print '分類 '. "\n"; print '

'; print '商品名 
' . "\n"; print '
'; print '特徴'; print '
'; print '' . "\n"; print '

'; print '規格  ' . "\n"; print '

'; print '価格  (半角数字)
' . "\n"; print '

'; print 'リンク先 http://
' . "\n"; print '

'; print "登録OKならチェック\n"; print '
'; print '' . "\n"; print '
'; print ''. "\n"; print '
'; print ''. "\n"; } # end of tuika ############################################# # # # 訂正処理               # # # ############################################# sub teisei { # 処理区分は2 $syori=2; $syocd=$in{'syocd'}; print "Content-type: text/html\n\n"; print < 商品マスタの保守 EOM print '
'; print "商品マスタの訂正処理\n"; print '   '; print '
' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '
'; print '
'; # 外側の飾り線 print ''; print ''; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print "商品コード  $syocd\n"; print '

'; print '分類 '. "\n"; print '

'; print '商品名 
' . "\n"; print '
'; print '特徴'; print '
'; print '' . "\n"; print '

'; print '規格  ' . "\n"; print '

'; print '価格  (半角数字)
' . "\n"; print '

'; print 'リンク先 http://
' . "\n"; print '

'; print '
'; print '' . "\n"; print '
'; # 登録日時 print "初回登録日  $torokubi9\n"; print ''. "\n"; print '
'; print ''. "\n"; } # end of teisei ############################################# # # # 削除処理               # # # ############################################# sub sakujo { # 処理区分は2 $syori=2; $syocd=$in{'syocd'}; print "Content-type: text/html\n\n"; print < 商品マスタの保守 EOM print '
'; print "商品マスタの削除処理\n"; print '   '; print '
' . "\n"; print '' . "\n"; print '' . "\n"; print "削除ならON\n"; print "削除せず戻る\n"; print '' . "\n"; print '
'; print '
'; # 共通ルーチンへ &display_rtn; print ''. "\n"; } # end of sakujo ########################################## # # # 追加訂正チェックルーチン      # # # ########################################## sub check2 { # 入力データをとる &form_data; # 商品名になにも入力がない場合 if ($in{'hinmei'} eq "") { &error(2); } # 追加処理で登録OKでない場合 if ($syori == 1 && $in{'addok'} eq "") { &error(3); } # チェック通過 if ($syori == 1) { &update1 } elsif ($syori == 2) { &update2 } &main; } # end of check2 ############################################# # # # フォーム入力データセットルーチン    # # # ############################################# sub form_data { $syori=$in{'syori'}; $syocd=$in{'syocd'}; $bunrui=$in{'bunrui'}; $hinmei=$in{'hinmei'}; $naiyo=$in{'naiyo'}; $kikaku=$in{'kikaku'}; $kakaku=$in{'kakaku'}; # 価格の半角処理 $kakaku =~ s/1/1/g; $kakaku =~ s/2/2/g; $kakaku =~ s/3/3/g; $kakaku =~ s/4/4/g; $kakaku =~ s/5/5/g; $kakaku =~ s/6/6/g; $kakaku =~ s/7/7/g; $kakaku =~ s/8/8/g; $kakaku =~ s/9/9/g; $kakaku =~ s/0/0/g; # 数字以外を消す $kakaku =~ s/[^0-9]//g; $linksaki=$in{'linksaki'}; # メッセージの改行のみをカットする(デモ用のため、実際は不要) @chk = split(/\n/,$naiyo); $msg=""; foreach (@chk) { if (length($_) > 1) { $msg=$msg.$_."\n"; } # end of if } # end of foreach $naiyo=$msg; # TEXTAREAデータの改行コード処理 $naiyo=~ s/\015\012/\n/g; #win $naiyo=~ s/\015/\n/g; #mac $naiyo =~ s/\n/&k/g; # タグの無効化 $ckdt=$hinmei ; &tagck ; $hinmei=$ckdt; $ckdt=$naiyo ; &tagck ; $naiyo=$ckdt; $ckdt=$kikaku ; &tagck ; $kikaku=$ckdt; $ckdt=$kakaku ; &tagck ; $kakaku=$ckdt; $ckdt=$linksaki ; &tagck ; $linksaki=$ckdt; } # end of form_data ############################### # タグの無効化サブルーチン ############################### sub tagck { $ckdt =~ s//>/ig; $ckdt =~ s///ig; } ##################### # ファイル登録 ##################### sub update1 { ($t1,$t2,$t3,$sysdd,$sysmm,$sysyy,$t7) = localtime; # 月補正 $sysmm++; # 年を4桁にする if ($sysyy < 70) { $sysyy = $sysyy + 2000;} else { $sysyy = $sysyy + 1900;} # 登録日 $torokubi="$sysyy.$sysmm.$sysdd"; # 商品コード、商品名、規格、価格、特徴、分類、リンク先,初回登録日 $value = "$syocd\t$hinmei\t$kikaku\t$kakaku\t$naiyo\t$bunrui\t$linksaki\t$torokubi\n"; # 登録済みデータを読み配列にセットする if ($hinmei ne "allclr") { &read; } push(@data,$value); # # この最大件数を超えたらの処理は通常いりませんのでカットして下さい # 先頭から古い順になっているのでそのまま1番目のデータをシフトする # ####### ここから $a=@data; if ($a > $max) { $herasu=$a - $max; for ($i=1; $i<=$herasu; $i++) { shift(@data) } } # end of if ####### ここまで @new=@data; &file_write; } # end of update1 ############################################# # # # チェックエラー表示画面ルーチン    # # # ############################################# sub error { # &error(xx); で呼び出されたルーチンは、()内の数字が $error に代入される。 $error = $_[0]; if ($error eq "0") { $error_msg = 'ファイルがない、またはOPENできない。'; } elsif ($error eq "1") { $error_msg = '商品コード入力未入力エラー'; } elsif ($error eq "2") { $error_msg = '商品名になにも入力がありません。'; } elsif ($error eq "3") { $error_msg = '追加処理で登録OKのチェックボックスがオンになっていません。'; } 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 update2 { &read; # 初回登録日セーブ $bundt=$idxdt{$syocd}; &bunkai; $torokubi=$torokubi9; $torokubi=~s/\n//g; # データ訂正 $value = "$syocd\t$hinmei\t$kikaku\t$kakaku\t$naiyo\t$bunrui\t$linksaki\t$torokubi\n"; $idxdt{$syocd}=$value; &file_rewrite; } # end of update2 ##################### # データ削除 ##################### sub delete { # フォーム入力データ if ($in{'delok'} eq "ok") { &read; # キー $syocd=$in{'syocd'}; # データ削除 delete $idxdt{$syocd}; &file_rewrite; # 正常終了 $msgkb=90; } # end of if else { $msgkb=91 } &main; } # end of delete ########################## # ファイル書き換え処理 # ########################## sub file_rewrite { # 登録用配列にデータセット %new=(); @data=values(%idxdt); foreach (@data){ if (length($_) > 1) { push(@new,$_); } } # end of foreach &file_write; } # end of rewrite ########################## # ファイル登録処理   # ########################## sub file_write { # ファイル登録 if (!open(WRITE,">$file")) { &error(0); } flock(WRITE,2); print WRITE @new; flock(WRITE,8); close (WRITE); } # end of write ################ end of script ###################