TinyCOBOLでWebプログラミング  2001/10/20


TinyCOBOLで簡単にCGIプログラミングが出来ます。
幣サイト フリープログラミングのコーナーで作成済みの 宅配便送料計算プログラム2001/06/09版をWeb化いたしました。


作成環境 Vine Linux 2.1/Apache1.3.14

左の画面が私のマシン(192.168.1.3)のTOPペー(index.htm)です。

この画面で入力した内容を一旦PerlのCGIに渡して、PerlからCOBOLプログラムを起動させ、COBOLのプログラムで各種計算をして、その結果をCOBOLのDISPLAY命令を使用しHTML形式で標準入出力に出力する という仕組みになっております。

左の画面で計算ボタンを押すと
左下の画面で計算結果が表示されます。
この画面がCOBOLのDISPLAY命令でHTML形式のデータを標準入出力に出力させた 画面です。


もちろんLANで繋がった他のWindowsのマシンからもアクセス出来ます。
以下の画面がWindowsのマシンからアクセスしたときの画面です。



エラーチェックはCOBOLプログラムでチェックしております。下の例は高さに数値以外を入力したときのエラーです。



以下ソースです。
入力項目数値変換サブルーチン subxに関してはSPEC社から発売されている「実習MS−DOS LEVELUCOBOL入門」を参照してください。

1.index.htm 
   /home/httpd/htmlに置きます。
   Apacheのデフォルトではここがドキュメントディレクトリになっております。 
    (ユーザを作成しユーザディレクトリに設置する方が良いと思いますが 今回はデフォルトを使用しました。)
<HTML>
<HEAD>
<TITLE>運賃算出</TITLE>
</HEAD>
<BODY><FORM method="GET" action="/cgi-bin/web01.cgi">
<FONT color="#cc0000" size="4">宅配便送料算出</FONT><BR><BR>
発地 <SELECT name="hat">
<OPTION value="0" selected>北海道</OPTION>
<OPTION value="1">青森県</OPTION>
<OPTION value="2">秋田県</OPTION>
<OPTION value="3">岩手県</OPTION>
<OPTION value="4">宮城県</OPTION>
<OPTION value="5">山形県</OPTION>
<OPTION value="6">福島県</OPTION>
<OPTION value="7">茨城県</OPTION>
<OPTION value="8">栃木県</OPTION>
<OPTION value="9">群馬県</OPTION>
<OPTION value="10">埼玉県</OPTION>
<OPTION value="11">千葉県</OPTION>
<OPTION value="12">東京都</OPTION>
<OPTION value="13">神奈川県</OPTION>
<OPTION value="14">山梨県</OPTION>
<OPTION value="15">長野県</OPTION>
<OPTION value="16">新潟県</OPTION>
<OPTION value="17">富山県</OPTION>
<OPTION value="18">石川県</OPTION>
<OPTION value="19">福井県</OPTION>
<OPTION value="20">静岡県</OPTION>
<OPTION value="21">愛知県</OPTION>
<OPTION value="22">岐阜県</OPTION>
<OPTION value="23">三重県</OPTION>
<OPTION value="24">滋賀県</OPTION>
<OPTION value="25">京都府</OPTION>
<OPTION value="26">大阪府</OPTION>
<OPTION value="27">兵庫県</OPTION>
<OPTION value="28">奈良県</OPTION>
<OPTION value="29">和歌山県</OPTION>
<OPTION value="30">岡山県</OPTION>
<OPTION value="31">広島県</OPTION>
<OPTION value="32">山口県</OPTION>
<OPTION value="33">鳥取県</OPTION>
<OPTION value="34">島根県</OPTION>
<OPTION value="35">徳島県</OPTION>
<OPTION value="36">高知県</OPTION>
<OPTION value="37">福岡県</OPTION>
<OPTION value="38">佐賀県</OPTION>
<OPTION value="39">長崎県</OPTION>
<OPTION value="40">熊本県</OPTION>
<OPTION value="41">大分県</OPTION>
<OPTION value="42">宮崎県</OPTION>
<OPTION value="43">鹿児島県</OPTION>
<OPTION value="45">沖縄県</OPTION>
</SELECT>
着地 <SELECT name="chk">
<OPTION value="0" selected>北海道</OPTION>
<OPTION value="1">青森県</OPTION>
<OPTION value="2">秋田県</OPTION>
<OPTION value="3">岩手県</OPTION>
<OPTION value="4">宮城県</OPTION>
<OPTION value="5">山形県</OPTION>
<OPTION value="6">福島県</OPTION>
<OPTION value="7">茨城県</OPTION>
<OPTION value="8">栃木県</OPTION>
<OPTION value="9">群馬県</OPTION>
<OPTION value="10">埼玉県</OPTION>
<OPTION value="11">千葉県</OPTION>
<OPTION value="12">東京都</OPTION>
<OPTION value="13">神奈川県</OPTION>
<OPTION value="14">山梨県</OPTION>
<OPTION value="15">長野県</OPTION>
<OPTION value="16">新潟県</OPTION>
<OPTION value="17">富山県</OPTION>
<OPTION value="18">石川県</OPTION>
<OPTION value="19">福井県</OPTION>
<OPTION value="20">静岡県</OPTION>
<OPTION value="21">愛知県</OPTION>
<OPTION value="22">岐阜県</OPTION>
<OPTION value="23">三重県</OPTION>
<OPTION value="24">滋賀県</OPTION>
<OPTION value="25">京都府</OPTION>
<OPTION value="26">大阪府</OPTION>
<OPTION value="27">兵庫県</OPTION>
<OPTION value="28">奈良県</OPTION>
<OPTION value="29">和歌山県</OPTION>
<OPTION value="30">岡山県</OPTION>
<OPTION value="31">広島県</OPTION>
<OPTION value="32">山口県</OPTION>
<OPTION value="33">鳥取県</OPTION>
<OPTION value="34">島根県</OPTION>
<OPTION value="35">徳島県</OPTION>
<OPTION value="36">高知県</OPTION>
<OPTION value="37">福岡県</OPTION>
<OPTION value="38">佐賀県</OPTION>
<OPTION value="39">長崎県</OPTION>
<OPTION value="40">熊本県</OPTION>
<OPTION value="41">大分県</OPTION>
<OPTION value="42">宮崎県</OPTION>
<OPTION value="43">鹿児島県</OPTION>
<OPTION value="45">沖縄県</OPTION>
</SELECT> <BR><BR><BR>
<INPUT size="9" type="text" name="tate" value="0" istyle="4">縦のサイズ <BR>
<INPUT size="9" type="text" name="yoko" value="0" istyle="4">横のサイズ<BR>
<INPUT size="9" type="text" istyle="4" name="takasa" value="0">高さ<BR>
<INPUT size="9" type="text" name="omosa" istyle="4" value="0">重量(グラム)<BR>
<BR>
<INPUT type="radio" name="gyo" value="1" checked> クロネコヤマト宅急便<BR>
<INPUT type="radio" value="2" name="gyo"> ゆうパック<BR><BR>
<INPUT type="submit" value="計算"></FORM>
</BODY>
</HTML>
2.web01.cgi
  /home/httpd/cgi-binに置きます。
  (こちらもApacheのデフォルトディレクトリーを使用しました)
  
  この時cgi-lib.plも同じディレクトリーに置いて下さい。
  cgi-lib.plはフォームのデータをデコードするツールです。
  http://cgi-lib.berkeley.edu/ からダウンロードできます。

    
#!/usr/bin/perl

require 'cgi-lib.pl';

&ReadParse(*in);

$hat = $in{'hat'};
$chk = $in{'chk'};
$tate = $in{'tate'};
$yoko = $in{'yoko'};
$takasa = $in{'takasa'};
$omosa = $in{'omosa'};
$gyo = $in{'gyo'};
system "./yamato $tate $yoko $takasa $omosa $hat $chk";
   exit;
3.yamato.cob
  実行モジュールを/home/httpd/cgi-binに置きます。
  (別のディレクトリーでコンパイルリンクし実行モジュールだけ持ってきました。)
 IDENTIFICATION  DIVISION.
 PROGRAM-ID.     YAMATO.
 ENVIRONMENT     DIVISION.
 CONFIGURATION   SECTION.
 INPUT-OUTPUT    SECTION.
 DATA DIVISION.
 FILE SECTION.

WORKING-STORAGE SECTION.
 01 WK-OUT                         PIC X(20).
 01 CMDLINE-PARMS                  PIC X(64).
 01 WK-PRONAME                     PIC X(10) VALUE '$$$$$$$$$$'.
 01 WK-ACC01                       PIC X(15) VALUE '$$$$$$$$$$$$$$$'.
 01 WK-ACC02                       PIC X(15) VALUE '$$$$$$$$$$$$$$$'.
 01 WK-ACC03                       PIC X(15) VALUE '$$$$$$$$$$$$$$$'.
 01 WK-ACC04                       PIC X(15) VALUE '$$$$$$$$$$$$$$$'.
 01 WK-ACC05                       PIC X(02) VALUE '$$'.
 01 WK-ACC06                       PIC X(02) VALUE '$$'.
 01 A                              PIC X(15). 
 01 C                              PIC S9(12)V9(3).
 01 JSW                            PIC 9 VALUE ZERO.
 01 WK-KWKKA.
   03 WK-TATE                      PIC S9(06)V9(3).
   03 WK-YOKO                      PIC S9(06)V9(3).
   03 WK-TAKA                      PIC S9(06)V9(3).
   03 WK-OMOS                      PIC S9(06)V9(3).
 01 WK-SIZE1                       PIC S9(06)V9(3).
 01 WK-SIZE2                       PIC S9(06)V9(3).
 01 WK-SIZE                        PIC S9(06)V9(3).
 01 WK-3HEN                        PIC S9(06)V9(3).
 01 WK-DKIN                        PIC ZZ,ZZZ,ZZ9.
 01 WK-OUT                         PIC X(10).
 01 I                              PIC 9(3).
 01 J                              PIC 9(3).
 01 WK-INDEXH                      PIC 9(3).
 01 WK-INDEXC                      PIC 9(3).
 01 SW-ERR                         PIC 9(1).
 01 WT-60.
    03  WT-60DAT.
      05  WT-60DAT1                PIC X(48) VALUE
         "074009501050116011601260126014701580168017901890".
      05  WT-60DAT2                PIC X(48) VALUE
         "095007400740084008400950095010501160126013701580".
      05  WT-60DAT3                PIC X(48) VALUE
         "105007400740074007400840084009501160126013701470".
      05  WT-60DAT4                PIC X(48) VALUE
         "116008400740074007400740074008400950105011601260".
      05  WT-60DAT5                PIC X(48) VALUE
         "116008400740074007400740074008400950105011601370".
      05  WT-60DAT6                PIC X(48) VALUE
         "126009500840074007400740074007400840095009501260".
      05  WT-60DAT7                PIC X(48) VALUE
         "126009500840074007400740074007400840095009501370".
      05  WT-60DAT8                PIC X(48) VALUE
         "126009500840074007400740074007400840095009501370".
      05  WT-60DAT9                PIC X(48) VALUE
         "158011601160095009500840084007400740084007401260".
      05  WT-60DAT10               PIC X(48) VALUE
         "168012601260105010500950095008400840074008401260".
      05  WT-60DAT11               PIC X(48) VALUE
         "179013701370116011600950095008400740084007401160".
      05  WT-60DAT12               PIC X(48) VALUE
         "189015801470126013701260137012601260126011600740".
    03  WT-60TBL.
      05  WT-60TBLX                OCCURS 12.
        07  WT-60KIN               PIC 9(04) OCCURS 12.
 01 WT-80.
    03  WT-80DAT.
      05  WT-80DAT1                PIC X(48) VALUE
         "095011601260137013701470147016801790189020002420".
      05  WT-80DAT2                PIC X(48) VALUE
         "116009500950105010501160116012601370147015802100".
      05  WT-80DAT3                PIC X(48) VALUE
         "126009500950095009501050105011601370147015802000".
      05  WT-80DAT4                PIC X(48) VALUE
         "137010500950095009500950095010501160126013701790".
      05  WT-80DAT5                PIC X(48) VALUE
         "137010500950095009500950095010501160126013701890".
      05  WT-80DAT6                PIC X(48) VALUE
         "147011601050095009500950095009501050116011601790".
      05  WT-80DAT7                PIC X(48) VALUE
         "147011601050095009500950095009501050116011601890".
      05  WT-80DAT8                PIC X(48) VALUE
         "168012601160105010500950095009500950105010501790".
      05  WT-80DAT9                PIC X(48) VALUE
         "179013701370116011601050105009500950105009501790".
      05  WT-80DAT10               PIC X(48) VALUE
         "189014701470126012601160116010501050095010501790".
      05  WT-80DAT11               PIC X(48) VALUE
         "200015801580137013701160116010500950105009501680".
      05  WT-80DAT12               PIC X(48) VALUE
         "242021002000179018901790189017901790179016800950".
    03  WT-80TBL.
      05  WT-80TBLX                OCCURS 12.
        07  WT-80KIN               PIC 9(04) OCCURS 12.
 01 WT-100.
    03  WT-100DAT.
      05  WT-100DAT1               PIC X(48) VALUE
         "116013701470158015801680168018902000210022102940".
      05  WT-100DAT2               PIC X(48) VALUE
         "137011601160126012601370137014701580168017902630".
      05  WT-100DAT3               PIC X(48) VALUE
         "147011601160116011601260126013701580168017902520".
      05  WT-100DAT4               PIC X(48) VALUE
         "158012601160116011601160116012601370147015802310".
      05  WT-100DAT5               PIC X(48) VALUE
         "158012601160116011601160116012601370147015802420".
      05  WT-100DAT6               PIC X(48) VALUE
         "168013701260116011601160116011601260137013702310".
      05  WT-100DAT7               PIC X(48) VALUE
         "168013701260116011601160116011601260137013702420".
      05  WT-100DAT8               PIC X(48) VALUE
         "189014701370126012601160116011601160126012602310".
      05  WT-100DAT9               PIC X(48) VALUE
         "200015801580137013701260126011601160126011602310".
      05  WT-100DAT10              PIC X(48) VALUE
         "210016801680147014701370137012601260116012602310".
      05  WT-100DAT11              PIC X(48) VALUE
         "221017901790158015801370137012601160126011602210".
      05  WT-100DAT12              PIC X(48) VALUE
         "294026302520231024202310242023102310231022101160".
    03  WT-100TBL.
      05  WT-100TBL1               OCCURS 12.
        07  WT-100KIN              PIC 9(04) OCCURS 12.
 01 WT-120.
    03  WT-120DAT.
      05  WT-120DAT1               PIC X(48) VALUE
         "137015801680179017901890189021002210231024203470".
      05  WT-120DAT2               PIC X(48) VALUE
         "158013701370147014701580158016801790189020003150".
      05  WT-120DAT3               PIC X(48) VALUE
         "168013701370137013701470147015801790189020003050".
      05  WT-120DAT4               PIC X(48) VALUE
         "179014701370137013701370137014701580168017902840".
      05  WT-120DAT5               PIC X(48) VALUE
         "179014701370137013701370137014701580168017902940".
      05  WT-120DAT6               PIC X(48) VALUE
         "189015801470137013701370137013701470158015802840".
      05  WT-120DAT7               PIC X(48) VALUE
         "189015801470137013701370137013701470158015802940".
      05  WT-120DAT8               PIC X(48) VALUE
         "210016801580147014701370137013701370147014702840".
      05  WT-120DAT9               PIC X(48) VALUE
         "221017901790158015801470147013701370147013702840".
      05  WT-120DAT10              PIC X(48) VALUE
         "231018901890168016801580158014701470137014702840".
      05  WT-120DAT11              PIC X(48) VALUE
         "242020002000179017901580158014701370147013702730".
      05  WT-120DAT12              PIC X(48) VALUE
         "347031503050284029402840294028402840284027301370".
    03  WT-120TBL.
      05  WT-120TBL1               OCCURS 12.
        07  WT-120KIN              PIC 9(04) OCCURS 12.
 01 WT-140.
    03  WT-140DAT.
      05  WT-140DAT1               PIC X(48) VALUE
         "158017901890200020002100210023102420252026303990".
      05  WT-140DAT2               PIC X(48) VALUE
         "179015801580168016801790179018902000210022103680".
      05  WT-140DAT3               PIC X(48) VALUE
         "189015801580158015801680168017902000210022103570".
      05  WT-140DAT4               PIC X(48) VALUE
         "200016801580158015801580158016801790189020003360".
      05  WT-140DAT5               PIC X(48) VALUE
         "200016801580158015801580158016801790189020003470".
      05  WT-140DAT6               PIC X(48) VALUE
         "210017901680158015801580158015801680179017903360".
      05  WT-140DAT7               PIC X(48) VALUE
         "210017901680158015801580158015801680179017903470".
      05  WT-140DAT8               PIC X(48) VALUE
         "231018901790168016801580158015801580168016803360".
      05  WT-140DAT9               PIC X(48) VALUE
         "242020002000179017901680168015801580168015803360".
      05  WT-140DAT10              PIC X(48) VALUE
         "252021002100189018901790179016801680158016803360".
      05  WT-140DAT11              PIC X(48) VALUE
         "263022102210200020001790179016801580168015803260".
      05  WT-140DAT12              PIC X(48) VALUE
         "399036803570336034703360347033603360336032601580".
    03  WT-140TBL.
      05  WT-140TBL1               OCCURS 12.
        07  WT-140KIN              PIC 9(04) OCCURS 12.
 01 WT-160.
    03  WT-160DAT.
      05  WT-160DAT1               PIC X(48) VALUE
         "179020002100221022102310231025202630273028404520".
      05  WT-160DAT2               PIC X(48) VALUE
         "200017901790189018902000200021002210231024204200".
      05  WT-160DAT3               PIC X(48) VALUE
         "210017901790179017901890189020002210231024204100".
      05  WT-160DAT4               PIC X(48) VALUE
         "221018901790179017901790179018902000210022103890".
      05  WT-160DAT5               PIC X(48) VALUE
         "221018901790179017901790179018902000210022103990".
      05  WT-160DAT6               PIC X(48) VALUE
         "231020001890179017901790179017901890200020003890".
      05  WT-160DAT7               PIC X(48) VALUE
         "231020001890179017901790179017901890200020003990".
      05  WT-160DAT8               PIC X(48) VALUE
         "252021002000189018901790179017901790189018903890".
      05  WT-160DAT9               PIC X(48) VALUE
         "263022102210200020001890189017901790189017903890".
      05  WT-160DAT10              PIC X(48) VALUE
         "273023102310210021002000200018901890179018903890".
      05  WT-160DAT11              PIC X(48) VALUE
         "284024202420221022102000200018901790189017903780".
      05  WT-160DAT12              PIC X(48) VALUE
         "452042004100389039903890399038903890389037801790".
    03  WT-160TBL.
      05  WT-160TBL1               OCCURS 12.
        07  WT-160KIN              PIC 9(04) OCCURS 12.
 PROCEDURE DIVISION.
 A-000.
  ACCEPT CMDLINE-PARMS             FROM COMMAND-LINE.
  UNSTRING CMDLINE-PARMS DELIMITED BY ' ' INTO
   WK-PRONAME WK-ACC01 WK-ACC02 WK-ACC03 WK-ACC04 WK-ACC05 WK-ACC06.
  IF  WK-ACC01                     =   LOW-VALUE OR  
      WK-ACC02                     =   LOW-VALUE OR  
      WK-ACC03                     =   LOW-VALUE OR  
      WK-ACC04                     =   LOW-VALUE OR  
      WK-ACC05                     =   LOW-VALUE OR  
      WK-ACC06                     =   LOW-VALUE
      MOVE    "入力エラー"         TO  WK-OUT
      MOVE    1                    TO  SW-ERR 
      GO  TO  A-800
  END-IF.
** 縦 **
  MOVE    WK-ACC01                 TO  A.
  MOVE    ZERO                     TO  C.
  CALL   "SUBX"                    USING  A  C  JSW.
  IF  JSW                      NOT =   ZERO
      MOVE    "縦数値エラー"       TO  WK-OUT
      MOVE    1                    TO  SW-ERR
  GO  TO  A-800
  END-IF.
  MOVE    C                        TO  WK-TATE.
** 横 **
  MOVE    WK-ACC02                 TO  A.
  MOVE    ZERO                     TO  C.
  CALL   "SUBX"                    USING  A  C  JSW.
  IF  JSW                      NOT =   ZERO
      MOVE    "横数値エラー"       TO  WK-OUT
      MOVE    1                    TO  SW-ERR
  GO  TO  A-800
  END-IF.

  MOVE    C                        TO  WK-YOKO.
** 高さ**
  MOVE    WK-ACC03                 TO  A.
  MOVE    ZERO                     TO  C.
  CALL   "SUBX"                    USING  A  C  JSW.
  IF  JSW                      NOT =   ZERO
      MOVE    "高さ数値エラー"     TO  WK-OUT
      MOVE    1                    TO  SW-ERR
  GO  TO  A-800
  END-IF.

  MOVE    C                        TO  WK-TAKA.
** 重量 **
  MOVE    WK-ACC04                 TO  A.
  MOVE    ZERO                     TO  C.
  CALL   "SUBX"                    USING  A  C  JSW.
  IF  JSW                      NOT =   ZERO
      MOVE    "重量数値エラー"     TO  WK-OUT
      MOVE    1                    TO  SW-ERR
  GO  TO  A-800
  END-IF.

  MOVE    C                        TO  WK-OMOS.
**発地 **
  MOVE    WK-ACC05                 TO  WK-INDEXH.
**着地 **
  MOVE    WK-ACC06                 TO  WK-INDEXC.
*
** サイズチェック **
  COMPUTE WK-3HEN                  =   WK-TATE + WK-YOKO + WK-TAKA.
  IF  WK-3HEN                  NOT >   60
      MOVE    60                   TO  WK-SIZE1
  ELSE
  IF  WK-3HEN                  NOT >   80
      MOVE    80                   TO  WK-SIZE1
  ELSE
  IF  WK-3HEN                  NOT >   100
      MOVE    100                  TO  WK-SIZE1
  ELSE
  IF  WK-3HEN                  NOT >   120
      MOVE    120                  TO  WK-SIZE1
  ELSE
  IF  WK-3HEN                  NOT >   140
      MOVE    140                  TO  WK-SIZE1
  ELSE
  IF  WK-3HEN                  NOT >   160
      MOVE    160                  TO  WK-SIZE1
  ELSE
      MOVE    "サイズ オーバー"    TO  WK-OUT
      MOVE    1                    TO  SW-ERR
      GO  TO  A-800.
*
   IF  WK-OMOS                 NOT >   2000
       MOVE    60                  TO  WK-SIZE2
   ELSE
   IF  WK-OMOS                 NOT >   5000
       MOVE    80                  TO  WK-SIZE2
   ELSE
   IF  WK-OMOS                 NOT >   10000
       MOVE    100                 TO  WK-SIZE  
   ELSE
   IF  WK-OMOS                 NOT >   15000
       MOVE    120                 TO  WK-SIZE2
   ELSE
   IF  WK-OMOS                 NOT >   20000
       MOVE    140                 TO  WK-SIZE2 
   ELSE
   IF  WK-OMOS                 NOT >   25000
       MOVE    160                 TO  WK-SIZE2
   ELSE
       MOVE    "重量オーバー"      TO  WK-OUT
       MOVE    1                   TO  SW-ERR
       GO  TO  A-800.
*
   IF  WK-SIZE1                    >   WK-SIZE2
       MOVE    WK-SIZE1            TO  WK-SIZE
   ELSE
       MOVE    WK-SIZE2            TO  WK-SIZE.
*
   IF  WK-INDEXH                   =   0
       MOVE    1                   TO  I
   ELSE
   IF  WK-INDEXH                   =   1 OR 2 OR 3
       MOVE    2                   TO  I
   ELSE
   IF  WK-INDEXH                   =   4 OR 5 OR 6
       MOVE    3                   TO  I
   ELSE
   IF  WK-INDEXH                   =   7 OR  8 OR  9 OR 10 OR
                                      11 OR 12 OR 13 OR 14
       MOVE    4                   TO  I
   ELSE
   IF  WK-INDEXH                   =   15 OR 16
       MOVE    5                   TO  I
   ELSE
   IF  WK-INDEXH                   =   17 OR 18 OR 19
       MOVE    6                   TO  I
   ELSE
   IF  WK-INDEXH                   =   20 OR 21 OR 22 OR 23
       MOVE    7                   TO  I
   ELSE
   IF  WK-INDEXH                   =   24 OR 25 OR 26 OR 27 OR
                                       28 OR 29
       MOVE    8                   TO  I
   ELSE
   IF  WK-INDEXH                   =   30 OR 31 OR 32 OR 33 OR
                                       34
       MOVE    9                   TO  I
   ELSE
   IF  WK-INDEXH                   =   35 OR 36 OR 37 OR 38
       MOVE    10                  TO  I
   ELSE
   IF  WK-INDEXH                   =   39 OR 40 OR 41 OR 42 OR
                                       43 OR 44 OR 45
       MOVE    11                  TO  I
   ELSE
       MOVE    12                  TO  I.
*
   IF  WK-INDEXC                   =   0
       MOVE    1                   TO  J
   ELSE
   IF  WK-INDEXC                   =   1 OR 2 OR 3
       MOVE    2                   TO  J
   ELSE
   IF  WK-INDEXC                   =   4 OR 5 OR 6
       MOVE    3                   TO  J
   ELSE
   IF  WK-INDEXC                   =   7 OR  8 OR  9 OR 10 OR
                                      11 OR 12 OR 13 OR 14
       MOVE    4                   TO  J
   ELSE
   IF  WK-INDEXC                   =   15 OR 16
       MOVE    5                   TO  J
   ELSE
   IF  WK-INDEXC                   =   17 OR 18 OR 19
       MOVE    6                   TO  J
   ELSE
   IF  WK-INDEXC                   =   20 OR 21 OR 22 OR 23
       MOVE    7                   TO  J
   ELSE
   IF  WK-INDEXC                   =   24 OR 25 OR 26 OR 27 OR
                                       28 OR 29
       MOVE    8                   TO  J
   ELSE
   IF  WK-INDEXC                   =   30 OR 31 OR 32 OR 33 OR
                                       34
       MOVE    9                   TO  J
   ELSE
   IF  WK-INDEXC                   =   35 OR 36 OR 37 OR 38
       MOVE    10                  TO  J
   ELSE
   IF  WK-INDEXC                   =   39 OR 40 OR 41 OR 42 OR
                                       43 OR 44 OR 45
       MOVE    11                  TO  J
   ELSE
       MOVE    12                  TO  J.
*
   MOVE    WT-60DAT                TO  WT-60TBL.
   MOVE    WT-80DAT                TO  WT-80TBL.
   MOVE    WT-100DAT               TO  WT-100TBL.
   MOVE    WT-120DAT               TO  WT-120TBL.
   MOVE    WT-140DAT               TO  WT-140TBL.
   MOVE    WT-160DAT               TO  WT-160TBL.
   EVALUATE WK-SIZE
     WHEN 60
        MOVE    WT-60KIN (I J)   TO  WK-DKIN
     WHEN 80
        MOVE    WT-80KIN (I J)   TO  WK-DKIN
     WHEN 100
        MOVE    WT-100KIN (I J)  TO  WK-DKIN
     WHEN 120
        MOVE    WT-120KIN (I J)  TO  WK-DKIN
     WHEN 140
        MOVE    WT-140KIN (I J)  TO  WK-DKIN
     WHEN 160
        MOVE    WT-160KIN (I J)  TO  WK-DKIN
    END-EVALUATE.
*
    MOVE    WK-DKIN              TO  WK-OUT.
    GO  TO  A-900.
 A 800.     
   DISPLAY 'Content-type: text/html'.
   DISPLAY.
   DISPLAY '<HTML>'.
   DISPLAY '<HEAD><TITLE>入力エラー</TITLE></HEAD>'.
   DISPLAY '<BODY>'.
   DISPLAY '<FONT SIZE=5 COLOR=RED>入力エラー</FONT>'.
   DISPLAY '<BR><BR>'.
   DISPLAY WK-OUT.
   DISPLAY '<BR><BR>'.
   DISPLAY '<A HREF="../index.htm">HOME</A>'.
   DISPLAY '</BODY>'.
   DISPLAY '</HTML>'.
   GO TO A-999.
 A-900.
   DISPLAY 'Content-type: text/html'.
   DISPLAY.
   DISPLAY '<HTML>'.
   DISPLAY '<HEAD><TITLE>運賃算出結果</TITLE></HEAD>'.
   DISPLAY '<BODY>'.
   DISPLAY '<FONT SIZE=5>運賃算出結果</FONT>'.
   DISPLAY '<BR>'.
   DISPLAY '<BR>運賃は '.
   DISPLAY WK-OUT.
   DISPLAY ' 円です'.
   DISPLAY '<BR><BR>'.
   DISPLAY '<A HREF="../index.htm">HOME</A>'.
   DISPLAY '</BODY>'.
   DISPLAY '</HTML>'.
 A-999.
   EXIT-PROGRAM.


こんな感じでCOBOLでのCGIプログラミングが出来ました。
インターフェイスの受け渡しをコマンドラインベースで行なっているので あまり細かな制御は出来ないのですが、ただ単にHTMLからCOBOLを起動させ ファイル等の情報を表示するだけでのCGIであれば COBOLで作成したCGIで十分に目的を果たす事が出来るかと思います。
「フリーCOBOLでWebプログラムの作成」という楽しみがまた一つ増えました。