tag:blogger.com,1999:blog-43411889052013338062024-03-05T21:45:28.210+09:00ティアンドトラスト Blog技術情報に関して更新します。(月1更新予定)ttrustfbhttp://www.blogger.com/profile/13351059382673251398noreply@blogger.comBlogger24125tag:blogger.com,1999:blog-4341188905201333806.post-28298025040849223082019-06-03T09:00:00.000+09:002019-06-03T09:00:00.151+09:00SQLCLI について(最後に)<br />
<div class="MsoNormal">
<span lang="EN-US">DB2</span>データベースを<span lang="EN-US">RPGLE</span>で処理する場合、データ記述仕様書<span lang="EN-US">(DDS)</span>でファイルを定義し作成して、<span lang="EN-US">RPGLE</span>プログラムでは、ファイル仕様書でファイルを定義して<span lang="EN-US">CHAIN/READ</span>などの命令を使用する方法が一般的でしょう。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
静的定義のデータ記述仕様書に対して<span lang="EN-US">SQLCLI</span>は、読み取り順序や選択条件を動的に与えることができたり、必要に応じてダイナミックにファイルを結合させて行を取り出すことができます。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
双方の良い点を組み合わせて利用するのも、アプリケーションの適用範囲が広がるように思います。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">IBM i </span>で<span lang="EN-US">Web</span>アプリケーションの構築を考えた時に、<span lang="EN-US">Web</span>マクロか<span lang="EN-US">php</span>を利用したデータベース・アクセスを思い浮かべますが、<span lang="EN-US">SQLCLI</span>を使用すれば、<span lang="EN-US">CGI</span>プログラムとして、<span lang="EN-US">IBM i </span>ユーザーの多くが慣れている<span lang="EN-US">RPGLE</span>を利用することも可能になると思います。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
機会があれば、<span lang="EN-US">RPGLE</span>での<span lang="EN-US">C<a href="https://www.blogger.com/null" name="_GoBack"></a>GI</span>にも触れてみたいと思っています。</div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-62644511835399169042019-05-07T09:00:00.000+09:002019-05-07T09:00:03.360+09:00SQLCLI について(「select」SQLステートメントの実行3)<br />
<div class="MsoNormal">
<span lang="EN-US">b.</span>の方法で行を処理するには</div>
<div class="MsoNormal">
</div>
<a name='more'></a><br />
<div class="MsoNormal">
<span lang="EN-US">1. <span style="mso-spacerun: yes;"> </span></span>環境ハンドルの取得<span lang="EN-US">(SQLAllocEnv</span>または<span lang="EN-US">SQLAllocHandle)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo2; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->環境ハンドル内で接続ハンドルの取得<span lang="EN-US">(SQLAllocConnect</span>または<span lang="EN-US">SQLAllocHandle)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo2; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">3.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->データベースへの接続<span lang="EN-US">(SQLConnect)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo2; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">4.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->接続ハンドルからステート・メントハンドルの取得<span lang="EN-US">(SQLAllocStmt</span>または<span lang="EN-US">SQLAllocHandle)</span></div>
<div class="MsoNormal">
<span lang="EN-US">5. </span>ステートメント・ハンドルに対して「<span lang="EN-US">select</span>」<span lang="EN-US">SQL</span>文を指定<span lang="EN-US">(SQLPrepare)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l1 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">6.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]--><span lang="EN-US">SQL</span>文にパラメータ・マーカが含まれる時は、パラメータ用変数のバインド<span lang="EN-US">(SQLBindParameter)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l1 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">7.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]--><span lang="EN-US">SQL</span>文にパラメータ・マーカが含まれる時は、パラメータ用変数に値を設定</div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l1 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">8.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]--><span lang="EN-US">SQL</span>文の実行<span lang="EN-US">(SQLExecute</span>または<span lang="EN-US">SQLExecDirect)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l1 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">9.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->戻り値が<span lang="EN-US">SQL_NO_DATA(=100)</span>になるまで「<span lang="EN-US">fetch</span>」<span lang="EN-US">SQL</span>文の実行<span lang="EN-US">(SQLFetch)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l1 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">10.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->必要なカラムから値の取り出し<span lang="EN-US">(SQLGetCol</span>、必要に応じて<span lang="EN-US">SQLNumResultCols</span>と<span lang="EN-US">SQLDescribeCol)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l1 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">11.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->ステートメント・ハンドルの解放<span lang="EN-US">(SQLFreeStmt</span>または<span lang="EN-US">SQLFreeHandle)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l1 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">12.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->データベースの切断<span lang="EN-US">(SQLDisconnect)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l1 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">13.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->接続ハンドルの解放<span lang="EN-US">(SQLFreeConnect</span>または<span lang="EN-US">SQLFreeHandle)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l1 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">14.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->環境ハンドルの解放<span lang="EN-US">(SQLFreeEnv</span>または<span lang="EN-US">SQLFreeHandle)</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
行を読み取るときに、事前にカラムにプログラム変数を割り当てる、あるいは<span lang="EN-US">fetch</span>後にカラムの値を取得する時のどちらの場合も、文字変数のデータ終了文字に注意する必要があります。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
カラム定義より長い長さのプログラム変数を使ってカラムの値を取得したり、数値を文字変換してプログラム変数に取得するようなケースでは、環境ハンドルの省略値によって、文字値はヌル終了になります。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
例えば、<span lang="EN-US">5</span>桁の文字属性のカラムから、<span lang="EN-US">20</span>桁の文字属性のプログラム変数に値を入れると、<span lang="EN-US">6</span>桁目にヌル<span lang="EN-US">(x’00’)</span>が挿入されます。文字値をヌル終了させるかどうかは、環境ハンドルの属性で指定できます。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
数値属性のカラムの値を文字プログラム変数で受け取ることもできます。</div>
<div class="MsoNormal">
その場合、有効桁以降が左詰めで文字変数に入れられて、小数点以下があれば、小数点はピリオド<span lang="EN-US">(‘.’)</span>で渡されます。数値がマイナスの時は、マイナス文字<span lang="EN-US">(‘-‘)</span>が付けられます。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
文字変数と同様に、ヌル終了となり、最後にヌル<span lang="EN-US">(x’00’)</span>が挿入されます。このままで<span lang="EN-US">%dec</span>関数を使用して、数値変数に値を代入しようとすると、例外エラーが発生するので、注意が必要です。</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-72197104382836694322019-04-01T09:00:00.000+09:002019-04-01T09:00:05.654+09:00SQLCLI について(「select」SQLステートメントの実行2)<br />
<div class="MsoNormal">
<span lang="EN-US">a.</span>の方法で行を処理するには</div>
<div class="MsoNormal">
</div>
<a name='more'></a><br />
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->環境ハンドルの取得<span lang="EN-US">(SQLAllocEnv</span>または<span lang="EN-US">SQLAllocHandle)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->環境ハンドル内で接続ハンドルの取得<span lang="EN-US">(SQLAllocConnect</span>または<span lang="EN-US">SQLAllocHandle)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">3.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->データベースへの接続<span lang="EN-US">(SQLConnect)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">4.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->接続ハンドルからステート・メントハンドルの取得<span lang="EN-US">(SQLAllocStmt</span>または<span lang="EN-US">SQLAllocHandle)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">5.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->ステートメント・ハンドルに対して「<span lang="EN-US">select</span>」<span lang="EN-US">SQL</span>文を指定<span lang="EN-US">(SQLPrepare)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">6.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]--><span lang="EN-US">SQL</span>文にパラメータ・マーカが含まれる時は、パラメータ用変数のバインド<span lang="EN-US">(SQLBindParameter)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">7.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]--><span lang="EN-US">SQL</span>文にパラメータ・マーカが含まれる時は、パラメータ用変数に値を設定</div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">8.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]--><span lang="EN-US">SQL</span>文の実行<span lang="EN-US">(SQLExecute</span>または<span lang="EN-US">SQLExecDirect)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">9.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->カラムにプログラム変数を割り当てる<span lang="EN-US">(SQLBindCol)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">10.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->戻り値が<span lang="EN-US">SQL_NO_DATA(=100)</span>になるまで「<span lang="EN-US">fetch</span>」<span lang="EN-US">SQL</span>文の実行<span lang="EN-US">(SQLFetch)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">11.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->カラムに割り当てたプログラム変数の内容に従った処理</div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">12.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->ステートメント・ハンドルの解放<span lang="EN-US">(SQLFreeStmt</span>または<span lang="EN-US">SQLFreeHandle)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">13.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->データベースの切断<span lang="EN-US">(SQLDisconnect)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">14.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->接続ハンドルの解放<span lang="EN-US">(SQLFreeConnect</span>または<span lang="EN-US">SQLFreeHandle)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">15.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->環境ハンドルの解放<span lang="EN-US">(SQLFreeEnv</span>または<span lang="EN-US">SQLFreeHandle)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<span lang="EN-US"><br /></span></div>
<div class="MsoNormal">
<span lang="EN-US">SQL</span>文にパラメータ・マーカが無い時は、<span lang="EN-US">5</span>~<span lang="EN-US">7</span>を省略して、<span lang="EN-US">8.</span>で<span lang="EN-US">SQL</span>文を<span lang="EN-US">SQLExecDirect</span>で実行します。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">9.</span>でカラムに<span lang="EN-US">SQLBindCol <span style="mso-spacerun: yes;"> </span>API</span>を使用してプログラム変数を割り当てる時、<span lang="EN-US">SQLCLI</span>には、ゾーン<span lang="EN-US">10</span>進数<span lang="EN-US">(RPGLE</span>のデータ・タイプ<span lang="EN-US">S)</span>に対応する<span lang="EN-US">SQL</span>データ・タイプがありませんので、ソーン<span lang="EN-US">10</span>進数カラムに対しては、文字変数を割り当てて、<span lang="EN-US">RPGLE</span>内のロジックで、カラムの値を使用する時に、<span lang="EN-US">%dec</span>関数等で<span lang="EN-US">10</span>進数に変換して使用します。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
必要があれば、小数点以下の桁数は、<span lang="EN-US">SQLDescribeCol API</span>で取得することができます。</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-43327696157857553082019-03-01T09:00:00.000+09:002019-03-01T09:00:06.105+09:00SQLCLI について(「select」SQLステートメントの実行1)<br />
<div class="MsoNormal">
<span lang="EN-US">RPGLE</span>の<span lang="EN-US">READ/READP/READE/READPE</span>命令に対応する「<span lang="EN-US">select</span>」、「<span lang="EN-US">fetch</span>」<span lang="EN-US">SQL</span>文を実行するには、大きく分けて</div>
<div class="MsoNormal">
</div>
<a name='more'></a><br />
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">a.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->あらかじめカラム(フィールド)にプログラム変数を割り当てておき、行(レコード)を読み取ったら、割り当てておいたプログラム変数に値が入る</div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">b.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->行(レコード)を読み取った後で、行からカラム(フィールド)の値を取り出して、プログラム変数に入れる</div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<br /></div>
<div class="MsoNormal">
の<span lang="EN-US">2</span>種類の方法があります。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
一般的に、あらかじめカラムにプログラム変数を割り当てるのは、静的な「<span lang="EN-US">select</span>」<span lang="EN-US">SQL</span>文を実行するケースだと考えられますので、割り当てるプログラム変数もそれぞれのカラムに合った属性の変数を定義することになると思われます。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
行を取得した後で、取得した行からカラムの値を取り出すのは、もちろん静的な「<span lang="EN-US">select</span>」<span lang="EN-US">SQL</span>文を処理するケースも考えられますが、多くは動的な「<span lang="EN-US">select</span>」<span lang="EN-US">SQL</span>文を実行して、不定のカラム数から値を取り出すことが考えられるのではないでしょうか。そのために、<span lang="EN-US">SQLCLI</span>では、実行した「<span lang="EN-US">select</span>」<span lang="EN-US">SQL</span>文から、カラム数を取り出す<span lang="EN-US">API(SQLNumResultCols)</span>、個々のカラムの属性を取得する<span lang="EN-US">API(SQLDescribeCol)</span>が用意されています。</div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-29544904120549756062019-02-01T09:00:00.000+09:002019-02-01T09:00:03.853+09:00SQLCLI について(SQLステートメントの実行)<br />
<div class="MsoNormal">
<span lang="EN-US">RPGLE</span>でカーソル処理をしない「<span lang="EN-US">insert</span>」「<span lang="EN-US">update</span>」「<span lang="EN-US">delete</span>」等の<span lang="EN-US">SQL</span>文を実行するには、基本的に以下のような手順で行います。</div>
<div class="MsoNormal">
</div>
<a name='more'></a><br />
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->環境ハンドルの取得<span lang="EN-US">(SQLAllocEnv</span>または<span lang="EN-US">SQLAllocHandle)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->環境ハンドル内で接続ハンドルの取得<span lang="EN-US">(SQLAllocConnect</span>または<span lang="EN-US">SQLAllocHandle)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">3.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->データベースへの接続<span lang="EN-US">(SQLConnect)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">4.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->接続ハンドルからステート・メントハンドルの取得<span lang="EN-US">(SQLAllocStmt</span>または<span lang="EN-US">SQLAllocHandle)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">5.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->ステートメント・ハンドルに対して<span lang="EN-US">SQL</span>文を指定<span lang="EN-US">(SQLPrepare)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">6.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]--><span lang="EN-US">SQL</span>文にパラメータ・マーカが含まれる時は、パラメータ用変数のバインド<span lang="EN-US">(SQLBindParameter)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">7.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]--><span lang="EN-US">SQL</span>文にパラメータ・マーカが含まれる時は、パラメータ用変数に値を設定</div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">8.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]--><span lang="EN-US">SQL</span>文の実行<span lang="EN-US">(SQLExecute</span>または<span lang="EN-US">SQLExecDirect)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">9.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->ステートメント・ハンドルの解放<span lang="EN-US">(SQLFreeStmt</span>または<span lang="EN-US">SQLFreeHandle)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">10.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->データベースの切断<span lang="EN-US">(SQLDisconnect)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">11.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->接続ハンドルの解放<span lang="EN-US">(SQLFreeConnect</span>または<span lang="EN-US">SQLFreeHandle)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">12.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->環境ハンドルの解放<span lang="EN-US">(SQLFreeEnv</span>または<span lang="EN-US">SQLFreeHandle)</span></div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<span lang="EN-US"><br /></span></div>
<div class="MsoNormal">
ステートメント・ハンドルをそのままに、複数種類の<span lang="EN-US">SQL</span>文を実行したい場合、<span lang="EN-US">5</span>~<span lang="EN-US">7</span>を、パラメータ値を変えて同じ<span lang="EN-US">SQL</span>文を実行したい時は<span lang="EN-US">6</span>~<span lang="EN-US">7</span>を、<span lang="EN-US">RPGLE</span>のロジックとして繰り返します。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">5</span>で指定される<span lang="EN-US">SQL</span>文が、例えば画面からの入力で与えられるようなケース、あるいは<span lang="EN-US">PC</span>クライアントから通信で渡されるようなケースでは、正しく実行できるかどうかを検査するために、<span lang="EN-US">5</span>で<span lang="EN-US">SQL</span>文実行準備<span lang="EN-US">API</span>を呼び出して、<span lang="EN-US">SQL</span>文を検査することもできます。</div>
<div class="MsoNormal">
<span lang="EN-US"><br /></span></div>
<div class="MsoNormal">
<span lang="EN-US">RPGLE</span>プログラムで生成する<span lang="EN-US">SQL</span>文では、<span lang="EN-US">SQL</span>構文エラーなどをユーザーに通知する必要は無いと思われますので、<span lang="EN-US">5</span>~<span lang="EN-US">7</span>を飛ばして、<span lang="EN-US">8</span>を「<span lang="EN-US">SQLExecDirect</span>」で実行します。</div>
<div class="MsoNormal">
パラメータ・マーカを使用する時は、<span lang="EN-US">5</span>~<span lang="EN-US">7</span>を処理して、<span lang="EN-US">8</span>を「<span lang="EN-US">SQLExecute</span>」で実行します。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
パラメータ・マーカの値の関連性妥当性検査は、<span lang="EN-US">SQLCLI</span>ではできませんので、そこは<span lang="EN-US">RPGLE</span>のプログラム・ロジックで組み込んで、エラーを戻すなり、再入力を促すなりを行います。</div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-57700447719172425302019-01-07T09:00:00.000+09:002019-01-07T09:00:02.129+09:00SQLCLI について(SQLCLIの使用-ステートメント・ハンドル)<br />
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">3.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->ステートメント・ハンドル</div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">SQLCLI</span>を使用して、<span lang="EN-US">RPGLE</span>で<span lang="EN-US">SQL</span>文を実行するためには、接続ハンドルに対してステートメント・ハンドルを取得しなければなりません。</div>
<div class="MsoNormal">
</div>
<a name='more'></a>取得したステートメント・ハンドルに指定できる<span lang="EN-US">SQL</span>文は1つですが、実行する<span lang="EN-US">SQL</span>文を変更して別の<span lang="EN-US">SQL</span>文を実行したり、パラメータ・マーカをを含む<span lang="EN-US">SQL</span>文を指定して、パラメータ値を変えて同じ<span lang="EN-US">SQL</span>文を何度も実行したりすることができます。<br />
<div class="MsoNormal">
1つの接続ハンドルに対して、複数のステートメント・ハンドルが取得できます。</div>
<div class="MsoNormal">
</div>
<div class="MsoNormal">
「<span lang="EN-US">select</span>」文などのカーソルを戻す<span lang="EN-US">SQL</span>文では、カーソル名の代わりにステートメント・ハンドルを使用して「<span lang="EN-US">fetch</span>」を実行します。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">3</span>種類のハンドルについて、<span lang="EN-US">RPGLE</span>プログラムが<span lang="EN-US">LR</span>標識オンで終了しても、自動的に解放されることはありませんので、それぞれ明示的に解放する必要があります。<span lang="EN-US">RPGLE</span>の<span lang="EN-US">LR</span>標識<span lang="EN-US">ON</span>による戻りは、リニア<span lang="EN-US">RPG</span>サイクルに従って、自メイン・プロシージャ内で定義されたファイルのみを<span lang="EN-US">CLOSE</span>します。</div>
<span lang="EN-US" style="font-family: "游明朝" , "serif"; font-size: 10.5pt;"><br clear="all" style="mso-special-character: line-break; page-break-before: always;" />
</span>
<br />
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<br /></div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-82711795734340134162018-12-03T09:00:00.000+09:002018-12-03T09:00:01.549+09:00SQLCLI について(SQLCLIの使用-接続ハンドル)<br />
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->接続ハンドル</div>
<div class="MsoNormal">
<span lang="EN-US">IBM i</span>のデータベースと接続するためのハンドルです。</div>
<div class="MsoNormal">
他の<span lang="EN-US">RDBMS</span>(例えば<span lang="EN-US">MS-SQL Server</span>)とも接続できるかなと思ってやってみましたが、他システムとの接続には<span lang="EN-US">DRDA</span>が使用されているようで、接続できませんでした。</div>
<div class="MsoNormal">
</div>
<a name='more'></a><br />
<div class="MsoNormal">
システムの<span lang="EN-US">DRDA</span>登録簿に登録されているシステムとであれば、遠隔<span lang="EN-US">RDB</span>との接続は可能です。<span lang="EN-US">*LOCAL</span>(自システム)は、ユーザー<span lang="EN-US">/</span>パスワード不要で接続できます(指定しても構いませんが、不一致の時はエラーが戻されます)。</div>
<div class="MsoNormal">
<span lang="EN-US">DRDA</span>をサポートする遠隔システムへの接続には、そのシステムの設定値によってユーザー<span lang="EN-US">/</span>パスワードが必要な場合もあります。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
接続ハンドルには、「トランザクション制御モード」があり、デフォルトでは「コミット制御あり」になっています。</div>
<div class="MsoNormal">
コミット制御ありの接続ハンドルを利用して「<span lang="EN-US">insert</span>」「<span lang="EN-US">update</span>」「<span lang="EN-US">delete</span>」<span lang="EN-US">SQL</span>文を実行するには、その対象となる全ての物理ファイルに対してジャーナル処理が必須になります。(ジャーナル処理されていないと、<span lang="EN-US">SQLCLI API</span>はエラーを戻します。)</div>
<div class="MsoNormal">
対話型<span lang="EN-US">SQL</span>を使用して作成された「コレクション」<span lang="EN-US">(=</span>ライブラリ<span lang="EN-US">)</span>とは異なり、自動でジャーナルの作成<span lang="EN-US">/</span>開始は行われませんので、あらかじめジャーナルの作成<span lang="EN-US">/</span>開始を行う必要があります。接続ハンドルの属性を変更するとこで、「コミット制御無し」に設定することもでき、その場合はジャーナルの作成<span lang="EN-US">/</span>開始はオプションになります。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
一般的に業務アプリケーションでは、コミット制御は必要だと思われますので、業務アプリケーションで使用する全ての物理ファイルに対して、ジャーナル処理を開始さえしておけば、「トランザクション制御モード」は変更する必要は無いと思われます。</div>
<div class="MsoNormal">
<br /></div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-48329789307141020232018-11-01T09:00:00.000+09:002018-11-01T09:00:09.263+09:00SQLCLI について(SQLCLIの使用-環境ハンドル)<br />
<div class="MsoNormal">
<span lang="EN-US">SQLCLI</span>を使用して<span lang="EN-US">SQL</span>文を処理するためには、<span lang="EN-US">IBM i </span>の<span lang="EN-US">DB2</span>とやり取りをするために、<span lang="EN-US">3</span>種類のハンドルが必要になります。</div>
<div class="MsoNormal">
<span lang="EN-US"><o:p></o:p></span></div>
<a name='more'></a><br />
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->環境ハンドル</div>
<div class="MsoNormal">
<span lang="EN-US">IBM i</span>の<span lang="EN-US">RDBMS</span>と連絡するためのハンドルです。</div>
<div class="MsoNormal">
「ジョブ・モード」と「サーバ・モード」の実行環境モードが選択でき、サーバ・モードを選択した時は、システムの「<span lang="EN-US">QSQSRVR</span>」ジョブで<span lang="EN-US">DB</span>接続要求や、<span lang="EN-US">SQL</span>文実行要求が処理されます。デフォルトは「ジョブ・モード」で作成されるので、環境ハンドルを取得した後で、ハンドル属性の変更<span lang="EN-US">API</span>を呼び出して「サーバ・モード」に変更します。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
確かにジョブログ等を見ると、ジョブ・モードでは<span lang="EN-US">RPGLE</span>プログラムを実行しているジョブで、サーバ・モードでは、<span lang="EN-US">RPGLE</span>プログラムを実行しているジョブが接続された「<span lang="EN-US">QSQSRVR</span>」ジョブで<span lang="EN-US">SQL</span>文が実行されているのは判りましたが、スループットは殆ど変わりないので、サーバ・モードの方が記憶域的なメリットでもあるのかな?と考えている次第です。</div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<br /></div>
<br />
<div class="MsoNormal">
</div>
<div class="MsoNormal">
<br /></div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-51331781777388326982018-10-01T09:00:00.000+09:002018-10-01T09:00:04.403+09:00SQLCLI について(RPGLEでSQLCLIを使用するには2)<div class="MsoNormal">
<span lang="EN-US">RPGLE</span>用のプロトタイプ定義は、<span lang="EN-US">SQLCLI</span>のマニュアルに、コーディングに必要な記述がありますので、それを参考にして、あらかじめ作成しておき、「<span lang="EN-US">/COPY</span>」ステートメントを使用して、<span lang="EN-US">RPGLE</span>プログラムのソースにコピーするようにします。</div>
<div class="MsoNormal">
これは汎用的なものですから、一度作成すれば<span lang="EN-US">SQLCLI</span>を利用するどのプロジェクトでも利用できると思います。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
プロトタイプ定義を作成する時に、おそらく障害になるのが「<span lang="EN-US">SQL_</span>」で始まる<span lang="EN-US">SQLCLI</span>名前付き定数でしょう。</div>
<div class="MsoNormal">
マニュアルにも「<span lang="EN-US">SQL_SUCCESS</span>」とか「<span lang="EN-US">SQL_INTEGER_t</span>」などの名前付き定数で書かれており、その値やタイプは判らないようになっています。</div>
<div class="MsoNormal">
もっともこれは、バージョン・アップなどで値が変わっても、名前付き定数は変わらないように配慮しているのかもしれません。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">IBM i </span>では、この名前付き定数定義は、<span lang="EN-US">C</span>言語用のプロトタイプ定義と併せて「<span lang="EN-US">QSYSINC/H.SQLCLI</span>」にソース・メンバーとして提供されています。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
私も、<span lang="EN-US">RPGLE</span>用のプロトタイプ定義と名前付き定数の定義を作成する時に参考にしました。<span lang="EN-US">C</span>言語でのデータタイプを<span lang="EN-US">RPGLE</span>用のそれにマップするのに苦労した覚えがあります。何せ、<span lang="EN-US">C</span>言語の知識は、よちよち歩き状態ですから(笑)。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
このような紆余曲折もあって、何とか<span lang="EN-US">RPGLE</span>用のプロトタイプ定義と名前付き定数定義を作成し、<span lang="EN-US">UTF-16</span>用の<span lang="EN-US">API</span>に対応していない、<span lang="EN-US">BLOB</span>、<span lang="EN-US">CLOB</span>に対応していないなどの問題は含んでいますが、現在<span lang="EN-US">RPGLE</span>プログラムで使用するに至っています。</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-84664658271977788982018-09-03T09:00:00.000+09:002018-09-03T09:00:12.362+09:00SQLCLI について(RPGLEでSQLCLIを使用するには)<br />
<div class="MsoNormal">
<span lang="EN-US">RPGLE</span>で<span lang="EN-US">SQLCLI</span>を使用する場合、多種ある<span lang="EN-US">SQLCLI</span>用の<span lang="EN-US">API</span>を、使用する機能に合わせて呼び出します。</div>
<div class="MsoNormal">
呼出しは、プログラムの動的呼び出し(<span lang="EN-US">CALL</span>命令)ではなく、サブ・プロシージャ呼出しと同じように呼び出します。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
すなわち、値を返す<span lang="EN-US">API</span>を使用して、その値をメイン・プロシージャで使用する時は、<span lang="EN-US">EVAL</span>命令、あるいは条件判断命令(<span lang="EN-US">IF</span>、<span lang="EN-US">DOW</span>など)で呼出し、返される値が不要な場合、<span lang="EN-US">CALLP</span>命令で呼び出します。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">RPGLE</span>でサブ・プロシージャを呼び出す時に必要なものが、「プロトタイプ定義」と言われる、外部名、戻り値のタイプ<span lang="EN-US">/</span>桁数、必要なパラメータの順番と個数とそれぞれのタイプ<span lang="EN-US">/</span>桁数を定義したものになります。</div>
<div class="MsoNormal">
1つのモジュール内で、メインとサブ・プロシージャを記述する時は、サブ・プロシージャ側に「プロシージャ・インターフェース定義」がありますので、プロトタイプ定義はオプション(<span lang="EN-US">IBM i </span>の<span lang="EN-US">V6</span>以前のバージョンでは必須)になりますが、<span lang="EN-US">SQLCLI</span>を使用する時は、別のモジュールやサービス・プログラムを使用する場合と同様にプロトタイプ定義が必須になります。</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-37683548573588194532018-08-01T09:00:00.000+09:002018-08-01T09:00:13.880+09:00SQLCLI について(SQLCLI の特徴2)<br />
<div class="MsoNormal">
<span lang="EN-US">SQLCLI</span>を使用すれば、ソケット通信と組み合わせて、クライアントからの<span lang="EN-US">SQL</span>要求を汎用的に処理するサーバ側<span lang="EN-US">RPGLE</span>ソフトウェアも作成することができます。</div>
<div class="MsoNormal">
</div>
<a name='more'></a><br />
<div class="MsoNormal">
例えば、<span lang="EN-US">MS-Access</span>を使用して<span lang="EN-US">IBM i </span>の<span lang="EN-US">RDBMS</span>にアクセスする場合、一般的には<span lang="EN-US">ADO</span>で<span lang="EN-US">IBM i Client Access ODBC Driver</span>を使用しますが、<span lang="EN-US">VBA</span>でソケット通信機能をコーディングすれば、<span lang="EN-US">ADO</span>や<span lang="EN-US">ODBC Driver</span>無しで<span lang="EN-US">IBM
i </span>のデータベースに、<span lang="EN-US">SQL</span>文でアクセスすることが可能になります。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
しかし、実際に疑似環境を作成してやってみると、<span lang="EN-US">ADO + ODBC Driver</span>での接続の方が処理速度が圧倒的に速く、<span lang="EN-US">SQLCLI</span>を使用した汎用的<span lang="EN-US">RPGLE</span>処理プログラムでは太刀打ちできませんでした(笑)。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
やはり、長年練られてバージョンアップを重ねてきた製品と、テストのために適当なメッセージ・フローをその場で考えて作成したものとでは、比較になりません。</div>
<div class="MsoNormal">
<span lang="EN-US">Access</span>の<span lang="EN-US">VBA</span>では、<span lang="EN-US">Native</span>な<span lang="EN-US">Windows</span>のソケット<span lang="EN-US">API</span>を使用せず、サードパーティ製のものを使用したことも関係しているのかもしれません。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
これはこれで、<span lang="EN-US">16</span>進の<span lang="EN-US">x’00’</span>が送受信データに含まれていると、その手前で受信が終了してしまうとか、複数のフィールド値の羅列をどのような区切り文字で送信するかなど、様々な苦労がありましたが、<span lang="EN-US">SQLCLI</span>とは関係が無いので割愛します。</div>
<div class="MsoNormal">
やはり、多くの人がかかわった熟成されたメッセージ・フローは偉大ですね。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">SQLCLI</span>を使用せず、専用のアプリケーションとして、<span lang="EN-US">RPGLE</span>の持つ本来の<span lang="EN-US">READ/WRITE</span>命令を使用すれば、通信メッセージ・フローを考慮する事を前提として、速度的には遜色のないものになるかもしれませんが、サブジェクトから逸れるので、この文中では取り上げません。</div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-89151115226315323972018-07-02T09:00:00.000+09:002018-07-24T11:18:35.583+09:00SQLCLI について(SQLCLI の特徴)<br />
<div align="left" class="MsoNormal" style="mso-pagination: widow-orphan; text-align: left;">
<span lang="EN-US">1.</span> 全ての<span lang="EN-US">SQL</span>文を、高水準言語から動的呼び出しで使用できる</div>
<div class="MsoNormal">
<span lang="EN-US">2.</span> 高水準言語への組み込み<span lang="EN-US">SQL</span>に比べて、効率が良い(と言われている)</div>
<div class="MsoNormal">
<span lang="EN-US">3.</span> <span lang="EN-US">RUNSQL</span>コマンドなどの直接<span lang="EN-US">SQL</span>文実行ではできない「カーソル処理」ができる(要するに<span lang="EN-US">declare cursor</span>や<span lang="EN-US">select</span>文に続く<span lang="EN-US">fetch</span>処理ができる)</div>
<div class="MsoNormal">
<span lang="EN-US">4.</span> <span lang="EN-US">SQL</span>文の中にパラメータ・マーカ(置換変数)を指定することができ、パラメータの文字<span lang="EN-US">/</span>数字などの属性値に従って適切に埋め込まれる</div>
<div class="MsoNormal">
<span lang="EN-US">5.</span> プログラム固定情報値としてあらかじめ準備された<span lang="EN-US">SQL</span>文だけでなく、実行時に<span lang="EN-US">SQL</span>文を変数で与えることができる。(例えば、画面から入力された<span lang="EN-US">SQL</span>文を検査して、実行することも可能)</div>
<div class="MsoNormal">
<span lang="EN-US">6.</span> <span lang="EN-US">SQL</span>文の実行環境も、サーバ・モードとジョブ・モードの設定ができる</div>
<div class="MsoNormal">
<span lang="EN-US">7.</span> トランザクション制御を使用する<span lang="EN-US">/</span>しないの設定ができる(省略時値はトランザクション制御必須)</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
などが挙げられます。</div>
<br />
<br />
<br />
<div class="MsoNormal">
高水準言語への組み込み<span lang="EN-US">SQL</span>では、カーソル定義とホスト変数を使用してのカーソル処理そのものは可能ですが、組み込んだ<span lang="EN-US">SQL</span>文を、いったん動的呼び出しに変換するために「プレ・コンパイラー」を通して一時的な言語ソースに変換する必要があります。<span lang="EN-US">SQLCLI</span>では、直接動的呼び出しをコーディングするので、プレ・コンパイルの必要は無く、高水準言語は、パラメータとして指定したプログラム変数を使用して直接<span lang="EN-US">DB2</span>とのやり取りを行います。</div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-8022023127401399482018-06-01T09:00:00.000+09:002018-07-24T11:18:24.803+09:00SQLCLI について(はじめに)<br />
<div class="MsoNormal">
あちこちで表現されている通り、<span lang="EN-US">IBM i </span>には標準でリレーショナル・データベースである<span lang="EN-US">DB2</span>が組み込まれています。</div>
<div class="MsoNormal">
<span lang="EN-US"></span></div>
<a name='more'></a><br />
<div class="MsoNormal">
<span lang="EN-US">DB2</span>へのアクセスは、<span lang="EN-US">IBM i </span>の前身である<span lang="EN-US">AS/400</span>、<span lang="EN-US">System/38</span>時代から使われていた、データ記述仕様書(<span lang="EN-US">DDS</span>)による定義と、<span lang="EN-US">RPG/RPGLE</span>をはじめとする高水準言語による入出力が代表的なものでしたが、構造化照会言語(<span lang="EN-US">SQL</span>)による定義やアクセスも可能です。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span lang="EN-US">IBM i </span>の<span lang="EN-US">SQL</span>文による<span lang="EN-US">DB2</span>へのデータ定義<span lang="EN-US">/</span>アクセスは</div>
<div class="MsoNormal">
</div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">1.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]--><span lang="EN-US">STRSQL</span>コマンドによる、対話型<span lang="EN-US">SQL</span>を使用する</div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">2.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]--><span lang="EN-US">RPG/RPGLE</span>などの高水準言語に組み込んで使用する</div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
<!--[if !supportLists]--><span lang="EN-US" style="mso-bidi-font-family: 游明朝; mso-bidi-theme-font: minor-latin; mso-fareast-font-family: 游明朝; mso-fareast-theme-font: minor-latin;"><span style="mso-list: Ignore;">3.<span style="font: 7.0pt "Times New Roman";"> </span></span></span><!--[endif]-->動的呼び出し(<span lang="EN-US">Call Level Interface</span>)を使用する</div>
<div class="MsoListParagraph" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; mso-para-margin-left: 0gd; text-indent: -18.0pt;">
</div>
<div class="MsoNormal">
などの方法があります。</div>
<div class="MsoNormal">
また、その他「<span lang="EN-US">RUNSQL</span>」コマンドによる<span lang="EN-US">SQL</span>文の直接実行や、<span lang="EN-US">PC</span>クライアントからは<span lang="EN-US">ODBC</span>等のミドルウェアを使用して、例えば<span lang="EN-US">MS-Access</span>や<span lang="EN-US">Excel</span>から<span lang="EN-US">VBA</span>で利用することも、<span lang="EN-US">php</span>などの<span lang="EN-US">CGI</span>を使用して、<span lang="EN-US">Web</span>クライアントからアクセスすることもできます。</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
ここでは、動的呼び出しである「<span lang="EN-US">SQLCLI</span>」(<span lang="EN-US">SQL Call Level Interface</span>:以下<span lang="EN-US">SQLCLI</span>)を取り上げて、<span lang="EN-US">RPGLE</span>での使用に焦点を当ててみたいと思います。</div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-64392630032775156962018-05-07T08:00:00.000+09:002018-05-24T16:16:34.048+09:00RPGLEでのSSL通信(2)サーバ認証さえクリアすれば、あとはIBM i のSSL通信機能が、APIを呼び出すだけで勝手にネゴシエーション(SSL Handshake)して、最も高い改ざん防止と暗号化を決定してくれるので、簡単にSSL通信を行うことができます。<br />
ネゴシエーションに関しては、システム値でも制御できますが、テストではシステム提供の省略値をそのまま使用しました。<br />
<br />
<a name='more'></a><br />
IBM i のバージョンやリリースによって若干異なるようですが、IBM i のSSL APIは、システム値に従って動作してくれます。<br />
もちろん、認証・署名・暗号化方式をAPIに対して指示する事も可能なようにしました。(最大5個)<br />
<br />
より業務に接したテストを行ったわけではありませんが、感触としては<br />
<br />
1.ソケットのSSLアップグレードに少し時間がかかる<br />
2.クリアテキストのSocketに比べると暗号化の分だけ遅い<br />
3.暗号化方式によってはパディングが入って転送量は増える<br />
<br />
が挙げられます。<br />
<br />
3.はほぼ気にならないでしょうが、1.はクライアントとの間で種々のネゴシエーションが行われるので、ちょっと待つ感じがありました。<br />
2.に関しては、暗号化の方式と実行するマシンの暗号化エンジン(デバイス)も関係するので何とも言えません。<br />
IBM i では、暗号化デバイスを使用することも、ソフトウェアで暗号化することもできますが、実装したSSL用サブプロシージャでは、暗号化デバイスは使用できません、少量のデータ送受信では、ソフトウェア暗号化でもクリアテキストの場合と遜色ない速度で通信できましたが、大量になるとその差は問題になるかもしれません。<br />
<br />
IBM i でのTCP/IP通信(殆どはTCPソケット)は、その殆どが暗号化されていますので、ユーザーソケット通信についても暗号化を検討する時には、SSL通信も検討されることをお勧めします。<br />
<br />
なお、SSL(TLS)はTCP上で動作するので、UDPには対応していません。(完)Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-2391475915701418502018-04-02T08:00:00.000+09:002018-05-24T16:08:43.114+09:00RPGLEでのSSL通信(1)以前に、RPGLEでのソケット通信について書いた覚えがあります。<br />
IBM i のUNIX APIをRPGLEのサブプロシージャにカプセル化して、RPGLEのプログラムで利用できるようにしました。<br />
今では、弊社のT-Socket-iとして提供されているソリューションです。<br />
<br />
<a name='more'></a><br />
今回はその、T-Socket-iに少し機能を限定したSSL通信機能サブプロシージャを追加しました。<br />
機能を限定としたのは、自分で納得のいかなかった機能を除外してしまったと言う意味です。<br />
最低限、サーバ認証、改ざん防止。<br />
暗号通信の部分は満足していると思っています。<br />
<br />
<br />
実装するにあたって苦労したのは、SSLハンドル構造体(RPGLEで言えばデータ構造)をSSL APIに合致するようにどのように作るかでした。<br />
幸い、インクルード・ファイルにC言語用のTypeDef構造体があったので、それに基づいて手さぐりで作成しました。<br />
こればかりはネットで検索しても出てこなかったものですから…。<br />
あ、自分の検索方法が悪かったのかもしれません。<br />
<br />
SSL通信のテストにあたって、IBM i では、公開認証局、ローカル認証局に係わらず、サーバ証明書はDCM(デジタル証明書マネージャ)で管理されています。<br />
もちろんテスト用の証明書を、公的認証局にお願いする(当然費用がかかる)訳にはいきませんので、IBM i 自身のローカル認証でサーバ証明書を発行しました。<br />
面倒なところは、ローカル認証のサーバ証明書は通信相手にあらかじめルート証明書(サーバ証明書に署名したホストの証明書)をインポートしておく必要があることです。<br />
公的認証局発行の証明書であれば、各マシンに、ルート認証局が自己署名したルート証明書はビルトインされていますので、提示したサーバ証明書は確認されるのですが、ローカル認証されたサーバ証明書は、ローカル認証局のルート証明書の公開鍵が無いと認証できないので、らかじめルート証明書を相手方にインポートしておく必要があります。(続く)Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-64851987878814978182018-01-08T09:33:00.000+09:002018-02-21T15:40:21.217+09:00~番外編 (APPC通信プログラムのテスト用に)~IBM i のSNA通信(APPCプログラミング編)<span style="font-family: "arial" , "helvetica" , sans-serif;">1台のIBM i で起動側、受動側のAPPC通信プログラムを作成してテストすることもできます。以前に「システム内通信(INTRA)」の稿を投稿したことがありましたが、それと同様な機能に「ローカルAPPC通信構成」があります。システム内通信では、送信・受信バッファは使用されませんでしたが、ローカルAPPC通信構成では、APPCのバッファ管理が有効になります。また、システム内通信では「同期会話」は使用できませんが、ローカルAPPC通信構成では使用することができます。</span><br />
<a name='more'></a><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">ローカルAPPC通信構成は、1つのローカルAPPC制御装置と、遠隔ロケーション名、構内ロケーション名を明示指定した2つのAPPC装置記述を作成します。ローカルAPPC制御装置では、APPN機能を使用することができませんので、APPC装置記述の自動構成は行われません。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ローカルAPPC制御装置の作成</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">CRTCTLAPPC CTLD(LOCALAPPC) LINKTYPE(*LOCAL) TEXT('LOCAL APPC 制御装置 ')</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ローカルAPPC制御装置に接続する、2つのAPPC装置記述の作成</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">ローカルAPPC通信構成では、APPN機能を使用しませんので、APPN(*NO)、RMTNETID(*NONE)を指定します。また、RMTLOCNAME、LCLLOCNAMEパラメータは、それぞれもう片方のLCLLOCNAME、RMTLOCNAMEパラメータと一致させます。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">CRTDEVAPPC DEVD(APPCSRC) RMTLOCNAME(APPCTGT) LCLLOCNAME(APPCSRC) RMTNETID(*NONE) CTL(APPCLOCAL) APPN(*NO) TEXT('APPC 装置 SOURCE')</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">CRTDEVAPPC DEVD(APPCTGT) RMTLOCNAME(APPCSRC) LCLLOCNAME(APPCTGT) RMTNETID(*NONE) CTL(APPCLOCAL) APPN(*NO) TEXT('APPC 装置 TARGET')</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">・構成をオン</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">構成状況処理の画面から、オプション1を使用して、構成をオンにします。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">WRKCFGSTS CFGTYPE(*CTL) CFGD(LOCALAPPC)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">・構成の確認</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">5250表示装置パススルー等を使用して、ローカルAPPC通信構成を確認します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">STRPASTHR RMTLOCNAME(*CNNDEV) CNNDEV(APPCSRC)</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-76515934787334679082017-12-01T09:32:00.000+09:002018-02-21T15:40:21.536+09:00~APPC通信プログラムの作成~IBM i のSNA通信 (APPCプログラミング編)<span style="font-family: "arial" , "helvetica" , sans-serif;">1)ICFファイルの作成</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">APPC通信プログラムを作成するには、起動側、受動側のそれぞれで、送受信するデータのフォーマット(レコード様式)の定義と、会話制御用のDDSキーワードを含むICFファイルを作成します。必ずしもフォーマットを一致させる必要はありませんが、一般的に送受信するデータのフォーマットは共通ですので、起動側、受動側で同じものを作成します。作成するICFファイルの名前は、同じでも異なっていても構いません。</span><br />
<a name='more'></a><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">この例では、起動側、受動側のAPPC通信プログラム用に、それぞれICFファイル「APPCICF」を作成します。DDSは同じもので、送受信するフォーマットを共通にします。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">・遠隔プログラムの起動に関するキーワード(レコード様式「EVKREC」)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">遠隔プログラムの起動用のレコード様式には、「EVOKE」と「SECURITY」キーワードを指定します。APPCの特徴でもある同期会話を行いたいときは、「SYNLVL(*CONFIRM)」キーワードも併せて指定します。これらのキーワードには、条件付けの標識は使えません。受動側プログラムは、この遠隔プログラム開始要求を受けて起動されますので、起動用のレコード様式は、起動側のプログラムでのみ使用します。受動側のプログラムから改めてAPPC同期会話を要求することはできません。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">EVOKEキーワードには、ライブラリ名/プログラム名と、遠隔プログラム起動時に渡されるパラメータをオプションで指定します。相手プログラムやライブラリー名が固定の時は、固定情報(リテラル)でも指定できますが、一般的には「プログラム・システム間フィールド」を指定します。プログラム・システム間フィールドは、通信相手に送信される値を指定するのではなく、書き出すプログラム側が、システムの管理機能に渡したい情報を指定するフィールドです。プログラム・システム間フィールドは、使用するレコード様式内に、38桁目の使用目的を「P」として定義してあげます。遠隔プログラムの起動時に渡されるパラメータにも、プログラム・システム間フィールドを使用することができます。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">システム提供のAPPC通信プログラムの場合、IBM i の実行管理機能で省略時のユーザーが割り当てられますが、ユーザー作成のAPPC遠隔プログラムの起動時には、遠隔システムに対してセキュリティ情報(ユーザー名、パスワード)を送ってあげる必要があります。それを指定するのが「SECURITY」キーワードで、オプション2が「パスワード」、オプション3が「ユーザー・プロファイル名」になります。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">・APPC会話の終了(切り離し)に関するキーワード(レコード様式「DETACH」)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">APPC会話の終了(切り離し)は、「DETACH」キーワードを含むレコード様式を出力することで行います。APPC会話の終了は、起動側、受動側のどちらからでも行うことができます。切り離し要求が出力されると、それまで送信用のバッファに溜まっていた送信データがあれば、それらが全て相手プログラムに送信され、それに続いて切り離し要求フラグが相手に送られます。バッファにデータが無い時は、切り離し要求フラグのみが送信されます。送られた切り離し要求フラグは、送信されたデータがあればその最後の送信データブロックと共に、送信データが無ければ切り離し要求フラグが単独で相手プログラムに受信されます。切り離しが成功した後は、起動側プログラムの場合、獲得済みのAPPC通信セッションを解放して終了するか、あるいはそのAPPC通信セッションを通して同じ遠隔ロケーションで、別の遠隔プログラムを開始することができます。受動側のプログラムは、獲得している「遠隔ロケーション名=*REQUESTER」のAPPC通信セッションを解放して終了します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">同期会話が有効なAPPC会話の場合、切り離しと一緒に確認を要求することもできます。確認要求付きで切り離しを送った場合、送った側のプログラムの実行は抑止(ブロック)され、相手からの応答を待ちます。確認を要求された側は、肯定応答/否定応答のいずれかを送って、切り離し要求に応答します。この時にデータを一緒に送信することはできません。(相手は送信状態で実行が抑止されているので、データを送っても受信されません。)肯定応答で応えた時は切り離しは成功してAPPC会話が終了し、否定応答で応答した時は、切り離しは失敗してAPPC会話は終了しません。切り離しの要求に対して否定応答を送った側が、次のデータや理由を送信する責任がありますので、否定された切り離し要求を送った側は、それらを受信する責任があります。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">・同期会話に関するキーワード</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">APPC同期会話を行うには、前にも記述しましたが、遠隔プログラム開始要求の「EVOKE」キーワードと一緒に「SYNLVL(*CONFORM)」を記述して、遠隔プログラムを開始しなければなりません。これで開始されたAPPC会話では、同期会話を行うことができるようになり、データ送信時に「CONFIRM」キーワードを有効にすることで、強制的にデータを相手に送るとともに、相手に確認を要求することができます。APPC会話の相手プログラムは、この送信データ(データが複数ブロックの場合は、最後のデータ)と一緒に相手の確認要求を受け取ります。(「RCVCONFIRM」キーワードの応答標識がON)確認要求を受け取った側は、相手に対して肯定応答(「RSPCONFIRM」キーワード)、または否定応答(「FAIL」キーワード)のみの応答を送信します。この時、確認を要求した相手はデータ送信状態で実行がブロックされて停止している訳ですから、応答を送る側は、肯定/否定応答以外のデータを送ることはできません。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">確認を要求した側は、相手が肯定応答(「RSPCONFIRM」キーワード)を返してきた場合は、確認要求付きのデータ送信が正常に完了しますが、相手が肯定応答以外(例えば「FAIL」キーワード)を返してきた場合、確認要求付きのデータ送信は例外エラーで終了し、データ送信状態も解除されてしまいますので、データ送信例外エラーのハンドリングをした後で、否定応答の理由などのデータを受信しなければなりません。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">・受信に関するキーワード</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">受信に関するキーワードは、プログラムがデータ受信状態にあるときに、データと一緒に、または単独で送信側からの状態通知を受け取って、指定されている応答標識をオンにしてくれるキーワードです。レコード・レベルでも指定できますが、一般的にはファイル・レベルで指定して、すべてのレコード様式での受信操作時に有効になるようにします。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">a.RCVDETACHキーワード</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">送信側が切り離し要求(「DETACH」キーワード)を送信してきたことを受信側プログラムに通知します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">b.RCVTRNRNDキーワード</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">送信側が、ALWWRTキーワード、またはINVITEキーワードを送信して、明示的に送信権を譲渡することを通知してきたか、あるいは送信側が送信状態から受信状態に転じて送信権を放棄したことを、受信側プログラムに通知します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">c.RCVCONFIRMキーワード</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">送信側が、CONFIRMキーワードを有効にしてデータを送信し、確認を要求していることを、受信側プログラムに通知します。これに対して受信側プログラムは、RSPCONFIRMキーワードを使用して肯定応答を行うか、FAILキーワードを使用して、否定応答を受け取り、送信権を受信側のプログラムに移します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">d.RCVFAILキーワード</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">送信側がFAILキーワードを有効にして送信してきたことを受信側プログラムに通知します。確認要求に対する否定応答にもFAILキーワードを使用しますが、この場合、RCVFAILキーワードの応答標識はONになりません。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">・送信に関するその他のキーワード</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">送信に関するキーワードは、送信側がデータと併せて、またはデータ無しの単独で使用するキーワードです。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">a.書き出し許可「ALWWRT」キーワード</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">送信権を持っている側が、受信状態の相手に対して送信権を明示的に譲渡することを指定します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">b.送信勧誘「INVITE」キーワード</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">相手にデータ送信を勧誘します。ALWWRTキーワードとの違いは、1)送信権があっても無くても送信することができる、2)送信勧誘後、一定時間データ受信を待機して、受信が無ければ送信勧誘をキャンセルすることができる、3)複数の通信相手(遠隔ロケーション)に対してデータの送信を勧誘できる、などがあります。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">c.レコード様式名通知「FMTNAME」キーワード</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">相手に、送信に使用したレコード様式名を通知し、受信レコード様式選択機能を使用してデータの受信を可能にするときに、送信側プログラムで使用します。ADDICFDEVEコマンドで、FMTSLT(*RMTFMT)キーワードの指定が必要です。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">d.受診データ内の文字値によるデータ受信「RECID」キーワード</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">受信側プログラムが、受信データ内の特定位置の文字値によって、データを受信するレコード様式を選択する時に使用します。ADDICFDEVEコマンドで、FMTSLT(*RECID)キーワードの指定が必要です。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">FMT * *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0001.00 *** テスト用 ICFF </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0002.00 A RCVDETACH(39) </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0003.00 A RCVTRNRND(40) </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0004.00 A RCVCONFIRM(38) </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0005.00 A INDARA </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0006.00 *** プログラム起動用 </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0007.00 A R EVKREC EVOKE(&X1LIB/&X1PGM +</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0008.00 A &X1PRDLIB) </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0009.00 A SECURITY(2 &X1PASS +</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0010.00 A 3 &X1USER) </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0011.00 A SYNLVL(*CONFIRM) </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0012.00 </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0013.00 A X1USER 10A P </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0014.00 A X1PASS 10A P </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0015.00 A X1PGM 10A P </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0016.00 A X1LIB 10A P </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0017.00 </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0018.00 A X1PRDLIB 10A P </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0019.00 *** 送受信用 </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0020.00 A R SNDRCV </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0021.00 A 56 CONFIRM</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0022.00 A 31 FRCDTA</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0023.00 A 32 ALWWRT</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0024.00 A X1DATA 4000O </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0025.00 </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0026.00 A X1JOBNAM 10A </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0027.00 A X1JOBUSR 10A </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0028.00 A X1JOBNBR 6A </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0029.00 A X1JOBID 16A </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0030.00 *** 切り離し用 </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0031.00 A R DETACH DETACH</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0032.00 A 56 CONFIRM </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0033.00 *** 肯定応答 </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0034.00 A R RSPCONF RSPCONFIRM</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0035.00 *** 否定応答 </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0036.00 A R RSPFAIL FAIL </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ICFファイルの作成と、プログラム装置項目の追加</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">ICFファイル用のDDSの入力が終了したら、ICFファイルを作成(コンパイル)します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">CRTICFF FILE(*CURLIB/ICFFILE) ACQPGMDEV(*NONE) MAXPGMDEV(1) WAITRCD(*NOMAX)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">a.ACQPGMDEVパラメータ</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">作成したICFファイルを使用するプログラムが、ICFファイルをオープンする時に、自動的に獲得されるプログラム装置名を指定します。明示的に「ACQ」命令でプログラム装置(=通信したい遠隔ロケーション)を獲得する時、あるいは複数のプログラム装置を使用する時は「*NONE」のままとします。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">b.MAXPGMDEVパラメータ</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">このICFファイルに追加するプログラム装置の最大数を指定します。プログラム装置=通信したい遠隔ロケーション=通信相手プログラムですから、1つのAPPC通信プログラムで、複数の遠隔ロケーション、または複数の相手プログラムと会話を行いたいときに変更します。省略値は1、最大値は256です。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">c.WAITRCDパラメータ</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">相手プログラムに対して送信勧誘を行って、受信待機する時間を指定したいときに使用します。省略値は*NOMAX(無制限)で、使用する時は秒数を指定します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">ICFファイルの作成終了後、APPC通信プログラムで使用するプログラム装置項目を追加します。ICFファイル再作成後は、プログラム装置項目も置き換えられてなくなっていますので、再度追加します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">a.起動側のAPPC通信プログラム用のプログラム装置項目</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">ADDICFDEVE FILE(*LIBL/ICFFILE) PGMDEV(SOURCE) RMTLOCNAME(TARGET) CMNTYPE(*APPC) FMTSLT(*PGM) CNVTYPE(*SYS)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">a.PGMDEVパラメータ</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">プログラム内で使用する、プログラム装置名を指定します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">b.RMTLOCNAMEパラメータ</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">通信相手の遠隔ロケーション名を指定します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">c.FMTSLT(*PGM)、CNVTYPE(*SYS)パラメータ</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">レコード様式選択機能として、FMTNAMEキーワード、RECIDキーワードを使用する時に、FMTSLTパラメータを使用します。レコード様式名での受信操作を行うときは、FMTSLT(*PGM)を指定します。CNVTYPE(*SYS)は、APPCマップ式会話を示します。ICFファイルを使用したAPPC通信では、一般的にCNVTYPE(*SYS)を使用します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">b.受動側nAPPC通信プログラム用のプログラム装置項目</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">ADDICFDEVE FILE(*LIBL/ICFFILE) PGMDEV(TARGET) RMTLOCNAME(*REQUESTER) CMNTYPE(*APPC) FMTSLT(*PGM) CNVTYPE(*SYS)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">PGMDEVパラメータは、プログラムで使用するプログラム装置名を指定します。RMTLOCNAMEパラメータには、予約語「*REQUESTER」を指定して、起動側プログラムが遠隔プログラム開始要求を出してきたAPPC通信セッションを獲得することを示します。FMTSLTパラメータ、CNVTYPEパラメータは、起動側のプログラム装置項目に一致させます。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">2)RPGLE APPC通信プログラムの作成</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">ICFファイルを作成したら、起動側、受動側でそれぞれAPPC通信プログラムを作成します。プログラムの作成には、メッセージ・フロー(データの送信順序)が重要ですので、あらかじめ双方で取り決めておきます。起動側のプログラムが開始され、受動側のプログラムを起動してAPPC会話が成立した時点では、データ送信をする側は起動側になります。起動側プログラムから遠隔プログラム開始要求で開始された受動側プログラムの第一オペレーションは「受信」操作になります。起動側プログラムが何も送信せずにいきなり受信に転じた場合、受動側プログラムは第一オペレーションで「送受反転」(RCVTRNRNDキーワードの応答標識ON)を受け取りますので、受動側プログラムが送信する側になります。あとは、メッセージ・フローに従った送受信操作を行います。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">IBM i で、起動側から遠隔プログラム開始要求を受けて開始される受動側プログラムは、通信サブシステム(QCMN、またはQBASE)内の通信ジョブで、経路指定プログラムとして開始されます。通信ジョブ用のジョブ記述は、省略値として「*USRPRF」となっていますので、遠隔プログラム開始要求で送られてきたユーザー・プロファイルにジョブ記述が指定されていて、ジョブ記述内にライブラリー・リスト等のジョブ初期設定情報が記述されていた場合は、受動側でRPGLEプログラムを直接呼び出すこともできますが、一般的には、ジョブのライブラリー・リストなどの設定を行うCLプログラムなどを呼び出して、CLプログラムからCALLコマンドでRPGLEプログラムを呼び出すようにします。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ファイル仕様書</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">ファイル仕様書でICFファイルを定義する時に必要なキーワードは、DEVIDキーワードとMAXDEVキーワードになります。DEVIDキーワードには、送信・受信操作を行うプログラム装置名を入れる変数を指定します。MAXDEVキーワードは、このファイルが複数装置ファイルであることを定義するとともに、プログラム装置の最大数を指定します。一般的にはICFファイルに定義されたプログラム装置数をそのまま使用しますので、MAXDEV(*FILE)を指定します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">ICFファイルを取り扱うときは、ファイルの入出力フィードバック域情報が必要になりますので、INFDSキーワードを使用して、ファイル情報データ構造を指定します。ファイル情報データ構造には、最後に操作したレコード様式名、プログラム装置名と、入出力操作毎に更新されるメジャー・マイナー戻りコードが含まれています。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">ICFファイルの入出力操作で、応答標識や条件付けの標識に対して独立標識域(01~99)を使用する時は、INDDSキーワードを使用します。これによって数字標識(01~99)に名前を付けることができて、より判りやすくなります。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">FMT * *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 .</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0004.00 FAPPCICF CF E WORKSTN USROPN </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0005.00 F INFDS(D#INFDS) </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0006.00 F INDDS(D#INDICATORS)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0007.00 F DEVID(F#PGMDEV) </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0008.00 F MAXDEV(*FILE) </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">・定義仕様書</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">定義仕様書では、ファイル情報データ構造(この例ではD#INFDS)、独立標識域用データ構造(この例ではD#INDICATORS)、</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">および操作するプログラム装置名用の変数を定義します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">FMT * *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 .</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0013.00 *** プログラム状況 </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0014.00 D SDS </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0015.00 D S#PROG 1 10 </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0016.00 D S#WSID 244 253 </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0017.00 D S#USER 254 263 </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0018.00 D S#JNBR 264 269 </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0019.00 *** ファイル情報 </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0020.00 D D#INFDS DS </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0021.00 D W#RCDFMT 261 270A </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0022.00 D W#PGMDEV 273 282A </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0023.00 D W#LC 370 371B 0</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0024.00 D W#TOP 378 379B 0</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0025.00 D W#MAJOR 401 402A </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0026.00 D W#MINOR 403 404A </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0027.00 *** 標識 </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0028.00 D D#INDICATORS DS </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0029.00 D I#FLASH 31 31N </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0030.00 D I#ALWWRT 32 32N</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0031.00 D I#RCVCONF 38 38N</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0032.00 D I#RCVDET 39 39N</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0033.00 D I#TRNRND 40 40N</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0034.00 D I#CONFIRM 56 56N</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">0041.00 D F#PGMDEV S 10A</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">・演算仕様書</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">a.ACQ命令</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">ICFファイル作成で「ACQPGMDEV(*NONE)」とした場合や、2つ以上のプログラム装置項目を使用する場合は、起動側、受動側プログラム共に通信に先だってACQ演算命令でプログラム装置を獲得します。起動側プログラムは、通信したい遠隔ロケーションが明示指定されているプログラム装置を獲得し、受動側プログラムは、遠隔ロケーション名として「*REQUESTER」が指定されているプログラム装置を獲得します。起動側、受動側の両方で獲得が成功すると、APPC会話が開始されます。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">b.REL命令</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">RPGLEプログラムで獲得したプログラム装置を解放します。解放の前に、切り離しを使用してAPPC会話を終了させておく必要があります。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">c.WRITE命令</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">データの送信、データとAPPC会話制御情報、まだはデータ無しでAPPC会話制御情報のみの送信を行うときに使用します。WRITE命令に先だって、どのプログラム装置に対しての操作なのかを、プログラム装置名フィールドに設定する必要があります。WRITE命令はレコード様式に対して行います。送信バッファ内のデータを強制的に送信するキーワード(FRCDTA、ALWWRT、CONFIRM、DETACHなど)を含むレコード様式を、WRITE命令で送信した場合、送信バッファはフラッシュされて、相手にデータ/制御情報が送信されます。以外の時は、送信データは送信バッファに蓄えられて、バッファが一杯になるか、送信状態だったプログラムが受信状態に反転するか、バッファ内のデータを強制送信するキーワードが有効な状態でのWRIT命令作で送信されます。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">APPC会話制御情報として、有効な確認要求(CONFIRMキーワード)を含むレコード様式を送信した場合、RPGLEプログラムは、相手からの確認応答/否定応答が返ってくるまで、実行がブロックされて停止します。確認要求に対して否定応答が返された場合は、WRITE命令は例外エラーで終了しますので、(E)オプションを付けて、エラー監視を行う必要があります。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">d.READ命令</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">受診バッファから、データおよびAPPC会話制御情報を読み取るために、READ命令を使用します。ADDICFDEVEコマンドで、FMTSLT(*PGM)としたプログラム装置からの読み取りは、レコード様式名を指定したREAD命令を使用します。INVITEキーワードを使用して送信勧誘をしたプログラム装置からの読み取り、ADDICFDEVEコマンドでFMTSLT(*RECID)やFMTSLT(*RMTFMT)を指定して、レコード様式選択機能を使用した読み取りを行うときは、ICFファイル名を指定したREAD命令を使用します。送信勧誘を行ったプログラム装置からの読み取りについては、プログラム装置名フィールドをブランクにしますが、それ以外の読み取り操作では、READ命令に先だって、どのプログラム装置から読み取るかをプログラム装置名フィールドに設定します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">FMT * *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 .</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0068.00 C EVAL F#PGMDEV = 'SOURCE'</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0069.00 C F#PGMDEV ACQ(E) APPCICF </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0070.00 C IF %ERROR </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0071.00 C EVAL W#CTL = 'END' </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0072.00 C LEAVESR </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0073.00 C ENDIF </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">FMT * *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 .</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0133.00 C WRITE DETACH</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">0134.00 C F#PGMDEV REL(E) APPCICF</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-45826692629480839362017-11-01T09:32:00.000+09:002018-02-21T15:40:20.840+09:00~非同期会話と同期会話~IBM i のSNA通信 (APPCプログラミング編)<span style="font-family: "arial" , "helvetica" , sans-serif;">APPC通信に限らず、ブロック単位でのプログラム同志の会話は基本的に「非同期」で行われます。つまり、送信側プログラムが送信操作を行っても、通常はその送信データはバッファに溜められ、通信プロトコルやバッファの大きさにによって異なりますが、次の送信データがバッファに到着する、バッファが一杯になる、明示的なバッファ内のデータの送信コマンドが出されるなどした時に、送信データは通信相手プログラムに送られ、相手側の受信用バッファに入れられます。</span><br />
<a name='more'></a><span style="font-family: "arial" , "helvetica" , sans-serif;">通信プログラムは、送信データをバッファに溜めずに、強制的に相手に送ることもできますが、通信相手がそのデータを受信バッファから受け取るかどうか(データ受信待ちでデータを受け取るタイミングにあるか)は、相手プログラムによります。また、送信データをバッファ内に溜めることなく強制的に相手に送ったとしても、送信側プログラムは送信操作が終了すると、停止することなく次の処理を行います。(受信側プログラムの受診バッファが一杯になった時は、送信できずに送信操作で停止します。)このように、プログラム同志の会話は非同期で行われています。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">APPC通信プロトコルでは、「同期会話」を使用することができます。これは、送信側のプログラムのデータ送信操作を、受信側のプログラムのデータ受信、受信側プログラムからの肯定・否定応答の受け取りまで完了させず、実行を抑止して待機させる機能です。これによって、送信側プログラムと受信側プログラムのデータ送受信操作を1つの動作として同期させることができるようになります。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">「同期会話」は、起動側プログラムが遠隔システム開始要求を送るときに、「この通信会話では同期会話を使用する」ことをオプションで宣言し、データの送信操作を行うときに、「これは確認を要求する送信操作」を明示することで行います。たとえ同期会話で通信会話を行うと指定しても、データ送信時に「確認要求」を指定しなければ、その送信操作は非同期でおこなわれます。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">実際に「同期会話」を使用するためには、ICFファイル用のDDSで必要なキーワードを指定します。起動側プログラムでは、遠隔プログラムの開始要求である「EVOKE」キーワードと一緒に「SYNLVL(*CONFIRM)」キーワードを指定してあげます。受動側のプログラムが、この遠隔プログラム開始要求を受け入れれば「同期会話」は使用可能になりますので、起動側/受動側を問わす、送信操作の段階で「CONFIRM」キーワードを付けて送信操作を行うと、それまでバッファに入っていた送信データとともに送信操作でのデータが相手に送られ、その送信操作は相手からの肯定/否定応答が返ってくるまで完了が抑止されることになります。</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-41010450148933394412017-10-01T09:31:00.000+09:002018-03-19T08:56:13.112+09:00~APPC通信セッションとAPPC通信会話~IBM i のSNA通信 (APPCプログラミング編)<span style="font-family: "arial" , "helvetica" , sans-serif;">2台のIBM i でAPPC通信構成が完了してAPPC通信リンクを活動化させると、物理的な接続の上にそれぞれのシステムのAPPC通信装置同士に論理的な接続が開始されます。これをAPPC通信セッションと言い、その数はお互いのシステムで定義されている「モード」を突き合わせる(交渉する)ことによって決定されます。</span><br />
<a name='more'></a><span style="font-family: "arial" , "helvetica" , sans-serif;">IBM i の場合、「モード」はモード記述(*MODD)と言うオブジェクトで定義されています。ユーザー作成のモード記述を利用することもできますが、「モード」の突き合わせは名前で行われるので、通信対象となる各システムに同じ名前で存在していなければならないために、一般的にシステム提供のモード記述を使用します。デフォルトのモード記述はネットワーク属性で定義されている「BLANK」が使用されます。モード記述には、最大セッション数と会話の最大数が定義されていて、お互いのシステムのモード記述を突き合わせたうえで、活動化したAPPC通信リンクでの最大数が決定されます。IBM i 同士の場合、最大数は512セッション/512会話となります。APPC通信構成で、APPN(*YES)とした通信構成では、モードは自動的に追加されて活動化されますが、APPN(*NO)として作成されたAPPC通信装置では、APPC通信装置作成時点で指定したモードのみを使用することができます。(最大数は14)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">APPC通信プログラムは、起動側/受動側でそれぞれ、このAPPC通信装置間のAPPC通信セッションのうちの1つを使用することで会話を行います。起動側APPC通信プログラムが開始されると、プログラムはまずAPPC通信セッションの獲得操作を行います。獲得が成功すると、獲得したAPPC通信セッションを通して、相手システムに「遠隔プログラム開始要求」を送って、通信相手システム内で受動側APPC通信プログラムを起動します。受信側APPC通信プログラムは、開始されると、起動側APPC通信プログラムが遠隔プログラム開始要求を送ってきたAPPC通信セッションの獲得操作を行って、起動側APPC通信プログラムとの会話を開始します。会話の終了は、起動側/受動側APPC通信プログラムのどちらからでも行うことができます。起動側APPCプログラムは、会話が終了した後、まだ獲得しているAPPC通信セッションを通して、別の受動側APPC通信プログラムを開始するか、APPC通信セッションを解放して、ローカル処理を続行するか、終了することができます。受動側APPC通信プログラムは、会話終了後、ローカル処理を続けるか終了します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">APPC通信セッションを獲得する場合、RPGLEプログラムでは「ACQ」(獲得)命令を使用します。終了する時は「REL」(解放)命令を使用して、取得していたAPPC通信セッションを解放します。獲得操作は、通信したい遠隔ロケーション、またはその遠隔ロケーション名を持つAPPC通信装置に対して行います。APPNネットワーク環境では、APPC通信装置が無ければ自動で作成されますので、一般的には遠隔ロケーション名を使用します。RPGLEプログラムでは、遠隔ロケーション名を明示的に指定するのではなく、ICFファイルに追加された、遠隔ロケーション名を含む「プログラム装置」を獲得することで、APPC通信セッションを獲得します。起動側のプログラムは、獲得したAPPC通信セッションを通して、遠隔プログラム開始要求を通信相手システムに送りますので、通信相手システム内の通信窓口名を示す遠隔ロケーション名が指定されているプログラム装置を獲得します。受動側のプログラムは、起動側のAPPC通信プログラムが遠隔プログラム開始要求を送ってきたAPPC通信セッションを獲得しなければならないために、遠隔ロケーション名として予約語「*REQUESTER」を指定したプログラム装置を獲得することで、起動側プログラムとの会話を始めます。</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-87262697754098804522017-09-01T09:31:00.000+09:002018-02-21T15:40:21.733+09:00~APPC通信プログラムを作成するには~IBM i のSNA通信 (APPCプログラミング編)<pre class="aLF-aPX-K0-aPE aLF-aPX-aLK-ayr-auR" style="background-color: white; font-size: 14px; white-space: pre-wrap; word-wrap: break-word;"><span style="font-family: "arial" , "helvetica" , sans-serif;">IBM i でAPPC通信プログラムを作成するには、システムAPIである「CPI-C」を利用する方法もありますが、RPGLEプログラマーにとってなじみやすい、「装置ファイル」を利用する方法が一般的です。「装置ファイル」は、IBM i に接続された表示装置、印刷装置などの各種装置をプログラムで取り扱うために使用するファイルで、表示装置であれば「表示装置ファイル」(DSPF)、印刷装置であれば「印刷装置ファイル」(PRTF)が使用されます。<a name='more'></a>APPC通信プログラムでは、APPC通信装置を扱うために「通信装置ファイル」(ICFF:Intersystem Communication Facility File)を使用します。ICFファイルは、送受信するデータのレコード様式を定義するほか、APPC通信機能用の制御情報を「キーワード」の形式で記述し、定義したものになります。記述内容は表示装置ファイルのそれとよく似ていますが、表示装置と違って通信装置には、画面上の「行/桁」や表示属性がありませんので、ICFFはこれらを除いたDSPFのようなものになります。</span></pre>
<pre class="aLF-aPX-K0-aPE aLF-aPX-aLK-ayr-auR" style="background-color: white; font-size: 14px; white-space: pre-wrap; word-wrap: break-word;"><span style="font-family: "arial" , "helvetica" , sans-serif;">2つのIBM i システムでAPPC通信構成が終了しているとして、起動システム側(CALLコマンドによって呼び出されるシステム側)と、受動システム側(APPC通信手順の遠隔プログラム開始要求を受けてプログラムが起動されるシステム側)それぞれのシステムで、ICFFとプログラム(例えばRPGLEプログラム)を作成することで、一つのAPPC通信アプリケーションを作成します。送受信するデータのレコード様式は、一般的に起動システム/受動システム側で共通ですので、両方のシステムで同じICFFを準備します。
ICFFを使用する通信プログラムは、APPC通信装置を直接指定して使用するのではなく、APPC通信装置に関連付けられた「プログラム装置」を通してAPPC通信装置にアクセスします。通信プログラムで使用されるプログラム装置は、ICFFファイルにあらかじめ追加しておきます。プログラム装置はICFFが再作成されると消えてしまいますので、再作成後にも再度追加してあげる必要があります。
APPC通信アプリケーションを作成するには、以下の手順で行います。</span></pre>
<pre class="aLF-aPX-K0-aPE aLF-aPX-aLK-ayr-auR" style="background-color: white; font-size: 14px; white-space: pre-wrap; word-wrap: break-word;"><span style="font-family: "arial" , "helvetica" , sans-serif;">a)起動システム側
・ICFファイルの作成
・ICFファイルに遠隔ロケーション名を明示指定した起動側プログラム装置項目を追加
・ICFファイルを使用する通信プログラムの作成
</span></pre>
<pre class="aLF-aPX-K0-aPE aLF-aPX-aLK-ayr-auR" style="background-color: white; font-size: 14px; white-space: pre-wrap; word-wrap: break-word;"><span style="font-family: "arial" , "helvetica" , sans-serif;">b)受動システム側
・ICFファイルの作成
・ICFファイルに「*REQUESTER」遠隔ロケーション名を指定した受動側プログラム装置項目を追加
・ICFファイルを使用する通信プログラムの作成</span></pre>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-40703224968994838152017-08-01T09:28:00.000+09:002018-02-21T15:40:42.119+09:00~IBM i のAPPC通信プログラム~ IBM i でのSNA通信(構成編)<pre class="aLF-aPX-K0-aPE aLF-aPX-aLK-ayr-auR" style="background-color: white; font-size: 14px; white-space: pre-wrap; word-wrap: break-word;"><span style="font-family: "arial" , "helvetica" , sans-serif;">前稿では、IBM i のSNA(APPC)通信構成、特に「ANYNET」と「EE」について書きましたが、今回はその通信構成を利用するユーザー作成のAPPC通信プログラムについて取り上げたいと思います。複数のIBM i を連携させて適用業務を実行したい場合、それぞれのシステムで稼働する通信プログラムを準備して、相互に情報のやり取りを行う必要性があります。もちろん、IBM i に豊富に準備されているアプリケーションを利用する方法もありますが、適用業務として必要な機能を盛り込んだ通信プログラムを作成して、実現する方法もあります。<a name='more'></a></span></pre>
<pre class="aLF-aPX-K0-aPE aLF-aPX-aLK-ayr-auR" style="background-color: white; font-size: 14px; white-space: pre-wrap; word-wrap: break-word;"><span style="font-family: "arial" , "helvetica" , sans-serif;">ユーザー作成の通信プログラムは、TCP/IPが事実上の業界標準となっている今、要求を受けるシステムでソケット通信手順で書かれだサーバー・プログラムを開始しておき、要求を出すシステム側でクライアント・プログラムを開始して要求を出す…と言った方式が主流になっていると思います。もちろん、RPGLEでTCP/IPソケット通信プログラムを作成して、これらを実現することは可能ですが、IBM i では、TCP/IPが標準となる以前から存在する、SNA通信プログラムでこれらを実現することも可能です。特に、複数のIBM i 同士でのSNA通信プログラムは、そのほとんどがプログラミング・インターフェースがなじみやすい、APPC通信手順で書かれると思います。</span></pre>
<pre class="aLF-aPX-K0-aPE aLF-aPX-aLK-ayr-auR" style="background-color: white; font-size: 14px; white-space: pre-wrap; word-wrap: break-word;"><span style="font-family: "arial" , "helvetica" , sans-serif;">APPC通信手順で作成された通信プログラムの特徴は、次のようなものがあげられます。
・構内システムで起動されたプログラムが、操作員の介在無しに、他方のシステムの通信プログラムを起動可能
・非同期会話、同期会話が選択可能
・確認要求を送信して、それに対する肯定/否定応答が可能(同期会話の場合)
・ストリーム形式/ブロック形式の両方に対応できる
・通信データのフォーマット情報のやり取り、およびフォーマットの自動選択が可能
・KEEP ALIVEの実装が不要(通信経路切断によるタイムアウト処理が不要)
特に、他方のシステムのプログラムの起動と、同期/非同期会話の選択がAPPCの特徴になると思います。</span></pre>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-80152330026860084152017-07-01T09:20:00.000+09:002018-03-19T08:58:42.984+09:00~3台のIBM i でSNA (APPC/APPN) 構成~IBM i でのSNA通信(構成編)<span style="font-family: "arial" , "helvetica" , sans-serif;">続いて、1つのLANセグメントに接続された2台のIBM i に加えて、ルータを介して接続された、遠隔セグメントに接続された1台のIBM i の構成を考えます。TCP/IPが既に構成されていて、それぞれのにIBM i に固定のIPアドレスが割り当てられており。TCP/IPの経路の設定もなされているものとします。</span><br />
<a name='more'></a><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">1台目:ネットワークID=APPN、制御点名=ABRAHAM、IPアドレス=192.168.1.101/24</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">2台目:ネットワークID=APPN、制御点名=BRADLEY、IPアドレス=192.168.1.201/24</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">3代目:ネットワークID=APPN、制御点名=CHARLIE、IPアドレス=172.23.0.176/16</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">(※ クリックすると図が大きくなります)</span><br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyKPD2VboLB6yqZaXDAkIkmbhCPNdK1GSafDCOIDZpiOq_iTNnhymUd1OnROSjO5OLpq5Ap6IutStdW3VcpL5uXkTK4ZSc5P_Bomq4_e3hlpV1zfxQKr1W1CvR-Uv35o725F8nxQP1-BA/s1600/3dai.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="419" data-original-width="691" height="194" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyKPD2VboLB6yqZaXDAkIkmbhCPNdK1GSafDCOIDZpiOq_iTNnhymUd1OnROSjO5OLpq5Ap6IutStdW3VcpL5uXkTK4ZSc5P_Bomq4_e3hlpV1zfxQKr1W1CvR-Uv35o725F8nxQP1-BA/s320/3dai.png" width="320" /></a></div>
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">2台のIBM i の時と同じように、ANYNETで2台ずつの組み合わせで(A)と(B)、(A)と(C)、(B)と(C)のように構成することも可能ですが、その場合さらに別のセグメントのIBM i が加わることになると構成が複雑になりますので、ここでは「EE」を使用して、(C)のIBM i をAPPNのネットワーク・ノードとして構成します。(C)をネットワーク・ノードとして構成した場合、(C)の先に別のLANセグメントがあって、IPルーティングをしない設定になっていたとしても、APPNの中継機能によって、APPCアプリケーションのセッションは中継されます。また(C)の先のセグメントにIBM i (D)が追加されたとしても、(A)、(B)システムでは通信構成を変更することなく、(C)(D)間のSNA通信構成をするだけで、(C)システムのロケーション探索機能が、追加されたセグメント内のIBM i (D)のAPPC通信ロケーションを検索してくれるので、(A)、(B)システムからは、APPC通信構成を追加することなく、(D)システム内のAPPC通信ロケーションを指定して、APPC通信を開始することができます。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">追加された(D)から、(A)、(B)どちらのシステムに対しても、(A)(B)システム内のロケーションを直接指定して、APPC通信アプリケーションを開始することができます。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">1)ネットワーク属性の確認</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">2台のIBM i の時と同様にそれぞれのIBM i で「DSPNETA」コマンドを使用して、ネットワーク属性を表示します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ローカル・ネットワークID(出荷時点では「APPN」)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ローカル制御点名(出荷時点ではシステム名)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・省略時のローカル・ロケーション(出荷時点ではローカル制御点名と同じ)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・APPNノード・タイプ(出荷時点では「*ENDNODE」)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・サーバー・ネットワークID/ 制御点名(出荷時点では「*LCLNETID *ANY」)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ANYNETサポートの許可(出荷時点では「*YES」)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・HPRトランスポート・タワー・サポートの許可(出荷時点では「*NO」)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">この構成では「EE」を使用するために、HPRトランスポート・タワー・サポートの許可を「*YES」に変更する必要があります。また、(A)、(B)システムに対してAPPNネットワーク機能を提供する(C)システムを、APPNノード・タイプ「*NETNODE」として構成します。(A)、(B)システム内で制御点名と省略時の構内ロケーション以外のロケーション名を使用する時は、(A)、(B)システムのサーバー・ネットワークID/ 制御点名に(C)システムのネットワークID.制御点名を指定します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">こうすることで、APPNの制御点セッションを通して(A)(B)内のAPPC通信ロケーションが(C)システムに登録されます。(A)(B)システムで制御点名以外のロケーション名を使用しない時は、この設定は必須ではありません。これは、(C)システムのAPPC通信構成によって、(C)システムは(A)(B)両方のシステムの制御点名を知ることができるからです。これらの拡張分散ネットワーク機能(APPN)については、機会があれば別稿で説明できたらと考えています。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">ネットワーク属性の変更は、「CHGNETA」コマンドで行います。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">2)IPアドレスの確認</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">それそれのIBM i で「CFGTCP」コマンド、または「NETSTAT OPTION(*IFC)」コマンドを使用して、構成したいサブネットに接続されているTCP/IPインターフェースのIPアドレス/サブネット・マスクを表示します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">3)構成のための情報</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">それぞれのシステムの構成のための情報は以下のようになります。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">(A)システム</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ローカル・ネットワークID=APPN</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ローカル制御点名=ABRAHAM</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・省略時のローカルロケーション名=ABRAHAM</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・APPNノード・タイプ=*ENDNODE</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・サーバー・ネットワークID/ 制御点名=APPN.CHARLIE</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・HPRトランスポート・タワー・サポートの許可=*YES</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・IPアドレス/サブネット・マスク=192.168.1.101/255.255.255.0</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">(B)システム</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ローカル・ネットワークID=APPN</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ローカル制御点名=BLADLEY</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・省略時のローカルロケーション名=BLADLEY</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・APPNノード・タイプ=*ENDNODE</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・サーバー・ネットワークID/ 制御点名=APPN.CHARLIE</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・HPRトランスポート・タワー・サポートの許可=*YES</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・IPアドレス/サブネット・マスク=192.168.1.201/255.255.255.0</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">(C)システム</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ローカル・ネットワークID=APPN</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ローカル制御点名=CHARLIE</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・省略時のローカルロケーション名=CHARLIE</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・APPNノード・タイプ=*NETNODE</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・サーバー・ネットワークID/ 制御点名=*LCLNETID *ANY</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・HPRトランスポート・タワー・サポートの許可=*YES</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・IPアドレス/サブネット・マスク=172.23.0.176/255.255.0.0</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">4)それぞれのシステムでの通信構成</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">「ANYNET」の通信構成と違って「EE」の通信構成では、通信相手システムのネットワークID.制御点名とともにIPアドレスまたはTCP/IPホスト名を指定するので、TCP/IPホスト・テーブル項目の追加は不要です。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">(A)システム</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・「CRTCTLAPPC」コマンドを使用して、APPC制御装置記述を作成します。LINKTYPEには「*HPRIP」を指定します。EEでも、ネットワーク層以下はTCP/IPを利用するため、制御装置を接続する回線は指定しません。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;"> CRTCTLAPPC CTLD(EECHARLIE) LINKTYPE(*HPRIP) RMTINTNETA('172.23.0.176') LCLLINTNETA(*SYS) RMTNETID(*NETATR) RMTCPNAME(CHARLIE) CPSSN(*YES) NODETYPE(*NETNODE) TEXT('EE TO CHARLIE') </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">(A)システム</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・APPC制御装置記述</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;"> CRTCTLAPPC CTLD(EECHARLIE) LINKTYPE(*HPRIP) RMTINTNETA('172.23.0.176') LCLLINTNETA(*SYS) RMTNETID(*NETATR) RMTCPNAME(CHARLIE) CPSSN(*YES) NODETYPE(*NETNODE) TEXT('EE TO CHARLIE')</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">(A)から(B)システムへのAPPCアプリケーション通信は、ネットワーク・ノードである(C)によって中継されますので、APPC制御装置記述の作成は不要です。(中継させたくない時は、手動で作成することもできます)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">(B)システム</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・APPC制御装置記述</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;"> CRTCTLAPPC CTLD(EECHARLIE) LINKTYPE(*HPRIP) RMTINTNETA('172.23.0.176') LCLLINTNETA(*SYS) RMTNETID(*NETATR) RMTCPNAME(CHARLIE) CPSSN(*YES) NODETYPE(*NETNODE) TEXT('EE TO CHARLIE') </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">(B)から(A)システムへのAPPCアプリケーション通信は、ネットワーク・ノードである(C)によって中継されますので、APPC制御装置記述の作成は不要です。(中継させたくない時は、手動で作成することもできます)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">(C)システム</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・(C)システムでは、(A)システム宛と(B)システム宛のAPPC制御装置記述を作成します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;"> CRTCTLAPPC CTLD(EEABRAHAM) LINKTYPE(*HPRIP) RMTINTNETA('192.168.1.101') LCLLINTNETA(*SYS) RMTNETID(*NETATR) RMTCPNAME(ABRAHAM) CPSSN(*YES) NODETYPE(*ENDNODE) TEXT('EE TO ABRAHAM') </span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;"> CRTCTLAPPC CTLD(EEBLADLEY) LINKTYPE(*HPRIP) RMTINTNETA('192.168.1.201') LCLLINTNETA(*SYS) RMTNETID(*NETATR) RMTCPNAME(BLADLEY) CPSSN(*YES) NODETYPE(*ENDNODE) TEXT('EE TO BLADLEY')</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">5)構成の活動化</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">(A)(B)(C)のIBM i の構成が完了したら、それぞれのシステムで「VRYCFG」コマンドを使用して、作成したEE用APPC通信制御装置を、オンに構成変更します。「WRKCFGSTS CFGTYPE(*CTL) CFGD(*APPC)」のオプション=1を使用して、オンに構成変更することもできます。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">EE用のAPPC制御招致記述がオンに構成変更され、活動化すると、仮想のAPPC制御装置が無ければ作成され、この構成では制御点セッションを使用するように構成されている(CPSSN(*YES)となっている)ので、制御点セッション用のAPPC装置記述が自動的に作成されて、活動化されます。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">6)利用するAPPCアプリケーション用の構成</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">APPCアプリケーション用の構成は、APPNネットワーク機能を使用する、使用しないにかかわらず同じです。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">ただ、5250表示装置パススルーにはホップbyホップの中継機能がありますが、指定するAPPC装置記述名はAPPN(*NO)でなければならないため、(A)→(C)→(B)システム等の5250表示装置パススルーを実行したい時は、(A)システムで(B)システム内のロケーション名を指定します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;"> STRPASTHR RMTLOCNAME(*CNNDEV) CNNDEV(CHARLIE BLADLEY) → ×</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"> STRPASTHR RMTLOCNAME(BLADLEY) → ○</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">APPCアプリケーションの分散データ管理機能(DDM)には、もともと中継機能がありませんので、 複数システムを経由するようなDDMを実行したい時は、EEでの構成が必要になります。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">次回は、SNA(APPC)通信構成を使用した、ユーザー作成のAPPCアプリケーション・プログラムについて投稿したいと考えています。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">(T&Trustの爺)</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-678386201512769942017-06-01T09:12:00.000+09:002018-02-21T15:41:06.276+09:00~2台のIBM i でSNA (APPC/APPN) 構成~IBM i でのSNA通信(構成編)<span style="font-family: "arial" , "helvetica" , sans-serif;">ここでは、1つのEthernet LANセグメントに接続された2台のIBM iのSNA通信構成を考えてみます。既にEthernet LAN回線の作成は済んでいて、TCP/IPインターフェースの構成で固定IPアドレスがそれぞれのIBM i に割り当てられているものとします。2台のIBM i ですので、APPNのネットワーク機能を提供してくれる「EE」で構成することもできますが、ここではよりシステム資源の使用の少ない「ANYNET」で構成します。必要に応じて様々なオプション通信構成もありますが、ここでは最低限必要な構成のみにとどめます。</span><br />
<a name='more'></a><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">1台目:ネットワークID=APPN、制御点名=ABRAHAM、IPアドレス=192.168.1.101/24</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">2台目:ネットワークID=APPN、制御点名=BRADLEY、IPアドレス=192.168.1.201/24</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">(※ クリックすると図が大きくなります)</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLzJkj7svSgN6PlAi6W2s4pxc4mjxfmh6ga88AzoGhEXL9vn67X5Uf59zxbVocnN7yOkU-cHcWmLqCBoOi7CFrM1JnJD1Dw7SRgjylD-RrhaLb7oPgxhL93T4KFilYX16QzWjFC1c-Uvw/s1600/img_sna2dai.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="215" data-original-width="595" height="115" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLzJkj7svSgN6PlAi6W2s4pxc4mjxfmh6ga88AzoGhEXL9vn67X5Uf59zxbVocnN7yOkU-cHcWmLqCBoOi7CFrM1JnJD1Dw7SRgjylD-RrhaLb7oPgxhL93T4KFilYX16QzWjFC1c-Uvw/s320/img_sna2dai.PNG" width="320" /></a></div>
<br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">構成にあたっては、まず情報の収集を行います。TCP/IPネットワークでは、IPアドレス、またはホスト名でコンピューターを識別しますが、SNA通信では、「ネットワークID.制御点名」の形式でコンピュータを特定します。一つのコンピュータの中には、SNA通信用の窓口(ロケーションと言います)があり、それぞれのロケーションは「ネットワークID.ロケーション名」で識別されます。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">SNAネットワークでコンピュータを唯一無二に識別する「ネットワークID.制御点名」は、そのコンピュータの省略時のロケーションとしても使用されます。別々のコンピュータの中のSNA通信プログラムは、相手コンピュータ内のロケーション(これを「遠隔ロケーション」と言います)と結びついている、自コンピュータ内のロケーション(これを「構内ロケーション」と言います)を通して、相手システム内のSNA通信プログラムと通信を行います。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">1)ネットワーク属性の確認</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">それぞれのIBM i で「DSPNETA」コマンドを使用して、ネットワーク属性を表示します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ローカル・ネットワークID(出荷時点では「APPN」)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ローカル制御点名(出荷時点ではシステム名)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・省略時のローカル・ロケーション(出荷時点ではローカル制御点名と同じ)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・APPNノード・タイプ(出荷時点では「*ENDNODE」)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ANYNETサポートの許可(出荷時点では「*YES」)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・HPRトランスポート・タワー・サポートの許可(出荷時点では「*NO」)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">ローカル・ネットワークIDの「APPN」は変更することもできますが、特に必要のない限りはこのままにしておきます。システム名、ローカル制御点名、省略時のローカル・ロケーション名を、それぞれ別の名前にすることも可能ですが、システム名を除いてそれぞれの名前は、SNAネットワークでは固有でなければならず、管理が複雑になるので、特に必要のない限りは同じにしておきます。なお、システム名の出荷時点の値は、「S」+製造番号となっています。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">APPNノード・タイプは、他のコンピュータに対して、APPNネットワーク機能を提供するかどうかを指定するもので、「*ENDNODE」とした場合は提供せず、「*NETNODE」とした場合はAPPNネットワーク機能を提供します。他に、APPNバックボーン・ネットワークを構成する時に使用する、代表ENDNODE的な「*BEXNODE」もあります。この例では、2台のIBM i で、他にネットワーク機能を提供する必要はありませんので、両システムともに「*ENDNODE」にします。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">この構成では、「ANYNET」を使用するので、両システムとも「ANYNETサポートの許可」を「*YES」に、「HPRトランスポート・タワー・サポートの許可」を「*NO」にします。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">ネットワーク属性の変更は「CHGNETA」コマンドで行います。一部のパラメータは、システム内のAPPN(*YES)となっているAPPC制御装置が、すべてオフに構成変更されていないと変更できません。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">APPC制御装置をオフに構成変更するには、「VRYOFF」コマンド、または「WRKCFGSTS」コマンドを使用します。「WRKCFGSTS CFGTYPE(*CTL) CFGD(*APPC)」とすると、一覧を表示して、オプション=2でオフに構成変更することができます。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">2)IPアドレスの確認</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">それそれのIBM i で「CFGTCP」コマンド、または「NETSTAT OPTION(*IFC)」コマンドを使用して、構成したいサブネットに接続されているTCP/IPインターフェースのIPアドレス/サブネット・マスクを表示します。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">3)構成のための情報</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">それぞれのシステムの構成のための情報は以下のようになります。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">(A)システム</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ローカル・ネットワークID=APPN</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ローカル制御点名=ABRAHAM</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・省略時のローカルロケーション名=ABRAHAM</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・APPNノード・タイプ=*ENDNODE</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ANYNETサポートの許可=*YES</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・IPアドレス/サブネット・マスク=192.168.1.101/255.255.255.0</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">(B)システム</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ローカル・ネットワークID=APPN</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ローカル制御点名=BLADLEY</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・省略時のローカルロケーション名=BLADLEY</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・APPNノード・タイプ=*ENDNODE</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・ANYNETサポートの許可=*YES</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・IPアドレス/サブネット・マスク=192.168.1.201/255.255.255.0</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">4)それぞれのシステムでの通信構成</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">(A)システム</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・「CRTCTLAPPC」コマンドを使用して、APPC制御装置記述を作成します。LINKTYPEには「*ANYNW」を指定します。ANYNETでは、ネットワーク層以下はTCP/IPを利用するため、制御装置を接続する回線は指定しません。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;"> CRTCTLAPPC CTLD(AYBLADLEY) LINKTYPE(*ANYNW) RMTNETID(*NETATR) RMTCPNAME(BLADLEY) HPR(*YES) TEXT('ANYNET TO BLADLEY')</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">・「ADDTCPHTE」コマンドを使用して、TCP/IPの構成に、IPアドレスとSNAネットワーク内のコンピュータ名とのマッピングを追加します。SNAネットワークでは「ネットワークID.制御点名」ですが、TCP/IPホスト・テーブルでは「制御点名.ネットワークID」となります。そのあとに、ANYNETを示す予約語「.SNA.IBM.COM」を付けます。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;"> ADDTCPHTE INTNETADR('192.168.1.201') HOSTNAME((BLADLEY.APPN.SNA.IBM.COM)) TEXT('FOR ANYNET')</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">(B)システム</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">・APPC制御装置</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;"> CRTCTLAPPC CTLD(AYABRAHAM) LINKTYPE(*ANYNW) RMTNETID(*NETATR) RMTCPNAME(ABRAHAM) HPR(*YES) TEXT('ANYNET TO ABRAHAM')</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">・TCP/IPホスト・テーブル</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;"> ADDTCPHTE INTNETADR('192.168.1.101') HOSTNAME((ABRAHAM.APPN.SNA.IBM.COM)) TEXT('FOR ANYNET')</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">5)構成の活動化</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">(A)(B)両方のIBM i の構成が完了したら、それぞれのシステムで「VRYCFG」コマンドを使用して、作成したANYNET用APPC通信制御装置を、オンに構成変更します。「WRKCFGSTS CFGTYPE(*CTL)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">CFGD(*APPC)」のオプション=1を使用して、オンに構成変更することもできます。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">APPC通信プログラム用の窓口であるロケーションは、IBM i ではAPPC装置記述として作成されます。APPC装置記述は、手動で作成することもできますが、APPNの機能によって自動的に作成されますので、APPN(*YES)となっているAPPC制御装置記述に対しては、手動で作成する必要はありません。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">(A)(B)のIBM i の例では、両方のシステムでANYNET用APPC通信制御装置をオンに構成変更した後で、例えば(A)から(B)に対して5250表示装置パススルーを実行すると、その時点で両方のシステムにAPPC装置記述が作成され、モード記述が追加されて、APPC装置がオンに構成変更されて活動状態になります。ここで作成されたAPPC装置記述は、(B)から(A)に対してのAPPC通信にも使用されます。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;"> STRPASTHR RMTLOCNAME(BLADLEY)</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">6)利用するAPPCアプリケーション用の構成</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">APPC通信プログラム用の通信構成が終了したら、利用するAPPCアプリケーション用の個別の構成を行います。例えば、5250表紙装置パススルーでは、ほとんどはシステムの出荷時点の状態でそのまま利用できるようになっていますが、仮想表示装置の自動構成数の限定、自動サインオン制御などの調整を行い、分散データ管理機能(DDM)であれば、DDMファイルの作成や、DDMアクセスの不許可などの設定を行います。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">ユーザー作成のAPPCアプリケーションを利用する場合、(A)(B)それぞれのIBM i で起動側、起動される側のプログラミングを行います。プログラミングに関しては、別稿でまとめることにします。</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4341188905201333806.post-56219103025238561282017-05-01T09:05:00.000+09:002018-02-21T15:39:18.127+09:00~SNA通信構成の必要性~ IBM i でのSNA通信(構成編)<span style="font-family: "arial" , "helvetica" , sans-serif;">例えば、1)本番機と開発機、あるいは業務Aと業務B、C用など、1拠点に複数のIBM iを導入するような場合、または、2)拠点毎にIBM iを導入して、拠点サーバとして運用したり、負荷分散/障害対策の目的で拠点毎にIBM iを導入して、拠点ごとに同じアプリケーションを運用するような場合、あるいは、3)メイン・フレームの周辺ノードとして、IBM iを利用するような場合など、複数のIBM iを導入して運用するケースがあると思います。いずれの場合もIBM iを連携させて運用するには、それぞれを通信回線を通して接続し、何らかの情報交換の仕組みを準備して運用されることと思います。</span><br />
<a name='more'></a><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">複数のIBM iを接続する場合、専用WAN回線を準備してメッシュ型に配置、あるいは分岐WAN回線や、パケット交換/フレームリレー等の多チャネル交換WAN回線で接続することもできます。しかし、回線維持費用の観点から、IBM i をLANに接続し、LANセグメント同士を比較的安価なIPルータを介して、相互接続して運用されるケースが多いのではないかと思います。ただし、メイン・フレームの周辺ノードとしてIBM i を運用する場合は、メイン・フレームとIBM i を専用線で接続し、複数セッションを構成して運用するケースもあるかもしれません。IBM i のメイン・フレームとのSNA通信は豊富にあって、メイン・フレームの種類や使用目的で選択する必要があるので、ここでは触れず、主に1)、2)のような、IBM i同士の連携運用に関して触れることにします。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">IBM i 同士の接続に関しては、1)、2)共に、IBM i をLANセグメント(多くはEthernet)に接続して、IBM i にプライベートなIPアドレスを割り振って、TCP/IPプリケーションを使用されることになると思います。IBM i の「TELNET」、「FTP」に代表される豊富なTCP/IPアプリケーションで事足りる事が多いかもしれません。また、従来はSNAアプリケーション(APPCアプリケーション)であった「DDM」や「DRDA」もTCP/IP対応になっていますので、これらを利用することもあるかと思います。残念ながら、オブジェクト配布機能に関しては、トランスポートとしてTCP/IPが使用できませんので、従来どおりSNA(APPC)通信構成が必要になります。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">特に、2)の同じ業務の相互運用に関して障害対策目的で運用する場合、障害発生時の業務停止時間を最短にするには、相互間でのデータの同期に加えて、相互の情報の同期の必要が発生します。A拠点で障害が発生して、IBM i サーバは使用できなくなった、あるいは定期メンテナンスでB拠点のIBM i サーバが停止するが、業務はそのまま続行する…、と言ったケースで、それぞれ他方の拠点にクライアントを接続して業務を継続するには、a)正常稼働時の相互に同期する機能b)障害/計画停止発生後、復旧して、停止時間中のデータを処理して他方に追い付く機能などが求められます。これらはハードウェアのクラスタ化などでも達成できると思いますが、IBM i に標準で準備されているいくつかの機能を組み合わせて使用し、それぞれのIBM i の情報を通信プログラムでやり取りしてあげることで、要件に合ったシステムをきめ細やかに作りこんであげることもできます。。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">IBM i の標準の機能と通信プログラムの組み合わせで、このような高可用性を実現しようとしようとした場合、ほとんどのケースではIBM i のTCP/IPアプリケーションと、ソケットを使用した通信プログラムを利用すれば解決できると思います。しかし、ソケット通信プログラムには、その手順の中に相手システム内でソケット通信プログラムを起動する機能はありませんので、相手システム内でプログラムの起動が必要な時は、rexecなどの他のTCP/IPアプリケーションと組み合わせて使用することになります。SNA(APPC)通信プログラムでは、その通信手順の中に「遠隔システムでのプログラムの起動」を行う機能がありますので、TCP/IPの接続待ち受け型(デーモン型)アプリケーションを起動しておくといった必要はありません。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">また、例えばオブジェクト配布機能などのAPPCアプリケーションを利用する場合は、SNA通信構成(APPC/APPN通信構成)が必要になります。APPC/APPN通信構成もTCP/IP同様にアプリケーションとは独立しているため、拠点間に1つだけ構成してあげれば、複数のAPPCアプリケーションで使用することができます。また、APPC/APPN通信構成1つで複数セッションをサポートするので、1つの構成で同時に複数のAPPCアプリケーションを、拠点の双方から利用することができます。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">APPC/APPN通信構成は非交換/交換2地点間、非交換分岐等のWAN回線、EthernetなどのLAN回線を使用して構成することも可能ですが、多くはLAN回線で構成されたTCP/IPに追加する形で構成されることが多いと思います。その方法としては、1)IP上のSNA(以下、ANYNET),、2)エンタープライズ・エクステンダー(以下、EE)の2種類があります。どちらも、経路制御層以下のパケット転送に関してはTCP/IPの「IP」を使用し、アプリケーション・プログラムに対するインターフェースはSNA(APPC)を利用します。2台のIBM i のみであれば、SNA通信でのネットワーク機能である「APPN」を使用しませんので、「ANYNET」と「EE」のどちらを使用しても、ほんの少しの構成上の違い程度しかありませんが、複数のLANセグメントにある3台以上のIBM i をANY TO ANYで接続できるようにするためには、APPNの制御点セッションがサポートされ 「EE」を利用した方が便利です。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">APPC/APPNとひとまとめにして呼んでいますが、APPC→エンド・ポイントで活動する、APPC手順で書かれた通信プログラムに対するインターフェースAPPN→ネットワーク層以下で、SNAフレームを転送する機能の意味で、APPCはTCP/IPのTCPに相当する部分のプログラム・プロトコル(規約)、APPNはTCP/IPのIP部分に相当するネットワーク機能の提供と、ざっくりと言い換えることもできると思います。</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">「EE」のAPPNネットワーク機能の一部はTCP/IPのUDPで動作するので、厳密に言うときれいに分離しているとは言い切れませんが…。</span><br />
<br />Unknownnoreply@blogger.com0