I言語ホームページ


1.1 I言語とは、その1
I言語とはInstant言語の略です、コンピューターのプログラムを即座に作る事が出来るプログラミング言語です。
プログラム作りは結構難しく、10人が勉強を始めても、実際にプログラムを作れるようになる人は、残念ながら10人とは成りません。
また、実際にプログラムを作れるようになったとしても、プログラムを作るには非常に時間がかかります。
そこでI言語では、難しい部分と、時間のかかる部分を、全てコンピューターに任せる事で、 「誰でも」「簡単に」「早く」プログラムを作れるようにしました。
VER37_8.0.11-2024年11月13日(.NET8.0.11版),VER36_6.0.5-2022年05月11日(.NET6.0.5版),VER35.12-2021年11月10日(.NET5.0.12版),VER32.1-2020年03月08日(.NET Framework版)
I言語のダウンロード(http://ilanguage.iinaa.net/download2.htm)
I言語自習書_01:I言語の動作環境の構築
I言語自習書_02:リレーショナルデータベースとSQL
I言語自習書_03:家計簿プログラムの作成
I言語自習書_04:トランザクション処理
I言語自習書_05:請求書発行システムの開発
I言語自習書_06:ノウハウ集
1.2 I言語とは、その2
プログラミングは頭脳労働の生産性を改善出来る素晴らしい道具です。
プログラミングは予想以上に時間が掛かるため、企業のシステム開発は基幹システムと呼ばれる、
基幹と成るシステムの開発に手いっぱいで、各担当者のシステム化にまでは手が回らず、
各担当者は相変わらず自分の頭脳で情報処理を行っており、各担当者の仕事の生産性までは改善出来ていない状況です。
日本は少子化で働き手が不足する方向に有ります、なので、国民全員がプログラミングを習得し、
自分自身の仕事の生産性を改善すれば働き手不足の解消が出来ます。
日本のGDPは世界4位前後と素晴らしい成績ですが、国民1人当たりGDPでは何と38位前後で、生産性がかなり悪い状況ですので、
国民全員がプログラミングが出来るように成れば仕事の生産性をかなり改善出来ます。
その意味で、小学校でもプログラミングが重要として「プログラミング教育の必須化」が始まりましたが、
専門家はプログラミングが出来るように成る事では無く「プログラミング的思考が身に付く事」と言っており、
小学生ではプログラミングの習得は無理との見解ですので、国民全員がプログラミングできる方向には残念ながら向かっていません。
これを、改善する為には、誰でも習得出来るプログラミングが必要です。
機械語は人間には難しいとして、沢山のプログラミング言語が作られたハズですが、最近のプログラミング言語は、
機械語には無い難しい技術や言葉のてんこ盛り状態で、小学生には理解出来ない状況になってしまっています。
I言語は、難しい技術や言葉を成るべく使わないで、それでも難しい部分と時間の掛かる部分を時間を掛けてI言語に組み込む事を繰り返し、
誰でも簡単に早くプログラミングが出来るようにしています。
I言語の一世代前のIPROGRAMですが、プログラマーで無いキーパンチャーが、私もプログラムを作りましたと言われた時に、誰でもプログラミング出来ると気づかされました。
自動車の運転は誰でも出来るように成りましたが、これは、誰でも運転できるように関係者が努力をして来た為です。
パソコンは自動車以上に家庭や企業内に有り、誰でもプログラミング出来る環境は既に整っています、
なので、IT関係者が誰でもプログラミング出来る事を意識し努力をすれば「一億総プログラマー」も夢物語ではありません。
I言語を使えば十分に実現出来ると考えています。皆で「一億総プログラマー」を実現し、
自分の仕事の生産性を自分自身のプログラミングで改善し、少子化による労働者不足を防ぎませんか。
1.3 I言語とは、その3
経済産業省のDXレポートに「2025年の崖」とショッキングな言葉が書かれています。
要約すると、現行システムが解読困難なプラックボックス状態になると、2025年に崖となってDX化を阻害するとの事です。
解読が容易なプログラミング手法とし、繰り返しと条件分岐単位に構造化する、構造化プログラミングが提案されましたが、
実際に実践し解読をしたところ、構造化のブロック単位に分岐が有り、そこで、解読が中断してしまい、非常に解読が困難になってしまっていました。
この時goto命令が解読を困難にしているとの説も出ました、これも分岐命令ですので、解読を困難にしていると思われます。
この、二つの事例から、分岐命令が解読を困難にしている原因で有ると言えます。
実は、goto命令以上に分岐している物が実際のプログラムには存在します、それは、ユーザーが作った無名関数以外の関数です、
関数は、更に、関数内では引数からの変数名の読み替えも必要で、この、2点で解読を非常に困難にしているのが現実です。
I言語では、「2025年の崖」を作らない対策として、解読が容易なプログラムも狙っているので、関数も有りません。
ただし、関数が無いと、同じロジックを何か所も書く必要が有り、これも、解読を困難にする原因ですので、
分岐しないで書いたロジックの一部に名前を付けて、他の場所でコピー出来る機能を用意し、分岐も、変数名の読み替えも無しで、
関数の長所のみが生かせるようにしています。
又、goto命令は廃止すると不便ですので、先に行くJUMP命令と、前に戻るBACK命令を用意し、少しでも解読が容易になるように工夫してあります。
尚、ifに有るelse命令は便利ですが、解読が困難になる原因と成っているので、あえて使えない文法としています。
関数がと思った人が居るかと思いますが、更に解読を困難にしている物が、オブジェクト指向プログラミングです、
オブジェクト指向プログラミングは関数以上にインスタンス名からクラス名への読み替えが必要で、更に、インスタンスを階層構造に出来るので、
解読が困難なプログラムが容易に作られてしまう致命欠点を持っています、最大の問題はオブジェクト指向プログラミングの長所は述べるが、
解読が困難に成る致命欠点を誰も指摘していないので、「2025年の崖」にまっしぐらに進んでしまっている事です。
I言語の一世代前のIPROGRAMの場合ですが、一つのプログラムを一番多い物で20人が更新していて驚きましたが、殆どのプログラムを複数人で更新しており、
作った本人以外が容易に解読出来る事が証明されています。
1.4 I言語とは、その4
全てをI言語で対応する事は難しいので、データはリレーショナルデータベース(RDB)に持ち、データの定義と操作の部分は、SQLと呼ばれる別の言語も使用します。
RDBは今までのデータベースとは異なり、データを一番簡単な構造の2次元の表で持っているので、SQLの文法も簡単で命令数も少なく初心者にも容易に習得できます。
SQLは簡単ですが、コンピューターシステム開発で必ず必要な、分散されて記憶されている情報を集めて処理するロジックを、SQLでテーブルを結合する方法で、簡単に対応出来る優れものです。
SQLこそがプログラムを「誰でも」「簡単に」「早く」出来るようにした救世主です。
I言語は、SQLを効果的に使う為の物ですので、一般的には給与計算、会計処理、生産管理と言った情報処理システムと呼ばれる、 事務処理システム専用の言語ですので、応用範囲は広いですが、何でも出来る言語では無いので、その点は注意して下さい。
尚、RDBのソフトはMicrosoft SQL Server 2022 Express Edition等パソコンで無償で使える物が複数種類提供されているので導入は容易です。
1.5 I言語とは、その5(VER22.1版 2022年6月11日改定)
それでは、I言語が難しくない事、時間がかからない事を理解してもらうために、実際のプログラムで説明します。
I言語はSQLを使います。SQLはRDBを使ってデータを効率よく記憶し、処理する為の言語です。
データはテーブル(行と列の2次元の表)と呼ぶ単位で持ちます。列がデータの種類で、行が1件づつのデータです。
I言語は、単に難しさの解消と、時間をかけない事を狙っただけでは、上手くゆかないので、規約でカバーしています、必要な部分を説明します。
I言語ではテーブルを許可(英字4文字)で大きく区分し、使用者には1個の許可を与えられます。 これにより使用者の扱えるテーブルを限定したり、許可の管理が簡単に行えるようにしています。
今回はインストール時点で許可"ZZZY"が作られていますので、これを使います。
テーブルの先頭は必ず許可と同じ文字列にする必要が有ります、そして、テーブルの最後は必ず"実表"(英語表記は"_TABLE")とする事としています。 (これはプログラム内で使われているテーブルが何かを簡単に判別出来るようにする為です)
更に、許可の次に2文字の許可区分を付ける事を推奨しています、今回はインストール時点で既に設定されている"AA"を許可区分とします。
それでは、ごく簡単な月単位のエンゲル係数を導くための、家計簿のテーブルを考えてみましょう。
列としては"年月日"、"内容"、"食費"、"金額"、が考えられます。尚、列名は全てがユニークで有る必要は有ります、 今回は一応家計簿用ですので先頭に「家計簿_」の文字を付加してユニークな列名とします。
尚、テーブルは他の行と区別する為の行毎にユニークな値を持った主キーが必要です、今回は"年月日"と"内容"でユニークに出来るので、この2個を主キーとします。
実際の作業は、最初に列のデータ辞書を作ってから、次にテーブルを作ります。
下記がテーブル情報です。
****************( テーブル情報 )********************
●テーブル名=ZZZYAA_家計簿実表
■列名1=家計簿_年月日 CHAR(8) (主キー、データ辞書[型1="D"],[長さ2=1])
(CHAR(8)は半角文字で8文字記憶出来る意味です、RDBには年月日を記憶出来る物も有りますが、 RDB毎に全く異なる動きをするので、I言語ではあえて文字で8文字としています)
(データ辞書の型1が"D"[DATE]は年月日を意味します)
(CHARで長さ2が1は最低1文字必要の意味です)
■列名2=家計簿_内容 NCHAR(20)(主キー、データ辞書[型1="J"],[長さ2=1])
(NCHAR(20)は全角文字(半角も含めて)で20文字記憶出来る意味ですが、I言語では都合により全角で10文字の意味となります,
プログラムの扱っている文字コードはUTF-16と呼ばれる物を使用していますが、
サロゲートペアと呼ばれるUTF-16の2文字を1文字で表現している物も問題無く扱えるように半分の文字数としています)
(データ辞書の型1が"J"[Japanise]は全て全角[日本語]を意味します)
(NCHARで長さ2が1は最低1文字必要の意味です)
■列名3=家計簿_食費 DECIMAL(1,0)(データ辞書[型1="+"])
(DECIMAL(1,0)は数値で有効桁数1桁、小数点以下0桁を意味します)
(データ辞書の型1が"+"は0以上の数値を意味しています,"-"とすると負の値も設定出来ます)
(この値が1の場合食費と見なす事にします)
■列名4=家計簿_金額 DECIMAL(9,0)(データ辞書[型1="+"])
★上記以外に、実際には、I言語自身が使うZ_で始まる列が、先頭に8個作られます。
************************************************
◎(データ辞書登録画面)◎(テーブル登録画面1/2)◎(テーブル登録画面2/2)

それでは、データーを登録するためのプログラムを作ってみます。尚、ここまでは全てI言語の開発支援プログラムで作る事が出来るので 、直接プログラムを打ち込む必要は有りません。
出来たプログラムです。
*****************( プログラム VER36.6.0.4 )******************************************
PROGRAM=,&X1,?_MM?_家計簿実表
SET={}.?&.SET&家計簿_年月日?
SET={}.?&.SET&家計簿_内容?
DATA={K}?&.DATA&家計簿_年月日?
DATA={K}?&.DATA&家計簿_内容?
DATA={}?&.DATA&家計簿_食費?
DATA={}?&.DATA&家計簿_金額?
COPY=@ZZZZZZ_SQL
*****************( 特徴 )**************************************************************
特徴1:テーブル情報がテーブル名と列名が主で、以外を変更してもプログラムの変更は不要です、プログラムとデータの完全独立を実現しています。
特徴2:更新のSQL文はI言語側で対応しています、更新では何時何処で誰が何をしたかを付加し、問題発生時に速やかに対応出来るように成っています。
特徴3:検索のSQL文はCOPY=@ZZZZZZ_SQLでコピーされています、複雑なニーズにも対応出来るように、プログラム内で組み立てています。
特徴4:命令はPROGRAM=、SET=、DATA=、COPY=の4個とCOPY=の中の「条件命令+」とREPEAT=とSQL=の3個の計7個で、後はSQL文の、SELECT,INSERT,UPDATE,BEGIN TRANSACTION,COMMIT TRANSACTION,ROLLBACK TRANSACTIONの6個を使っているだけですので、初心者でも理解は容易です。
特徴5:プログラムの書き方が他のプログラミング言語とは大きく異なっています。理由は、初心者が命令と同じ単語をデータ名として使ってしまい、 意味不明のエラーを出してしまう事からの解放でした、これを予約語と言いますが、初心者は全ての命令を覚えていないので、間違いを犯してしまう問題と、バージョンアップで新たな予約語が出来ると、今までエラーの無かったプログラムがエラーとなってしまう厄介な問題が有り、長期に使用するプログラムにとっては大きな問題を含んでいました。 そこで、命令を書くオペレーション部とデータ名を書くオペランド部を完全に分離する書き方を3種類用意しました、 定義命令用の「オペレーション=オペランド」と条件命令用の「オペランド+」(+と‐がオペレーションです)と操作命令用の「=オペレーション{オペランド1}{オペランド2};」です。 経験者には最初は違和感が有りますが、文法は単純ですのですぐ慣れます。
 尚、SQL文には予約語が有り、列名として使う場合RDBMS毎に対応方法が異なる為、I言語としては列名として予約語は使えない事としました、5個のRDBMSの予約語全て使えないので、結構使えそうな名前が使えないので設計時には注意が必要です、データ辞書作成で予約語をI言語がチェックしているので、覚える必要は有りません。
特徴6:更新時、画面に表示されているデータと同じ保証は無いので、再度読み込んで画面と異なる場合は更新しないような細かな配慮もされています。
特徴7:I言語は英大文字が基本で動いています、なので、プログラムも英大文字で作っています、理由は元々がメインフレームとの連携用に開発した関係で英大文字が基本に成っています。英小文字をあまり使わない理由はSQL Serverにも有ります、SQL Serverは同じ英小文字と英大文字を比較すると同じ文字と判定します、一方、I言語は一般的なプログラミング言語と同じ動きにしたいので、異なる文字と判定します、SQL SeverとI言語の判定結果が異なるので、誤動作防止の意味で、英小文字を極力使用しない仕様としています。
特徴8:I言語を使って、インストールもメニューも、開発支援ソフトも、運用支援ソフトも作られており、インストールすれば、即、本番運用が出来るようになっています。朝の時間起動処理を実行すると、その日の昼にデータベースのバックアップと次の稼働日の朝の時間起動処理が予約され、エンドレスで時間起動が行われるように成っています。
特徴9:I言語の一つ前のIPROGRAMで実際に一万本以上のプログラムが開発され本番運用されました、I言語はIPROGRAMのDNAを引き継いでいるので、実用性は実証済です。尚、現役時代に生産管理システムを担当していた関係で、俗にMRPと呼ばれる部品発注システムをIPROGRAMで構築したので、I言語でもサンプル発注システムとして作って有ります、伝票を発行する印刷プログラムもI言語用に作って有るので、企業ニーズに合わせてカスタマイズすれば使えるように成っています、お試し下さい。
特徴10:インストールも動くように、テキストエディタでファイルに書いたプログラムを、実行する事も出来ます。実際の業務プログラムはプログラムテーブルに作るので、このプログラムのように、一般的なI言語の更新処理用プログラムで、プログラムを作ります、当然ですが、テキストエディタで出来る事もI言語でプログラミングされています。
特徴11:必要と思われる機能は殆ど網羅しましたが、それでも、不足の場合でも自力で対応出来るように、I言語のソースプログラムも添付しています。
特徴12:I言語では、ライブラリをそのまま使う方法は取らないで、I言語の命令に置き換えて提供してます、初心者がつまずかない為でもありますが、動作環境に非互換が発生しても、I言語側で非互換を対応し、開発されたプログラムの影響を極力低減する為です。IPROGRAMの時にSQL Serverが再構築され、大規模な非互換が発生した事が有りましたが、非互換の殆どはIPROGRAM側で対応出来、開発したプログラムの修正が殆ど無しで移行できました。これは、長期間使用するプログラムにとって非常に重要な事と考えます。
****************( プログラムの詳細説明 )******************************************
PROGRAM=,&X1,?_MM?_家計簿実表
◎「PROGRAM=」はプログラムの処理種類を指定し、OUTPUTが標準検索処理で、INPUTが標準更新処理で、NOTがそれ以外の処理を意味します。
◎ここでは処理種類が省略されており、この場合はメニューに指定した処理種類が採用されます。
◎PROGRAM=は複数個書く事が出来、一個のプログラムの中で画面を切り替える事ができます、プログラム開発ではメニューを作ってその一つを選択してプログラムを作る画面を開いています。
◎メニューには処理種類の他に他のプログラムをコピーする指定も出来るので、同じプログラムがそのまま更新用と検索用のプログラムとして動かせます。
◎メニューの処理種類と許可はデータベースに接続するログインIDに使われ処理種類がOUTPUTはテーブルに対しSELECT(検索)権限のみが有り、更新は出来ないようになっています。
◎権限が設定されるのはマスターデータベースに対してで、他に全ての権限が有るワークデータベースも有り、どんなニーズにも対応出来るように成っています。。
◎処理種類がINPUTのデータベース接続のログインIDはテーブルに対しSELECT、INSERT(作成)、UPDATE(修正)の権限が有ります、尚、DELETE(削除)の権限は有りません。
◎INPUTにDELETEの権限が無いので行を物理的に削除出来ません、これは、削除データもUPDATEでZ_CANCELに削除日を入れ、何時何処で誰が削除したかを記憶し、問題発生に速やかに対処出来るようにしている為です。
◎列名でZ_で始まる物と英字4文字とアンダーバーで始まる列名もパッケージソフト用で予約語としており、登録出来ないので注意して下さい。
◎「&X1」は右に指定するテーブルの別名です、ユニークな別名が必要なのでここで指定する文法に成っています、&X1が推奨値です。
◎「&X1」の別名はプログラム内では殆ど省略可能になっているので、ここ以外で登場する事は殆ど有りませんが、SQL文内では必ず登場します。
◎「?_MM?_家計簿実表」は標準の検索及び更新対象のテーブル名です。
◎「?_MM?」と両端に?の有るものはプログラムの読み出し時に内容で置き換えられます。
◎「_MM」のようにアンダーバーで始まる変数はシステムが提供している物で、必要と思われる物が沢山提供されています。
◎「?_MM?」はデータベース名とスキーマ名(SQL Serverの場合テーブルはデータベース名.スキーマ名.テーブル名で扱われます)更に許可と許可区分を含む値で置き換えられ、テスト中はテスト用データベースが設定されます。
SET={}.?&.SET&家計簿_年月日?
◎「SET=」は検索時の絞り込み用のデータを入力する為の物です。尚、PROGRAM=NOTの場合は使用しません。
◎画面はI言語が表示しているので、表示場所はほぼ決まっています。1行目はタイトル表示で、2行目はメッセージ表示で、3行目は現在入力位置の情報の表示で、SET=は4行目から見出し部と表示部が横に並んで表示されます。画面サイズはMS-DOSのCUI画面から始まった関係で、横が80文字で縦が25文字が基本に成っています、なので、入力できる文字数は最大でも80文字までですので、注意が必要です。尚、80文字以上のデータを扱いたい場合はDATA=を画面に表示しない設定も出来るので、そこに入れ、80文字以下に分割して表示し、更新時に文字を結合して、対応します。
◎「{}」は付加的な属性情報を設定する物です、今回は何も無いので空と成ります。
◎「.?&.SET&家計簿_年月日?」は該当列名のデータ型に合わせて画面を表示する情報が設定されます。
◎「&」で始まる変数名はテーブル宣言で作られる変数で、特に&.はPROGRAM=の右に書かれているテーブル名から作られた変数です、本来は&X1.と書きますがX1は省略出来ます。
◎先頭の「.」は、DATA=のデータ名と重複させない為に付けています、本来はSX1.(別名はSを取ったX1と成ります)とする代わりに,別名省略時はPROGRAM=の別名に成る事を利用し「.」のみで対応しています。
SET={}.?&.SET&家計簿_内容?
DATA={K}?&.DATA&家計簿_年月日?
◎「DATA=」は検索結果のデータの表示と、更新時のデータ入力用の項目設定用です。
◎検索結果ですので、画面に表示可能な行の数だけ作られます。尚、PROGRAM=NOTの場合は1個のみと成ります。
◎画面サイズはMS-DOSのCUI画面から始まった関係で、横が80文字に成っています、DATA=の表示は見出し部がSET=の次に来て、見出し部が表示される複数行分の下に、データ部が1行分確保されますが、右方向80文字を超えた場合は、SET=と同じように見出し部の次に表示部の形で複数行で表示されるのが基本に成っています、80文字を超えても見出し部と表示部を分離のままにしたい場合は、陽にCONTROL=SCROLLとすれば右スクロールが出来るように成ります、尚、縦サイズはI言語が画面に表示できる行数を再計算し、表示可能な分画面を広げて表示されます。又、1行に複数行分表示出来る場合は、複数行分表示されます。
◎メニュー等の画面も作れるように、DATA=の表示画面を全てFORM=命令で自前でレイアウトする事も可能です。@の連続が表示部に成りますが、表示長は決まっているので、長さが異なる場合は、I言語が長さを自動調整するので、注意が必要です。
◎「{K}」はKEYを意味し、更新時のキーを指定しています、更新処理ではDATA=に最低1か所はKを付ける必要が有ります。尚、SET=に{K}を設定する事も出来ます。
◎データ辞書の型1が"D"の年月日ですので、表示はYYYY-MM-DDと10桁表示と成ります。ただし、入力はハイフン無しで、テーブル上もハイフン無の8文字と成ります。
DATA={K}?&.DATA&家計簿_内容?
DATA={}?&.DATA&家計簿_食費?
DATA={}?&.DATA&家計簿_金額?
◎データ辞書の型1が"+"の数値で、小数点以下が無いので、データは小数点が右端と想定し、右詰めで3桁毎にカンマ付いて表示されます。
COPY=@ZZZZZZ_SQL
◎「COPY=」は他の場所からプログラムをコピーしてここに埋め込みます、他のプログラミング言語では関数と呼ばれる物で対応しますが、関数は初心者には難しい事と、分岐とデータ名の読み替えが必要な2点で解読を艱難にする致命欠点を持っているので,単にコピーする命令で対応しています。
◎@から始まる名前はどのプログラムでも使える名前です。
◎「@ZZZZZZ_SQL」は検索用のSQL文を組み立てるプログラムです、下記が内容です。
**************( @ZZZZZZ_SQLの内容 )************************************************************************
◎下記のプログラムは結果的には「SQL=」の命令が作られ、検索用のSQL文となります。
%ZZZZZZ_SQL_SELECT+REPEAT=_SELECT_COUNT
◎「%ZZZZZZ_SQL_SELECT+」のように最後に'+'又は'-'が有る物は、そこから右のプログラムを採用するかしないかを指定出来ます。
◎「PEPEAT=値」と値が有るとその数だけ繰り返します、「_SELECT_COUNT」はDATA=の数になります。
◎「PEPEAT=終了値[,開始値]」が文法です、初心者が良く質問をするFORやWHILEと同等の命令ですが、初心者に理解し易いように、単に開始値から終了値まで繰り返すだけの文法としました。
%ZZZZZZ_SQL_SELECT+SQL=?_SELECT##?
◎繰り返し内に有る'##'はプログラム読み出し時に最初に繰り返しの数に置き換えます、_SELECT##は_SELECT1から番号が付いて行きます。
◎配列は初心者が理解出来ないので使いませんが、変数名の一部を連番にする事で、配列と同じ事が出来るようにしています。##以外に#-が一つ少ない数、#+が一つ多い数が設定されます。
◎_SELECT1は「SELECT 別名.列名」に_SELECT2以降は「,別名.列名」となります、尚、SELECT=が有る場合は別名.列名の位置が置き換わります。
◎データ名の.以降(.が無い物はそのまま)が列名に成ります、尚、別名が無い物はPROGRAM=に書かれた別名の「X1」が付加されます。
%ZZZZZZ_SQL_SELECT+REPEAT=
◎PEPEAT=に値が無い場合は繰り返しの終了を意味します。
%Z_CANCEL_SELECT+SQL=,?_T?.Z_CANCEL
◎更新処理は削除データも表示するので、削除データの判定の為Z_CANCELも読み込みます。
◎「_T」はPROGRAM=に書かれた別名の「X1」と成ります。
%ZZZZZZ_SQL_FROM+REPEAT=_FROM_COUNT
◎「_FROM_COUNT」は1にJOIN=命令文の数が足された物です。
%ZZZZZZ_SQL_FROM+SQL=?_FROM##?
◎「_FROM##」は結合文字とテーブル名と結合条件が設定されます。
%ZZZZZZ_SQL_FROM+REPEAT=
%ZZZZZZ_SQL_LEFT+REPEAT=_LEFT_COUNT
◎「_LEFT_COUNT」はDATA=の数です。
%ZZZZZZ_SQL_LEFT+SQL=?_LEFT##?
◎「_LEFT##」はデータ辞書にテーブル結合の指定が有ると設定されます。
%ZZZZZZ_SQL_LEFT+REPEAT=
%ZZZZZZ_SQL_WHERE+REPEAT=_WHERE_COUNT
◎「_WHERE_COUNT」はSET=の数です。
%ZZZZZZ_SQL_WHERE+SQL=?_WHERE##?
◎「_WHERE##」はSET=にデータが入力された場合絞り込みのSQL文が組み込まれます、データ型が文字の場合は「(WHERE又はAND) 別名.列名 LIKE '入力値%'」と成ります。
%ZZZZZZ_SQL_WHERE+REPEAT=
%Z_CANCEL_WHERE+SQL=?_WHERE_AND? ?_T?.Z_CANCEL=' '
◎検索処理の場合削除データは不要なので、未削除データのみ表示します。
◎未削除データは「Z_CANCEL=' ’」で判定します、I言語では誤動作防止の為、通常はテーブルにNULL値は登録出来ないように成っているので、このように判定しています。
%ZZZZZZ_SQL_GROUP+REPEAT=_GROUP_COUNT
◎「_GROUP_COUNT」はDATA=の数です。
%ZZZZZZ_SQL_GROUP+SQL=?_GROUP##?
◎付加属性にGの有るデータがここに付加されます。
%ZZZZZZ_SQL_GROUP+REPEAT=
%ZZZZZZ_SQL_HAVING+SQL=?_HAVING?
◎「_HAVING」に値を転送すると、ここに設定されます。
%ZZZZZZ_SQL_ORDER+REPEAT=_ORDER_COUNT
◎「_ORDER_COUNT」はDATA=の数です。
%ZZZZZZ_SQL_ORDER+SQL=?_ORDER##?
◎通常は付加属性にKの有るデータを昇順に表示します。
%ZZZZZZ_SQL_ORDER+REPEAT=
*******************************************************************************************************************
◎(プログラム登録画面1/4)◎(プログラム登録画面2/4)◎(プログラム登録画面3/4)◎(プログラム登録画面4/4)

◎(実行画面)

先頭が*のコメント行を除くと、たった、8行しか有りませんし、テーブル名と列名がほとんどで、以外簡単な英単語があるだけで、難しそうなプログラムらしきものはありません,これだけで更新処理が問題なく出来ます。
基本のプログラムは全てI言語側が行う事で、これ以上は無理と考えられる極限まで、文字数が削減され「誰でも」「簡単に」「早く」が実現されている事が、お分かりと思います。
それでは、月単位のエンゲル係数を計算するプログラムを作ってみます。
こちらは、単なる更新や検索処理ではないので、手動でプログラムする必要があります。
月単位のエンゲル係数はSQLのSUMの合計を出す集計関数とGROUP BYのグループ化の機能を使えば出来ます。
SQLをすべて作れば、当然可能ですが、「早く」が実現できないので、ある程度の事まではI言語で対応出来るようにしています。
エンゲル係数を計算する式は、エンゲル係数を表示するDATA=の下にSELECT=で書く事で対応できます。
グループ化の指定はDATA=の次に{G}とする事で対応できます。
プログラムは下記のようになります。こちらも、たったの8行で出来ます。
****************( プログラム )*******************************
PROGRAM=,&X1,?_MM?_家計簿実表
DATA={G}年月{6}
SELECT=?_SUBSTR(X1.家計簿_年月日;1;6)?
DATA={}エンゲル係数{3,,+,Z}
SELECT=CASE SUM(?_T?.家計簿_金額) WHEN 0 THEN 0 ELSE
SELECT=100*SUM(CASE ?_T?.家計簿_食費 WHEN 1 THEN
SELECT=?_T?.家計簿_金額 ELSE 0 END)/SUM(?_T?.家計簿_金額) END
COPY=@ZZZZZZ_SQL
****************( プログラムの詳細説明 )******************************************
PROGRAM=,&X1,?_MM?_家計簿実表
DATA={G}年月{6}
◎付加属性にGを書く事で、GROUP BYが設定されます。
◎{6}は6文字表示出来る画面を表示します、このように、直接文字数を指定する事も出来ます。。
SELECT=?_SUBSTR(X1.家計簿_年月日;1;6)?
◎「SELECT=」を書くと別名.列名の代わりにSQL文に埋め込まれます。
◎年月単位に集計したいので、年月日から先頭の6文字を抜き出しています。
◎「_SUBSTR]は文字列を抜き出す関数に置き換わります、RDBMS毎に書き方が異り、引数の順番が異なる場合も考慮し、引数を含めて全体をシステム変数にしています、尚、引数はカンマでは無く、セミコロンで区切る文法に成っているので注意して下さい。
◎別名のX1.は今回は無くても動きますが、将来同じ列名を持つテーブルを結合してもエラーと成らないように別名を付けてあります。尚、X1.の代わりに?_T?.としたいですが、?の中に?は入れ子に出来ないのでX1.としています。
DATA={}エンゲル係数{3,,+,Z}
◎エンゲル係数を表示する画面です,3が3桁の数値で、次の空白は小数点以下の桁数で無い時は0の意味で、+が正の数値を意味します、Zは0の時0と表示します、無いと0は表示されません。
SELECT=CASE SUM(?_T?.家計簿_金額) WHEN 0 THEN 0 ELSE
SELECT=100*SUM(CASE ?_T?.家計簿_食費 WHEN 1 THEN
SELECT=?_T?.家計簿_金額 ELSE 0 END)/SUM(?_T?.家計簿_金額) END
◎エンゲル係数を計算しています。
COPY=@ZZZZZZ_SQL
****************************************************************
◎(プログラム登録画面)◎(実行画面)

エンゲル係数を求めているのはSQLで対応可能ですが、少し複雑ですので説明します。
「CASE SUM(?_T?.家計簿_金額) WHEN 0 THEN 0 ELSE ...」は分母が0の時SQLがエラーとなるのでこれを回避するため0の時は0とし0以外のみ計算します。
「CASE ?_T?.家計簿_食費 WHEN 1 THEN ?_T?.家計簿_金額 ELSE 0 END)」は食費のみ金額を設定し食費以外は0を設定することで食費のみの金額を算出します。
「100*SUM(食費分の金額)/SUM(その月の金額)」でエンゲル係数が%で求められます。
SQLは0で割るとエラーと成る仕様になっています、I言語で0に成らないプログラムにする事も可能ですが、万が一0に成ってもエラーに成らないように、このようにしています。
このプログラムはCOPY=@ZZZZZZ_SQLで検索のSQLが下記のように組み立てられます。
SELECT SUBSTRING(X1.家計簿_年月日,1,6)
,CASE SUM(X1.家計簿_金額) WHEN 0 THEN 0 ELSE
100*SUM(CASE X1.家計簿_食費 WHEN 1 THEN X1.家計簿_金額 ELSE 0 END)/SUM(X1.家計簿_金額) END
FROM ?_MM?_家計簿実表 X1
WHERE X1.Z_CANCEL=' ' GROUP BY (SUBSTRING(X1.家計簿_年月日,1,6)) ORDER BY 1,2

今回はほんの1例ですが、少し複雑な作業が必要でも、I言語側がほとんど対応してくれるので、
「誰でも」「簡単に」「早く」が実現可能な事がお分かりと思います。
ここまでは、他の開発ソフトでも比較的簡単に出来ますが、I言語はここからシステムが更に複雑になっても、「誰でも」「簡単に」「早く」が可能です。
家計簿でも、実際に使う場合は更に多くの機能を組み込んで、毎月行う作業を極力少なくする事が一番大事です。
たとえば、新聞代などは多分毎月同じです、中には火災保険のように年1度の物もあるので、この辺も含めて、定期的に自動で処理させるための、時間起動機能(一般的にはバッチ処理と呼びます)もI言語には組み込まれています。
開発支援も運用支援もすべてI言語で作られています、この点も他の開発ソフトとは異なります、つまり、結構複雑な開発支援も運用支援も開発出来るソフトですので、その実力は非常に高いと言えます。
尚、このページの先頭の「I言語自習書_03:家計簿プログラムの作成」で実際の操作が自習出来ます、是非チャレンジしてみて下さい。
1.6 I言語とは、その6
パソコンとは、パーソナルコンピューターの略です。 日本語で言い換えれば、企業等で使用する大型の電子計算機に対し、個人で使用する小型の電子計算機の事です。
小型と言っても最近のパソコンは昔の大型の電子計算機の性能を遥かに超えているので、中小企業や個人商店の基幹システム用として十分機能します。
では、あなたはパソコンを電子計算機として活用していますか?。
残念ながら、パソコンを電子計算機として活用している人は少ないと思われます。
これでは、パソコンの能力を十分に生かし切れていません、宝の持ち腐れとは言いませんが、非常にもったいない事です。
なぜでしょうか?、それは、パソコンを電子計算機として活用する為には、目的に合ったプログラムが必要ですが、
目的に合ったプログラムがあまり無く、個人でプログラムを作ろうとすると、難しく、かつ、時間がかかる為に、
個人ではプログラムを簡単には作る事が出来ない為です。
つまり、これを解決出来る言語が「I言語」と言う事になります。
1.7 I言語とは、その7
I言語は。元々は自分自身のシステム開発の改善の為に作ったIPROGRAM(最初はICOBOLでその後IPROGRAMを作る)が会社で作った物なので、無償で公開出来るように自宅で0から再構築した物です。 一般には基幹システムと呼ばれるシステムまで構築出来る機能を持っています。(スケジュールに合わせて、バッチ処理を起動する機能も組み込まれています) IPROGRAMですが、既に1万本以上のプログラムが作られ本稼働していますので、実用性は保証済みです。
1.8 I言語とは、その8
ICT化が進んだ企業では、1人が1台のパソコンを使用していると思いますが、やはり、計算機としての利用はほんの少しと思われます。 理由は、プログラム開発は難しく、更に、時間がかかる為、個人のニーズまで情報処理部門がシステム化する余力が無いためです。 結局、個々の担当者は情報処理を自分の頭を使って行っています、その結果、ノウハウは個人の頭の中で留まってしまい、人が変われば、 また、1からノウハウを伝承する必要があります。 一方、I言語を使えば、自らの力で、自分の頭で行っている情報処理を、プログラムとしてコンピューターに蓄積することが容易に出来るようになります。 これを、社員の全員が始めれば、社員のあらゆるノウハウが蓄積され、人が変わっても1からノウハウを教える必要が無くなります。 担当者は、システム化により、日常業務に追われる事もなく、プログラムを改良する事で、更に、有効なノウハウがコンピューターに構築されます。 企業にとって、非常に大きな発展が期待出来ます。
コンピュータの専門家へのメッセージ
1.9 I言語とは、その9
初心者に難しい技術と、プログラムの解読が困難に成る物を、可能な限り使わないようにしました。
(1.7.1)オブジェクト指向プログラミング---初心者には難しい言葉が多く、解読時インスタンス名からクラス名の読み替えが有り、解読が困難なので使いません。
(1.7.2)関数---関数内は変数名の読み替えが必要で、解読が困難になるので、使いません。ただし、同じステップが何か所も必要な場合は便利なので、単にプログラムをコピーし、変数名の読み替え無しで関数と同じ使い方が出来るようにしました。
(1.7.3)for命令等---for,while,do,switch命令等は初心者には難しい事と、命令の記入方法を単純にしたため、このような命令を実現する為には新たな記入方法を追加する必要が有り、使わないようにしました。ただし、便利な場合も有るので、簡単に対応出来る文法としました。
(1.7.4)ifのelse---プログラムミスを起こしやすいく、解読しにくく成るので、使わないようにしました。
(1.7.5)ポインタ---初心者には難しい事と、C言語以外のプログラムは殆ど採用していないのでので、使わないようにしました。
(1.7.6)配列---初心者には難しいので、使わないようにしました。ただし、無いと困る場合が有るので、通常の名前の一部分を連番とする事で配列のように使える機能を用意しました。
(1.7.7)構造体,共用体---初心者には難しい事と、データの処理部分はSQLで対応するので、一時テーブルで対応可能なので、使わないようにしました。
(1.7.8)列挙型---初心者には難しい事と、無くても別の方法で対応可能なので、使わないようにしました。
(1.7.9)データ型---データはRDBに持つので、テーブルにはデータ型の概念が有りますが、I言語内ではデータ型の概念は希薄で、全て文字列で処理しています。
(1.7.10)予約語---記入方法を「命令=処理内容」と「命令{処理内容}」とし、命令と処理内容を完全に分離し、予約語を無用としました。ただし、SQLには予約語が存在するので、SQLの予約語は判定しエラーとする機能を付けました。
(1.7.11)GUI---有れば便利ですが、使うと操作が複雑になり、操作に戸惑う画面が出来てまうので、I言語側で最低限必要なGUIのみを提供し、操作に戸惑う事が無い事を優先しました。
(1.7.12)SQLとI言語以外---メインフレームではプログラミング言語であるCOBOLのマニュアルは3冊ほどでしたが、それ以外のマニュアルが100冊以上ありました。プログラミングはテキストエディターが必要で、画面は画面を作るソフトが必要で沢山の本を習得しないとプログラムを完成できませんでした。そこで、可能な物は全てSQLとI言語のみで対応しました、テキストエディタも画面ソフトも使わないで、インストールもメニューもプログラム開発も全てI言語のプログラムで対応できるようになっています。
2.I言語バージョン27以上の使用条件(2024年5月27日改定)
(1)使用中に損害が発生しても一切保証はしません。
(2)危険を伴うシステムには適用しないで下さい。
(3)I言語は全て無料で使用出来ます。
(4)I言語で商売をする、開発ソフトを他社(他人)に提供する場合はプログラム名が重複しないようにユニークなメニュー名を取得して下さい。
(4.1)メニュ-名はAAAAからVZZZまでで、まだ未登録の物を取得できます。
(4.2)取得したい場合は希望のメニュ-名を明記したメールを直接原沢に下さい、 メニュー名が未登録の場合は可能を、登録済の場合は不可能を返信します。
(5)難読化しないで使う場合は重要情報を扱うシステムには適用しないで下さい。
(5.1)I言語はソースプログラムも添付されていますが、機械語ではなく中間言語に翻訳されるC#で作られているので、 リバースエンジニアリングをすれば、ソースプログラムを復元できます。 従って、ソースプログラムが無くても、パスワードを解読しようとすれば解読可能ですので、 重要情報を扱うシステムには適用しないで下さい。
(5.2)重要情報を扱うシステムで使いたい場合は、インストールで難読化を実施してから使用して下さい。
(6)QtはLGPL版を使用しています。
★使用条件を承諾する場合のみ使用できます。
旧バージョンのI言語ページ
提供者
メールアドレス:harasawa@mis.janis.or.jp(このメールアドレスへの特定電子メールの送信を拒否いたします)
氏名:原沢信道(ひらがな:はらさわ のぶみち)
住所:長野県飯田市
GITHUB: https://github.com/i-language/i-language
( 写真は我が家の庭から見た風景です)

All Rights Reserved, Copyright (C) 2009-2024 Nobumichi Harasawa.