I言語VER5システム開発の入門編 4/9 (プログラムの作成)


(4)I言語でプログラムを作り,テスト実行をします。
◎★プログラムを始める前に,プログラムの種類を説明します。
沢山のプログラムを調べた結果,大きく3種類のプログラムに分類できました。
1個目は検索するプログラムです,今回の場合,市の登録申請でその市が在るか検索するのに使えます。
2個目は検索もしますが,更新するプログラムです,今回の場合,市を登録するのに使えます。
3個目は検索しないプログラムです。(前2個に該当しないもの)
まずは,更新しないと検索は出来ませんので市を更新するプログラムを作ってみます。
I言語ではプログラムの単位をジョブと呼んでいます,ジョブ名はメニューの位置で決まります, メニューで入れる番号で01から40までで3個です。
ジョブ名は早く作成した人の勝ちですので空いているジョブ名や,メニュー名を探します。
最初のメニュー名は'ZZZZ+00+00+00'でこのメニュー上にZZZZ+(番号)+00+00'のメニューが表示されます。 (番号00はジョブではなくメニューの意味になります)
今回はの最初のメニューで空いている30を番号とし'ZZZZ+30+00+00'を「自習メニュー」とします。
次は全て空いているので番号01で'ZZZZ+30+01+00'を「入門メニュー」とします。
ジョブ名は取りあえず右上に表示で番号21を使用で'ZZZZ+30+01+21'を「市 更新処理」とします。 (メニューは左が01から20で,右が21から40となります)

◎(4.1)「システム 開発 メニュー」で'21'を入れて「テスト 全 プログラム 更新」を起動します。

◎(4.2)ジョブに'ZZZZ30'を入れて[Enter]で必ず検索し'←'で更新に行き,次の作業をします。
'2','ZZZZ','30','00','00',言語は'JA'が入りスキップします, 'TEST'(テスト,テスト中は本番メニューとしては表示されません), 'ZZZY'(許可)でメニューまで自動でスキップします,'自習メニュー',[Enter]。
'↓','2','ZZZZ','30','01','00',(JA),'TEST'(テスト), 'ZZZY'(許可)でメニューまで自動でスキップします,'入門メニュー',[Enter]。
'↓','2','ZZZZ','30','01','21',(JA),'TEST'(テスト),'ZZZY'(許可), 'INPUT'(処理種類,「更新」の意味です), 'J'(認証,ジョブに使用者を指定で認証) で'↓'でメニューまで移動します,'市 更新処理',[Enter]。
これでメニュー関連は作成済みです。'0'(選択の意味です)を押して,プログラム更新の画面に移動します。

◎(4.3)検索と更新のプログラムはテーブルを指定して作ることができます,そこで,操作に'TABLE'と入力し[Enter]します。 (操作の説明は[F1]のファンクションキーを押すと,ヘルプ画面が出て,これもI言語で動いていますが,そこに,説明があります)

◎(4.4)テーブルを選択する画面に変わったので,ここで,[Enter]で検索,'←','0'で「ZZZY市実表」を選択します。

◎(4.5)画面が戻りプログラムが出来ています,操作に'TEST'と入れて[Enter]でテスト実行できます。
★ここでプログラムを説明しておきます。
プログラムはPROGRAM=では始まりSET=で検索条件を入力し,DATA=に検索結果を表示します,SQL=が検索用のSQL文です。
全部で19行しか無いですが、 多くのプログラムが800以降の検索用SQL文を触らなくても良いように設計されているので、 このプログラムの場合、先頭*のコメント行を除く100,200,500,700のたったの4行分が重要な行となります。
100 PROGRAM=,&X1,?_M?市実表
PROGRAM=の次に「,」で何も指定がないとメニューの処理種類を採用します, 今回は「INPUT」で更新プログラムとなります。
&X1は右に指定するテーブルの別名です,&X1とする事を推奨しています。
?_M?市実表は更新するテーブル名です。(検索するテーブルはSQL=で陽に指定していますが,検索もここに書く事でプログラムが共通化できます)
?で囲まれたものは名前の内容で置き換えられます。
先頭がアンダーバーの名前は,システム変数で_Mはこのプログラムで テーブル(マスタテーブル)の先頭に付加する文字です。
データベースシステムの違いやテスト中,本番中等でテーブル名の異なる部分をこれで対応します。
このプログラムではテスト実行で「I_ABC_TEST_MAST_ZZZY.DBO.ZZZY市実表」に変換されます。
SQL Serverでは「データベース名」.「スキーマ名」.「テーブル名」でテーブルを表現し
「I_(システム名)_[TESTはテスト実行,REALは本番実行]_MAST_(許可).DBO.(許可)市実表」となります。
(SQL Serverではデータベースを切り替える事で,スキーマ名は全てDBOのみを使用しています, 他のRDBMSはデータベースを1個としているので,データベースの指定はありません, PotgreSQLとDB2はスキーマ名を変えています, Oracleにはスキーマの機能が無いのでユーザ名を使用していますので注意が必要です)
200 SET={,?_T?.}?&.SET&~~市?
SET=で検索の条件を入力したり,何らかの情報を表示や入力する場所です。
{,?_T?.}の?_T?.は下記の?_WHERE##?で組み立てるデータ名の先頭に付加します。
_TはPROGRAM=の2番目の「&X1」の&を取ったもので内容は「X1」です。
「?&.SET&~~市?」はデータ辞書とテーブルを元にSET=に与えるパラメータを設定しています。
「&.」はPROGRAM=内で指定した「&X1」を省略した物で,「&X1.」と見なします。
「~~」は最初に許可に変換します,今回は許可がZZZYですのでZZZYに変換されます。
プログラム上のデータ名は「ZZZY市」となります。
300 *SET={,?_T?.}?&.SET&~~都道府県?
先頭が「*」の時はコメント行と見なしなにもしません。
500 DATA={K }?_T?.?&.DATA&~~市?
DATA=は検索結果を表示したり,更新データを入力する場所です。
{K }でこのデータが更新キーである事を示しています。
「?&.DATA&~~市?」でデータ辞書およびテーブル情報からDATA=に与えるパラメータを設定しています。
「?_T?.」はデータ名の先頭に付加され,プログラム上のデータ名は「X1.ZZZY市」となります。
700 DATA={ }?_T?.?&.DATA&~~都道府県?
Kが無いので更新キーではなく更新対象となります。
800 REPEAT=_DATA_COUNT
REPEAT=は次のREPEAT=まで繰り返をします。
_DATA_COUNTは既に設定されたDATA=の数で,今回は2となります。
900 SQL=?_SELECT##?
SQL=は検索のSQL文です,検索は複雑なSQL文が必要となる場合があるので,プログラムで組み立てています。
「?_SELECT##?」はDATA=で設定されたデータ名を元に文字列が組み立てられます。
「##」はPREPEAT=の繰り返しの中では最初に繰り返し番号に変換されます, よって,最初は?_SELECT1?2回目は?_SELECT2?となり, このプログラムでは最初が「SELECT X1.ZZZY市」次が「,X1.ZZZY都道府県」に変換されます。
1000 REPEAT=
繰り返しの回数指定がないので,単に繰り返しの終わりを意味します。
1100 INPUT+SQL=,?_T?.Z_CANCEL
「INPUT+」はこのプログラムが「INPUT」である場合この行を採用します,今回は「INPUT」ですので採用されます。
I言語では削除データはZ_CANCELに削除日を入れる論理削除方式を取っています, その為更新では削除データを判定をするのでZ_CANCELもSELECTの項目として読み込みます。
1200 SQL=FROM ?_TABLE? ?_T?
「?_TABLE?」はPROGRAM=内で指定したテーブル名です。
1300 REPEAT=_SET_COUNT
_SET_COUNTは既に設定されたSET=の数で,今回は1となります。
1400 SQL=?_WHERE##?
このプログラムでは?_WHERE##?は?_WHERE1?で「WHERE X1.ZZZY市 LIKE '?ZZZY市?%'」に変換され, ZZZY市を先頭からの文字列を条件として絞り込みが出来ます。
1600 INPUT-SQL=?_WHERE_AND? ?_T?.Z_CANCEL IS NULL
更新(INPUT)では削除データも表示するのでINPUT-で採用しません。逆に,検索の場合は削除データーは不要なのでこの行を採用します。
?_WHERE_AND?は_SET_COUNTが0の時はWHERE文が?_WHERE##?で作られていないので「WHERE]に変換され,0でないときは「AND」に変換されます。
1700 REPEAT=_ORDER_COUNT
_ORDER_COUNTはここまでにキー項目がある場合はそこまでのDATA=の数, ない場合はDATA=の数となります,今回は1となります。
1800 SQL=?_ORDER##?
?_ORDER##?は?_ORDER1?となり「ORDER BY 1」に変換されます。
====================================================
1部をのぞき変数を使わない場合は以下のようになります
☆これでも動きますが、変化(成長)には弱いので,このようにはしないで下さい。
****************************************************
100 PROGRAM=,&X1,?_M?市実表
200 SET={,X1.}ZZZY市{12,,}市
500 DATA={K }X1.ZZZY市{12,0,J,}{}{}{}市
700 DATA={ }X1.ZZZY都道府県{10,0,J,}{}{}{}都道府県
900 SQL=SELECT X1.ZZZY市
900 SQL=,X1.ZZZY都道府県
1100 SQL=,X1.Z_CANCEL
1200 SQL=FROM ?_M?市実表 X1
1400 SQL=WHERE X1.ZZZY市 LIKE '?ZZZY市?%'
1800 SQL=ORDER BY 1
====================================================

◎(4.6)テスト実行画面です。テスト中の意味で1行目のジョブ名称が赤色背景で表示されます。 ここで使用者とパスワード入れてください。

◎(4.7)'ZZZZZZZY'(使用者),パスワード入力後,[Enter]で検索,'←'で更新に行き,'2'(作成) ,'飯田'(市)で次は都道府県の入力です,都道府県はすでに決まった物から選びたいので,ここで,リストボックスを出したいです。 そのためには事前にZZZY都道府県実表が作られている必要があるので,作業を一旦中止し, 同じ手順で'ZZZZ+30+01+22'にZZZY都道府県実表を更新するプログラムを作ります。[Esc]キーを2回押してテスト実行画面を閉じ, もとの画面上で[Esc]キーを押します。

◎(4.8)'↓','2','ZZZZ','30','01','22',(JA),'TEST'(テスト),'ZZZY'(許可),'INPUT'(処理種類),'J'(認証), '↓'でメニューまで移動します,'都道府県 更新処理',[Enter]し,'0'で選択します。

◎(4.9)'TABLE',[Enter]でテーブル一覧画面に行きます。

◎(4.10)[Enter]で検索後'←','↓','↓'で'0'で「ZZZY都道府県実表」を選択します。

◎(4.11)プログラムが出来たので'TEST'[Enter]でテスト続行します。

◎(4.12)'ZZZZZZZY'(使用者)とパスワードを入力後,[Enter]で検索し,
'←'(更新へ),'2'(作成),'北海道',[Enter],
'↓'(下へ),'2'(作成),'東京都',[Enter],
'↓'(下へ),'2'(作成),'長野県',[Enter],
と取りあえず3県分登録します,[Esc]で終了し,もとの画面で[Esc]2回でメニューに戻ります。

◎(4.13)リストボックスを出すのはプログラムでもできますが,データ辞書でも出来ますので,
'25'を入力し「テスト データ辞書 更新」に行きます,データ名で'ZZZY都'と入力し[Enter]します。
'←','3'(修正)で[Tab]を9回押しチェックに行きます。

◎(4.14)列1個のリストボックス表示はLISTBOX1です,'LISTBOX1'を選びます。 (選ぶには[PgDn](Page Down)または[PgUp](Page Up)で移動し[Enter]で選べます)

◎(4.15)チェック61で対象となるテーブル一覧が出るので,「?_MP_ZZZY?都道府県実表」を選びます。

◎(4.16)チェック62でデータ名「ZZZY都道府県」を選びます。

◎(4.17)これで終わりですので'↓'で最後に行き,[Enter]で修正処理をします。

◎(4.18)[Esc]でメニューに戻って,'21'で「テスト 全 プログラム 更新」に行き,ジョブに'ZZZZ300121'を入れて[Enter]し, '←','0'でZZZZ300121のプログラムに行き'TEST'で再度テスト実行をします。
[Enter]で検索後'←','2','飯田'でリストボックスが表示されました。 リストボックス上の「長野県」を選ぶため[PgDn](Page Down)し[Enter]で作成できます。
★注意★VER5.11以降では仕様を変更しましたので、このままではリストボックスが表示されません注意下さい。
★理由:プログラム内で指定しないテーブルが使われるので保守上問題有り、プログラムで陽に指定しないと動かない事とした。
★補足:V1.11版以降での説明文を作成中です。。

◎(4.19)さらに'↓','2','駒ヶ根','長野県','↓','2','調布','東京都','↓','2','札幌','北海道'で作成しました。

◎(4.20)次は検索プログラムを「ZZZZ+30+01+01」で「市 検索処理」として作ります。
「システム 開発 メニュー」で'21'を入れて「テスト 全 プログラム 更新」起動します。
ジョブに'ZZZZ30'と入れ,[Enter]で検索します。'←','↓'を4回,'2','ZZZZ','30','01','01',言語は'JA'でスキップ,'TEST','ZZZY' ,'OUTPUT'(処理種類,「検索」の意味です),'X'(認証,認証しない意味), 'ZZZZ300121'(コピー1,「ZZZZ300121」の更新プログラムをこのプログラムでコピーして使用の意味), '↓'でメニューに行き'市 検索処理',[Enter]で完成です。

◎(4.21)'0'で選択しプログラムで'TEST',[Enter]でテスト実行します。

◎(4.22)[Enter]で検索すると,検索されました。
次へ(5/9,問題点と改善点の対応)
All Rights Reserved, Copyright (C) 2009-2010 Nobumichi Harasawa.