}I言語の学習 3. SQLとI言語の連携の学習


3.1)メニューの学習。

3.1.1)I言語のアイコンをクリックすると、メニューが表示されます、このメニューもI言語でプログラムされているので、まずはメニューでI言語の画面を説明します。

3.1.2)1行目から3行目まではI言語で共通です。
3.1.3)1行目に画面のタイトルが表示されます。メニューですのでアイコンと同じ内容の'I'が表示されています。
3.1.4)2行目はメッセージが表示されます、エラーの場合もこの行に赤の背景でエラーメッセージが表示されます。因みに'a'を入力すると、「a *(input)*」のエラーが2行目に表示されます。

3.1.5)3行目は現在処理中のデータの内容や付加情報です。2番目の波括弧の{2,2,9}が入力中のデータ定義内容で、最初の2が全体の文字数、次の2が最小文字数、次の9が入力出来る文字が0から9までの数字の意味となります。よって'a'がエラーと成った訳です。
3.1.6)メニューは左が01から20までで右が21から40まで表示出来ます。
3.1.7)通常はキーボードから数字2文字を入力しますが、メニューの上でクリックしても該当の数字が入力できます。
3.1.8)これからプログラムを作りますが、プログラムを作るメニューは「01===システム 支援 メニュー」に有るので、01を入力します。

3.1.9)プログラムを作るメニューは「02==システム 開発 メニュー」に有るので、02を入力します。

3.1.10)メニューは必ず2回画面が移動する事で実際に動かしたいメニューが表示されます。I言語ではプログラムを起動するメニューをジョブと呼んでいます。
3.1.11)ジョブのメニューの数字の次に=p=と表示されている物と、'==='と表示されている物が有ります。これは、パスワードを必要とするかを表しており、'==='はパスワードを必要としません、一方、'=P='はパスワードが必要ですので事前に使用者とパスワードが設定されている必要が有ります。
3.1.12)プログラムを作るメニューは「21=P=テスト 全 プログラム 更新システム 開発 メニュー」に有るので、21を入力します。
3.1.13)パスワードは使用者に対しパスワードと許可の英字4文字と認証区分が有り、許可区分にはGUEST(外部の人用)とPERSON(内部の人用)とADMIN(管理者用)が設定されます。'=P='の物はGUEST以外のPERSONとADMINの人が使えます。尚、GUESTでもそのジョブに対する権限を与えれば可能と成ります。
3.2)プログラム開発ジョブのメニューの学習

3.2.1)パスワードを必要とするジョブですので使用者入力が必要です。ここで使用者を入力します、インストールではZZZZZZZZが許可ZZZZの管理者、ZZZZZZZYが許可ZZZYの管理者として登録されているので、今回はZZZZZZZYを使用します。使用者のZZZZZZZYを入力し、パスワードにインストール時点で変更したパスワードを入れます。尚、インストールでパスワードを変更してない場合は別画面が表示されるので、そこでパスワードを変更してから変更したパスワードを入れて最後に[Enter]キーを押すと入力位置がジョブに移動します。。

3.2.2)この画面も当然I言語で動いており、ここで説明する内容はI言語共通の説明と成ります。このプログラムは更新用の標準的なプログラムとして作られており、更新したい場合は←矢印キーを押します。

3.2.3)入力位置が明細行の先頭の位置に移動し、右上にリストボックスが表示され「2=作成」が表示されています。この行は何も表示していないので、修正や削除は必要無いので作成のみが表示されています。
3.2.4)*に2で作成M0はZZZZでM1,M2,M3にメニューから起動したいので01から40までの取り合えず使っていない30を3個入れます。

3.2.5)許可は使用者の許可と同じZZZYのみが入力できるようになっています。因みに許可ZZZZは特別の使用者で全ての許可を扱う事が出来ます。

3.2.6)許可区分は許可ZZZYに対しAAとZYとZZが既に登録されていますが、今回はAAを入力します。

3.2.7)処理種類にはOUTPUTとINPUTが有ります。データベースには2種類のデータベースが有り、一時的に作って消す事の出来るテーブル用のワーク用と、通常はテーブルを消す事のないマスタ用が有ります。ここでOUTPUTとすると、マスタ用データベース内のテーブルを更新する事が出来ないように成ります、INPUTとすればメニューの許可と同じ許可のテーブルが更新出来ます、今回は取りあえずINPUTにします。

3.2.8)認証にはJとPとXとAが有り、Jは使用者登録以外にジョブに対する設定が必要な物で、Pは使用者がGUEST以外の場合使え、Xはパスワード不要で、Aは管理者用となります、今回はXでパスワード不要とします。

3.2.9)コピー1からコピー5まではここにジョブを入力するとジョブの後にコピーして使う事ができます。今回はコピーしないのでメニューまで行きますが、メニューが最後の項目ですので、ここで↓矢印を押します、↓矢印で入力の最後のデータに移動出来ます。尚、↑矢印を押せば入力の先頭位置に戻る事も出来ます。

3.2.10)メニューにSTUDYを入力し最後に[Enter]を押すとMESSAGEに!作成OKと出て作成が完了します。
3.2.11)この行が作成されたので、リストボックス上に修正と削除、更に選択の行が追加されています。
3.2.12)ここで0で選択すると、プログラムの更新画面に移動できます。1個のジョブ内で複数のプログラム(画面)を実行出来るようになっているので、全体をジョブと呼んでいます。
3.3)SQLとI言語の連携プログラムの学習
3.3.1)それでは、SQLとI言語の連携のプログラムを作ってみます。
3.3.2)プログラムの仕様はI言語の画面から有効桁数8桁で小数部2桁の正の値を入力し、SQLの関数を使って2乗と平方根を求め、I言語で画面に結果を表示します。

3.3.3)←矢印キーで更新に行き、2で作成し作成後は↓矢印キーで1行下がり全ての行を作成します。
3.3.4)1行目はここからプログラムの開始に意味で「PROGRAM=処理種類...」の命令を書きます。処理種類は3種類あり、OUTPUTとINPUTとNOTです。OUTPUTは標準的な検索プログラム用で、INPUTは更に検索に加え標準的な更新プログラム用です。NOTはそれ以外の場合です。今回は標準的な検索はしないので、NOTで作ります。
3.3.5)2行目は画面から数値を入力する部分を書きます。「DATA=入力値{8,2,+}」入力値がI言語で扱うデータ名で、波括弧内がデータの定義情報です。8が有効桁数、2が小数部の桁数、+が正の数値を意味しています。
3.3.6)3行目は2行目の入力直後に実行する処理が書けます、今回は2乗と平方根を求めるSQL文を書きます。「=SQL_SET{2乗,平方根}{SELECT POWER(?入力値?,2)と「=  ,?_SQRT((入力値))?};」 と成ります。実行命令は先頭に=を書きます、SQL_SETはSQLを実行しI言語側で1件のみの結果を受け取りたい場合に使用します、{2乗,平方根}はSQLの結果の1件目を受け取るI言語側のデータ名を書いています、最後の波括弧内でSQL文を書きます、?で囲まれた物はその変数の内容で置き換わります、?入力値?は入力値の内容で ?_SQRT((入力値))?は平方根をRDBMSの仕様に合わせて組み立てています、?内では?が使えないので(入力値)で入力値の内容を設定出来る仕様と成っています。命令の最後の;は不要ですが、命令の終わりを明確に分かり安くする意味で;を書く事を推奨します。
3.3.7)4行目は2乗の結果を表示するデータを書きます「DATA={O}2乗{14,2,+}」と成ります。{O}は入力項目でなく出力のみの項目の意味となります。2乗した場合有効桁数は整数部が2倍の(8-2)×2=12で小数部は同じ2ですので14桁必要と成ります。
3.3.8)5行目は平方根の結果を表示するデータを書きます「DATA={O}平方根{30}」とします。平方根の場合小数部の桁数はRDBMS側が勝手に決めるので陽に指定する事が出来ないので、とりあえずそのままで30文字分を表示出来るようにしました。I言語側ではデータは全て文字列で持つようになっているので、このようにしても動きます。
3.3.9)それでテスト実行してみます、テスト実行は操作でT(TEST)[Enter]とするとテスト画面が立ち上がります。

3.3.10)テスト画面はテスト中が分かるように1行目に赤背景で「****[ TEST ]****」が表示され、タイトルも赤背景になっています。
3.3.11)画面に対する定義は何もしていないので、I言語が画面を見出しを付けて表示しています。
3.3.12)試しに5[Entrr]とすれば結果が表示されます。

3.3.13)もう少し学習を続けます。I言語では可能な限りエラーが起きない工夫をしていますが、それでもエラーと成る場合があります。エラーが起きてもパニックにならないようにここで学習しておきます
3.3.14)平方根は小数部の桁数不明で30文字表示としていましたが、あえて小数部5桁にして実行してみます。

3.3.15)小数部の桁数が足りないのでunder flowのエラーとなってしましました。

3.3.16)I言語としてunder flowは無視する仕様にする事も当然可能ですが、この場合はSQL側で小数部を合わせれば可能に成るので、エラーとしています。
3.3.17)SQLで小数部を合わせるにはCASTを使えばできます、「CAST(結果 AS DECIMAL(8,5))」です。

3.3.18)今度はエラーと成らないで表示されました。

3.3.19)SQL側でエラーが発生する場合も有りますので、その場合の学習もしておきます。
3.3.20)999999.99を入力してみます。

3.3.21)numericに変換中にエラーと成ったと言っています、平方根のDECIMALの整数部が不足している為に発生しています。平方根ですから整数部は入力値の桁数の半分で良いと判断し(8-2)÷2=3と考え小数部の5と合わせて8としましたが、CASTで四捨五入が行われ整数部が4桁となり、エラーとなってしまいました、そこで、有効桁数を8から9に変更します。

3.3.22)今度はエラーとなりませんでした。

3.3.23)999999を入力してみます。

3.3.24)intで算術オーバーフローと成りました。これは999999をINTとみなし2乗した為算術オーバーフローと成ってしまった為です。そこで999999をDECIMALにCASTする事で対応します。

3.3.25)今度はエラーとなりませんでした。

3.3.26)補足:データを何も入力しないで[Enter]すると、「関数sqrtには引数1個が必要です」のエラーと成ってしまいます。これはI言語側のプログラムミスで?_SQRT((入力値))?がSQRT()と成ってしまう為です。(VER27.1で修正します)取りあえず?_SQRT((_VC&入力値))?(_から始まる物はシステム変数でVが値を設定で、Cは列名をカットする意味で、&以下の入力値の内容を値としてSQLに設定出来るように成っています)とすれば問題が出なく成ります、このようにI言語自体に問題が有る場合もありますが、長い時間を掛けて開発しているので致命的な物は無いはずです。
3.3.27)事務処理系システムでは2乗も、平方根もあまり使わないので、今回のエラーはめったに起きる内容ではないですが、事務処理系でも起きる可能性はゼロでは無いので、あえてここで学習しましたので、理解しておいてください。
Reserved, Copyright (C) 2018-2018 Nobumichi Harasawa.