2009年05月03日 DVD to VCD(VIDEO CD) [長年日記]
_ DVD to VCD(VIDEO CD)
私のメインのデスクトップ機にはDVD-ROMドライブは付いているが、DVD-R等に書きこみ出来るドライブは付いていない(今時なのだが)。なぜなら、それは私がSCSI至上主義を貫いているからに他ならない。
SCSIのDVD-Rドライブなどは(しかも内蔵に限る)は、めったに手に入らない。
さっさと、そんな主義はとっぱらって、数千円のIDE接続のドライブを手に入れれば良いだけの事なのだが、今さらこのマシン(Pentium-II 375MHZ)に投資するのも、なんだかなぁ...というところ。
そんな事で、今までもDVDを焼くときはmpeg4にして、データとしてCD-Rに焼いているのだが、当然パソコンでないと視聴できない。
そんな状況を少しでも(努力のみで)向上させるために、DVDを(懐かしの)Video CDとして焼くスクリプトを作った。当然、MAX70分から80分程度のソースに限るのだが。まぁ、うちのブラウン管テレビで視聴する分には充分(と言ってみる)。
#! /bin/sh if [ "X$1" = "X-h" -o "X$1" = "X--help" ] then echo "Usage : dvd2vcd.sh [-rw] [-s hh:mm:ss] [ -e hh:mm:ss] [-a ax:ay] [-t title] [-c chapter] [-vb vbitrate] [-ab abitrate] [-f fps] [-al audio_lang] [-sl subtitle_lang]" echo "" echo " -rw : CD-RW" echo " -s start_time : start position time" echo " -e end_time : pass time" echo " -a ax:ay : source aspect(default 16:9)" echo " -t title : title number(default 1)" echo " -c chapter : chapter(default 1)" echo " -vb vbitrate : video bitrate (kbit) (default 1150)" echo " -ab abitrate : audio bitrate (kbit) (default 224)" echo " -f fps : frame per second(default 24)" echo " -al audio_lang : audio language (default ja,en)" echo " -ai audio_id : audio id" echo " -sl subtitle_lang : subtitle language (default none)" echo " -si subtitle_id : subtitle id " exit 0 fi # resample=44100 expand=352:240 packetsize=2324 # vbitrate=1150 abitrate=224 ofps=24 aspect=16:9 # rw=no start="" end="" title="1" chapter="1" alang="ja" aid="" slang="" sid="" # while [ $# != 0 ] do case $1 in -rw ) rw=yes ;; -s ) shift start="-ss $1" ;; -e ) shift end="-endpos $1" ;; -a ) shift aspect=$1 ;; -t ) shift title="$1" ;; -c ) shift chapter="$1" ;; -vb ) shift vbitrate="$1" ;; -ab ) shift abitrate="$1" ;; -f ) shift ofps="$1" ;; -al ) shift alang="$1" ;; -ai ) shift aid="$1" ;; -sl ) shift slang="$1" ;; -si ) shift sid="$1" ;; esac shift done # ex=`echo ${expand} | cut -d: -f1` ey=`echo ${expand} | cut -d: -f2` ax=`echo ${aspect} | cut -d: -f1` ay=`echo ${aspect} | cut -d: -f2` sy=`expr ${ex} \* ${ay} / ${ax}` if [ ${sy} -gt ${ey} ] then sy=${ey} sx=`expr ${ey} \* ${ax} / ${ay}` else sx=${ex} fi # if [ "X${alang}" = "X" ] then alang_opt="" else alang_opt="-alang ${alang}" fi # if [ "X${aid}" = "X" ] then aid_opt="" else aid_opt="-aid ${aid}" fi # if [ "X${slang}" = "X" ] then slang_opt="" else slang_opt="-slang ${slang}" fi # if [ "X${sid}" = "X" ] then sid_opt="" else sid_opt="-sid ${sid}" fi # function menc() { vpass=$1 filename=$2 mencoder dvd://${title} -chapter ${chapter} \ ${start} ${end} \ ${alang_opt} ${aid_opt} \ ${slang_opt} ${sid_opt} \ -afm libmad, \ -vfm ffmpeg, \ -af resample=${resample} \ -vf scale=${sx}:${sy},expand=${expand} \ -oac lavc \ -ovc lavc \ -lavcopts vcodec=mpeg1video:vbitrate=${vbitrate}:vhq:vpass=${vpass}:acodec=mp2:abitrate=${abitrate} \ -ofps ${ofps} \ -of mpeg \ -mpegopts format=xvcd:size=${packetsize} \ -o ${filename} } # menc 1 /dev/null menc 2 /tmp/dvd2vcd.$$.tmp.mpg # vcdimager --cue-file=/tmp/dvd2vcd.$$.tmp.cue \ --bin-file=/tmp/dvd2vcd.$$.tmp.bin \ /tmp/dvd2vcd.$$.tmp.mpg # if [ ${rw} = yes ] then cdrdao blank -n --speed 8 --device 0,3,0 fi cdrdao write -n --speed 8 --device 0,3,0 /tmp/dvd2vcd.$$.tmp.cue # rm -f /tmp/dvd2vcd.$$.tmp.*
mencoderでDVDをmpeg1形式に変換し、vcdimagerでmpeg1形式からVIDEO CD形式に変換する。最後に、それをcdrdaoでCD-Rに焼けば完成。
cdrdaoの--device指定は(当然)環境によって異なるので注意すること。
VIDEO-CDの規格上はmpeg1のビットレートは1150Kbps(以下?)、音声のビットレートは224Kbps(固定?)という事なのだが、うちのDVDプレーヤー(Panasonic NV-VHD1)では規定ビットレート以下であれば再生できた(ただし、表示される進行時間が早く進んで行くが...)。いわゆる規格外VCDということになるのだろうが、とりあえず画質の低下を我慢すれば2時間の映画を無理矢理CD-R1枚に納める事も可能。
2009年05月06日 libretto100(myh.no-ip.org) HD置換 後日談 [長年日記]
_ libretto100(myh.no-ip.org) HD置換 後日談
なんと、libretto100のHD交換後、プロバイダーからのメールを取得するfetchmailをcronからキックする設定を有効に戻すのを忘れていた。
約2週間メールが止まっていた事になる。メーリングリスト系がピタッと止まっていたので、怪訝には感じていたが、ゴールデンウィークの影響かと考えていたのだが。
結局、430通ほどのメールが溜っていて、ただ今取得中。
2009年05月08日 firefox-3.0.9 version up [長年日記]
_ firefox-3.0.9 version up
.mozconfig
. $topsrcdir/browser/config/mozconfig ac_add_options --disable-debug ac_add_options --disable-dbus ac_add_options --disable-jemalloc ac_add_options --enable-optimize ac_add_options --enable-default-toolkit=cairo-gtk2
build
nice make -f client.mk build nice make package
2009年05月18日 sqlite3-ruby(1.2.4)儂(わし)的解釈によるメモ [長年日記]
_ sqlite3-ruby(1.2.4)儂(わし)的解釈によるメモ
インストール
sqlite-amalgamation-3.6.14.tar.gz
- tar xvzf sqlite-amalgamation-3.6.14.tar.gz
- cd sqlite-3.6.14
- ./configure
- make
- make install
rubygems-1.3.3.tgz
- tar xvzf rubygems-1.3.3.tgz
- cd rubygems-1.3.3
- ruby setup.rb config
- ruby setup.rb setup
- ruby setup.rb install
sqlite3-ruby-1.2.4.tar.bz2
- cd sqlite3-ruby-1.2.4
- ruby setup.rb config
- ruby setup.rb setup
- ruby setup.rb install
サンプルスクリプト
悪魔茶屋 SQLite3のページで紹介されているスクリプトをベースにさせていただいてます。
#! /usr/bin/ruby require 'rubygems' require 'sqlite3' ##require 'nkf' #====================================================================== # # Databaseへの接続 # puts "Databaseへの接続" # db = SQLite3::Database.new('test.db') # # データベース項目へ格納する際に、自動的に型変換する # db.type_translation = true # # 排他に出会った時の最大待ち時間(msec) # # transaction使用時は無視されるよう? # db.busy_timeout(5 * 1000) # # 排他に出会った時のトラップハンドラ(busy_timeoutと同時使用不可) # # transaction使用時は無視されるよう? # #db.busy_handler("test.db"){|data, retries| # print "in busy_handler data is ",data,"\n" # print "retries is ",retries,"\n" # sleep 1; # if (retries <= 3) # return true # else # return false # end #} #====================================================================== # # トランザクションの開始(busy_timeout, busy_handlerの使用不可?) # #puts "トランザクションの開始" # ##db.transaction #====================================================================== # # テーブル削除(念のため) # puts "テーブル削除(念のため)" # sql = <<SQL drop table member; SQL begin db.execute(sql) rescue => e if (e.to_s == "no such table: member") # # ありがちなエラー(テーブル存在しない)は明示的にトラップ処理 # puts "drop error, but continue." else # # 予測できないエラーはトラップして終了 # p e puts "drop ERROR = {#{e}}" exit 1 end end #====================================================================== # # テーブル作成 # puts "テーブル作成" # sql = <<SQL create table member ( id INT PRIMARY KEY, name TEXT, job TEXT ); SQL db.execute(sql) #====================================================================== # # 2重にテーブル作成し、わざとエラーを発生させてみる # puts "2重にテーブル作成し、わざとエラーを発生させてみる" # begin db.execute(sql) rescue => e if (e.to_s == "table member already exists") # # ありがちなエラー(テーブルは既に存在する)は明示的にトラップ処理 # puts "create table error, but continue." else # # 予測できないエラーはトラップして終了 # p e puts "create table ERROR = {#{e}}" exit 1 end end #====================================================================== # # インデックス作成 # puts "インデックス作成" # sql = <<SQL create index i_member_name on member(name); SQL db.execute(sql) #====================================================================== # # データセットアップ(バインド機能使用) # puts "データセットアップ(バインド機能使用)" # sql = "insert into member (id, name, job) values (:id, :name, :job)" db.execute(sql, :id => 1, :name => '伊藤 太郎', :job => 'サラリーマン') db.execute(sql, :id => 2, :name => '山田 太郎', :job => '野球選手') db.execute(sql, :id => 3, :name => '山田 花子', :job => 'タレント')
悪魔茶屋 SQLite3のページではsqlite3にデータを格納する際にはUTF-8にしないといけない旨の記述があるが、実際に生EUCを放り込んでみても特に問題なかった。ただし、他のコード(SJIS etc)だと問題が発生するのかも。
追記:やはりUTF-8でないとマルチバイト文字を検索に利用すると不正な結果を返す事があるようす。
#====================================================================== # # 2重にデータを作成し、わざとエラーを発生させてみる # puts "2重にデータを作成し、わざとエラーを発生させてみる" # begin db.execute(sql, :id => 3, :name => '山田 花子', :job => 'タレント') rescue => e if (e.to_s == "column id is not unique") # # ありがちなエラー(指定したキーは既に存在する)は明示的にトラップ処理 # puts "insert error, but continue." else # # 予測できないエラーはトラップして終了 # p e puts "insert ERROR = {#{e}}" exit 1 end end #====================================================================== # # データの検索(バインド機能使用) # puts "データの検索(バインド機能使用)" # sql = "select * from member where id >= :val" result = db.execute(sql, :val => 1) # # 結果レコードが有れば表示する # if (result.length > 0) p result[0][0].class # => Fixnum p result[0][1].class # => String p result[0][2].class # => String end result.each do |m| puts "#{m[0]}\t#{m[1]}\t#{m[2]}" end #====================================================================== # # データの更新(バインド機能使用) # puts "データの更新(バインド機能使用)" # sql = "update member set job = :job where name = :name" db.execute(sql, :job => '裁判官', :name => '山田 太郎') # # 更新結果の確認 # puts "更新結果の確認" # sql = "select * from member where name = :name" result = db.execute(sql, :name => '山田 太郎') result.each do |m| puts "#{m[0]}\t#{m[1]}\t#{m[2]}" end #====================================================================== # # データの削除(バインド機能使用) # puts "データの削除(バインド機能使用)" # sql = "delete from member where name like :name" db.execute(sql, :name => '山田%') # # 削除結果の確認(バインド機能使用) # puts "削除結果の確認(バインド機能使用)" # sql = "select * from member where id >= :id" result = db.execute(sql, :id => 1) result.each do |m| puts "#{m[0]}\t#{m[1]}\t#{m[2]}" end #====================================================================== # # トランザクション完了 # #puts "トランザクション完了" # ##db.commit #====================================================================== # # Databaseからの切断 # puts "Databaseからの切断" # db.close
その他sqlite3の運用に関して
インデックスの再作成は、
$ sqlite3 foo.db reindex
無効領域の開放は、
$ sqlite3 foo.db vacuum
2009年05月20日 open-cobol(1.0)儂(わし)的解釈によるメモ [長年日記]
_ open-cobol(1.0)儂(わし)的解釈によるメモ
さて、私自身COBOLと付き合い出して20年以上になるわけだが(あっ、メインフレームのね)、正直、以下のサンプルで使ってる程度の命令、構文が理解できてればバッチ処理に関しては(たぶん)充分。ただし、実際に業務システムを構築する際には、JCL(Job Control Language)やユーティリティ類との組合せで力を発揮するものなので、LinuxやCygwin上でのopen-cobolではCOBOLの良さが見えにくいかもしれない。
ちなみにデータベース、オンライン処理(DB/DC)に関してはメーカー(処理系)依存が大きいもんなので、一般論で語るのは何かと難しい。
インストール
Berkeley DB(4.7)
- tar xvzf db-4.7.25.tar.gz
- cd db-4.7.25/build_unix
- ../dist/configure
- make
- make install
- vi /etc/ld.so.conf
/usr/local/BerkeleyDB.4.7/lib
- ldconfig
open-cobol(1.0)
- tar xvzf open-cobol-1.0.tar.gz
- cd open-cobol-1.0
- CPPFLAGS=-I/usr/local/BerkeleyDB.4.7/include LDFLAGS=-L/usr/local/BerkeleyDB.4.7/lib ./configure
- make
- make install
サンプルプログラム
*00111111111122222222223333333333444444444455555555556666666666777 *89012345678901234567890123456789012345678901234567890123456789012 * * open-cobol sample by m-ito@myh.no-ip.org in 2009.05.20 * * Compile : cobc -x sample.cob * Run : LS=ls.dat IDX=idx.dat REL=rel.dat ./sample * * ================================================== * 見出し部 * ================================================== IDENTIFICATION DIVISION. PROGRAM-ID. SAMPLE. AUTHOR. M-ITO. * ================================================== * 環境部 * ================================================== ENVIRONMENT DIVISION. * -------------------------------------------------- * 入出力節 * -------------------------------------------------- INPUT-OUTPUT SECTION. FILE-CONTROL. * * LINE SEQENTIOAL(テキストファイル形式) * SELECT LS-FILE ASSIGN "LS" ORGANIZATION LINE SEQUENTIAL STATUS LS-STS.
ASSIGN "LS"の場合、実際に割り当てられるファイルは環境変数LSから取得される(open-cobol独自仕様?)。
ORGANIZATION LINE SEQUENTIALは、いわゆるテキストファイル(エディタで作れるやつ)を順編成ファイルとして扱うことが出来るので、UNIXやWindows環境では便利。
ORGANIZATION SEQUENTIALは、本来の(メインフレーム上での)順編成ファイルを扱う場合。
* * INDEX(索引順編成形式) * SELECT IDX-FILE ASSIGN "IDX" ORGANIZATION INDEXED ACCESS DYNAMIC RECORD KEY IDX-KEY ALTERNATE RECORD KEY IS IDX-KEY2 WITH DUPLICATES STATUS IDX-STS.
索引順編成ファイルはBerkeley DBを利用して実装されている。ちょっとしたデータ管理ならデータベースが無くてもこれで充分かもしれない。(トランザクション、ロールバックが使えれば本当にデータベースは必要無いかも)
* * RELATIVE(相対編成形式) * SELECT REL-FILE ASSIGN "REL" ORGANIZATION RELATIVE ACCESS DYNAMIC RELATIVE KEY REL-KEY STATUS REL-STS.
相対編成ファイルも一時期ある顧客のシステムでよく使った。ようは、件数を指定して直接その件数目にアクセスできる形式。
* ================================================== * データ部 * ================================================== DATA DIVISION. * -------------------------------------------------- * ファイル節 * -------------------------------------------------- FILE SECTION. * * LINE SEQENTIOAL(テキストファイル形式) * FD LS-FILE. 01 LS-REC. 02 LS-SEQ PIC S9(3) SIGN IS LEADING SEPARATE CHARACTER. 02 LS-DATA PIC X(80).
SIGN IS LEADINGとSEPARATE CHARACTERもUNIX, Windows環境で、数値データをASCIIフラットファイルに格納して扱う(UNIXという考え方 定理5)のに非常に適している。S9(3)の場合は"-999" 〜 "+999"の4byteの文字列として格納される。
* * INDEX(索引順編成形式) * FD IDX-FILE. 01 IDX-REC. 02 IDX-KEY PIC S9(3) SIGN IS LEADING SEPARATE CHARACTER. 02 IDX-DATA. 03 IDX-KEY2 PIC X(10). 03 FILLER PIC X(70). * * RELATIVE(相対編成形式) * FD REL-FILE. 01 REL-REC. 02 REL-SEQ PIC S9(3) SIGN IS LEADING SEPARATE CHARACTER. 02 REL-DATA PIC X(80). * -------------------------------------------------- * 作業領域節 * -------------------------------------------------- WORKING-STORAGE SECTION.
WORKING-STORAGE SECTIONでは変数の定義を行う。常に批判の的になる事だが、基本的にCOBOLで扱う変数は全て大局(グローバル)変数なのだ。
例
- X(10) 10バイトの文字列
- 9(10) 10桁の正整数
- S9(10) 10桁の整数
- S9(10)V9(5) 15桁(小数点以下5桁)の実数
- N(10) 日本語10桁の文字列
01 LS-STS PIC X(2). 01 IDX-STS PIC X(2). 01 REL-STS PIC X(2). * 01 END-SW PIC X(3) VALUE "OFF". 01 INV-SW PIC X(3) VALUE "OFF".
VALUE句で初期値を指定する。
01 REL-KEY PIC 9(3). 01 WK-SEQ PIC S9(3). 01 I PIC 9(3). 01 J PIC 9(3). * 01 WK-UNSTRING PIC X(80). 01 WK-UNSTRING-1 PIC X(10). 01 WK-UNSTRING-2 PIC X(10). 01 WK-UNSTRING-3 PIC X(10). 01 WK-UNSTRING-4 PIC X(10). * 01 WK-INSPECT PIC X(80). 01 WK-INSPECT-CNT PIC 9(3). * 01 WK-EDIT-1 PIC ---,---,---9. 01 WK-EDIT-2 PIC ZZZ,ZZZ,ZZZ9. * 01 WK-COMPUTE PIC S9(10)V9(10). 01 WK-COMPUTE-2 PIC ---,---,---9.9(10).
数値項目を簡単に文書的に見やすく編集する機能があるのがCOBOLの良い所。
* 01 WK-DIVIDE-SHO PIC S9(10). 01 WK-DIVIDE-AMARI PIC S9(10). * 01 WK-VALUEHEX PIC X(4) VALUE X"B4C1BBFA".
16進の定数は X"16進数表現" で表す。
* 01 WK-VALUEKANJI PIC N(2) VALUE "漢字". * 01 WK-ACCEPT PIC X(80). * 01 WK-REDEFINES PIC X(7). 01 WK-REDEFINES-R REDEFINES WK-REDEFINES. 02 WK-REDEFINES-G PIC X(1). 02 WK-REDEFINES-NN PIC X(2). 02 WK-REDEFINES-TT PIC X(2). 02 WK-REDEFINES-HH PIC X(2).
REDEFINES句はCOBOLに特徴的な機能。異なる変数を同じ領域に重ね合わせるイメージ。他の言語ならポインターを使うような場面かと思うが、この使い勝手はCOBOLに独特な物で、他の言語では味わえない。
* 01 WK-OCCURS. 02 FILLER OCCURS 12. 03 WK-OCCURS-X PIC X(1). 01 WK-OCCURS2. 02 FILLER OCCURS 3. 03 FILLER OCCURS 4. 04 WK-OCCURS2-X PIC X(1).
配列はOCCURS句で指定する。多次元配列もできる。
* 01 WK-SEARCH-TABLE-R. 02 FILLER PIC X(16) VALUE "000001YAGI". 02 FILLER PIC X(16) VALUE "000002NAKAKOJI". 02 FILLER PIC X(16) VALUE "000003WATANABE". 02 FILLER PIC X(16) VALUE "000004WAKIYAMA". 02 FILLER PIC X(16) VALUE "000005MIYOSHI". 02 FILLER PIC X(16) VALUE "000006KOBAYASHI". 02 FILLER PIC X(16) VALUE "000007MATSUI". 02 FILLER PIC X(16) VALUE "000008HOSONO". 02 FILLER PIC X(16) VALUE "000009NAKAMURA". 02 FILLER PIC X(16) VALUE "000010ITO". 01 WK-SEARCH-TABLE REDEFINES WK-SEARCH-TABLE-R. 02 WK-SEARCH OCCURS 10 ASCENDING KEY WK-SEARCH-KEY INDEXED BY WK-SEARCH-IDX. 03 WK-SEARCH-KEY PIC X(6). 03 WK-SEARCH-NAME PIC X(10). 01 WK-SEARCH-FIND-SW PIC X(3).
テーブルワークエリアに対しての2分木サーチに言語レベルで対応している。
* 01 WK-FUNCTION-DATE PIC X(80). * 01 WK-INITIALIZE. 02 FILLER PIC X(7) VALUE "XXXXXXX". 02 FILLER PIC 9(7) VALUE 9999999. 02 WK-INITIALIZE-X PIC X(7) VALUE "XXXXXXX". 02 WK-INITIALIZE-9 PIC 9(7) VALUE 9999999. * ================================================== * 手続き部 * ================================================== PROCEDURE DIVISION. * -------------------------------------------------- * 主処理 * -------------------------------------------------- MAIN-EN. * * 順編成ファイルテスト PERFORM SUB-LS-FILE-TEST-EN THRU SUB-LS-FILE-TEST-EX.
サブルーチン呼び出しはPERFORM文で行う。
* * 索引順編成ファイルテスト PERFORM SUB-IDX-FILE-TEST-EN THRU SUB-IDX-FILE-TEST-EX. * * 相対編成ファイルテスト PERFORM SUB-REL-FILE-TEST-EN THRU SUB-REL-FILE-TEST-EX. * * IF文テスト PERFORM SUB-IF-TEST-EN THRU SUB-IF-TEST-EX. * * EVALUATE文テスト PERFORM SUB-EVALUATE-TEST-EN THRU SUB-EVALUATE-TEST-EX. * * PERFORM文テスト PERFORM SUB-PERFORM-TEST-EN THRU SUB-PERFORM-TEST-EX. * * UNSTRING文テスト PERFORM SUB-UNSTRING-TEST-EN THRU SUB-UNSTRING-TEST-EX. * * INSPECT文テスト PERFORM SUB-INSPECT-TEST-EN THRU SUB-INSPECT-TEST-EX. * * 編集テスト PERFORM SUB-EDIT-TEST-EN THRU SUB-EDIT-TEST-EX. * * COMPUTE文テスト PERFORM SUB-COMPUTE-TEST-EN THRU SUB-COMPUTE-TEST-EX. * * DIVIDE文テスト PERFORM SUB-DIVIDE-TEST-EN THRU SUB-DIVIDE-TEST-EX. * * VALUE(HEX)文テスト PERFORM SUB-VALUEHEX-TEST-EN THRU SUB-VALUEHEX-TEST-EX. * * VALUE(漢字)文テスト PERFORM SUB-VALUEKANJI-TEST-EN THRU SUB-VALUEKANJI-TEST-EX. * * ACCEPT文テスト PERFORM SUB-ACCEPT-TEST-EN THRU SUB-ACCEPT-TEST-EX. * * REDEFINES文テスト PERFORM SUB-REDEFINES-TEST-EN THRU SUB-REDEFINES-TEST-EX. * * OCCURS文テスト PERFORM SUB-OCCURS-TEST-EN THRU SUB-OCCURS-TEST-EX. * * SEARCH文テスト PERFORM SUB-SEARCH-TEST-EN THRU SUB-SEARCH-TEST-EX. * * FUNCTION-DATE文テスト PERFORM SUB-DATE-TEST-EN THRU SUB-DATE-TEST-EX. * * INITIALIZE文テスト PERFORM SUB-INITIALIZE-TEST-EN THRU SUB-INITIALIZE-TEST-EX. * MAIN-EX. MOVE ZERO TO RETURN-CODE. GOBACK.
プログラムの終了には上記のGOBACK以外にSTOP RUNもよく使われる。
* -------------------------------------------------- * 順編成ファイルテスト * -------------------------------------------------- SUB-LS-FILE-TEST-EN. DISPLAY "== SUB-LS-FILE-TEST-EN ==" * * LS-FILEにテストデータ出力 * MOVE -5 TO WK-SEQ.
ワークへの代入はMOVE文で行う。
OPEN OUTPUT LS-FILE.
ファイルのアクセスに先だってOPEN文によるオープン処理(そのままやがな)が必要。
* ADD 1 TO WK-SEQ.
計算命令はCOMPUTE文というのが有って、通常の計算式はそちらを使う事が多いけれど、単純に1インクリメントする場合はADD文を使う事が多い(気分的なもの)。wk-seq = wk-seq + 1とwk-seq++の違いみたいな物。
MOVE WK-SEQ TO LS-SEQ. MOVE "LINE 1" TO LS-DATA. WRITE LS-REC.
ファイルへの書き出しはWRITE文で行う。書き出しの単位は常にレコード単位となる。
* ADD 1 TO WK-SEQ. MOVE WK-SEQ TO LS-SEQ. MOVE "LINE 2" TO LS-DATA. WRITE LS-REC. * ADD 1 TO WK-SEQ. MOVE WK-SEQ TO LS-SEQ. MOVE "LINE 3" TO LS-DATA. WRITE LS-REC. * ADD 1 TO WK-SEQ. MOVE WK-SEQ TO LS-SEQ. MOVE "LINE 4" TO LS-DATA. WRITE LS-REC. * ADD 1 TO WK-SEQ. MOVE WK-SEQ TO LS-SEQ. MOVE "LINE 5" TO LS-DATA. WRITE LS-REC. * ADD 1 TO WK-SEQ. MOVE WK-SEQ TO LS-SEQ. MOVE "LINE 6" TO LS-DATA. WRITE LS-REC. * ADD 1 TO WK-SEQ. MOVE WK-SEQ TO LS-SEQ. MOVE "LINE 7" TO LS-DATA. WRITE LS-REC. * ADD 1 TO WK-SEQ. MOVE WK-SEQ TO LS-SEQ. MOVE "LINE 8" TO LS-DATA. WRITE LS-REC. * ADD 1 TO WK-SEQ. MOVE WK-SEQ TO LS-SEQ. MOVE "LINE 9" TO LS-DATA. WRITE LS-REC. * ADD 1 TO WK-SEQ. MOVE WK-SEQ TO LS-SEQ. MOVE "LINE 10" TO LS-DATA. WRITE LS-REC. * CLOSE LS-FILE.
ファイルを使い終ったらCLOSE文でクローズ処理(これまたそのまま...)を行う。バッファーと物理ディスクとの同期が行われる(たぶん)。
* * LS-FILE 読み込み * OPEN INPUT LS-FILE. * MOVE "OFF" TO END-SW. READ LS-FILE AT END MOVE "ON" TO END-SW END-READ.
順編成ファイルの読み込みはREAD AT END文を使う。
PERFORM UNTIL (END-SW = "ON")
条件指定の繰り返しにはPERFORM UNTIL文を使う。他の言語と違って繰り返しを抜ける条件を指定する点に注意。
DISPLAY "LS-FILE : " LS-REC
メッセージの出力にはDISPLAY文を使う。メインフレームの場合はUPON ほにゃららで出力先を指定できたが、open-cobolの場合にどんな出力先指定が出来るかは未調査。
READ LS-FILE AT END MOVE "ON" TO END-SW END-READ END-PERFORM. * CLOSE LS-FILE. * DISPLAY "== SUB-LS-FILE-TEST-EX ==". SUB-LS-FILE-TEST-EX. EXIT.
サーブルーチンの最後はEXIT文で閉める。
* -------------------------------------------------- * 索引順編成ファイルテスト * -------------------------------------------------- SUB-IDX-FILE-TEST-EN. DISPLAY "== SUB-IDX-FILE-TEST-EN ==" * * IDX-FILEにテストデータ出力 * OPEN INPUT LS-FILE. OPEN OUTPUT IDX-FILE. * MOVE "OFF" TO END-SW. READ LS-FILE AT END MOVE "ON" TO END-SW END-READ. PERFORM UNTIL (END-SW = "ON") MOVE LS-REC TO IDX-REC WRITE IDX-REC READ LS-FILE AT END MOVE "ON" TO END-SW END-READ END-PERFORM. * CLOSE LS-FILE. CLOSE IDX-FILE. * * IDX-FILE直読み * OPEN INPUT IDX-FILE. * MOVE 1 TO IDX-KEY. MOVE "OFF" TO INV-SW READ IDX-FILE INVALID MOVE "ON" TO INV-SW END-READ.
索引順編成ファイルを読む場合はREAD INVALID文を使う。
DISPLAY "IDX-FILE DIRECT(IDX-KEY = " IDX-KEY ") : " IDX-REC. * CLOSE IDX-FILE. * * IDX-FILE位置指定&連続読み * OPEN INPUT IDX-FILE. * MOVE "OFF" TO END-SW MOVE "OFF" TO INV-SW MOVE 3 TO IDX-KEY. START IDX-FILE KEY >= IDX-KEY INVALID MOVE "ON" TO INV-SW END-START. READ IDX-FILE NEXT AT END MOVE "ON" TO END-SW END-READ. PERFORM UNTIL (END-SW = "ON") DISPLAY "IDX-FILE(IDX-KEY >= " IDX-KEY ") : " IDX-REC READ IDX-FILE NEXT AT END MOVE "ON" TO END-SW END-READ END-PERFORM.
索引順編成ファイルの特定のレコードに位置付けるにはSTART INVALID文を使い、位置付けたレコードからキー順に読み込むにはREAD NEXT文を使用する。
* CLOSE IDX-FILE. * * IDX-FILE ALTERNATE-KEYによる位置指定&連続読み * OPEN INPUT IDX-FILE. * MOVE "OFF" TO END-SW MOVE "OFF" TO INV-SW MOVE "LINE 3" TO IDX-KEY2. START IDX-FILE KEY >= IDX-KEY2 INVALID MOVE "ON" TO INV-SW END-START. READ IDX-FILE NEXT AT END MOVE "ON" TO END-SW END-READ. PERFORM UNTIL (END-SW = "ON") DISPLAY "IDX-FILE(IDX-KEY2 >= " IDX-KEY2 ") : " IDX-REC READ IDX-FILE NEXT AT END MOVE "ON" TO END-SW END-READ END-PERFORM.
索引順編成ファイルの特定のレコードに位置付けるには複数のキー(ALTERNATE KEY)が利用できる。
* CLOSE IDX-FILE. * DISPLAY "== SUB-IDX-FILE-TEST-EX ==". SUB-IDX-FILE-TEST-EX. EXIT. * -------------------------------------------------- * 相対編成ファイルテスト * -------------------------------------------------- SUB-REL-FILE-TEST-EN. DISPLAY "== SUB-REL-FILE-TEST-EN ==" * * REL-FILEにテストデータ出力 * OPEN INPUT LS-FILE. OPEN OUTPUT REL-FILE. * MOVE ZERO TO REL-KEY. MOVE "OFF" TO END-SW. READ LS-FILE AT END MOVE "ON" TO END-SW END-READ. PERFORM UNTIL (END-SW = "ON") MOVE LS-REC TO REL-REC ADD 1 TO REL-KEY WRITE REL-REC READ LS-FILE AT END MOVE "ON" TO END-SW END-READ END-PERFORM. * CLOSE LS-FILE. CLOSE REL-FILE. * * REL-FILE読み込み * OPEN INPUT REL-FILE. * MOVE "OFF" TO INV-SW MOVE 6 TO REL-KEY. READ REL-FILE INVALID MOVE "ON" TO INV-SW END-READ. PERFORM UNTIL (INV-SW = "ON") DISPLAY "REL-FILE : " REL-REC ADD 1 TO REL-KEY READ REL-FILE INVALID MOVE "ON" TO INV-SW END-READ END-PERFORM.
相対編成ファイルの読み込みにはREAD INVALID文を使用する。
* CLOSE REL-FILE. * DISPLAY "== SUB-REL-FILE-TEST-EX ==". SUB-REL-FILE-TEST-EX. EXIT. * -------------------------------------------------- * IF文テスト * -------------------------------------------------- SUB-IF-TEST-EN. DISPLAY "== SUB-IF-TEST-EN ==" * OPEN INPUT LS-FILE. * MOVE "OFF" TO END-SW. READ LS-FILE AT END MOVE "ON" TO END-SW END-READ. PERFORM UNTIL (END-SW = "ON") IF (LS-SEQ < ZERO) DISPLAY "MINUS : " LS-REC ELSE DISPLAY "PLUS : " LS-REC END-IF
IF文の条件式には >, >=, =, <=, <, AND, OR が使える。
READ LS-FILE AT END MOVE "ON" TO END-SW END-READ END-PERFORM. * CLOSE LS-FILE. * DISPLAY "== SUB-IF-TEST-EX ==". SUB-IF-TEST-EX. EXIT. * -------------------------------------------------- * EVALUATE文テスト * -------------------------------------------------- SUB-EVALUATE-TEST-EN. DISPLAY "== SUB-EVALUATE-TEST-EN ==" * OPEN INPUT LS-FILE. * MOVE "OFF" TO END-SW. READ LS-FILE AT END MOVE "ON" TO END-SW END-READ. PERFORM UNTIL (END-SW = "ON") EVALUATE TRUE WHEN (LS-SEQ < ZERO) DISPLAY "MINUS : " LS-REC WHEN (LS-SEQ > ZERO) DISPLAY "PLUS : " LS-REC WHEN OTHER DISPLAY "ZERO : " LS-REC END-EVALUATE
条件多分岐にはEVALUATE文を使う。
READ LS-FILE AT END MOVE "ON" TO END-SW END-READ END-PERFORM. * CLOSE LS-FILE. * DISPLAY "== SUB-EVALUATE-TEST-EX ==". SUB-EVALUATE-TEST-EX. EXIT. * -------------------------------------------------- * PERFORM文テスト * -------------------------------------------------- SUB-PERFORM-TEST-EN. DISPLAY "== SUB-PERFORM-TEST-EN ==" * PERFORM VARYING I FROM 1 BY 3 UNTIL (I > 20) DISPLAY "PERFORM I = " I END-PERFORM.
繰り返し文の一例。変数Iの値を1から3づつ増分し、Iが20より大きくなるまで繰り返す。
* DISPLAY "== SUB-PERFORM-TEST-EX ==". SUB-PERFORM-TEST-EX. EXIT. * -------------------------------------------------- * UNSTRING文テスト * -------------------------------------------------- SUB-UNSTRING-TEST-EN. DISPLAY "== SUB-UNSTRING-TEST-EN ==". * MOVE "APPLE ORANGE LEMON PINE" TO WK-UNSTRING. UNSTRING WK-UNSTRING DELIMITED BY ALL SPACE INTO WK-UNSTRING-1 WK-UNSTRING-2 WK-UNSTRING-3 WK-UNSTRING-4. DISPLAY "UNSTRING-1 =(" WK-UNSTRING-1 ")" DISPLAY "UNSTRING-2 =(" WK-UNSTRING-2 ")" DISPLAY "UNSTRING-3 =(" WK-UNSTRING-3 ")" DISPLAY "UNSTRING-4 =(" WK-UNSTRING-4 ")" * MOVE "APPLE,ORANGE,LEMON,PINE" TO WK-UNSTRING. UNSTRING WK-UNSTRING DELIMITED BY "," INTO WK-UNSTRING-1 WK-UNSTRING-2 WK-UNSTRING-3 WK-UNSTRING-4. DISPLAY "UNSTRING-1 =(" WK-UNSTRING-1 ")" DISPLAY "UNSTRING-2 =(" WK-UNSTRING-2 ")" DISPLAY "UNSTRING-3 =(" WK-UNSTRING-3 ")" DISPLAY "UNSTRING-4 =(" WK-UNSTRING-4 ")"
文字列の分割にはUNSTRING文を使う。メインフレームではあまり無いが、CSVファイルを扱う場合に便利。
* DISPLAY "== SUB-UNSTRING-TEST-EX ==". SUB-UNSTRING-TEST-EX. EXIT. * -------------------------------------------------- * INSPECT文テスト * -------------------------------------------------- SUB-INSPECT-TEST-EN. DISPLAY "== SUB-INSPECT-TEST-EN ==". * MOVE "AAA BBB AAA CCC AAA EEE AAA" TO WK-INSPECT. MOVE ZERO TO WK-INSPECT-CNT. INSPECT WK-INSPECT TALLYING WK-INSPECT-CNT FOR ALL "AAA". DISPLAY "INSPECT-CNT = " WK-INSPECT-CNT. * INSPECT WK-INSPECT REPLACING ALL "AAA" BY "aaa". DISPLAY "WK-INSPECT(REPLACED) = " WK-INSPECT.
文字列の置換や文字列の出現回数を数えるにはINSPECT REPLACE文やINSPECT TALLYING文を使う。
* DISPLAY "== SUB-INSPECT-TEST-EX ==". SUB-INSPECT-TEST-EX. EXIT. * -------------------------------------------------- * 編集テスト * -------------------------------------------------- SUB-EDIT-TEST-EN. DISPLAY "== SUB-EDIT-TEST-EN ==". * MOVE 123456 TO WK-EDIT-1. DISPLAY "WK-EDIT-1 [123456] = " WK-EDIT-1. MOVE -123456 TO WK-EDIT-1. DISPLAY "WK-EDIT-1 [-123456] = " WK-EDIT-1. MOVE 123456 TO WK-EDIT-2. DISPLAY "WK-EDIT-2 [123456] = " WK-EDIT-2. MOVE -123456 TO WK-EDIT-2. DISPLAY "WK-EDIT-2 [-123456] = " WK-EDIT-2.
PIC句を使うと数値データを簡単に見やすい形式に編集できる。
* DISPLAY "== SUB-EDIT-TEST-EX ==". SUB-EDIT-TEST-EX. EXIT. * -------------------------------------------------- * COMPUTE文テスト * -------------------------------------------------- SUB-COMPUTE-TEST-EN. DISPLAY "== SUB-COMPUTE-TEST-EN ==". * COMPUTE WK-COMPUTE = 1000 * 123 / (100 - 10 + 123). MOVE WK-COMPUTE TO WK-COMPUTE-2. DISPLAY "WK-COMPUTE = " WK-COMPUTE-2.
一般的な計算はCOMPUTE文で行う。
* DISPLAY "== SUB-COMPUTE-TEST-EX ==". SUB-COMPUTE-TEST-EX. EXIT. * -------------------------------------------------- * DIVIDE文テスト * -------------------------------------------------- SUB-DIVIDE-TEST-EN. DISPLAY "== SUB-DIVIDE-TEST-EN ==". * DIVIDE 100 BY 27 GIVING WK-DIVIDE-SHO REMAINDER WK-DIVIDE-AMARI.
でも割算の余りを求めたい場合にはDIVIDE文が便利。
DISPLAY "DIVIDE 100/27 = " WK-DIVIDE-SHO " ... " WK-DIVIDE-AMARI. * DISPLAY "== SUB-DIVIDE-TEST-EX ==". SUB-DIVIDE-TEST-EX. EXIT. * -------------------------------------------------- * VALUE(HEX)文テスト * -------------------------------------------------- SUB-VALUEHEX-TEST-EN. DISPLAY "== SUB-VALUEHEX-TEST-EN ==". * DISPLAY "VALUE HEX = (" WK-VALUEHEX ")".
16進数でもデータの表現ができる。
* DISPLAY "== SUB-VALUEHEX-TEST-EX ==". SUB-VALUEHEX-TEST-EX. EXIT. * -------------------------------------------------- * VALUE(漢字)文テスト * -------------------------------------------------- SUB-VALUEKANJI-TEST-EN. DISPLAY "== SUB-VALUEKANJI-TEST-EN ==". * DISPLAY "VALUE KANJI = (" WK-VALUEKANJI ")".
当然漢字も扱える。ただし、メーカ依存(機種依存)あり。
* DISPLAY "== SUB-VALUEKANJI-TEST-EX ==". SUB-VALUEKANJI-TEST-EX. EXIT. * -------------------------------------------------- * ACCEPT文テスト * -------------------------------------------------- SUB-ACCEPT-TEST-EN. DISPLAY "== SUB-ACCEPT-TEST-EN ==". * DISPLAY "ACCEPT FROM SYSIN(何か入力して下さい): ". ACCEPT WK-ACCEPT FROM SYSIN. DISPLAY "WK-ACCEPT SYSIN = " WK-ACCEPT. * ACCEPT WK-ACCEPT FROM DATE. DISPLAY "WK-ACCEPT DATE = " WK-ACCEPT. * ACCEPT WK-ACCEPT FROM TIME. DISPLAY "WK-ACCEPT TIME = " WK-ACCEPT.
SYSINからの入力、日付の取得、時刻の取得にはACCEPT文を利用する。
* DISPLAY "== SUB-ACCEPT-TEST-EX ==". SUB-ACCEPT-TEST-EX. EXIT. * -------------------------------------------------- * REDEFINES文テスト * -------------------------------------------------- SUB-REDEFINES-TEST-EN. DISPLAY "== SUB-REDEFINES-TEST-EN ==". * MOVE "4210519" TO WK-REDEFINES. DISPLAY "WK-REDEFINES-G = " WK-REDEFINES-G. DISPLAY "WK-REDEFINES-NN = " WK-REDEFINES-NN. DISPLAY "WK-REDEFINES-TT = " WK-REDEFINES-TT. DISPLAY "WK-REDEFINES-HH = " WK-REDEFINES-HH.
データを決まったフォーマットに分割するのにREDEFINES句は便利。
* DISPLAY "== SUB-REDEFINES-TEST-EX ==". SUB-REDEFINES-TEST-EX. EXIT. * -------------------------------------------------- * OCCURS文テスト * -------------------------------------------------- SUB-OCCURS-TEST-EN. DISPLAY "== SUB-OCCURS-TEST-EN ==". * MOVE "ABCDEFGHIJKL" TO WK-OCCURS. PERFORM VARYING I FROM 1 BY 1 UNTIL (I > 12) DISPLAY "WK-OCCURS-X(" I ") = " WK-OCCURS-X(I) END-PERFORM. * MOVE "ABCDEFGHIJKL" TO WK-OCCURS2. PERFORM VARYING I FROM 1 BY 1 UNTIL (I > 3) PERFORM VARYING J FROM 1 BY 1 UNTIL (J > 4) DISPLAY "WK-OCCURS2-X(" I " " J ") = " WK-OCCURS2-X(I J) END-PERFORM END-PERFORM.
配列にはOCCURS句を使用する。
* DISPLAY "== SUB-OCCURS-TEST-EX ==". SUB-OCCURS-TEST-EX. EXIT. * -------------------------------------------------- * SEARCH文テスト * -------------------------------------------------- SUB-SEARCH-TEST-EN. DISPLAY "== SUB-SEARCH-TEST-EN ==". * SEARCH ALL WK-SEARCH AT END MOVE "OFF" TO WK-SEARCH-FIND-SW WHEN (WK-SEARCH-KEY(WK-SEARCH-IDX) = "000005") MOVE "ON" TO WK-SEARCH-FIND-SW END-SEARCH
ワークエリアの2分木サーチがSEARCH ALL文で出来る。
* IF (WK-SEARCH-FIND-SW = "ON") DISPLAY "SEARCH OK KEY = " WK-SEARCH-KEY(WK-SEARCH-IDX) DISPLAY "SEARCH OK NAME = " WK-SEARCH-NAME(WK-SEARCH-IDX) ELSE DISPLAY "SEARCH NG" END-IF. * DISPLAY "== SUB-SEARCH-TEST-EX ==". SUB-SEARCH-TEST-EX. EXIT. * -------------------------------------------------- * FUNCTION-DATE文テスト * -------------------------------------------------- SUB-DATE-TEST-EN. DISPLAY "== SUB-FUNCTION-DATE-TEST-EN ==". * MOVE FUNCTION CURRENT-DATE TO WK-FUNCTION-DATE. DISPLAY "WK-FUNCTION-DATE = " WK-FUNCTION-DATE.
日付の年を西暦4桁で取得する場合はFUNCTION CURRENT-DATEを使う。
* DISPLAY "== SUB-FUNCTION-DATE-TEST-EX ==". SUB-DATE-TEST-EX. EXIT. * -------------------------------------------------- * INITIALIZE文テスト * -------------------------------------------------- SUB-INITIALIZE-TEST-EN. DISPLAY "== SUB-INITIALIZE-TEST-EN ==". * DISPLAY "WK-INITIALIZE(BEFORE) = " WK-INITIALIZE. INITIALIZE WK-INITIALIZE. DISPLAY "WK-INITIALIZE(AFTER) = " WK-INITIALIZE.
ワークエリアの初期化にはINITIALIZE文を使う。PIC句に合わせた適切な値で初期化してくれる。
* DISPLAY "== SUB-INITIALIZE-TEST-EX ==". SUB-INITIALIZE-TEST-EX. EXIT.
実行結果
== SUB-LS-FILE-TEST-EN == LS-FILE : -004LINE 1 LS-FILE : -003LINE 2 LS-FILE : -002LINE 3 LS-FILE : -001LINE 4 LS-FILE : +000LINE 5 LS-FILE : +001LINE 6 LS-FILE : +002LINE 7 LS-FILE : +003LINE 8 LS-FILE : +004LINE 9 LS-FILE : +005LINE 10 == SUB-LS-FILE-TEST-EX ==
== SUB-IDX-FILE-TEST-EN == IDX-FILE DIRECT(IDX-KEY = +001) : +001LINE 6 IDX-FILE(IDX-KEY >= +003) : +003LINE 8 IDX-FILE(IDX-KEY >= +004) : +004LINE 9 IDX-FILE(IDX-KEY >= +005) : +005LINE 10 IDX-FILE(IDX-KEY >= -001) : -001LINE 4 IDX-FILE(IDX-KEY >= -002) : -002LINE 3 IDX-FILE(IDX-KEY >= -003) : -003LINE 2 IDX-FILE(IDX-KEY >= -004) : -004LINE 1 IDX-FILE(IDX-KEY2 >= LINE 3 ) : -002LINE 3 IDX-FILE(IDX-KEY2 >= LINE 4 ) : -001LINE 4 IDX-FILE(IDX-KEY2 >= LINE 5 ) : +000LINE 5 IDX-FILE(IDX-KEY2 >= LINE 6 ) : +001LINE 6 IDX-FILE(IDX-KEY2 >= LINE 7 ) : +002LINE 7 IDX-FILE(IDX-KEY2 >= LINE 8 ) : +003LINE 8 IDX-FILE(IDX-KEY2 >= LINE 9 ) : +004LINE 9 == SUB-IDX-FILE-TEST-EX ==
== SUB-REL-FILE-TEST-EN == REL-FILE : +001LINE 6 REL-FILE : +002LINE 7 REL-FILE : +003LINE 8 REL-FILE : +004LINE 9 REL-FILE : +005LINE 10 == SUB-REL-FILE-TEST-EX ==
== SUB-IF-TEST-EN == MINUS : -004LINE 1 MINUS : -003LINE 2 MINUS : -002LINE 3 MINUS : -001LINE 4 PLUS : +000LINE 5 PLUS : +001LINE 6 PLUS : +002LINE 7 PLUS : +003LINE 8 PLUS : +004LINE 9 PLUS : +005LINE 10 == SUB-IF-TEST-EX ==
== SUB-EVALUATE-TEST-EN == MINUS : -004LINE 1 MINUS : -003LINE 2 MINUS : -002LINE 3 MINUS : -001LINE 4 ZERO : +000LINE 5 PLUS : +001LINE 6 PLUS : +002LINE 7 PLUS : +003LINE 8 PLUS : +004LINE 9 PLUS : +005LINE 10 == SUB-EVALUATE-TEST-EX ==
== SUB-PERFORM-TEST-EN == PERFORM I = 001 PERFORM I = 004 PERFORM I = 007 PERFORM I = 010 PERFORM I = 013 PERFORM I = 016 PERFORM I = 019 == SUB-PERFORM-TEST-EX ==
== SUB-UNSTRING-TEST-EN == UNSTRING-1 =(APPLE ) UNSTRING-2 =(ORANGE ) UNSTRING-3 =(LEMON ) UNSTRING-4 =(PINE ) UNSTRING-1 =(APPLE ) UNSTRING-2 =(ORANGE ) UNSTRING-3 =(LEMON ) UNSTRING-4 =(PINE ) == SUB-UNSTRING-TEST-EX ==
== SUB-INSPECT-TEST-EN == INSPECT-CNT = 004 WK-INSPECT(REPLACED) = aaa BBB aaa CCC aaa EEE aaa == SUB-INSPECT-TEST-EX ==
== SUB-EDIT-TEST-EN == WK-EDIT-1 [123456] = 12,3456 WK-EDIT-1 [-123456] = -12,3456 WK-EDIT-2 [123456] = 12,3456 WK-EDIT-2 [-123456] = 12,3456 == SUB-EDIT-TEST-EX ==
== SUB-COMPUTE-TEST-EN == WK-COMPUTE = 577.4647887323 == SUB-COMPUTE-TEST-EX ==
== SUB-DIVIDE-TEST-EN == DIVIDE 100/27 = +0000000003 ... +0000000019 == SUB-DIVIDE-TEST-EX ==
== SUB-VALUEHEX-TEST-EN == VALUE HEX = (漢字) == SUB-VALUEHEX-TEST-EX ==
== SUB-VALUEKANJI-TEST-EN == VALUE KANJI = (漢字) == SUB-VALUEKANJI-TEST-EX ==
== SUB-ACCEPT-TEST-EN == ACCEPT FROM SYSIN(何か入力して下さい): 適当に入力 WK-ACCEPT SYSIN = 適当に入力 WK-ACCEPT DATE = 090521 WK-ACCEPT TIME = 20181282 == SUB-ACCEPT-TEST-EX ==
== SUB-REDEFINES-TEST-EN == WK-REDEFINES-G = 4 WK-REDEFINES-NN = 21 WK-REDEFINES-TT = 05 WK-REDEFINES-HH = 19 == SUB-REDEFINES-TEST-EX ==
== SUB-OCCURS-TEST-EN == WK-OCCURS-X(001) = A WK-OCCURS-X(002) = B WK-OCCURS-X(003) = C WK-OCCURS-X(004) = D WK-OCCURS-X(005) = E WK-OCCURS-X(006) = F WK-OCCURS-X(007) = G WK-OCCURS-X(008) = H WK-OCCURS-X(009) = I WK-OCCURS-X(010) = J WK-OCCURS-X(011) = K WK-OCCURS-X(012) = L WK-OCCURS2-X(001 001) = A WK-OCCURS2-X(001 002) = B WK-OCCURS2-X(001 003) = C WK-OCCURS2-X(001 004) = D WK-OCCURS2-X(002 001) = E WK-OCCURS2-X(002 002) = F WK-OCCURS2-X(002 003) = G WK-OCCURS2-X(002 004) = H WK-OCCURS2-X(003 001) = I WK-OCCURS2-X(003 002) = J WK-OCCURS2-X(003 003) = K WK-OCCURS2-X(003 004) = L == SUB-OCCURS-TEST-EX ==
== SUB-SEARCH-TEST-EN == SEARCH OK KEY = 000005 SEARCH OK NAME = MIYOSHI == SUB-SEARCH-TEST-EX ==
== SUB-FUNCTION-DATE-TEST-EN == WK-FUNCTION-DATE = 2009052120181282+0900 == SUB-FUNCTION-DATE-TEST-EX ==
== SUB-INITIALIZE-TEST-EN == WK-INITIALIZE(BEFORE) = XXXXXXX9999999XXXXXXX9999999 WK-INITIALIZE(AFTER) = XXXXXXX9999999 0000000 == SUB-INITIALIZE-TEST-EX ==