2001/06/09版

当バージョンでは 発地と着地の選択を可能にし 金額計算を発地 着地を元に計算するよう改訂。
またTcl/Tk COBOLのコーディングを見直し(ちょっとコメント追加する)
開発環境 Vine Linux 2.0 Tinycobol-0.53
今回は発地と着地選択の追加。発地決定ボタンを押すとリストボックス上部に選択した地域が表示されます。その発地と着地を元にCOBOLで金額計算します。
金額計算はサイズ毎にOCCURS12×OCCURS12のテーブルを内部テーブルとして持ち、発地と着地をインデックスにし金額を決定しております。
Tcl/Tkの画面に関してはこれがほぼ最終形になります。
次期バージョンでは内部テーブルのファイル化,出来ればPostgreSQLを使用して金額を算出したいと思っております。

  以下にソースを紹介いたします。

まずはCOBOLでyamato.cobです。


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.
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 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.
** 縦 **
MOVE WK-ACC01 TO A.
MOVE ZERO TO C.
CALL "SUBX" USING A C JSW.
MOVE C TO WK-TATE.
** **
MOVE WK-ACC02 TO A.
MOVE ZERO TO C.
CALL "SUBX" USING A C JSW.
MOVE C TO WK-YOKO.
** **
MOVE WK-ACC03 TO A.
MOVE ZERO TO C.
CALL "SUBX" USING A C JSW.
MOVE C TO WK-TAKA.
** 重 **
MOVE WK-ACC04 TO A.
MOVE ZERO TO C.
CALL "SUBX" USING A C JSW.
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
GO TO A-999.
*
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
GO TO A-999.
*
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.
A-999.
DISPLAY WK-OUT.
EXIT-PROGRAM.

Tcl/Tkです。unchin.tcl 
(ちなみに当方Tcl/Tkに関しては全くの初心者ですのでセオリー通りに作成出来ていなく、お恥ずかしいのですが 一応紹介いたします。)

#! /usr/bin/wish
#option add *font kanji16
frame .hat ; #発地
frame .hat.box ; #発地ボックス
frame .chk ; #着地
frame .chk.box ; #着地ボックス
frame .midasi ; #表題
frame .tate ; #縦
frame .yoko -bg red ; #横
frame .taka -bg red ; #高さ
frame .omos -bg red ; #重量
set ent1 ""
set ent2 ""
set ent3 ""
set ent4 ""
set indexa ""
set indexb ""
set dataa ""
set datab ""
#
#ボックスセット内容
set ken {北海道 青森県 秋田県 岩手県 宮城県 山形県 福島県 茨城県 栃木県
群馬県 埼玉県 千葉県 東京都 神奈川県 山梨県 長野県 新潟県 富山県
石川県 福井県 静岡県 愛知県 岐阜県 三重県 滋賀県 京都府 大阪府
兵庫県 奈良県 和歌山県 岡山県 広島県 山口県 鳥取県 島根県
徳島県 香川県 愛媛県 高知県 福岡県 佐賀県 長崎県 熊本県 大分県
宮崎県 鹿児島県 沖縄県}
#
#発地ボックス
entry .hat.dspken -relief groove -bd 2 -width 10
listbox .hat.box.lis -height 15 -width 8 -background white -yscrollcommand {.hat.box.scrl set}
foreach i ${ken} {
.hat.box.lis insert end $i
}
scrollbar .hat.box.scrl -command {.hat.box.lis yview}
button .hat.b1 -relief raised -text "発地決定" -background #cccccc -command sethat
#
#着地ボックス
entry .chk.dspken -relief groove -bd 2 -width 10
listbox .chk.box.lis -height 15 -width 8 -background "#66cccc" -yscrollcommand {.chk.box.scrl set}
foreach j ${ken} {
.chk.box.lis insert end $j
}
scrollbar .chk.box.scrl -command {.chk.box.lis yview}
button .chk.b1 -relief raised -text "着地決定" -background "#229999" -command setchk
#
#サイズ入力
label .midasi.la1 -text 宅配便送料算出
label .tate.inputlabel -bg #990000 -fg white -text 縦のサイズ -width 10
entry .tate.inputentry -width 8 -relief sunken -textvariable ent1
label .yoko.inputlabel -bg #000099 -fg white -text 横のサイズ -width 10
entry .yoko.inputentry -width 8 -relief sunken -textvariable ent2
label .taka.inputlabel -bg #009900 -fg white -text 高さ -width 10
entry .taka.inputentry -width 8 -relief sunken -textvariable ent3
label .omos.inputlabel -bg black -fg white -text 重量(グラム) -width 10
entry .omos.inputentry -width 8 -relief sunken -textvariable ent4
#
#種類選択
radiobutton .rad1 -text "クロネコヤマト宅急便" -variable sw -value "A" -selectcolor blue
radiobutton .rad2 -text "ゆうパック" -variable sw -value "B" -selectcolor red
radiobutton .rad3 -text "定形外郵便" -variable sw -value "C" -selectcolor yellow
#
#実行ボタン
button .enter -text 実行 -command {enter [.tate.inputentry get] [.yoko.inputentry get] [.taka.inputentry get] [.omos.inputentry get] $indexa $indexb $sw}
#
#終了ボタン
button .syuryo -text 終了 -command exit
#パッキング
pack .midasi
pack .hat.box.lis .hat.box.scrl -fill y -in .hat.box -side left
pack .hat.dspken .hat.box .hat.b1 -in .hat -side top
pack .chk.box.lis .chk.box.scrl -fill y -in .chk.box -side left
pack .chk.dspken .chk.box .chk.b1 -in .chk -side top
pack .hat -side left
pack .chk -side left
pack .midasi.la1
pack .tate.inputlabel .tate.inputentry -in .tate -side left
pack .yoko.inputlabel .yoko.inputentry -in .yoko -side left
pack .taka.inputlabel .taka.inputentry -in .taka -side left
pack .omos.inputlabel .omos.inputentry -in .omos -side left
pack .midasi .tate .yoko .taka .omos -side top
pack .rad1 .rad2 .rad3 .enter .syuryo -side top -anchor w
#
#---------------エンター処理---------------
proc enter {arg1 arg2 arg3 arg4 arg5 arg6 arg7} {
global indexa
global indexb
if {$arg1 < 1 } {
tk_messageBox -message "縦サイズ エラー"
focus .tate.inputentry
} elseif {$arg2 < 1} {
tk_messageBox -message "横サイズ エラー"
focus .yoko.inputentry
} elseif {$arg3 < 1} {
tk_messageBox -message "高さサイズ エラー"
focus .taka.inputentry
} elseif {$arg4 < 1} {
tk_messageBox -message "重さ エラー"
focus .omos.inputentry
} elseif {$arg5 < 0} {
tk_messageBox -message "発地未選択 エラー"
focus .omos.inputentry
} elseif {$arg6 < 0} {
tk_messageBox -message "着地未選択 エラー"
focus .omos.inputentry
} elseif {$arg7 == "A"} {
set command "./yamato $arg1 $arg2 $arg3 $arg4 $arg5 $arg6"
set result [eval exec $command]
tk_messageBox -message $result
focus .tate.inputentry
if {$result < 9999} {
.hat.dspken delete 0 end
.chk.dspken delete 0 end
set indexa ""
set indexb ""
set dataa ""
set datab ""
}
} elseif {$arg7 == "B"} {
set command "./yupack $arg1 $arg2 $arg3 $arg4 $arg5 $arg6"
set result [eval exec $command]
tk_messageBox -message $result
focus .tate.inputentry
if {$result < 9999} {
.hat.dspken delete 0 end
.chk.dspken delete 0 end
set indexa ""
set indexb ""
set dataa ""
set datab ""
}
} elseif {$arg7 == "C"} {
set command "./teigai $arg1 $arg2 $arg3 $arg4 $arg5 $arg6"
set result [eval exec $command]
tk_messageBox -message $result
focus .tate.inputentry
if {$result < 9999} {
.hat.dspken delete 0 end
.chk.dspken delete 0 end
set indexa ""
set indexb ""
set dataa ""
set datab ""
}
} else {
tk_messageBox -message "便選択 エラー"
focus .tate.inputentry
}
}
#
#-----------発地セット処理--------------
proc sethat {} {
global indexa
global dataa
set indexa [.hat.box.lis curselection]
set dataa [.hat.box.lis get $indexa]
.hat.dspken delete 0 end
.hat.dspken insert 0 $dataa
}
#
#-----------着地セット処理-------------
proc setchk {} {
global indexb
global datab
set indexb [.chk.box.lis curselection]
set datab [.chk.box.lis get $indexb]
.chk.dspken delete 0 end
.chk.dspken insert 0 $datab
}