LINE BOT

LineBotのアイコン

LINE BOT とはスマート・フォンのLINEを使ってIBM iとの
会話を実現させるオプション機能のことです。
LINE BOTにはLINE BOT独自の機能の他にAutoWebユーザーがRPG/COBOLなどの
開発言語を使ってLINE BOTの出口プログラムを開発することもできます。
出口プログラムを開発すれば会社に事情に適切な適用業務を情報システム室で
独自に開発することができます。
また言語処理機能もカスタマイズや初期設定を適切に行えば
自社独自のLINE BOTシステムを開発することができます。
ここではLINE BOTによる日本語の解析の方法を解説します。
全文を読めば日本語の解析とその意味を判断することは
難しいことではないことがわかるはずです。
※ LINE BOTの試供版による使用は後述を参照してください。
 ※ LINE BOTに関するコマンドの使用説明はIBM i操作メニューの
LINE BOTメニューの説明を参照してください。

LINE BOTには大きくわけて2つの機能があります。
標準機能と出口プログラム機能です。
 標準機能はLINE BOTの導入時から備わっている基本的な機能のことです。
標準機能だけでも十分LINE BOTの機能を生かすことができます。

標準機能

  • 日本語処理機能 ....... 日本語を読解して処理する機能
  • 学習機能.............. LINEユーザーからの学習機能
  • オブジェクト検索機能

    指定されたデータ・ベースやオブジェクトの内容を検索します。

  • プログラム相互参照

    指定されたデータ・ベースを使用しているプログラムを調べます。

出口プログラム機能........ 登録出口プログラムによる処理機能

RPG/COBOLでLINEと会話するプログラムを開発することができます。

LINE BOTとLINEクライアントはLINEサーバーをSSL通信で経由して
通信します。
このSSL証明はIBM iやWindowsによる自己証明型ではなく
第三者機関の契約による証明が必要です。
したがってお客さまご自身によるかまたは潟Iフィスクアトロに
依頼されるかの方法でSSL通信を設定する必要があります。
さらにお客さまのIBM iもSSL通信の設定が必要となります。
これも潟IフィスクアトロによるSSLセットアップ・サービスを
ご利用になることができます。
くわしくは潟Iフィスクアトロ営業窓口までご相談ください。

LINE BOTは3つの解析用のファイルとひとつのセッション・ファイルから成っています。
さらにプログラム参照用として2つのファイルを使用します。

LINE BOTの動作原理はとてもシンプルで簡単です。
例えばLINEユーザーが次の質問をしたとします。
動作原理を次のシナリオで説明します。

日本語とは目的となるいくつかの用語を助詞や接続詞を使って
文章に仕上げたものです。
聞き手は目的となる用語を把握の上、文章表現で
話し手が何を求めているのかを聞きだします。

かんたんに言えば日本語の文章からいわゆる「てにおは」を
省いて残った単語(キー・ワード)を解釈するのが
日本語解釈の方法なのです。

LINE BOTもこれと同じことを行うだけです。
大きくわけて2段階の処理を行います。

LINE BOT画像

(1)不要な日本語の接続詞などを除去する。
... 日本語データ・ベースに登録されている日本語を
文章の中から削除します。

(2)残った語句(=これをキー・ワードと呼びます)によって
データ・ベースの名前とレコード(=キーなどによって特定)と
そのレコード中の項目値(フィールド)を抽出します。

言ってみればたったこれだけの簡単な処理です。

わかりやすくするために

「NV-CF1の在庫を知りたい。」

という文章をシナリオの例にとって説明します。
この文章から不要な語句を除去すると
「NV-CF1」と「在庫」だけが残ります。
それではその処置を詳細に順を追って説明致します。

  • 1.助詞や接続詞を除去

    最初に助詞や接続詞などを登録している日本語データ・ベース
    (ASNET.USR/WORDDB)の中に登録されている用語があれば
    その用語を文章から除去します。
    同時に見つかった用語が何を意味しているのかを
    登録されている「文章の意味」によって判断します。

    文章の中から日本語データ・ベース(WORDDB)の位置が

    LST(=最後尾)-->TOP(=最前列)-->MID(中央)

    の順に除去を繰り返します。 ただしMID(=中央)の語句はその語句の両端がひらかなである場合は除去しません。
    例えば場所を示す前置詞の「に」は「こんにちは」という語句の
    一部であるかも知れないからです。
    この「に」を除去してしまうと「こん」と「ちは」という判断のつかない
    語句に分解されてしまうからです。

    語句の除去と同時に除去する語句の意味も記憶しておきます。
    「知りたい」という語句は日本語データ・ベースでは

    ▼日本語データ・ベース(ASNET.USR/WORDDB)

    位置 名詞コード 意味 実行コマンド 決定 次の名詞コード
    LST 知りたい ASK * *

    として意味はASKとして登録されていますのでこれは要望(=ASK)であることを意味しています。

  • 2.キー・ワードを抽出する

    @によって不要な語句を除去した後には次の2つの語句が残ります。 日本語データ・ベース(WORDDB)によって除去された後の残る語句のことを キー・ワードと呼びます。 残ったキー・ワードは次の2つです。

    [NV-CF1] [在庫]

  • 3.キー・ワードを検索する

    2つのキー・ワードを

    知識データ・ベース(ASNET.USR/KNOWDB) と
    経験データ・ベース(QUSRTEMP/EXPRDB) にないか

    調べます。

  • 4.ユーザーに「NV-CF1とは何か」を質問する

    まず「NV-CF1」のいう用語が見つからなかったのでユーザーに質問します。 「NV-CF1とは何ですか?」
    答えは「商品です。」と返ってきました。
      知識データ・ベースを調べると

    ▼知識データ・ベース(ASNET.USR/KNOWDB)

    位置 名詞コード 意味 実行コマンド 決定 次の名詞コード オブジェクト
    MID 商品     商品マスター
    MID 商品マスター DBS QTRFIL/SHOHIN     *FILE

    とあります。
    これによって「商品」とは「商品マスター」のことでありそして
    「商品マスター」とは「QTRFIL/SHOHIN」であることがわかります。
    ( QTRFIL=ライブラリー名, SHOHIN=ファイル名)
    そこで経験データ・ベースにはこの「NV-CF1」の情報をLINE BOTは次のように登録します。

    ▼経験データ・ベース(QUSRTEMP/EXPRDB)

    位置 名詞コード 意味 実行コマンド 決定 次の名詞コード オブジェクト
    MID NV-CF1     商品マスター
  • 5.「在庫」を探す

    「在庫」とは何かがまだ解決していませんので商品マスター(QTRFIL/SHOHIN)の項目について
    在庫がないかどうか調べますが商品マスターの項目の中にも「在庫」という項目は
    見つかりませんでした。

  • 6.ユーザーに「在庫とはどこにあるか」を質問する

    そこでもう一度ユーザーに「在庫は見つかりませんでした。在庫はどこにありますか?」
    と諮問すると「在庫マスターにあります。」と回答がありました。
    そこで調べてみると次のように見つかりました。

    ▼知識データ・ベース(ASNET.USR/KNOWDB)

    位置 名詞コード 実行コマンド 次の名詞コード
    MID 在庫マスター QTRFIL/SHZAIKO  

    「在庫」は「在庫マスター」にあることを教えてもらいましたので
    経験データ・ベースに次のように登録しておきます。

    ▼経験データ・ベース(QUSRTEMP/EXPRDB)

    位置 名詞コード 意味 実行コマンド 次の名詞コード オブジェクト
    MID 在庫マスター QTRFIL/SHZAIKO * 在庫マスター  
  • 7.在庫マスターのNV-CF1のレコードの在庫数を調べる。

    以上によってLINE BOTは

    NV-CF1の在庫数は128個です。

    と回答します。

次に前述のデータ・ベースに登録された情報を利用する
応答、つまり学習機能に基づいた日本語処理を紹介しましょう。

質問は同じ

「NV-CF1の在庫を知りたい。」

です。
前述のように日本語データ・ベースに基づいて不要な語句を
除去した結果、

「NV-CF1」 と 「在庫」

が残ります。しかもこの文章はASKという質問文です。 最初に「NV-CF1」に関しては

▼経験データ・ベース(QUSRTEMP/EXPRDB)

位置 名詞コード 意味 実行コマンド 決定 次の名詞コード オブジェクト
MID NV-CF1   商品マスター

がありますのでこれは商品マスターであることがわかりさらに

▼知識データ・ベース(ASNET.USR/KNOWDB)

位置 名詞コード 意味 実行コマンド 決定 次の名詞コード オブジェクト
MID 商品マスター DBS QTRFIL/SHOHIN     *FILE

によって商品マスターとはQTRFIL/SHOHINであることもわかります。

次に「在庫」に関しても

▼経験データ・ベース(QUSRTEMP/EXPRDB)

位置 名詞コード 意味 実行コマンド 決定 次の名詞コード オブジェクト
MID 在庫 DBS QTRFIL/SHZAIKO * 在庫マスター

から在庫マスター(QTRFIL/SHZAIKO)にあることがわかります。
そこでLINE BOTは在庫マスターの中から「NV-CF1」という文字列を含んでいるレコードを
探してそのレコードの中から「在庫」という文字列を含む項目「在庫数」の値を抽出して

「NV-CF1の在庫は128です。」

と学習結果に基づいて回答します。
LINE BOTのデータ・ベース検索は最高速の読取り技術で検索します。
大量のデータ・ベースの場合でも最も速い読取りが可能です。

前述の文章

「NV-CF1の在庫を知りたい。」

では文章の意味は ASK(=質問)でした。
質問とはオブジェクトの情報を調べることです。
対象がデータ・ベースの場合はデータ・ベースの値を調べることを
意味していました。
次に文章の意味が WHO(=誰が)という場合を考えてみます。
例えば次のような場合です。

では文章の意味は ASK(=質問)でした。
質問とはオブジェクトの情報を調べることです。
対象がデータ・ベースの場合はデータ・ベースの値を調べることを
意味していました。
次に文章の意味が WHO(=誰が)という場合を考えてみます。
例えば次のような場合です。

「商品マスターを使用しているのは誰ですか?」

この文章には「誰」(=WHO)がありますので文章の意味は誰が
これを捕まえているのか?
すなわちIBM i用語でいうところのオブジェクト・ロックの調査です。
指定したオブジェクトを使用しているはどのユーザーか?
という調査依頼であると捉えることができます。
対象となるオブジェクトは

「商品マスター」(QTRFIL/SHOHIN *FILE)

です。
これは

▼知識データ・ベース(ASNET.USR/KNOWDB)

位置 名詞コード 意味 実行コマンド 次の名詞コード オブジェクト
MID 在庫マスター QTRFIL/SHZAIKO * 在庫マスター  

に商品マスターは QTRFIL/SHOHIN でありオブジェクト・タイプは +FILE であると
登録されていることからわかります。
これによってLINE BOTは

WRKOBJLCK QTRFIL/SHOHIN *FILE

を実行してどのユーザーが商品マスターを使用しているのかを調べて報告します。
これがオブジェクト・ロックの検索の処理の詳細です。

LINE BOTは文書化ツールよりはるかに効率的な方法でブログラムを
調査することができます。
あるデータ・ベースの項目の値がおかしいことがあれば
どのプログラムによって更新されているのか調査する必要があります。
このようなときにLINE BOTによる調査は効果を発揮します。

「在庫マスターを使っているプログラムは?」

の質問では「プログラム」という語句は知識データ・ベースに次のように 登録されています。

▼知識データ・ベース(ASNET.USR/KNOWDB)

位置 名詞コード 意味 実行コマンド 決定 次の名詞コード オブジェクト
MID プログラム PGM * 在庫マスター *PGM

これによって質問文はプログラム相互参照を要求しているものと解釈されます。
そこでLINE BOTは プログラム相互参照ファイル(QUSRTEMP/DSPPGMREF)
データ・ベースをキーとするLF (=QUSRTEMP/DSPPGML1 )をファイル QTRFIL/SHZAIKOを
指定して次のように読取ります。

▼プログラム相互参照LF (QUSRTEMP/DSPPGML1)

ライブラリー プログラム 参照ファイル ライブラリー 使用方法
QTROBJ ANS201 SHZAIKO QTRFIL 1
QTROBJ PGM201 SHZAIKO QTRFIL 1

このプログラム参照ファイルはあらかじめCRTPGMREFによって QUSRTEMPに作成しておいたものです。

プログラム相互参照ではもっとくわしくフィールド・レベルまで調べることができます。
現実のシステム運営上で不明なデータ損傷などがあったときには
そのデータ・ベースを参照しているプログラムはどれであるかよりは
そのデータ・ベースの特に問題となる損傷のあるフィールド値を更新している
プログラムはどれかを知りたいはずだからです。
フィールド参照まで調べるにはあらかじめ

LINE BOT フィールド参照ファイル(QUSRTEMP/DSPPGMFFD)

を作成して準備しておく必要があります。
フィールド参照ファイルは次のような構造です。

▼フィールド参照ファイル(QUSRTEMP/DSPPGMFFD)

プログラム ライブラリー フィールド 使用 欄見出し 長さ少数 演算命令
PGM204 QTROBJ SZCODE U 商品コード 10A MOVE SEL SZCODE

このファイルもまたメニュー: GO LINBOT の CRTPGMFFDコマンドによって生成することができます。

LINE BOTは

「在庫マスターを使っているプログラムは?」

に対して次のように回答します。

▼知識データ・ベース(ASNET.USR/KNOWDB)

位置 名詞コード 意味 実行コマンド 決定 次の名詞コード オブジェクト
MID 得意先検索 EXT QTROBJ/PGM902 *

...これは「得意先検索」というキー・ワードが現れたらプログラム: QTROBJ/PGM902 を
呼び出して実行することを意味します。
プログラム: QTROBJ/PGM902 ヘの呼び出いパラメータは次のとおりです。

C*--------------------------------------------------------------------------                
C     *ENTRY        PLIST                                                  |                
C                   PARM                    SUSRID           20            |ユーザー ID    
C                   PARM                    FRMLIN           80            |LINE からの MSG 
C                   PARM                    TOLINE           80            |LINE への返答   
C                   PARM                    ERR               1            |エラー ='E'    
C                   PARM                    ERRMSG           80            |エラー MSG     
C*--------------------------------------------------------------------------               
					 
【パラメータの説明】
ユーザーID
LINEの会話のユーザーのIDです。
セッション・ファイルを検索するのに利用しますが 通常での利用はありません。
ユーザーID
LINEからの返答およびメッセージ
FRMLIN
(LINE からのMSG)
LINEへこのプログラムが戻すメッセージおよび
LINEへ以前に送信した質問文が入っています。
これを調べればFROMLINがどんな質問に対して
送られてきたメッセージであるかがわかります。
TOLINE
(LINE への返答)
LINEの会話のユーザーのIDです。
セッション・ファイルを検索するのに利用しますが 通常での利用はありません。
ERR
(エラー ='E')
このプログラムでエラーが発生したときはこの欄に
文字「E」を代入して送信してください。
ERRMSG
(エラー MSG)
このプログラムでエラーが発生したときはこの欄に
エラー・メッセージを代入して送信してください。
エラー・メッセージはLINEに表示されます。
[処理の概要]

パラメータの説明でおわかりのようにFRMLINでメッセージを受取ってTOLINEへ
メッセージを戻すという簡単な会話です。

[サンプルRPG : RPG902 ] http://218.44.135.18/QSYS.LIB/QTRSRC.LIB/QRPGLESRC.FILE/RPG902.MBR
-----------------------------------------------------------------------------------------------
0001.00 H DFTNAME(PGM902) DATEDIT(*YMD/)                                                            
0002.00 F********** LINE 得意先検索 *******************************************                     
0003.00 FTOKMAS    IF   E           K DISK                                                          
0004.00 F                                     EXTFILE(TOKMAS_LIB)                                   
0005.00 F**********************************************************************                     
0006.00  *[ COMPILE ]                                                                               
0007.00  * CRTBNDRPG  OBJ(QTROBJ/PGM902)  SRCFILE(R610SRC/QRPGLESRC)                                
0008.00  * DBGVIEW(*SOURCE) AUT(*ALL)                                                               
0009.00  *-------------------------------------------------------------------*                      
0010.00  *  2022/06/15 : 作成                                                                       
0011.00  *-------------------------------------------------------------------*                      
0012.00  *( 作業変数 )                                                                              
0013.00 D TOKMAS_LIB      S             13    INZ('QTRFIL/TOKMAS')                                  
0014.00 C*--------------------------------------------------------------------------                
0015.00 C     *ENTRY        PLIST                                                  |                
0016.00 C                   PARM                    SUSRID           20            | ユーザー ID    
0017.00 C                   PARM                    FRMLIN           80            |LINE からの MSG 
0018.00 C                   PARM                    TOLINE           80            |LINE への返答   
0019.00 C                   PARM                    ERR               1            | エラー ='E'    
0020.00 C                   PARM                    ERRMSG           80            | エラー MSG     
0021.00 C*--------------------------------------------------------------------------                
0022.00  /FREE                                                                                      
0023.00     SELECT;                                                                                 
0024.00     WHEN FRMLIN = ' 得意先検索 ';                                      
0025.00          TOLINE = ' 得意先コードを入れてください。 ';                  
0026.00     OTHER;                                                             
0027.00          TKCODE = FRMLIN;                                              
0028.00  /END-FREE                                                             
0029.00 C     TKCODE        CHAIN     TOKMAS                                   
0030.00  /FREE                                                                 
0031.00       IF NOT %FOUND;                                                   
0032.00         TOLINE = ' 得意先コード ' + %TRIMR(TKCODE) + ' の誤りです ';   
0033.00       ELSE;                                                            
0034.00         TOLINE = %TRIMR(TKCODE) + %TRIMR(TKNM) + ' が見つかりました '; 
0035.00       ENDIF;                                                           
0036.00     ENDSL;                                                             
0037.00  /END-FREE                                                             
0038.00 C                   SETON                                        LR    
0039.00 C                   RETURN                                             
-----------------------------------------------------------------------------------------------
[コンパイル]
	CRTBNDRPG PGM(QTROBJ/PGM902) SRCFILE(QTRSRC/QRPGLESRC) DFTACTGRP(*NO) ACTGRP(*NEW)
	DBGVIEW(*SOURCE) AUT(*ALL)    
				
解説

このプログラムはILE-RPGですが RPG IIIであってもかまいません。
最初には「得意先検索」というキー・ワードが流れてくることから始まります。
そこでPGM902は「得意先コードを入れてください。」
とTOLINEに入れて返します。
すると次はFRMLINには得意先コードが入力されて戻ってきます。
このときTOLINEには先に送信した「得意先コードを入れてください。」
という文字列が入っているはずです。
FRMLINから取得した得意先コードで得意先マスターにCHAINして
結果のメッセージをTOLINEに入れて戻して終了します。
これは得意先コードで得意先名を検索するだけの簡単なサンプルです。
実際はデータ・ベースの内容を戻すなどの処理が必要なはずです。
次にデータ・ベースの項目の内容を戻すサンプルをご覧ください。

[サンプルRPG : RPG901 ] http://218.44.135.18/QSYS.LIB/QTRSRC.LIB/QRPGLESRC.FILE/RPG901.MBR
-----------------------------------------------------------------------------------------------
0001.00 H DFTNAME(PGM901) DATEDIT(*YMD/)                                               
0002.00 F********** LINE 得意先検索 *******************************************        
0003.00 FTOKMAS    IF   E           K DISK                                             
0004.00 F                                     EXTFILE(TOKMAS_LIB)                      
0005.00 F**********************************************************************        
0006.00                                                                                
0007.00  *[ COMPILE ]                                                                  
0008.00  * CRTSQLRPGI OBJ(QTEMP/PGM901)  SRCFILE(R610SRC/QRPGLESRC) COMMIT(*NONE)      
0009.00  * RDB(*NONE) OBJTYPE(*PGM) OUTPUT(*PRINT)                                     
0010.00                                                                                
0011.00  *-------------------------------------------------------------------*         
0012.00  *  2022/06/13 : 作成                                                          
0013.00  *-------------------------------------------------------------------*         
0014.00  *( 作業変数 )                                                                 
0015.00 D TOKMAS_LIB      S             13    INZ('QTRFIL/TOKMAS')                     
0016.00 D AR              S              1A   DIM(80)                                  
0017.00 D N               S              4B 0                                          
0018.00 D TRUE#           S              4B 0 INZ(0)                                   
0019.00 D FALSE#          S              4B 0 INZ(-1)                                  
0020.00 D OE              C                   CONST(X'0E')                             
0021.00 D OF              C                   CONST(X'0F')                             
0022.00 D QUOT            C                   CONST(X'7D')                             
0023.00 D NULL            C                   CONST(X'00')                             
0024.00 D SEARCH          S             80A                                                           
0025.00  *                                                                                            
0026.00 D*( データ・ベース外部データ構造 )                                                            
0027.00 D FMT001        E DS                  EXTNAME('QTRFIL/TOKMAS')                                
0028.00 D RCDDTA          DS                  OCCURS(9999)                                            
0029.00 D  VAR1                   1   1024                                                            
0030.00                                                                                               
0031.00 C*--------------------------------------------------------------------------                  
0032.00 C     *ENTRY        PLIST                                                  |                  
0033.00 C                   PARM                    SUSRID           20            | ユーザー ID      
0034.00 C                   PARM                    FRMLIN           80            |LINE からの MSG   
0035.00 C                   PARM                    TOLINE           80            |LINE への返答     
0036.00 C                   PARM                    ERR               1            | エラー ='E'      
0037.00 C                   PARM                    ERRMSG           80            | エラー MSG       
0038.00 C*--------------------------------------------------------------------------                  
0039.00  /FREE                                                                                        
0040.00     SELECT;                                                                                   
0041.00   //*****************************//                                                           
0042.00     WHEN FRMLIN = ' 得意先検索 ';                                                             
0043.00   //*****************************//                                                           
0044.00          TOLINE = ' 得意先コードまたは名前を入れてください。 ';                               
0045.00   //************************************************//                                        
0046.00     WHEN TOLINE = ' 得意先コードまたは名前を入れてください。 ';                               
0047.00   //************************************************//                                        
0048.00          IF %SUBST(FRMLIN:1:1) = OE;                                       
0049.00              EXSR      SQL_TOKMAS;                                         
0050.00          ELSE;                                                             
0051.00          TKCODE = FRMLIN;                                                  
0052.00          ENDIF;                                                            
0053.00  /END-FREE                                                                 
0054.00 C                   SETOFF                                       99        
0055.00 C     TKCODE        CHAIN     TOKMAS                             99        
0056.00 C   99              EXSR      TOKERR                                       
0057.00  /FREE                                                                     
0058.00          TOLINE = %TRIMR(TKCODE) + %TRIMR(TKNM) + ' が見つかりました ' +   
0059.00                  ' 何を知りたいですか ?';                                  
0060.00   //************************************************//                     
0061.00     WHEN %SCAN(' 何を知りたいですか ? ':TOLINE) > 0;                       
0062.00   //************************************************//                     
0063.00  /END-FREE                                                                 
0064.00 C                   MOVEL(P)  TOLINE        TKCODE                         
0065.00 C                   SETOFF                                       99        
0066.00 C     TKCODE        CHAIN     TOKMAS                             99        
0067.00 C   99              EXSR      TOKERR                                       
0068.00  /FREE                                                                     
0069.00          SELECT;                                                           
0070.00          WHEN FRMLIN = ' 電話番号 ';                                       
0071.00               TOLINE = TKTEL;                                              
0072.00          WHEN FRMLIN = 'FAX 番号 ';                           
0073.00               TOLINE = TKFAX;                                 
0074.00          WHEN FRMLIN = ' 郵便番号 ';                          
0075.00               TOLINE = TKZIP;                                 
0076.00          WHEN FRMLIN = ' 担当者 ';                            
0077.00               TOLINE = TKTNCD;                                
0078.00          WHEN FRMLIN = ' 支払日 ';                            
0079.00               TOLINE = %CHAR(TKSIHR);                         
0080.00          WHEN FRMLIN = ' 締日 ';                              
0081.00               TOLINE = %CHAR(TKSIME);                         
0082.00          WHEN FRMLIN = ' 前月売掛残 ';                        
0083.00               TOLINE = %TRIMR(%EDITC(TKUZAN:'K')) + ' 円 ';   
0084.00          WHEN FRMLIN = ' 当月売上高 ';                        
0085.00               TOLINE = %TRIMR(%EDITC(TKTURI:'K')) + ' 円 ';   
0086.00          WHEN FRMLIN = ' 当月返品高 ';                        
0087.00               TOLINE = %TRIMR(%EDITC(TKTHEN:'K')) + ' 円 ';   
0088.00          WHEN FRMLIN = ' 当月値引額 ';                        
0089.00               TOLINE = %CHAR(TKTNEB);                         
0090.00               TOLINE = %TRIMR(%EDITC(TKTNEB:'K')) + ' 円 ';   
0091.00          WHEN FRMLIN = ' 当月入金振込 ';                      
0092.00               TOLINE = %TRIMR(%EDITC(TKNKFR:'K')) + ' 円 ';   
0093.00          WHEN FRMLIN = ' 当月入金手形 ';                      
0094.00               TOLINE = %TRIMR(%EDITC(TKNKTG:'K')) + ' 円 ';   
0095.00          WHEN FRMLIN = ' 当月売掛残 ';                        
0096.00               TOLINE = %TRIMR(%EDITC(TKTZAN:'K')) + ' 円 ';              
0097.00          OTHER;                                                          
0098.00               TOLINE = %TRIMR(FRMLIN) + ' は不明です (1)';               
0099.00               *INLR  = *ON;                                              
0100.00               RETURN;                                                    
0101.00          ENDSL;                                                          
0102.00          TOLINE = %TRIMR(FRMLIN) + ' は ' + %TRIMR(TOLINE) + ' です。 '; 
0103.00   //****************//                                                   
0104.00     OTHER;                                                               
0105.00   //****************//                                                   
0106.00          TOLINE = 'PGM901A-ERR' + %TRIMR(FRMLIN) + ' が不明です (2)';    
0107.00     ENDSL;                                                               
0108.00  /END-FREE                                                               
0109.00 C                   SETON                                        LR      
0110.00 C                   RETURN                                               
0111.00 C******************************************************                  
0112.00 C     *INZSR        BEGSR                                                
0113.00 C******************************************************                  
0114.00 C*  初期サイクルのみの実行                                               
0115.00 C                   ENDSR                                                
0116.00 C******************************************************                  
0117.00 C     SQL_TOKMAS    BEGSR                                                
0118.00 C******************************************************                  
0119.00 C*    *******************************************                        
0120.00 C*    *  あいまい検索の注意 !!                  *                                  
0121.00 C*    *   検索文字列 SERACH = '% 検索文字 %%%%%'*                                  
0122.00 C*    *    のように % を最後まで続けること      *                                  
0123.00 C*    *******************************************                                  
0124.00 C                   MOVEA     FRMLIN        AR(2)                                  
0125.00 C     1             DO        80            N                              N=1-80  
0126.00 C     AR(N)         IFEQ      ' '                                                  
0127.00 C                   MOVE      '%'           AR(N)                                  
0128.00 C                   ENDIF                                                          
0129.00 C                   ENDDO                                                  N=1-80  
0130.00 C                   MOVEA     AR            SEARCH                                 
0131.00 C* SELECT 文によってカーソル C1 を用意                                             
0132.00 C/EXEC SQL DECLARE C1 CURSOR FOR                                                   
0133.00 C+  SELECT * FROM QTRFIL/TOKMAS WHERE TKNMJ LIKE :SEARCH                           
0134.00 C/END-EXEC                                                                         
0135.00 C*  カーソルをオープン                                                             
0136.00 C/EXEC SQL OPEN C1                                                                 
0137.00 C/END-EXEC                                                                         
0138.00 C******************************************************                            
0139.00 C*            明  細  演  算                                                 
0140.00 C******************************************************                            
0141.00 C/EXEC SQL WHENEVER NOT FOUND GOTO EOF                                             
0142.00 C/END-EXEC                                                                         
0143.00 C     1             DO        *HIVAL        N                                      
0144.00 C     N             OCCUR     RCDDTA                                        
0145.00 C/EXEC SQL                                                                  
0146.00 C+   FETCH C1 INTO :TKCODE, :TKNMJ, :TKNM, :TKKBN, :TKTEL, :TKFAX,          
0147.00 C+                 :TKZIP, :TKADR1, :TKADR2, :TKTNCD, :TKSIME, :TKSIHR,     
0148.00 C+                 :TKSCOD, :TKYMAX, :TKUZAN, :TKTURI, :TKTHEN,             
0149.00 C+                 :TKTNEB, :TKNKFR, :TKNKTG, :TKTZAN                       
0150.00 C/END-EXEC                                                                  
0151.00 C/EXEC SQL SET RESULT SETS ARRAY :RCDDTA FOR :N ROWS                        
0152.00 C/END-EXEC                                                                  
0153.00 C                   ENDDO                                                   
0154.00 C     EOF           TAG                                                     
0155.00 C*  カーソルをクローズ                                                      
0156.00 C/EXEC SQL CLOSE C1                                                         
0157.00 C/END-EXEC                                                                  
0158.00  /FREE                                                                      
0159.00     IF TKCODE = ' ';                                                        
0160.00        TOLINE = ' 名前 (' + %TRIMR(FRMLIN) + ') は見つかりませんでした。 '; 
0161.00         *INLR = *ON;                                                        
0162.00         RETURN;                                                             
0163.00     ENDIF;                                                                  
0164.00  /END-FREE                                                                  
0165.00 C                   ENDSR                                                   
0166.00 C******************************************************                     
0167.00 C     TOKERR        BEGSR                                                   
0168.00 C******************************************************              
0169.00  /FREE                                                               
0170.00       IF *IN99 = *ON;                                                
0171.00         TOLINE = ' 得意先コード ' + %TRIMR(TKCODE) + ' の誤りです '; 
0172.00         *INLR = *ON;                                                 
0173.00         RETURN;                                                      
0174.00       ENDIF;                                                         
0175.00  /END-FREE                                                           
0176.00 C                   ENDSR                                            
-----------------------------------------------------------------------------------------------
[コンパイル]
	CRTSQLRPGI OBJ(QTEMP/PGM901)  SRCFILE(R610SRC/QRPGLESRC) COMMIT(*NONE) 
	RDB(*NONE) OBJTYPE(*PGM) OUTPUT(*PRINT)				
				
解説

これは得意先マスターの項目値を求めるサンプル・ソースです。
しかも得意先のコードではなく名前で動的に得意先マスターを
検索する高度な利用方法を示しています。
そのためSQLを使いますのでSEUのソース・タイプを
「SQLRPGLE」としてください。
SQLを導入されいいなくてもSQLRPGLEを使って
開発して実行することもできます。
IBMのライセンス・プログラム「対話式SQL」
というのはSTRSQLコマンドによって
対話式でSQL文を入力してテストできるという意味です。
「対話式SQL」を導入していないIBM iでもすべてのSQLは使うことができます。

それでは最初に「得意先検索」をFRMLINから受信して 「得意先コードまたは名前を入れてください。」と返します。

0046.00     WHEN TOLINE = ' 得意先コードまたは名前を入れてください。 ';
						

とあるようにTOLINEがこの質問であれば。
FRMLINはこの質問に対する返事のはずです。
そこでその返事: FRMLINに漢字のシフト文字が先頭にあれば
これは名前が入力されたものと判断します。

0048.00          IF %SUBST(FRMLIN:1:1) = OE;                                       
0049.00              EXSR      SQL_TOKMAS; 
						

SQLを実行するサブ・ルーチン: SQLTOKMAS では

0133.00 C+  SELECT * FROM QTRFIL/TOKMAS WHERE TKNMJ LIKE :SEARCH
						

というSQL文で LIKE :SEARCH つまり SEARCHという文字列が含まれている
得意先レコードを検索しなさいと言っています。
ところでその前に不明な演算があります。

0124.00 C                   MOVEA     FRMLIN        AR(2)                                  
0125.00 C     1             DO        80            N                              N=1-80  
0126.00 C     AR(N)         IFEQ      ' '                                                  
0127.00 C                   MOVE      '%'           AR(N)                                  
0128.00 C                   ENDIF                                                          
0129.00 C                   ENDDO                                                  N=1-80  
0130.00 C                   MOVEA     AR            SEARCH 
 						

です。
これは QUERYなどでもある総称文字の検索です。
例えば「中村産業」という文字列を検索するのであれば

LINE %中村産業%%%%%% .....%
						

と SEARCH文全体を文字%で埋め尽くさねばならないのです。
これがSQLRPGLEでのIBMの仕様です。

0146.00 C+   FETCH C1 INTO :TKCODE, :TKNMJ, :TKNM, :TKKBN, :TKTEL, :TKFAX,          
0147.00 C+                 :TKZIP, :TKADR1, :TKADR2, :TKTNCD, :TKSIME, :TKSIHR,     
0148.00 C+                 :TKSCOD, :TKYMAX, :TKUZAN, :TKTURI, :TKTHEN,             
0149.00 C+                 :TKTNEB, :TKNKFR, :TKNKTG, :TKTZAN  
						

FETCH というのはSQLで選択されたレコードを1レコードずつ読む命令です。
カーソルC1の値を :TKCODE, ....と各フィールドに埋め込む命令です。
FETCH の後でフィールド値;TKCODEを見れば値が
読まれたかどうかがわかります。
得意先コードの値が見つかれば

0054.00 C                   SETOFF                                       99        
0055.00 C     TKCODE        CHAIN     TOKMAS                             99 
						

で得意先マスターに改めてCHAIN検索でレコードを取得します。
そこでLINEユーザーには

0058.00          TOLINE = %TRIMR(TKCODE) + %TRIMR(TKNM) + ' が見つかりました ' +   
0059.00                  ' 何を知りたいですか ?'; 
						

によって得意先が見つかったことと知りたい項目を尋ねます。 TOLINE に

0061.00     WHEN %SCAN(' 何を知りたいですか ? ':TOLINE) > 0;
						

というように今質問した内容があれば戻ってきた答えは
知りたい項目のはずですから

0069.00          SELECT;                                                           
0070.00          WHEN FRMLIN = ' 電話番号 ';                                       
0071.00               TOLINE = TKTEL;                                              
0072.00          WHEN FRMLIN = 'FAX 番号 ';                           
0073.00               TOLINE = TKFAX; 
:                      :
						

のようにしてフィールド値を戻します。 数値を編集して戻したい場合は

TOLINE = %TRIMR(%EDITC(TKUZAN:'K')) + ' 円 ';
						

のようにして%EDITCという編集用の組込み関数を使えば簡単に
編集結果を表示することができます。
ところでここまでご覧になってきてILE-RPGのフリー・フォーマットが
多用されていることにお気づきだと思います。
フリー・フォーマットは/FREE〜/END-FREEのあいだを
自由にフリー・フォーマットとして演算記述することができます。
フリー・フォーマットを初めてご覧になる方もあられたと思いますが
意味は説明がなくてもおわかりになると思います。
それほどフリー・フォーマットの記述ははるかに直感的です。
RPG III, ILE-RPG, C言語, フリー・フォーマットの四つを比べれば
最も簡単に記述でした誰が見ても最もわかりやすいのは
フリー・フォーマットです。
少しずつでも練習されればRPG III よりILE-RPG, さらには
フリー・フォーマットが一番やさしいと感じられると思います。
RPG IIIが一番、書き手の個性が表れてしまいます。
誰が書いても個性が表れにくいのがCLPです。
フリー・フォーマットを使いこなせれば本当にRPGの進化を
感じることでしょう。

[サンプルCOBOL : CBL901 ] http://218.44.135.18/QSYS.LIB/QTRSRC.LIB/QRPGLESRC.FILE/CBL901.MBR
-----------------------------------------------------------------------------------------------
0001.00        IDENTIFICATION DIVISION       .                                          
0002.00        PROGRAM-ID. CBL901.                                                      
0003.00        AUTHOR. (C) OFFICE QUATTRO CO,.LTD                                       
0004.00        ENVIRONMENT    DIVISION       .                                          
0005.00        CONFIGURATION   SECTION       .                                          
0006.00        SOURCE-COMPUTER.  IBM-AS400.                                             
0007.00        OBJECT-COMPUTER.  IBM-AS400.                                             
0008.00        SPECIAL-NAMES. REQUESTOR IS WORK-STATION.                                
0009.00       *****************************************************************         
0010.00       *                                                                         
0011.00       *    CBL901   :     LINE 出口 COBOL プログラム・サンプル                  
0012.00       *    言語     :     COBOL                                                 
0013.00       *    タイプ   :     CBLLE      : ILE-COBOL                                
0014.00       *    コンパイル :   CRTBNDCBL PGM(QTROBJ/PGM903) SRCFILE(QTRSRC/QCBLLESRC)
0015.00       *                   DBGVIEW(*SOURCE) AUT(*ALL)                            
0016.00       *                                                                         
0017.00       *----------------------------------------------------------------         
0018.00        INPUT-OUTPUT    SECTION.                                                 
0019.00        FILE-CONTROL.                                                            
0020.00       *****************************************************************         
0021.00       *  得意先マスター                                                         
0022.00            SELECT TOKMAS    ASSIGN TO DATABASE-TOKMAS                           
0023.00                              ORGANIZATION IS INDEXED                            
0024.00                              ACCESS MODE  IS DYNAMIC                         
0025.00                              RECORD KEY   IS EXTERNALLY-DESCRIBED-KEY        
0026.00                              FILE STATUS  IS FSTATUS .                       
0027.00       *****************************************************************      
0028.00        DATA DIVISION.                                                        
0029.00       *****************************************************************      
0030.00        FILE SECTION.                                                         
0031.00       *****************************************************************      
0032.00       *  得意先マスター                                                      
0033.00        FD TOKMAS                                                             
0034.00                LABEL RECORDS ARE STANDARD.                                   
0035.00        01 TOKMAS-REC.                                                        
0036.00            COPY DDS-ALL-FORMATS OF QTRFIL-TOKMAS.                            
0037.00       *****************************************************************      
0038.00        WORKING-STORAGE SECTION.                                              
0039.00       *****************************************************************      
0040.00        77 FSTATUS         PIC  X(02) .                                       
0041.00        01 PROGRESS        PIC  X(06)  .                                      
0042.00                                                                              
0043.00       *=======================================================*              
0044.00       * LINKAGE SECTION                                       *              
0045.00       *=======================================================*              
0046.00        LINKAGE                  SECTION.                                     
0047.00       ******************************************************                 
0048.00       *     入力パラメータ                                             
0049.00       ******************************************************           
0050.00        01 SUSRID       PIC X(20).                                      
0051.00        01 FRMLIN       PIC X(80).                                      
0052.00        01 TOLINE       PIC X(80).                                      
0053.00        01 ERR          PIC X(1).                                       
0054.00        01 ERRMSG       PIC X(80).                                      
0055.00        PROCEDURE DIVISION USING SUSRID FRMLIN TOLINE ERR ERRMSG.       
0056.00       *****************************************************************
0057.00        MAIN-PROGRAM    SECTION.                                        
0058.00       *****************************************************************
0059.00        MAINLINE.                                                       
0060.00            OPEN  INPUT TOKMAS.                                         
0061.00                                                                        
0062.00            EVALUATE FRMLIN                                             
0063.00            WHEN  " 得意先検索 "                                        
0064.00                  MOVE " 得意先コードを入れてください。 " TO TOLINE     
0065.00            WHEN  OTHER                                                 
0066.00                  MOVE FRMLIN TO TKCODE                                 
0067.00                  READ TOKMAS                                           
0068.00                  INVALID KEY                                           
0069.00                    STRING TKCODE " の誤りです。 " DELIMITED BY SIZE    
0070.00                    INTO TOLINE                                         
0071.00                  NOT INVALID KEY                                       
0072.00                    MOVE "READ"  TO  PROGRESS                  
0073.00                    READ TOKMAS                                
0074.00                    END-READ                                   
0075.00                    STRING TKCODE TKNM " が見つかりました。 "  
0076.00                    DELIMITED BY SIZE INTO TOLINE              
0077.00                  END-READ                                     
0078.00            END-EVALUATE.                                      
0079.00                                                               
0080.00            CLOSE TOKMAS.                                      
0081.00            GOBACK.                                            
-----------------------------------------------------------------------------------------------
[コンパイル]
CRTBNDCBL PGM(QTROBJ/PGM903) SRCFILE(QTRSRC/QCBLLESRC) DBGVIEW(*SOURCE) AUT(*ALL)
				
解説

COBOLであっても動作原理はILE-RPGと同じです。RPG901の説明を参照してください。

[サンプルCLP : CLP901 ] http://218.44.135.18/QSYS.LIB/QTRSRC.LIB/QCLSRC.FILE/CLP901CL.MBR
-----------------------------------------------------------------------------------------------
0001.00              PGM        PARM(&SUSRID &FRMLIN &TOLINE &ERR &ERRMSG)         
0002.00 /*-------------------------------------------------------------------*/    
0003.00 /*   CLP901CL   : LINE 得意先検索 CLP プログラム・サンプル           */    
0004.00 /*                                                                   */    
0005.00 /*   2022/06/23  作成                                                */    
0006.00 /*-------------------------------------------------------------------*/    
0007.00              DCL        VAR(&SUSRID) TYPE(*CHAR) LEN(20)                   
0008.00              DCL        VAR(&FRMLIN) TYPE(*CHAR) LEN(80)                   
0009.00              DCL        VAR(&TOLINE) TYPE(*CHAR) LEN(80)                   
0010.00              DCL        VAR(&ERR) TYPE(*CHAR) LEN(1)                       
0011.00              DCL        VAR(&ERRMSG) TYPE(*CHAR) LEN(80)                   
0012.00              DCLF       FILE(QTRFIL/TOKMAS)                                
0013.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                     
0014.00              DCL        VAR(&STMMSG) TYPE(*CHAR) LEN(132)                  
0015.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                     
0016.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)                     
0017.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)                  
0018.00              DCL        VAR(&MSGKEY) TYPE(*CHAR) LEN(4)                    
0019.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)                  
0020.00              DCL        VAR(&ERRDTA) TYPE(*CHAR) LEN(132)                  
0021.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                      
0022.00              DCL        VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)                   
0023.00              DCL        VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +                
0024.00                           VALUE('*ESCAPE   ')                        
0025.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(116) +          
0026.00                           VALUE(X'00000074') /* 2 進数  */           
0027.00              DCL        VAR(&NULL4) TYPE(*CHAR) LEN(4) +             
0028.00                           VALUE(X'00000000')                         
0029.00              MONMSG     MSGID(CPF9999) EXEC(GOTO CMDLBL(ERROR))      
0030.00                                                                      
0031.00 /*( 環境の取得 )*/                                                   
0032.00              RTVJOBA    TYPE(&TYPE)                                  
0033.00              IF         COND(&TYPE *EQ '0') THEN(DO) /*  バッチ  */  
0034.00              CHGVAR     VAR(&TOPGMQ) VALUE('*SYSOPR   ')             
0035.00              ENDDO      /*  バッチ  */                               
0036.00              ELSE       CMD(DO) /*  対話式  */                       
0037.00              CHGVAR     VAR(&TOPGMQ) VALUE('*TOPGMQ   ')             
0038.00              ENDDO      /*  対話式  */                               
0039.00                                                                      
0040.00 /*( パラメータの取得 )*/                                             
0041.00              SELECT                                                  
0042.00              WHEN       COND(&FRMLIN = ' 得意先検索 ') THEN(DO)      
0043.00              CHGVAR     VAR(&TOLINE) +                               
0044.00                           VALUE(' 得意先コードを入れてください。 ')  
0045.00              ENDDO                                                   
0046.00              OTHERWISE  CMD(DO)                                      
0047.00 /*( キーのセット )*/                                                 
0048.00              CHGVAR     VAR(&TKCODE) VALUE(&FRMLIN)                   
0049.00              OVRDBF     FILE(TOKMAS) TOFILE(QTRFIL/TOKMAS) +          
0050.00                           POSITION(*KEYAE 1 TOKMASR &TKCODE) +        
0051.00                           SECURE(*YES) OVRSCOPE(*JOB)                 
0052.00              RCVF       RCDFMT(TOKMASR)                               
0053.00              MONMSG     MSGID(CPF0864) EXEC(GOTO CMDLBL(REDEND))      
0054.00              CHGVAR     VAR(&TOLINE) VALUE(&TKCODE *CAT &TKNM *TCAT + 
0055.00                           ' が見つかりました。 ')                     
0056.00              DLTOVR     FILE(TOKMAS) LVL(*JOB)                        
0057.00              RETURN                                                   
0058.00  REDEND:     CHGVAR     VAR(&TOLINE) VALUE(' コード ' *CAT +          
0059.00                           &TKCODE *TCAT +                             
0060.00                           ' は見つかりませんでした。 ')               
0061.00              DLTOVR     FILE(TOKMAS) LVL(*JOB)                        
0062.00              ENDDO                                                    
0063.00              ENDSELECT                                                
0064.00              RETURN                                                   
0065.00                                                                       
0066.00  APIERR:                                                              
0067.00              CHGVAR     VAR(&MSGID) VALUE(%SST(&APIERR 9 7))          
0068.00              CHGVAR     VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))      
0069.00              CHGVAR     VAR(&MSGF) VALUE('Q' *CAT %SST(&MSGID 1 +     
0070.00                           3) *CAT 'MSG')                              
0071.00              IF         COND(&MSGF *EQ 'QCPEMSG') THEN(CHGVAR +       
0072.00                           VAR(&MSGF) VALUE('QCPFMSG'))                   
0073.00              CHGVAR     VAR(&MSGFLIB) VALUE('QSYS      ')                
0074.00              GOTO       SNDMSG                                           
0075.00                                                                          
0076.00  ERROR:      RCVMSG     MSGTYPE(*FIRST) RMV(*NO) KEYVAR(&MSGKEY) +       
0077.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +    
0078.00                           SNDMSGFLIB(&MSGFLIB)                           
0079.00              IF         COND(&MSGID *EQ 'CPF9999') THEN(DO)              
0080.00              CHGVAR     VAR(&ERRDTA) VALUE(&MSGDTA)                      
0081.00              RCVMSG     MSGTYPE(*PRV) MSGKEY(&MSGKEY) RMV(*NO) +         
0082.00                           MSG(&MSG) MSGDTA(&MSGDTA) MSGID(&MSGID) +      
0083.00                           MSGF(&MSGF) MSGFLIB(&MSGFLIB)                  
0084.00              CHGVAR     VAR(&STMMSG) VALUE(' プログラム ' *CAT +         
0085.00                           %SST(&ERRDTA 8 10) *TCAT +                     
0086.00                           ' のステートメント ' *CAT %SST(&ERRDTA +       
0087.00                           24 8) *CAT ' で次のエラーが発生しました。 ')   
0088.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STMMSG) +   
0089.00                           TOMSGQ(&TOPGMQ) MSGTYPE(*DIAG)                 
0090.00              ENDDO                                                       
0091.00  SNDMSG:     IF         COND(&MSGID *EQ ' ') THEN(DO)                    
0092.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +      
0093.00                           TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)              
0094.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                      
0095.00              ENDDO                                                       
0096.00              ELSE       CMD(DO)                              
0097.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 
0098.00                           MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +  
0099.00                           MSGTYPE(&MSGTYPE)                  
0100.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)          
0101.00              ENDDO                                           
0102.00              ENDPGM                                          
-----------------------------------------------------------------------------------------------
[コンパイル]
CRTCLPGM PGM(QTROBJ/CLP901CL) SRCFILE(QTRSRC/QCLSRC) OPTION(*SRCDBG) AUT(*ALL)  
					
解説

CLPでも今はデータ・ベースを扱うことができます。 複数のデータ・ベースを扱うことができますし指定したキーでの 読取りの可能です。 SQLを使えばデータ・ベースの更新も可能です。

0048.00              CHGVAR     VAR(&TKCODE) VALUE(&FRMLIN)                   
0049.00              OVRDBF     FILE(TOKMAS) TOFILE(QTRFIL/TOKMAS) +          
0050.00                           POSITION(*KEYAE 1 TOKMASR &TKCODE) +        
0051.00                           SECURE(*YES) OVRSCOPE(*JOB)      
						

のOVRDBF で POSITION(*KEYAE 1 TOKMASR &TKCODE) が
RPGのSETLL命令に相当します。
次に

0052.00              RCVF       RCDFMT(TOKMASR)                               
0053.00              MONMSG     MSGID(CPF0864) EXEC(GOTO CMDLBL(REDEND))    
						

でレコードを読んで CPF0864 つまりEOF(=End Of FILE) であれば
NOT CHAIN と同じで指定したキーのレコードは
見つからなかったことになります。
このような処理をすればCLPでもキーを指定しての読取りが可能です。

ご参考までに GO LINBOTメニューの

日本語データ・ベースの登録(WRKWORDDB)
知識データ・ベースの登録(WRKKNOWDB)
経験データ・ベースの登録(WRKEXPRDB)

はデータ・ベースの追加・変更・削除を行っていますが
すべてCLPによる処理です。
RPGなど他の言語は使っていません。

LINE BOTがどのように応答したのかデバッグする方法について解説します。

  • コマンド: LINE
  • LINE CGIデバッグ・コマンド: LINE を実行すると5250エミュレータ上で
    LINE BOTの動作を調べることができます。
    ただしLINEコマンドは実際にLINEと通信しているわけではありません。
    LINE BOTの動作をシミュレートしているだけです。
    詳細は「IBM i操作メニュー」の「LINE BOTメニュー」をご覧ください。

  • セッション・ファイル
  • 会話の内容は一時的にセッション・ファイルに保存されます。

▼セッション・ファイル(QUSRTEMP/SESSION)

ユーザーID タイム・スタンプ LINEからの質問
Ueae32cca8c7941706c0 1,625,665,242,211 NV-CF1 の在庫を知りたい

セッション・ファイルは[ユーザーID] + [タイム・スタンプ] をキーとしています。
従って出口プログラムでセッション・ファイルの内容をユーザーIDを使って
読取ることができます。
セッション・ファイルをアクセスできるようにするために
入力パラメータにはセッションのユーザーIDが渡されます。
セッション・ファイルは挨拶文などがあるとそこで削除されます。
さらにセッション・ファイルの削除データは再利用されますので
セッションがいつまでも増え続けてIBM iのデスクを圧迫するようなことはありません。

  • ログ出力
  • AUTOWEBログ開始(STRAUTLOG)コマンドで LINEデバッグ・パラメータを *ONにしてSTRAUTLOGを実行すれば LINE BOTのログがAlaskaのログ(ASNET.USR/QNETJOBLOG)に印刷出力されます。 ログはGO ASNET.COM/SERVERメニューで確認することができます。

                                                                      
    7/06/22 作成                                     LINE ログ                                           
    	時刻    送 / 受  LINE 会話データ                                                                   
    						メッセージ                                                                       
    	9:24:05          <FILE><RECORD><destination>Udd5d6de8682756953844b497997fa70c</destination><event>
    	s><type>message</type><message><type>text</type><id>16381767806711</id><text> 在
    		庫マスターを使っているプログラムは・ </text></message><webhookEvent>01G78EB9FWWY
    		6X82V7DWPJ1YRC</webhookEvent><deliveryCont><isRedelivery>false</isRedelivery></d
    		eliveryCont><timestamp>1657067119629</timestamp><source><type>user</type><userId 
    		>Ueae32cca8c7941706c04608d336e4162</userId></source><replyToken>fa5b24d72cc846dc
    		85f3177260b6a832</replyToken><mode>active</mode></events></RECORD></FILE>
    	>  在庫マスターを使っているプログラムは?                                      
    					
  • QSYSOPRメッセージ
  • AUTOWEBログ開始(STRAUTLOG)コマンドでLINEデバッグを*ONにしておいて実行すれば LINE BOTの実行状況は QSYSOPRに報告されますので DSPMSG QSYSOPRで確認することができます。

  • 出口プログラムのデバッグ
  • 出口プログラムをデバッグするには次の2つの方法があります。

    • 出口プログラムをSTRDBGで指定してLINEコマンドを実行する
      出口プログラムが呼び出されて対話式環境でデバッグすることができます。
    • 出口プログラムにDSPLY命令を挿入する
      出口プログラムがRPGであればDSPLY命令を入れておけば
      DSPLY命令の結果はQSYSOPRに表示されます。
    • [例]フィールドMSGの先頭から30バイトを表示します。
      ( DSPLY命令で表示できるのは最大50バイトまでです。)

      /FREE
      DSPLY ('MSG =' + %SUBST(MSG:1:30))'';
      /END-FREE

    IBM i ではハードウェア障害が発生すると QSYSOPR にメッセージが出力されます。
    読者の中には毎日定期的に QSYSOPR を監視している方も多いことでしょう。

    しかしAutoWebのLINE BOTを使うとこの監視を自動化することが可能です。
    お手持ちのスマホのLINEで障害発生をリアルタイムに知ることが出来るようになります。

    LINE BOTによる監視を行うためには下記の手順に従って下さい。

    • 1. メッセージ待ち行列 QSYSMSG の作成

      QSYSOPR の監視業務で大変なことの一つに、通常メッセージと、
      即時対応が必要な重大メッセージとを見分けなければならないことが挙げられます。
      QSYSOPRには日々大量のメッセージが出力されるため、
      重大なメッセージを見落としてしまう可能性もあります。

      幸いなことにIBMはこの問題に解答を用意してくれています。
      それがメッセージ待ち行列 QSYSMSG です。

      i5/OSの初期導入の状態ではこのメッセージ待ち行列は存在しませんが、
      コマンドを実行して作成することで
      以後ハードウェア障害を含む致命的なエラー・メッセージは QSYSOPR ではなく
      QSYSMSG に送られるようになります。

      従って QSYSMSG にメッセージが作成されているか確認するだけで監視が完了します。

      具体的にどのメッセージが QSYSMSG に送られるかは
      こちらに載っています。

      QSYSMSG を作成するには下記のコマンドを実行します。

      > CRTMSGQ MSGQ(QSYS/QSYSMSG) TEXT('QSYSOPRのメッセージ格納MSGQ') AUT(*ALL)

    • 2. QSYSMSG の中断処理プログラムを作成する。

      次に QSYSMSG の監視自体も自動化します。

      自動監視のために QSYSMSG の中断処理プログラムを作成します。
      中断処理プログラムとは、メッセージがメッセージ・待ち行列に到着した時に
      自動的に実行されるプログラムです。

      下記のCLプログラムは、メッセージが到着するとその内容をLINEで送信します。

      0001.00              PGM        PARM(&MSGQ &MSGQLIB &MRK)                        
      0002.00 /*-------------------------------------------------------------------*/  
      0003.00 /*   SNDMSGLINE :  メッセージを LINE 送信する中断処理プログラム      */
      0004.00 /*                                                                   */  
      0005.00 /*                 CHGMSGQ で MSGQ に本プログラムを割り当てると      */
      0006.00 /*                 MSGQ に到着したメッセージが LINE で送信される。   */
      0007.00 /*                                                                   */
      0008.00 /*   > CHGMSGQ MSGQ(QSYS/QSYSMSG) DLVRY(*BREAK)                      */
      0009.00 /*                            PGM(ASNET.COM/SNDMSGLINE)              */
      0010.00 /*                                                                   */
      0011.00 /*   2024/09/03  作成                                                */
      0012.00 /*-------------------------------------------------------------------*/
      0013.00              DCL        VAR(&MSGQ) TYPE(*CHAR) LEN(10)                 
      0014.00              DCL        VAR(&MSGQLIB) TYPE(*CHAR) LEN(10)              
      0015.00              DCL        VAR(&MRK) TYPE(*CHAR) LEN(4)                   
      0016.00              DCL        VAR(&SYSNAME) TYPE(*CHAR) LEN(8)               
      0017.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                 
      0018.00              DCL        VAR(&SNDMSG) TYPE(*CHAR) LEN(5000)             
      0019.00              DCL        VAR(&CRLF) TYPE(*CHAR) LEN(2) VALUE(X'0D25')   
      0020.00              DCL        VAR(&STMMSG) TYPE(*CHAR) LEN(132)              
      0021.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                 
      0022.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)                 
      0023.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)              
      0024.00              DCL        VAR(&MSGKEY) TYPE(*CHAR) LEN(4)                  
      0025.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)                
      0026.00              DCL        VAR(&ERRDTA) TYPE(*CHAR) LEN(132)                
      0027.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                    
      0028.00              DCL        VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)                 
      0029.00              DCL        VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +              
      0030.00                           VALUE('*ESCAPE   ')                            
      0031.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(116) +              
      0032.00                           VALUE(X'0000007400000000') /* 2 進数  */       
      0033.00              DCL        VAR(&ERR) TYPE(*CHAR) LEN(1)                     
      0034.00              DCL        VAR(&NULL4) TYPE(*CHAR) LEN(4) +                 
      0035.00                           VALUE(X'00000000')                             
      0036.00              MONMSG     MSGID(CPF9999) EXEC(GOTO CMDLBL(ERROR))          
      0037.00                                                                          
      0038.00 /*( 環境の取得 )*/                                                       
      0039.00              RTVJOBA    TYPE(&TYPE)                                      
      0040.00              IF         COND(&TYPE *EQ '0') THEN(DO) /*  バッチ  */      
      0041.00              CHGVAR     VAR(&TOPGMQ) VALUE('*SYSOPR   ')                 
      0042.00              ENDDO      /*  バッチ  */                                   
      0043.00              ELSE       CMD(DO) /*  対話式  */                           
      0044.00              CHGVAR     VAR(&TOPGMQ) VALUE('*TOPGMQ   ')                 
      0045.00              ENDDO      /*  対話式  */                                   
      0046.00              RTVNETA    SYSNAME(&SYSNAME)                                
      0047.00                                                                       
      0048.00 /*( メッセージの取得 )*/                                              
      0049.00              RCVMSG     MSGQ(&MSGQLIB/&MSGQ) MSGKEY(&MRK) RMV(*NO) +  
      0050.00                           MSG(&MSG) MSGID(&MSGID)                     
      0051.00                                                                       
      0052.00 /*( メッセージの作成 )*/                                              
      0053.00              CHGVAR     VAR(&SNDMSG) VALUE(' システム ' *CAT +        
      0054.00                           &SYSNAME *TCAT ' で障害が発生しました。 ' + 
      0055.00                           *CAT &CRLF *TCAT &CRLF *TCAT &MSGID *TCAT + 
      0056.00                           &CRLF *TCAT &MSG)                           
      0057.00 /*( LINE 送信 )*/                                                     
      0058.00           /* SNDPGMMSG  MSG(&SNDMSG) TOMSGQ(*SYSOPR) */               
      0059.00              ASNET.COM/SNDLINE MSG(&SNDMSG)                           
      0060.00              RETURN                                                   
      0061.00                                                                       
      0062.00  APIERR:                                                              
      0063.00              CHGVAR     VAR(&MSGID) VALUE(%SST(&APIERR 9 7))          
      0064.00              CHGVAR     VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))      
      0065.00              CHGVAR     VAR(&MSGF) VALUE('Q' *CAT %SST(&MSGID 1 +     
      0066.00                           3) *CAT 'MSG')                              
      0067.00              IF         COND(&MSGF *EQ 'QCPFMSG') THEN(CHGVAR +       
      0068.00                           VAR(&MSGF) VALUE('QCPFMSG'))                
      0069.00              CHGVAR     VAR(&MSGFLIB) VALUE('QSYS      ')             
      0070.00              GOTO       SNDMSG                                        
      0071.00                                                                          
      0072.00  ERROR:      RCVMSG     MSGTYPE(*FIRST) RMV(*NO) KEYVAR(&MSGKEY) +       
      0073.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +    
      0074.00                           SNDMSGFLIB(&MSGFLIB)                           
      0075.00              IF         COND(&MSGID *EQ 'CPF9999') THEN(DO)              
      0076.00              CHGVAR     VAR(&ERRDTA) VALUE(&MSGDTA)                      
      0077.00              RCVMSG     MSGTYPE(*PRV) MSGKEY(&MSGKEY) RMV(*NO) +         
      0078.00                           MSG(&MSG) MSGDTA(&MSGDTA) MSGID(&MSGID) +      
      0079.00                           MSGF(&MSGF) MSGFLIB(&MSGFLIB)                  
      0080.00              CHGVAR     VAR(&STMMSG) VALUE(' プログラム ' *CAT +         
      0081.00                           %SST(&ERRDTA 8 10) *TCAT +                     
      0082.00                           ' のステートメント ' *CAT %SST(&ERRDTA +       
      0083.00                           24 8) *CAT ' で次のエラーが発生しました。 ')   
      0084.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STMMSG) +   
      0085.00                           TOMSGQ(&TOPGMQ) MSGTYPE(*DIAG)                 
      0086.00              ENDDO                                                       
      0087.00  SNDMSG:     IF         COND(&MSGID *EQ ' ') THEN(DO)                    
      0088.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +      
      0089.00                           TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)              
      0090.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                      
      0091.00              ENDDO                                                       
      0092.00              ELSE       CMD(DO)                                          
      0093.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +             
      0094.00                           MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +              
      0095.00                           MSGTYPE(&MSGTYPE)          
      0096.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)  
      0097.00              ENDDO                                   
      0098.00              ENDPGM
      
    • 3.中断処理プログラムを登録するプログラムの作成

      中断処理プログラムは下記のコマンドで登録することが出来ます。

      > CHGMSGQ MSGQ(QSYS/QSYSMSG) DLVRY(*BREAK) PGM(ASNET.COM/SNDMSGLINE)

      しかし、CHGMSGQ を実行したジョブが終了するとメッセージ・待ち行列が
      *HOLDに戻ってしまい中断処理プログラムが呼ばれなくなってしまいます。

      常にQSYSMSGを監視するために、短いCLプログラムを作成し、
      バッチジョブとしてバックグラウンドで動作したままにしておきます。

      0001.00              PGM                                            
      0002.00              CHGMSGQ    MSGQ(QSYS/QSYSMSG) DLVRY(*BREAK) +  
      0003.00                           PGM(ASNET.COM/SNDMSGLINE)         
      0004.00  LOOP:       DLYJOB     DLY(999999)                         
      0005.00              GOTO       CMDLBL(LOOP)                        
      0006.00              ENDPGM                                         
      

      このプログラムをSBMJOBを使って実行します。

      > SBMJOB CMD(CALL PGM(ASNET.COM/MONSYSMSGC)) JOB(MONSYSMSGC) JOBQ(QUSRNOMAX)

      これによりこのジョブが生きている間、QSYSMSGの監視が行われます。

      QUSRNOMAXに投入するとバッチジョブとしてサブシステム QUSRWRK の配下で待機して活動を続けます。
      他の業務には影響を与えません。

    • 4.動作確認

      下記のような簡単なCLPを作成し、
      ハードウェア障害のメッセージを故意に送信することで動作確認が行えます。

      0001.00             PGM                                       
      0002.00             SNDPGMMSG  MSGID(CPPEA05) MSGF(QCPFMSG) + 
      0003.00                  TOMSGQ(QSYS/QSYSMSG)         
      0004.00             ENDPGM                                    
      

    この章の解説はLINE BOTの動作原理と出口プログラムの開発方法について解説しました。
    LINE BOTを動作させるためには事前の初期化が必要です。
    その理解を深めていただくために「IBM i操作メニュー」の
    LINE BOTメニュー」も併せてご覧ください。