2001/09/02版

当バージョンでは 待ちに待った協力者が現れ ゆうパック版を作成して頂きました。(見事に”ささっと”作成されました)
今回 ゆうパック版を追加するにあたって、データベースの構造を少し変えました(列の追加・表の名称の変更)
またテーブル作成SQLファイルの作成、テストデータ作成プログラムと本体プログラムのMakefileを1本化しました。

協力してくださった「みねの」さん ご苦労様でした。

開発環境 Vine Linux 2.1 Tinycobol-0.54

GUIの部分は以前と変わり無しです。
またまたVine Linux2.1に戻りました。



実行はPostgreSQLのユーザでXにログインし実行させます。
postmasterを起動させれば あとは今まで通り./unchin.tclで実行可能です。



データベース名  unchin

テーブル名     takuhai

列名         種類がsyu でinteger
            サイズがsize でinteger
            発地がhat でinteger
            着地がchk でinteger
            運賃がuncn でinteger


以下 作成方法を簡単に説明します。
1.unchinデータベース作成
$createdb unchin

2.takuhaiテーブル作成
$psql unchin < create.sql (注 以下で説明)

テストデータ作成方法は クロネコヤマト用のtest01とゆうパック用のtest02を実行させます。

ゆうパックの場合、地域によるunchinの組み合わせが47×47通りありますのでデータ作成プログラムは少し複雑になりました。
bbb02.txtというファイルで「送り元の県」から「送り先の県」の地帯(第1〜第4地帯まであります)をマトリックスで作成しました。そのファイルをインプットとしてtest02.cobで更に重量によるunchin分けを行いデーターベースにinsertしております。

合計22,954件のレコードが出来ました。

実行方法は以下です。
postmasterを起動しpostgreSQLのユーザにてtest01とtest02を実行する。

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

 yupack.cobです。(
みねのさん作成)


IDENTIFICATION DIVISION.
PROGRAM-ID. YUPACK.
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-SIZE PIC 9(03).
01 WK-3HEN PIC S9(06)V9(3).
01 WK-DKIN PIC ZZ,ZZZ,ZZ9.
01 WK-OUT PIC X(10).
01 WK-INDEXH PIC 9(3).
01 WK-INDEXC PIC 9(3).
77 DATABASE-NAME PIC X(80).
77 SQL-QUERY PIC X(200).
77 DB-HANDLE PIC 9(12) COMP.
77 QRY-HANDLE PIC 9(12) COMP.
77 NTUPLE PIC 9(12) COMP.
77 NFIELD PIC 9(12) COMP.
77 MAX-TUPLE PIC 9(12) COMP.
77 MAX-FIELD PIC 9(12) COMP.
77 COLUMN-VALUE PIC X(80) VALUE SPACES.
77 CMD PIC 9.
77 DB-STATUS PIC 9(12) COMP.
77 DB-MESSAGE Pic X(200).
01 MYTBL-RECORD PIC X(15).
*
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-TATE > 100 OR WK-YOKO > 100 OR WK-TAKA > 100
OR
WK-3HEN > 150
MOVE "サイズ オーバー" TO WK-OUT
GO TO A-999.
*
IF WK-OMOS NOT > 2000
MOVE 2 TO WK-SIZE
ELSE
IF WK-OMOS NOT > 4000
MOVE 4 TO WK-SIZE
ELSE
IF WK-OMOS NOT > 6000
MOVE 6 TO WK-SIZE
ELSE
IF WK-OMOS NOT > 8000
MOVE 8 TO WK-SIZE
ELSE
IF WK-OMOS NOT > 10000
MOVE 10 TO WK-SIZE
ELSE
IF WK-OMOS NOT > 12000
MOVE 12 TO WK-SIZE
ELSE
IF WK-OMOS NOT > 14000
MOVE 14 TO WK-SIZE
ELSE
IF WK-OMOS NOT > 16000
MOVE 16 TO WK-SIZE
ELSE
IF WK-OMOS NOT > 18000
MOVE 18 TO WK-SIZE
ELSE
IF WK-OMOS NOT > 20000
MOVE 20 TO WK-SIZE
ELSE
MOVE "重量 オーバー" TO WK-OUT
GO TO A-999.

*
*---- FROM INDEX SET ----*
COMPUTE WK-INDEXH = WK-INDEXH + 1.
*
*---- TO INDEX SET ----*
COMPUTE WK-INDEXC = WK-INDEXC + 1.
*
*
*---- DB CONNECT ----*
MOVE "unchin" TO DATABASE-NAME.
CALL "sql_connect_db" USING DATABASE-NAME
DB-HANDLE
DB-STATUS.
IF DB-STATUS NOT = ZEROS
DISPLAY "Error in database connection!"
STOP RUN.
*
*---- DB SELECT ----*
STRING "select uncn from takuhai where syu = 2 and "
" size = " WK-SIZE
" and hat = " WK-INDEXH
" and chk = " WK-INDEXC
" ;;" INTO SQL-QUERY.
*
CALL "sql_exec_query" USING DB-HANDLE
SQL-QUERY
QRY-HANDLE
DB-STATUS.
IF (DB-STATUS NOT = 1 AND
DB-STATUS NOT = 2)
MOVE SPACES TO DB-MESSAGE
CALL "sql_status_message" USING DB-HANDLE
DB-MESSAGE
DISPLAY DB-MESSAGE.
*
CALL "sql_max_tuple" USING QRY-HANDLE
MAX-TUPLE.
CALL "sql_max_field" USING QRY-HANDLE
MAX-FIELD.
MOVE ZERO TO NTUPLE
PERFORM UNTIL NTUPLE = MAX-TUPLE
CALL "sql_get_tuple" USING QRY-HANDLE
NTUPLE
MYTBL-RECORD
ADD 1 TO NTUPLE
END-PERFORM.
*
CALL "sql_clear_query" USING QRY-HANDLE.
*
*---- DB DISCONNECT ----*
CALL "sql_disconnect_db" USING DB-HANDLE.
*
** 縦 **
MOVE MYTBL-RECORD TO A.
MOVE ZERO TO C.
CALL "SUBX" USING A C JSW.
MOVE C TO WK-DKIN.
MOVE WK-DKIN TO WK-OUT.
A-999.
DISPLAY WK-OUT.
EXIT-PROGRAM.
 データ作成用COBOLプログラム test02.cobです。みねのさん作成)

IDENTIFICATION DIVISION.
PROGRAM-ID. TEST02.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INFILE ASSIGN TO "bbb02.txt"
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS FS.
DATA DIVISION.
FILE SECTION.
FD INFILE
LABEL RECORD IS STANDARD.
01 IN-REC.
03 IN-AREA-DATA.
05 IN-AREA OCCURS 47 INDEXED BY INDX.
07 IN-AREA-NO PIC 9(1).
07 FILLER PIC X(1).
WORKING-STORAGE SECTION.
77 FS PIC 9(2).
77 DATABASE-NAME PIC X(80).
77 SQL-QUERY PIC X(200).
77 DB-HANDLE PIC 9(12) COMP.
77 DB-STATUS PIC 9(12) COMP.
77 DB-MESSAGE PIC X(80).
77 QRY-HANDLE PIC 9(12) COMP.
01 I PIC 9(2) VALUE 0.
01 J PIC 9(2).
01 WK-NUM PIC 9(2).
01 WK-TBL.
03 WT-UNCHIN-TBL.
05 WT-1AREA PIC X(40) VALUE
"0610077009301010109011701250133014101490".
05 WT-2AREA PIC X(40) VALUE
"0710087010301110119012701350143015101590".
05 WT-3AREA PIC X(40) VALUE
"0820098011401220130013801460154016201700".
05 WT-4AREA PIC X(40) VALUE
"1020118013401420150015801660174018201900".
03 WT-UNCHIN-R REDEFINES WT-UNCHIN-TBL.
05 WT-UNCHIN-G OCCURS 4
INDEXED BY WT-IDX-AREA.
07 WT-UNCHIN PIC 9(4) OCCURS 10
INDEXED BY WT-IDX-G.

01 WK-INSERT.
03 WK-INS01 PIC X(29) VALUE
"INSERT INTO takuhai VALUES (".
03 FILLER PIC X(02) VALUE "2,".
03 WK-INS02 PIC 9(03).
03 WK-INS03 PIC X(01) VALUE ",".
03 WK-INS04 PIC 9(02).
03 WK-INS05 PIC X(01) VALUE ",".
03 WK-INS06 PIC 9(02).
03 WK-INS07 PIC X(01) VALUE ",".
03 WK-INS08 PIC 9(04).
03 WK-INS09 PIC X(03) VALUE ");;".
PROCEDURE DIVISION.
A-000.
DISPLAY "table add (yupack) start"
OPEN INPUT INFILE.
MOVE "unchin" to DATABASE-NAME.
CALL "sql_connect_db" USING DATABASE-NAME DB-HANDLE DB-STATUS.
IF DB-STATUS NOT = ZEROS
DISPLAY "Error in database connection!"
STOP RUN.
* MOVE WT-UNCHIN-TBL TO WT-UNCHIN-R.
A-010.
READ INFILE
AT END GO TO A-999.
IF (FS NOT = "00")
DISPLAY "Error on Reading Input File "
STOP RUN.
*
ADD 1 TO I.
DISPLAY "i= " I.
PERFORM VARYING INDX
FROM 1
BY 1
UNTIL INDX > 47
PERFORM VARYING J
FROM 1
BY 1
UNTIL J > 10
COMPUTE WK-INS02 = J * 2
MOVE I TO WK-INS04
MOVE INDX TO WK-INS06
MOVE IN-AREA-NO(INDX) TO WK-NUM
SET WT-IDX-AREA TO WK-NUM
* SET WT-IDX-AREA TO IN-AREA-NO(INDX)
SET WT-IDX-G TO J
MOVE WT-UNCHIN(WT-IDX-AREA,WT-IDX-G)
TO WK-INS08
MOVE WK-INSERT TO SQL-QUERY
display sql-query(1:60)
CALL "sql_exec_query" using
DB-HANDLE SQL-QUERY QRY-HANDLE DB-STATUS
* DISPLAY WK-INSERT " " DB-STATUS
if (DB-STATUS not = 1 and DB-STATUS not = 2)
move spaces to DB-MESSAGE
call "sql_status_message" using DB-HANDLE DB-MESSAGE
* display DB-MESSAGE
end-if
END-PERFORM
END-PERFORM.
*
GO TO A-010.

A-999.
CALL "sql_disconnect_db" USING DB-HANDLE.
CLOSE INFILE.
DISPLAY "table add (yupack) normal end ".
STOP RUN.


 テーブル作成用のSQLファイルです。みねのさん作成)

 CREATE.SQL

drop table takuhai;
create table takuhai (
syu integer,
size integer,
hat integer,
chk integer,
uncn integer,
PRIMARY KEY(syu,size,hat,chk)
);


Tcl/Tkは今回変わり無しですので省略致します。