} I言語VER8システム開発の入門編 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)ジョブで[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'(許可), 'AA'(部分),'INPUT'(処理種類,「更新」の意味です), 'J'(認証,ジョブに使用者を指定で認証) で'↓'でメニューまで移動します,'市 更新処理',[Enter]。
これでメニュー関連は作成済みです。'0'(選択の意味です)を押して,プログラム更新の画面に移動します。

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

◎(4.4)テーブルの数を指定します今回は1個ですので1とし[Enter]で次に行きます。

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

◎(4.6)画面が戻りプログラムが出来ています,操作に'TEST'と入れて[Enter]でテスト実行できます。
★ここでプログラムを説明しておきます。
プログラムはPROGRAM=では始まりSET=で検索条件を入力し,DATA=に検索結果を表示します, 更にCOPY=@ZZZZZZ_SQLでコピーされたプログラムのSQL=が検索用のSQL文になります。
全部で8行ですが、先頭が「*」はコメント行で使わないので、たったの5行で動いています。
200 PROGRAM=,&X1,?_MM?_市実表
PROGRAM=の次に「,」で何も指定がないとメニューの処理種類を採用します, 今回は「INPUT」で更新プログラムとなります。
&X1は右に指定するテーブルの別名です,&X1とする事を推奨しています。
?_MM?_市実表は更新するテーブル名です。(検索するテーブルはSQL=で陽に指定していますが,検索もここに書く事でプログラムが共通化できます)
?で囲まれたものは名前の内容で置き換えられます。
先頭がアンダーバーの名前は,システム提供データ名で_MMはこのプログラムで テーブル(マスタテーブル)の先頭に付加する文字です。
データベースシステムの違いやテスト中,本番中等でテーブル名の異なる部分をこれで対応します。
このプログラムではテスト実行で「I_ABC_T_M_ZZZY.DBO.ZZZYAA_市実表」に変換されます。
SQL Serverでは「データベース名」.「スキーマ名」.「テーブル名」でテーブルを表現し
「I_(システム名)_[Tはテスト実行,Rは本番実行]_[MはMASTの意味]_(許可).DBO.(許可)(部分)_市実表」となります。
(SQL Serverではデータベースを切り替える事で,スキーマ名は全てDBOのみを使用しています, 他のRDBMSはデータベースを1個としているので,データベースの指定はありません, PotgreSQLとDB2はスキーマ名を変えています, Oracleにはスキーマの機能が無いのでユーザ名を使用していますので注意が必要です)
300 SET={}?&.SET&~+_市?
SET=で検索の条件を入力したり,何らかの情報を表示や入力する場所です。
「?&.SET&~+_市?」はデータ辞書とテーブルを元にSET=に与えるパラメータを設定しています。
「&.」はPROGRAM=内で指定した「&X1」を省略した物で,「&X1.」と見なします。
「~+」は最初に許可+部分に変換します,今回は許可がZZZYで部分が'AA'ですのでZZZYAAに変換されます。
プログラム上のデータ名は「ZZZYAA_市」となります。
400 *SET={}?&.SET&~+_都道府県?
先頭が「*」の時はコメント行と見なしなにもしません。
600 DATA={K}X1.?&.DATA&~+_市?
DATA=は検索結果を表示したり,更新データを入力する場所です。
{K}でこのデータが更新キーである事を示しています。
「X1.」はデータ名の先頭に付加され,プログラム上のデータ名は「X1.ZZZYAA_市」となります。
「?&.DATA&~+_市?」でデータ辞書およびテーブル情報からDATA=に与えるパラメータを設定しています。
800 DATA={}X1.?&.DATA&~+_都道府県?
Kが無いので更新キーではなく更新対象となります。
900 COPY=@ZZZZZZ_SQL
名前の先頭に「@」が有る場合は特別なコピー命令で、混在テーブルにある情報をコピーしてプログラムに埋め込みます。

コピーされたプログラムは次のような動きになります。直接プログラムしても良いですが、ほとんどのプログラムがこのままで可能ですので、別に置いて維持の生産性を改善しています。
00100 %ZZZZZZ_SQL_SELECT+REPEAT=_SELECT_COUNT
REPEAT=は次のREPEAT=まで繰り返をします。
_SELECT_COUNTは_DATA_COUNTと同じで、既に設定されたDATA=の数で,今回は2となります。
00200 %ZZZZZZ_SQL_SELECT+SQL=?_SELECT##?
SQL=は検索のSQL文です。
「?_SELECT##?」はDATA=で設定されたデータ名を元に文字列が組み立てられます。
「##」はPREPEAT=の繰り返しの中では最初に繰り返し番号に変換されます, よって,最初は?_SELECT1?2回目は?_SELECT2?となり, このプログラムでは最初が「SELECT X1.ZZZYAA_市」次が「,X1.ZZZYAA_都道府県」に変換されます。
00300 %ZZZZZZ_SQL_SELECT+REPEAT=
繰り返しの回数指定がないので,単に繰り返しの終わりを意味します。
00400 %Z_CANCEL_SELECT+SQL=,X1.Z_CANCEL
%Z_CANCEL_SELECT+はこのPROGRAM=がINPUTである場合この行を採用します,今回は「INPUT」ですので採用されます。
I言語では削除データはZ_CANCELに削除日を入れる論理削除方式を取っています, その為更新では削除データを判定をするのでZ_CANCELもSELECTの項目として読み込みます。
00500 %ZZZZZZ_SQL_FROM+REPEAT=_FROM_COUNT
_FROM_COUNTはジョイン指定が有る場合増えますがこのプログラムは無いので1です。
00600 %ZZZZZZ_SQL_FROM+SQL=?_FROM##?
ジョイン指定が無いのでこのプログラムでは_FROM1として'FROM ?_TABLE? X1'のみが設定されます。
「?_TABLE?」はPROGRAM=内で指定したテーブル名です。
00700 %ZZZZZZ_SQL_FROM+REPEAT=
繰り返しの回数指定がないので,単に繰り返しの終わりを意味します。
00800 %ZZZZZZ_SQL_LEFT+REPEAT=_LEFT_COUNT
_LEFT_COUNTは_DATA_COUNTと同じで今回は2です、次のREPEAT=まで繰り返をします。
00900 %ZZZZZZ_SQL_LEFT+SQL=?_LEFT##?
DATA=で指定しデータ辞書からのLEFT OUTER JOIN文を設定しますが、このプログラムでは指定が無いので全て空白となります。
01100 %ZZZZZZ_SQL_WHERE+REPEAT=_WHERE_COUNT
_WHERE_COUNTは_SET_COUNTと同じで、既に設定されたSET=の数で,今回は1となります。
01200 %ZZZZZZ_SQL_WHERE+SQL=?_WHERE##?
このプログラムでは?_WHERE##?は?_WHERE1?でSET=でX1.ZZZYAA_市@WHEREに設定されている値を使用します、このプログラムでは以下のようになります。
「WHERE X1.ZZZYAA_市 LIKE '?ZZZYAA_市?%'」となり、ZZZYAA_市を先頭からの文字列を条件として絞り込みが出来ます。
01400 %Z_CANCEL_WHERE+SQL=?_WHERE_AND? X1.Z_CANCEL=' '
%Z_CANCEL_WHERE+は更新(INPUT)では採用しません。逆に,検索の場合は削除データーは不要なのでこの行を採用します。
?_WHERE_AND?は_WHERE1で'WHERE'となり_WHERE##で文字が設定された場合や_WHERE_ANDが使われた場合'AND'となります。
01500 %ZZZZZZ_SQL_GROUP+REPEAT=_GROUP_COUNT
_GROUP_COUNTは_DATA_COUNTと同じで2となります。
01600 %ZZZZZZ_SQL_GROUP+SQL=?_GROUP##?
?_GROUP##?はDATA=の属性4にGが設定されていると_SELECT##と同じ物が”GROUP BY"付きで設定されます。 このプログラムには無いので全て空白となります。
GROUP BYが集計関数が有る場合の集計の単位を表します。
01800 %ZZZZZZ_SQL_HAVING+SQL=?_HAVING?
_HAVINGの内容を設定します。集計結果を条件とする場合に使用します。
01900 %ZZZZZZ_SQL_ORDER+REPEAT=_ORDER_COUNT
_ORDER_COUNTはここまでにキー項目がある場合はそこまでのDATA=の数, ない場合はDATA=の数となります,今回は1となります。
02000 %ZZZZZZ_SQL_ORDER+SQL=?_ORDER##?
?_ORDER##?は?_ORDER1?となり「ORDER BY 1」に変換されます。
ORDER BYはデータの取り出す順番を指定します。
====================================================
1部をのぞき特殊データ名を使わない場合は以下のようになります
☆これでも動きますが、変化(成長)には弱いので,このようにはしないで下さい。
****************************************************
200 PROGRAM=,&X1,?_MM?_市実表
300 SET={}ZZZYAA_市{12,,/,}市
600 DATA={K}X1.ZZZYAA_市{12,0,J,}{}{}{}{&X1.}{ZZZYAA_市}{{}}市
800 DATA={}X1.ZZZYAA_都道府県{10,0,J,}{}{}{}{&X1.}{ZZZYAA_都道府県}{{}}都道府県
910 SQL=SELECT X1.ZZZYAA_市
920 SQL=,X1.ZZZYAA_都道府県
930 SQL=,X1.Z_CANCEL
940 SQL=FROM ?_MM?_市実表 X1
950 SQL=WHERE X1.ZZZYAA_市 LIKE '?ZZZYAA_市?%'
960 SQL=ORDER BY 1
====================================================
▲I言語の特徴:実際に作られた基本のプログラムは数行しかありません。 つまり、基本的なプログラムの部分は、ほとんどをI言語側が実行しており、プログラム内に存在しません。 一般のプログラムでは、細かなプログラムの部分もソースプログラムに作られるので、 そこを、修正する場合には高度の知識が必要となりますし、解読も難しくなります。 I言語は高度の知識を不要とするため、細かな部分は存在しませんし、解読が難しくなる事も有りません。

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

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

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

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

◎(4.11)テーブルの数を指定します今回は1個ですので1とし[Enter]で次に行きます。

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

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

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

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

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

◎(4.17)許可はZZZYのテーブルを使うのでZZZYを選びます。

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

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

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

◎(4.21)[Esc]でメニューに戻って,'21'で「テスト 全 プログラム 更新」に行き,ジョブに'ZZZZ300121'を入れて[Enter]し, '←','0'でZZZZ300121のプログラムに行き、ここでデータ辞書を有効にするため再度プログラムを作るので、まずは、元のプログラムを全て消します。
操作で'CANCEL 200 900'で200から900までの行が全て消えます。

◎(4.22)論理削除でデータが残っているので操作に'DISCARD'「Enter」で物理的に削除します。

◎(4.23)前回同様TABLEでAA_市実表を指定しプログラムを作った結果です。
前回のプログラムに対し2行目が新たに作られており、前回800番の内容が900番で文字が増えています。
300 TABLE=&X2,?_MM?_都道府県実表
★注意:VER8.3には問題が有り、TABLE=&X2,?_MM?AA_都道府県実表と'AA'の部分が余分に付いてしまうのでここで取って下さい。
テーブルを使用する宣言を新たに行っています。
800 DATA={}X1.?&.DATA&~+_都道府県?

900 DATA={,&X2}X1.?&.DATA&~+_都道府県?
と',&x2'が追加されており、これによりデータ辞書で指定した内容でリストボックスが表示されます。

◎(4.24)'TEST'[Enter]でプログラムを起動し[Enter]で検索後'←','2','飯田'でリストボックスが表示されました。 リストボックス上の「長野県」を選ぶため[PgDn](Page Down)し[Enter]で作成できます。

◎(4.25)さらに'↓','2','調布','東京都','↓','2','札幌','北海道'で作成しました。

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

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

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