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の機能
LINE BOTには大きくわけて2つの機能があります。
標準機能と出口プログラム機能です。
標準機能はLINE BOTの導入時から備わっている基本的な機能のことです。
標準機能だけでも十分LINE BOTの機能を生かすことができます。
標準機能
-
- 日本語処理機能 ....... 日本語を読解して処理する機能
- 学習機能.............. LINEユーザーからの学習機能
- オブジェクト検索機能
指定されたデータ・ベースやオブジェクトの内容を検索します。
- プログラム相互参照
指定されたデータ・ベースを使用しているプログラムを調べます。
出口プログラム機能........ 登録出口プログラムによる処理機能
- RPG/COBOLでLINEと会話するプログラムを開発することができます。
LINE BOTの通信
LINE BOTとLINEクライアントはLINEサーバーをSSL通信で経由して
通信します。
このSSL証明はIBM iやWindowsによる自己証明型ではなく
第三者機関の契約による証明が必要です。
したがってお客さまご自身によるかまたは潟Iフィスクアトロに
依頼されるかの方法でSSL通信を設定する必要があります。
さらにお客さまのIBM iもSSL通信の設定が必要となります。
これも潟IフィスクアトロによるSSLセットアップ・サービスを
ご利用になることができます。
くわしくは潟Iフィスクアトロ営業窓口までご相談ください。
LINE BOTの処理構造
LINE BOTは3つの解析用のファイルとひとつのセッション・ファイルから成っています。
さらにプログラム参照用として2つのファイルを使用します。
LINE BOTの日本語処理機能
LINE BOTの動作原理はとてもシンプルで簡単です。
例えばLINEユーザーが次の質問をしたとします。
動作原理を次のシナリオで説明します。
日本語とは目的となるいくつかの用語を助詞や接続詞を使って
文章に仕上げたものです。
聞き手は目的となる用語を把握の上、文章表現で
話し手が何を求めているのかを聞きだします。
かんたんに言えば日本語の文章からいわゆる「てにおは」を
省いて残った単語(キー・ワード)を解釈するのが
日本語解釈の方法なのです。
LINE BOTもこれと同じことを行うだけです。
大きくわけて2段階の処理を行います。
(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による出口プログラムの開発
[サンプル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)
解説
COBOLによる出口プログラムの開発
[サンプル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による出口プログラムの開発
[サンプル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 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> > 在庫マスターを使っているプログラムは?
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 の障害監視
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メニュー」も併せてご覧ください。
これは得意先マスターの項目値を求めるサンプル・ソースです。
しかも得意先のコードではなく名前で動的に得意先マスターを
検索する高度な利用方法を示しています。
そのためSQLを使いますのでSEUのソース・タイプを
「SQLRPGLE」としてください。
SQLを導入されいいなくてもSQLRPGLEを使って
開発して実行することもできます。
IBMのライセンス・プログラム「対話式SQL」
というのはSTRSQLコマンドによって
対話式でSQL文を入力してテストできるという意味です。
「対話式SQL」を導入していないIBM iでもすべてのSQLは使うことができます。
それでは最初に「得意先検索」をFRMLINから受信して 「得意先コードまたは名前を入れてください。」と返します。
とあるようにTOLINEがこの質問であれば。
FRMLINはこの質問に対する返事のはずです。
そこでその返事: FRMLINに漢字のシフト文字が先頭にあれば
これは名前が入力されたものと判断します。
SQLを実行するサブ・ルーチン: SQLTOKMAS では
というSQL文で LIKE :SEARCH つまり SEARCHという文字列が含まれている
得意先レコードを検索しなさいと言っています。
ところでその前に不明な演算があります。
です。
これは QUERYなどでもある総称文字の検索です。
例えば「中村産業」という文字列を検索するのであれば
と SEARCH文全体を文字%で埋め尽くさねばならないのです。
これがSQLRPGLEでのIBMの仕様です。
FETCH というのはSQLで選択されたレコードを1レコードずつ読む命令です。
カーソルC1の値を :TKCODE, ....と各フィールドに埋め込む命令です。
FETCH の後でフィールド値;TKCODEを見れば値が
読まれたかどうかがわかります。
得意先コードの値が見つかれば
で得意先マスターに改めてCHAIN検索でレコードを取得します。
そこでLINEユーザーには
によって得意先が見つかったことと知りたい項目を尋ねます。 TOLINE に
というように今質問した内容があれば戻ってきた答えは
知りたい項目のはずですから
のようにしてフィールド値を戻します。 数値を編集して戻したい場合は
のようにして%EDITCという編集用の組込み関数を使えば簡単に
編集結果を表示することができます。
ところでここまでご覧になってきてILE-RPGのフリー・フォーマットが
多用されていることにお気づきだと思います。
フリー・フォーマットは/FREE〜/END-FREEのあいだを
自由にフリー・フォーマットとして演算記述することができます。
フリー・フォーマットを初めてご覧になる方もあられたと思いますが
意味は説明がなくてもおわかりになると思います。
それほどフリー・フォーマットの記述ははるかに直感的です。
RPG III, ILE-RPG, C言語, フリー・フォーマットの四つを比べれば
最も簡単に記述でした誰が見ても最もわかりやすいのは
フリー・フォーマットです。
少しずつでも練習されればRPG III よりILE-RPG, さらには
フリー・フォーマットが一番やさしいと感じられると思います。
RPG IIIが一番、書き手の個性が表れてしまいます。
誰が書いても個性が表れにくいのがCLPです。
フリー・フォーマットを使いこなせれば本当にRPGの進化を
感じることでしょう。