IBM i Free Format RPG 入門
日本アイ・ビー・エム株式会社
IBM Systems.ハードウェア事業本部
Power Systems テクニカルセールス
2015年2月26 日 rev 1.0
2015年2月 Power Systems テクニカル・セミナー
© 2015 IBM Corporation 2
■© IBM Corporation 2015. All Rights Reserved.
■ワークショップ、セッション、および資料は、IBMまたはセッション発表者によって準備され、それぞれ独⾃の⾒解を反映したものです。それらは情報提 供の目的のみで提供されており、いかなる参加者に対しても法律的またはその他の指導や助⾔を意図したものではなく、またそのような結果を⽣むものでも ありません。本講演資料に含まれている情報については、完全性と正確性を期するよう努⼒しましたが、「現状のまま」提供され、明⽰または暗⽰にかかわ らずいかなる保証も伴わないものとします。本講演資料またはその他の資料の使⽤によって、あるいはその他の関連によって、いかなる損害が⽣じた場合も 、IBMは責任を負わないものとします。 本講演資料に含まれている内容は、IBMまたはそのサプライヤーやライセンス交付者からいかなる保証または表明を 引きだすことを意図したものでも、IBMソフトウェアの使⽤を規定する適⽤ライセンス契約の条項を変更することを意図したものでもなく、またそのような 結果を⽣むものでもありません。 ■本講演資料でIBM製品、プログラム、またはサービスに⾔及していても、IBMが営業活動を⾏っているすべての国でそれらが使⽤可能であることを暗⽰する ものではありません。本講演資料で⾔及している製品リリース日付や製品機能は、市場機会またはその他の要因に基づいてIBM独⾃の決定権をもっていつで も変更できるものとし、いかなる⽅法においても将来の製品または機能が使⽤可能になると確約することを意図したものではありません。本講演資料に含ま れている内容は、参加者が開始する活動によって特定の販売、売上高の向上、またはその他の結果が⽣じると述べる、または暗⽰することを意図したもので も、またそのような結果を⽣むものでもありません。 パフォーマンスは、管理された環境において標準的なIBMベンチマークを使⽤した測定と予測に基づい ています。ユーザーが経験する実際のスループットやパフォーマンスは、ユーザーのジョブ・ストリームにおけるマルチプログラミングの量、⼊出⼒構成、 ストレージ構成、および処理されるワークロードなどの考慮事項を含む、数多くの要因に応じて変化します。したがって、個々のユーザーがここで述べられ ているものと同様の結果を得られると確約するものではありません。 ■記述されているすべてのお客様事例は、それらのお客様がどのようにIBM製品を使⽤したか、またそれらのお客様が達成した結果の実例として⽰されたも のです。実際の環境コストおよびパフォーマンス特性は、お客様ごとに異なる場合があります。 ■IBM、IBM ロゴ、ibm.com、[当該情報に関連し商標リスト中に掲載されたIBMブランド、製品名称があれば追加する]は、世界の多くの国で登録された International Business Machines Corporationの商標です。
■他の製品名およびサービス名等は、それぞれIBMまたは各社の商標である場合があります。
■現時点での IBM の商標リストについては、www.ibm.com/legal/copytrade.shtmlをご覧ください。
■Adobe, Adobeロゴ, PostScript, PostScriptロゴは、Adobe Systems Incorporatedの米国およびその他の国における登録商標または商標です。
■IT Infrastructure Libraryは英国Office of Government Commerceの一部であるthe Central Computer and Telecommunications Agencyの登録商標で す。
■インテル, Intel, Intelロゴ, Intel Inside, Intel Insideロゴ, Intel Centrino, Intel Centrinoロゴ, Celeron, Intel Xeon, Intel SpeedStep, Itanium, および Pentium は Intel Corporationまたは子会社の米国およびその他の国における商標または登録商標です。
■Linuxは、Linus Torvaldsの米国およびその他の国における登録商標です。
■Microsoft, Windows, Windows NT および Windowsロゴは Microsoft Corporationの米国およびその他の国における商標です。 ■ITILは英国The Minister for the Cabinet Officeの登録商標および共同体登録商標であって、米国特許商標庁にて登録されています。 ■UNIXはThe Open Groupの米国およびその他の国における登録商標です。
■Cell Broadband Engineは、Sony Computer Entertainment, Inc.の米国およびその他の国における商標であり、同社の許諾を受けて使⽤しています。 ■JavaおよびすべてのJava関連の商標およびロゴは Oracleやその関連会社の米国およびその他の国における商標または登録商標です。
© 2015 IBM Corporation 3
更新履歴
© 2015 IBM Corporation 4
概要
■
RPGⅢからの既存プログラマー、および、これからRPG
を始められる皆様向けにFree Format RPGの最新情報を
提供します。
■
IBM i をご使⽤のお客様環境では、RPGプログラムが基
幹システムとして稼動し、OSのバージョン上位互換性や
アプリケーション開発・運⽤の容易さのメリットを提供
し続けています。
■
このセッションでは、Eclipseベースの開発ツールRDiの
エディターを使ったFree Format RPGのコーディング・
サンプルも交えてご紹介します。
© 2015 IBM Corporation 5
目次
1. IBM i におけるアプリケーション開発
2. RPGⅣとは
1. RPGⅣの特徴
2. ILE RPG
3. Free Format RPG とは
4. Free Format RPG コーディング・サンプル
1. 事前準備
− Rational Developer for i のインストール
2. 初心者向けチュートリアル
© 2015 IBM Corporation 6
© 2015 IBM Corporation 7
VIOS
Power Hypervisor ファームウェアによる仮想化
I/O 仮想化
サーバー統合
アプリ資産継承
•RPG
• COBOL
• C/C++
TIMI 仮想マシン
SLIC マイクロコード
相互連携オープン性
• Java(WAS)
• PHP
• Ruby on Rails
• OSS 環境
IBM i アプリケーション環境
© 2015 IBM Corporation 8
■
基幹業務系
•
⽣産管理、販売管理、⼈事
・給与・経理
•
業務変革がない限り変化を
求めない
•
⻑期間にわたり安定して使
⽤できる事が重要
周辺系
GUI 情報発信、
モバイル端末サポート
積極的に変化を求める
改修を前提とするスクラッ
チ文化
RPG, COBOL, C/C++
Java, PHP, Ruby
相互連携
IBM i 独自環境
アプリケーション資
産の継承
オープン性重視
新しいインターフェ
ースへの対応
アプリケーションのタイプと IBM i のプログラム言語
© 2015 IBM Corporation 9
IBM i アプリケーション開発ロードマップ
ユーザー・ エクスペリエ ンスの拡張 モジュール化 アプリケーシ ョン統合 ビジネス プロセス の統合 開発ツール の改善 既存環境 RPG/COBOL 5250 5250 RPG/COBOLILE and Java
HTML/JSP DB2 and SQL Connectors Process Choreography RPG/COBOL XML XML Portlets GUI GUI 5250 GUI ILE/Java Java/EJB
ILE (e.g. RPG, COBOL, …)
GUI Portlets HTML/JSP HTML/JSP HTML/JSP 5250 5250 5250 Servlets Servlets Servlets
Servlets Portlets Portlets
XML
XML
DB2 and SQL
Web Services Web Services
Remote System Explorer WebFacing/HATS Remote System Explorer WebFacing/HATS Remote System Explorer iSeries Web tools
ユーザー・インターフェース
アプリケーション技術
RPGは25年以上に渡り、技術の変化に対応しながら
利用し続けられています
© 2015 IBM Corporation 10
RPG文法の変遷
© 2015 IBM Corporation 11
RPGⅢ(OPM RPG) System/38 – V2R3
FCUSTFILEIF E DISK FREPORT O E PRINTER ICUSTDS E DSCUSTFILE /COPY GETCURDAT /COPY INVOICE C READ CUSTFILE LRC *INLR DOWNE*ON
C DUEDAT IFGT CURDAT
C EXSR SNOVDU
C WRITEREPORTFM
C/EXEC SQL INSERT :NAME, :DUEDATE INTO
C+ MYLIB/MYFILE C/END-EXEC C ENDIF C READ CUSTFILE LR C ENDDO C* C SNOVDU BEGSR C CALL 'SNDINVCE' C PARM CUSTDS
C PARM ISOVDU OVERDU 10
C ENDSR
変数名には6文字の制限
"Send overdue notice" =
SNOVDU
構文は全て大文字
変数名には6文字の制限
"Send overdue notice" =
SNOVDU
© 2015 IBM Corporation 12
V3R1
H bnddir('ACCRCV') dftactgrp(*no) Fcustfile uf e disk Freport o e printer D custDs e ds extname(custfile) D today s d datfmt(*iso) /copy invoices C time today C read custfileC dow not %eof C if dueDate > today
C exsr sendOvrNtc
C read custfile
C write reportFmt
C/exec sql insert :name, :duedate into
C+ mylib/myfile C/end-exec C endif C enddo C eval *inlr = '1' C sndOvrNtc begsr C call 'SNDINVCE' C parm custDs
C parm IS_OVERDUE overdue 10
C endsr
大文字小文字の混在
10文字までの変数名
"Send overdue
notice" =
SendOvrNtc
日付と時間のサポート
大文字小文字の混在
10文字までの変数名
"Send overdue
notice" =
SendOvrNtc
日付と時間のサポート
© 2015 IBM Corporation 13
V3R2 – V4R4
H bnddir('ACCRCV') dftactgrp(*no) Fcustfile uf e disk Freport o e printer D custDs e ds extname(custfile) D today s d datfmt(*iso) D sendOverdueNotice... D pr C time today C read custfileC dow not %eof C if dueDate > today
C callp sendOverdueNotice (custDs)
C write reportFmt
C/exec sql insert :name, :duedate into
C+ mylib/myfile C/end-exec C endif C read custfile C enddo C eval *inlr = '1' P sendOverdueNotice... P b ...
サブ・プロシージャー
⻑いプロシージャー名が可能
(例)“Send overdue notice”を実⾏
するプロシージャー名:
SendOverdueNotice
サブ・プロシージャー
⻑いプロシージャー名が可能
(例)“Send overdue notice”を実⾏
するプロシージャー名:
© 2015 IBM Corporation 14
V5R1 – V5R2
H bnddir('ACCRCV') dftactgrp(*no) Fcustfile uf e disk Freport o e printer D custDs ds extname(custfile) D sendOverdueNotice... D pr /freeread custfile custDs; dow not %eof;
if dueDate > %date(); // overdue?
sendOverdueNotice (); write reportFmt;
/end-free
C/exec sql insert :name, :duedate into
C+ mylib/myfile
C/end-exec /free
endif;
read custfile custDs; enddo; *inlr = '1'; /end-free ...
C仕様書のFree Format対応
インデント表記可能
多数の組み込み関数
C仕様書のFree Format対応
インデント表記可能
多数の組み込み関数
© 2015 IBM Corporation 15
V5R3 – 7.1
H bnddir('ACCRCV') dftactgrp(*no) Fcustfile uf e disk Freport o e printer D custDs e ds extname(custfile) D sendOverdueNotice... D pr /freeread custfile custDs; dow not %eof;
if dueDate > %date(); // overdue?
sendOverdueNotice (); write reportFmt;
exec sql insert :name, :duedate into
mylib/myfile; endif;
read custfile custDs; enddo; *inlr = '1'; /end-free P sendOverdueNotice... P b /copy invoices ...
Free FormatのSQL
Free FormatのSQL
© 2015 IBM Corporation 16
7.1 TR7
ctl-opt bnddir('ACCRCV');
dcl-f custfile usage(*update);
dcl-ds custDs likerec(custRec); dcl-f report printer;
read custfile custDs;
dow not %eof;
if dueDate > %date(); // overdue?
sendOverdueNotice ();
write reportFmt;
exec sql insert :name, :duedate into
mylib/myfile;
endif;
read custfile custDs;
enddo;
inlr = '1';
dcl-proc sendOverdueNotice; /copy invoices
sendInvoice (custDs : IS_OVERDUE);
end-proc;
/FREE, /END-FREE 不要
C 仕様書以外に、H ・ F ・
D ・ P の各仕様書もfree
fomat対象に
/FREE, /END-FREE 不要
C 仕様書以外に、H ・ F ・
D ・ P の各仕様書もfree
fomat対象に
© 2015 IBM Corporation 17
■
文字ベースのADT(開発支援ツール)
SEU画面例
PDM画面例
初期のRPG開発環境
© 2015 IBM Corporation 18
■
Remote System Explorer(RSE):従来の5250開発環境
をEclipse上に移植
Rational Developer for i を使用したRPG開発環境
PDMのように IBM i上のオブ ジェクトを操作 SEUのようにソースを 表示・編集・操作でき るLPEXエディター ファイルのフィールドや データをテーブル形式で 表示
© 2015 IBM Corporation 19
【ご参考】Eclipseを使用したJava開発環境
■
RPG開発環境もJava開発環境と同様のインターフェース
© 2015 IBM Corporation 20
【ご参考】RDiを使用したFree Formatへの変換例
H DATEDIT(*YMD) F*BCH110得意先マスター一覧表の印刷 FTOKMSL03 IF E K DISKFQPRINT O F 132 PRINTER OFLIND(*INOF) C*見出し印刷 C EXCEPT MIDASI C *IN99 DOWEQ '0' C*得意先マスターの読み込み C READ TOKMSL03 99 C *IN99 IFEQ '0' C*利用可能額の計算
C TKGEND SUB TKUZAN WKRIYO 9 0
C*頁変えの確認 C OF EXCEPT MIDASI C OF SETOFF OF C*明細の印刷 C EXCEPT MEISAI C END C END C*終了処理 C SETON LR C RETURN OQPRINT E MIDASI 2 02 ・・・・・・ H DATEDIT(*YMD) //BCH110得意先マスター一覧表の印刷 FTOKMSL03 IF E K DISK
FQPRINT O F 132 PRINTER OFLIND(*INOF)
//見出し印刷 /FREE EXCEPT MIDASI; DOW *IN99 = '0'; //得意先マスターの読み込み READ TOKMSL03; *IN99 = %EOF; IF *IN99 = '0'; //利用可能額の計算 /END-FREE
C TKGEND SUB TKUZAN WKRIYO
//頁変えの確認 C OF EXCEPT MIDASI C OF SETOFF //明細の印刷 /FREE EXCEPT MEISAI; ENDIF; ENDDO; //終了処理 *INLR = *ON; RETURN; /END-FREE OQPRINT E MIDASI 2 02 ・・・・・・
H F D P 仕様書、一部のC仕様書は変換され
ない(I O 仕様書はFree Format非対象)
/FREE, /END-FREEが入る
H F D P 仕様書、一部のC仕様書は変換され
ない(I O 仕様書はFree Format非対象)
/FREE, /END-FREEが入る
© 2015 IBM Corporation 21
© 2015 IBM Corporation 22
RPGⅣとは
■
RPGはReport Program Generatorの略称です
■
RPGⅣが最新版であり、ILE(Integrated Language Environment:
統合化⾔語環境)に対応しているため、「ILE RPG」としても知られ
ています
■
RPGは、IBM i の専⽤のプログラム⾔語であり、本来、報告書を作
成するための簡易⾔語として発表された⾔語であるが、現在では、
拡張され、一般のプログラム⾔語と同様の機能を持っています
FCUSTFILEIF E DISK FREPORT O E PRINTER ICUSTDS E DS /COPY GETCURDAT /COPY INVOICE C READ CUSTFILE LR C *INLR DOWNE*ON C DUEDAT IFGT CURDATC EXSR SNOVDU
C WRITEREPORTFM
C/EXEC SQL INSERT :NAME, :DUEDATE INTO C+ MYLIB/MYFILE
C/END-EXEC
C ENDIF
C READ CUSTFILE LR
© 2015 IBM Corporation 23
© 2015 IBM Corporation 24
RPGⅣの特徴
■
RPGⅣの主な特徴
① 仕様書
−
RPG⾔語はプログラムの処理内容に応じて、最⼤7種類の仕様書を
使⽤してプログラムを書きます
② プログラム・サイクル(RPGサイクル)
−
プログラム・サイクルとは、ファイル終了状態に達するまで、プ
ログラムが 反復する一連のステップのことです
③ 標識
−
標識は、オン (‘1’) またはオフ (‘0’) のいずれかが⼊る 1 バイ ト
の文字フィールドです。演算処理の条件付け、または、RPG内部
論理のセットのために 使⽤されます
© 2015 IBM Corporation 25
①仕様書(1/2)
■
メイン・ソース・セクション
•
制御仕様書(H)
− プログラムの⽣成および実⾏についての情報をコンパイラーに提供します。その中に は、プログラム名、日付の形式、および 代替照合順序またはファイル変換の使⽤な どが含まれます•
ファイル仕様書(F)
− プログラムで使⽤するすべてのファイルを記述します•
定義仕様書(D)
− プログラムで使⽤されるデータを記述します•
入⼒仕様書(I)
− プログラムで使⽤される⼊⼒レコードおよびフ ィールドについて記述します − 外部記述ファイル(※1)を使⽤する場合は⼊⼒仕様書は使⽤しません•
演算仕様書(C)
− データに対して実⾏される演算および演算の順 序を記述します。 演算仕様書では、 特定の⼊⼒および出⼒操作を制御することも できます•
出⼒仕様書(O)
− プログラムで使⽤される出⼒レコードおよびフ ィールドを記述します。 − 外部記述ファイル(※1)を使⽤する場合は出⼒仕様書は使⽤しません。RPG IV 仕様書には 7 つのタイプがあります。
各仕様書タイプはオプションです。各仕様書
は、以下に示される順番でソース・プログラム
に入力されなければ なりません。
© 2015 IBM Corporation 26
①仕様書(2/2)
■
サブプロシージャー・セクション
•
プロシージャー仕様書(P)
− サブプロシージャー※2の始めと終わりにマークを付け、サブプロシージャー名 およ びエクスポートするかどうかを指⽰します•
定義仕様書(D)
− サブプロシージャーで使⽤される内部データ を記述します•
演算仕様書(C)
− グローバル・データおよび内部データの両⽅に対して実⾏される演算 および演算の 順序を記述します•
※1 外部記述ファイル
− ファイル⾃身が、フィールド名/属性/フィールド⻑を持っているため、プログラム内 でレコードおよびフィールドを記述する必要のないファイルです。 − これに対して、プログラム内でレコードおよびフィールドを記述するファイルをプロ グラム記述ファイルと呼びます•
※2 サブプロシージャー
− メイン・プロシージャーに対する補助的な処理または関数をサブプロシージャーとし て分けてコーディングします© 2015 IBM Corporation 27
②プログラム・サイクル(RPGサイクル)
■
RPGサイクルとは
•
読み取った各レコードを処理していく一連のステップ
見出しおよび
明細行の出力
入力レコード
読み取り
合計演算
実行
合計出力
書出し
フィールド
転送
明細演算
実行
スター
ト
LRがオン
なら終了
※LR:最終レコード標識•
RPGは当初、報告書を作成す
るための簡易⾔語
•
レコードの読み取り、書き出
しを仕様書に明⽰的にコーデ
ィングするのではなく、コン
パイラーによって論理順序を
得る
•
一般的なRPGサイクルの例
1. ⾒出しを印刷
2. 得意先マスターを読み取り
3. 明細を得意先番号順に印刷
4. 最後に「レコード件数」と「
売掛⾦残高の合計」を印刷
© 2015 IBM Corporation 28
③標識
■
'1' (オン) または '0' (オフ) のいずれかが⼊れられる1バイトの文字
■
当初、命令の結果を⽰すか、あるいは命令の処理を条件付け (制御)
するために使⽤
■
【参考】よく使われる標識
•
LR(Last Record)標識:最終レコード標識
−
プログラムを終了させる場合に使⽤
−
LR標識をオンにセットすることにより、内部的に以下が⾏なわれる
1. 変数の初期設定
– 文字変数:ブランク
– 数字変数:ゼロ
– 標識:オフ
2. データベース・ファイルの読み取り開始位置のセット
– 最初のレコードが読み取られるようにセット
© 2015 IBM Corporation 29
© 2015 IBM Corporation 30
IBM i のプログラミング環境
■
オリジナル・プログラミング・モデル(OPM)
•
AS/400が登場時からのプログラミング環境
−
ソース・コードをコンパイルし、実⾏可能なプログラム・オブジ
ェクトを⽣成
−
プログラムは開始点(⼊口点)を1つだけ持つ
−
実⾏時に他のプログラムを呼び出すことが可能(動的プログラム
呼び出し)
•
OPMのコンパイラー
−
RPG, COBOL, CL, BASIC, PL/I
© 2015 IBM Corporation 31
ILEとは
■
Integrated Language Environment(統合化⾔語環境)
•
IBM i におけるプログラミング環境
•
ILEコンパイラーによって⽣成されたプログラムに共通の環境
•
提供されているILEコンパイラー
−
ILE RPG
−
ILE COBOL
−
ILE C
−
ILE C++
−
ILE CL
© 2015 IBM Corporation 32
ILEとOPMの比較
ILE
OPM
プログラムの形態 プログラム、
サービス・プログラム
プログラム
コンパイラー
コンパイルによりモジュー
ル・オブジェクトを⽣成(直
接実⾏不可)
コンパイルによりプログラム
を⽣成
プログラム⽣成
コンパイル、バインド
コンパイル
プログラム実⾏
活動化グループ
各⾔語ごとの実⾏単位
他のプログラムの
呼び出し
動的プログラム呼び出し
静的プロシージャー呼び出し
動的プログラム呼び出し
複数⾔語
複数⾔語の混在に対応
単一⾔語の使⽤にフォーカス
エラー処理
共通エラー処理
⾔語固有エラー処理
⾔語固有エラー処理
© 2015 IBM Corporation 33
ILEのプログラム構造
■
ILEのプログラム構造
•
1つまたは複数のモジュールから成り⽴つ
•
モジュールは、1つまたは複数のプロシージャーからなる
プログラム
モジュール1 モジュール2 プロシージャー1 プロシージャー2プログラム
モジュール プロシージャー プロシージャー© 2015 IBM Corporation 34
モジュール
■
ILEコンパイラーによって⽣成されるオブジェクト
•
オブジェクト・タイプ *MODULE
•
ILEオブジェクトの基本
•
単独では実⾏不能なオブジェクト
−
モジュールをバインドすることで実⾏可能なプログラムを⽣成
•
1つまたは複数のプロシージャーとデータ項目より構成
−
モジュール内のプロシージャーやデータ項目に、他のILEプログラムから
直接アクセスすることが可能
■
ILEの⾔語であれば、モジュールはすべて同じ概念
•
ILEプログラムでは、⾔語の異なる
モジュールを含めることが可能
•
再利⽤性と保守性の向上
−
コンパイル単位を小さくする
モジュール1 RPG プログラム1 プログラム2 モジュール3 C++ モジュール4 COBOL モジュール2 RPG© 2015 IBM Corporation 35
プロシージャー
■
特定の処理を実⾏して呼び出し元に戻る
•
⾃己完結型の一連の高水準⾔語ステートメント
■
ILEはプロシージャー・ベースの⾔語のサポートを提供
■
プロシージャー・ベースの⾔語の特徴
•
ローカル変数の使⽤
•
プロシージャーに⼊るたびに作成される⾃動変数
•
プログラム間でデータを共有するための外部変数の使⽤
•
複数の⼊口点を持てる
•
モジュールのバインディングによる、呼び出しオーバーヘッド
の低減(静的プロシージャー呼び出し)
© 2015 IBM Corporation 36
ILEプログラム
■
ILEプログラム
•
1つ以上のコピーされたモジュールから⽣成
•
動的プログラム呼び出しにより制御を渡される
•
プログラムへの⼊り口点は一つ
•
コピーされた1つ以上のモジュールは、1つのプログラム⼊り口
プロシージャー(PEP)を含むことができる
•
ILEプログラムのPEPとして、どのモジュールのPEPを使⽤する
か制御できる
−
CRTPGMコマンドのENTMODパラメーターによって、どのモジュ
ールのPEPをプログラムの⼊り口点にするか選択
−
ENTMODに指定されなかったモジュールのPEPは無視される
© 2015 IBM Corporation 37
サービス・プログラム
■
サービス・プログラムとは
•
ILEプログラムまたはサービス・プログラムから直接アクセスされる、
実⾏可能なプロシージャーとデータ項目の集まり
•
アプリケーションで頻繁に呼び出される共通機能として使⽤される
■
サービス・プログラムの特徴
•
1つまたは複数のモジュール、他のサービス・プログラムから作成され
る
•
オブジェクト・タイプ *SRVPGM
•
モジュールのPEPは無視される
•
動的プログラム呼び出しによる
サービス・プログラムの実⾏はできない
サービスプログラム Proc1 Proc2 モジュール CALLP Proc1 モジュール CALLP Proc1 CALLP Proc2© 2015 IBM Corporation 38
プログラムおよびプロシージャーの呼び出し
■
動的プログラム呼び出し
•
ILEプログラムまたはOPMプログラムに制御を渡す
−
他のOPMプログラムまたはILEプログラムを呼び出すことが可能
−
サービス・プログラムを呼び出すことはできない
■
静的プロシージャー呼び出し
•
ILEプロシージャーに制御を渡す
•
ILE⾔語のみで可能
•
以下のプロシージャー呼び出しが可能
−
同じモジュール内にあるプロシージャー
−
同じILEプログラムまたはサービス・プログラム内にある別のモジ
ュールのプロシージャー
−
他のILEサービス・プログラム内のプロシージャー
© 2015 IBM Corporation 39
ジョブ
B
ジョブ
A
活動化
■
活動化
•
ILEプログラムまたはサービス・プログラムを実⾏可能にするプロセス
•
プログラムが呼び出されると、システムにより活動化される
−
必要な静的データを割振る
−
サービス・プログラムへのプログラムのバインディングを完了する
■
活動化グループ
•
ILEプログラムやサービス・プログラムは
活動化グループ内で活動化される
•
プログラムの実⾏に必要な
リソースが含まれる
•
リソースが、活動化グループ
によって分離される
活動化グループプログラム 変数 A = 10 活動化グループ プログラム 変数 A = 20 プログラム プログラム命令© 2015 IBM Corporation 40
活動化グループ
■
活動化グループの作成
• CRTPGM, CRTSRVPGMコマンドのACTGRPパラメーターで指定 − ACTGRP(活動化グループ名) – ユーザー指定活動化グループ – 同じ活動化グループ名を指定するプログラムで使⽤される − ACTGRP(*NEW) – システム指定活動化グループ – プログラム呼び出し時に新しい活動化グループを⽣成 − ACTGRP(*CALLER) – 呼び出し元プログラムの活動化グループを使⽤ » サービス・プログラム作成(CRTSRVPGM)のデフォルト − ACTGRP(*ENTMOD) – プログラム⾔語とストレージ・モデルにより活動化グループを⽣成 » プログラム作成(CRTPGM)のデフォルト – プログラムのエントリー・モジュールの属性を検索 – モジュール属性がRPGLE, CBLLE, CLLEの場合» STGMDL(*SNGLVL) :活動化グループQILE
» STGMDL(*TERASPACE) :活動化グループQILETS – モジュール属性がRPGLE, CBLLE, CLLE以外の場合
© 2015 IBM Corporation 41
デフォルト活動化グループ
■
OPMデフォルト活動化グループ
•
OPMプログラムが使⽤する活動化グループ
−
ジョブ開始時にシステムによって⾃動的に作成される
−
ジョブ終了時にシステムによって削除される
– ユーザーが削除することはできない
■
ILEプログラムもデフォルト活動化グループを使⽤可能
•
ILEプログラムがDFTACTGRP(*YES)で作成された場合
•
ILEプログラムの呼び出しがOPMデフォルト活動化グループから
⾏われた場合
© 2015 IBM Corporation 42
活動化グループの管理
■
デフォルト以外の活動化グループの削除
•
ACTGRP(*NEW)
−
プログラムの終了で⾃動的に削除される
•
その他の活動化グループ
−
プログラムが終了しても削除されない
−
RCLACTGRPコマンドで使⽤されていない活動化グループを削除
■
ジョブの活動化グループの確認
•
WRKJOB オプション18
© 2015 IBM Corporation 43
ストレージ・モデル
■
ILEで使⽤するストレージ・モデル
• テラスペース・ストレージ • 単一レベル・ストレージ■
テラスペースと単一レベル・ストレージの比較
• テラスペース・ストレージ・モデルの使⽤ − 単一割り振りで16MBより⼤きな動的ストレージを使⽤ − ⼤きなバイト・ストリーム・ファイルへの効率的なアクセスなど テラスペース 単一レベル 局所性 通常は通常は所有しているジョ ブのみアクセス ポインターを持っている全てのジョブでアクセス可能 サイズ 合計100TB 16MB単位のものが多数 メモリー・マッピング のサポート 可能 不可 8バイト・ポインター によるアドレッシング 可能 不可 ジョブ間の共⽤ 共⽤メモリーAPIを使⽤して実 ⾏ 他のジョブへポインターを渡すことに よって、または共⽤メモリーAPI を 使⽤することによって実⾏© 2015 IBM Corporation 44
プログラムの作成
■
ILEプログラムの作成
•
ソースコードをコンパイルしてモジュールを作成
−
CRTxxxMOD
•
モジュールをバインディングして、プログラムまたはサービス
・プログラムを作成
−
CRTPGM
:プログラム作成
– ⼊口モジュールを指定する
−
CRTSRVPGM:サービス・プログラム作成
−
バインディングの指定
– MODULEパラメーター
– BNDSRVPGMパラメーター
– BNDDIR BNDSRVPGMパラメーター
© 2015 IBM Corporation 45
バインディング・ディレクトリー
■
バインディング・ディレクトリー とは
•
モジュールまたはサービス・プログラムのリストを提供するオブジェク
ト
−
オブジェクト・タイプ *BNDDIR
•
ILEプログラムまたはサービス・プログラムの作成に必要なモジュール
やサービス・プログラムを参照するために使⽤
−
ディレクトリーの項目にモジュールやサービス・プログラムの名前を指定
– 実際のオブジェクトの存在は確認しない
•
特定の機能や目的を持つモジュールやサービス・プログラムをパッケー
ジ化
−
個々のモジュールを指定せずに必要な機能を使⽤することが可能
– 例:数値計算⽤のバインド・ディレクトリー
© 2015 IBM Corporation 46
プログラムの作成例
CRTPGM PGM(TESTLIB/TEST)
MODULE(MOD01 MOD02)
ENTMOD(MOD01)
BNDSRVPGM(TESTLIB1/SRV01)
BNDDIR(TESTLIB1/BNDDIR01)
MOD02 Proc11 Proc12MOD01
Srv02 Proc21 Proc22 Srv01 Proc02 Proc01 バインド・ディレクトリー BNDDIR01 ディレクトリー項目 SRV02, SRV03 Srv03 Proc31 Proc32 モジュールMOD01とMOD02を組み込む プログラムの入口モジュールはMOD01 プログラム TESTの作成 サービス・プログラムSRV01を組み込む バインド・ディレクトリーBNDDIR01の項目を組み込むプログラム
TEST
© 2015 IBM Corporation 47
参考資料
IBM Knowledge Center IBM i 7.2
■
ILE概念
• http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_72/ilec/ilecmain.htm?lang=ja■
ILE RPG解説書
• http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_72/rzasd/rzasdmain.htm?lang=j a■
ILE RPGプログラマーの手引き
• http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_72/rzasc/rzascmain.htm?lang=jaIBM i インターネットセミナー
■
IBM i 6.1 (i5/OS V6R1) 開発⾔語としてILE –RPG(PDF)
© 2015 IBM Corporation 48
© 2015 IBM Corporation 49
Free Format RPG
ctl-opt bnddir
(
'ACCRCV'
)
;
dcl-f
custfile
usage
(
*update
)
;
dcl-ds
custDs
likerec
(
custRec
)
;
dcl-f
report
printer
;
read
custfile custDs;
dow
not
%eof
;
if
dueDate
>
%date
()
; // overdue?
sendOverdueNotice
()
;
write
reportFmt;
exec sql
insert
:name, :duedate
into
mylib/myfile;
endif
;
read
custfile custDs;
enddo
;
*inlr
=
'1';
dcl-proc
sendOverdueNotice;
sendInvoice
(
custDs : %date
())
;
end-proc
;
既存のRPGプログラマーは、
新しい文法を簡単に学べる
RPG以外のプログラマーにと
ても、固定形式より学びや
すい
既存のRPGプログラマーは、
新しい文法を簡単に学べる
RPG以外のプログラマーにと
ても、固定形式より学びや
すい
H仕様書 H仕様書 F仕様書 F仕様書 D仕様書 D仕様書 C仕様書 C仕様書© 2015 IBM Corporation 50
既存RPGプログラマーにとっての
Free Formatのメリット
■
構文のインデントによりメンテナンス性向上
•
if, for, dowなどプログラムの構造が分かりやすい
■
多くのフラストレーションの解消
•
/FREE と /END-FREE が不要
•
固定形式での2⾏にわたる宣⾔を1⾏に
D getNextCustomer... D pr vs dcl-pr getNextCustomer;•
⻑い文字列キーワードに対するコーディング・スペースの不⾜
の解消
D HSSFCellStyle c D 'org.apache.poi.hssf.-D usermodel.HSSFCellStyle' vs dcl-c HSSFCellStyle 'org.apache.poi.hssf.usermodel.HSSFCellStyle';© 2015 IBM Corporation 51
新しくRPGを始めるプログラマーにとっての
Free Formatのメリット
■
固定形式と比べると、RPGの学習がとても容易
•
RDiエディターの色付け機能が改善されたことで、JavaやPHPな
どと同じようなルック・アンド・フィールでRPGのコードを扱
える
•
桁位置などに⼾惑う必要はなく、RPGの命令コードやキーワー
ドなどを覚えるだけでよい
■
以下をRPGプログラムから学べる
•
ビジネス・プログラミング
•
メッセージの⾃動ロギング(ジョブログ)
© 2015 IBM Corporation 52
RPG は まだ100% フリーではない
■
Free Formatのコードは、8 – 80カラムに制限
■
I 仕様書と O 仕様書は、固定形式のみ
•
外部記述ファイルを使⽤する傾向がある
■
RPGサイクルに関連したコードは、固定形式を使⽤
© 2015 IBM Corporation 53
新しい
RPG(Free Format)になっても変わらないもの
■
全てのバージョンのRPGについて、以下は変わらない
•
以前のバージョンの上位互換
•
RPGコンパイラーによる固定形式のサポート
•
ビジネス・プログラミングにおいて重要な十進数演算に対する
サポート
•
システムとの優れた統合
−
データベースの統合による容易なレコード・レベルI/Oのコーディ
ング
−
データ域のサポート
−
組込みSQLにおけるレコードレベルI/OとSQL I/Oの混在
−
ILE RPG
– 全OPMと全ILE言語の間の呼び出し
– RPGとJava間の呼び出し
– XML文書の読み込み
© 2015 IBM Corporation 54
追加のサポート
■
組込みSQL
•
SQLプリコンパイラーも新しいFree Format文法をサポート
■
RDi
•
RDi9.0.1以降は、Free Format RPGをサポート
•
Free Formatへの変換機能
−
H F D P 仕様書をFree Formatに変換しない
© 2015 IBM Corporation 55
Free Format RPGの前提条件
■
IBM i
•
IBM i 7.1以降
−
IBM i 7.1の場合、下記PTFを適⽤
– RPGⅣ コンパイラー:PTF SI51640 (APAR SE56767 :
http://www-912.ibm.com/n_dir/nas4apar.nsf/ALLAPARS/SE56767 )
– SQL プリコンパイラー:DB2 PTF Group SF99701 レベル 26 以降
■
クライアントPC(Editor)
•
Rational Developer for i 9.0.1以降
−
※5250画面のSEUではFree Formatはサポートされません。
© 2015 IBM Corporation 56
参考資料
■
フリーフォームRPG紹介およびIBM Rational
Developer for i 9.0.1への更新ガイド
•
http://www.ibm.com/developerworks/jp/rational/library/e
m/cms/rdi90/freeformrpg/
•
目次
1. フリーフォームRPG
© 2015 IBM Corporation 57
4.Free Format RPG
コーディング・サンプル
© 2015 IBM Corporation 58
1. 事前準備
• Rational Developer for i のインストール
• このチュートリアルでは、開発ツールとして、Rational
Developer for i を使⽤しています。
• 事前準備として、Rational Developer for i を開発⽤PCにイン
ストールください。
• Rational Developer for i のインストール⽅法は下記リンク先を
ご参照ください。
• Rational Developer for i V9.0 インストール・ガイド
•
http://www.ibm.com/developerworks/jp/rational/library/em
/cms/rdi90/installationguide/
• Rational Developer for i V9.1 インストール・ガイド (社内リンク)
• iRAM資料ダウンロードリンク:
https://w3-
03.ibm.com/tools/cm/iram/oslc/assets/D16D43E3-D62A-9FE5-80D3-5E8E153791A4/1.0
© 2015 IBM Corporation 59
2.RPGⅣ初心者向けチュートリアル
Coding in Free-Form RPG IV - a beginner‘s tutorial
■
Chapter 1 Hello World
• ソースの編集、コンパイル⽅法
• コンパイル・エラー時のエラー・メッセージの⾒⽅ • プルグラムの実⾏
• プログラムのデバッグ
■
Chapter 2 General info about RPG
• RPG概要
■
Chapter 3 Variables and procedures
• 定数、変数定義 • プロシージャー
■
Chapter 4 Introduction to files
• データベース・ファイルの使⽤
■
Chapter 5 Display files
• 表⽰ファイルの資料
■
参考リンク:Coding in Free-Form RPG IV - a beginner‘s tutorial(英語)
• https://www.ibm.com/developerworks/community/wikis/home?lang=ja#!/wiki/We
13116a562db_467e_bcd4_882013aec57a/page/Coding%20in%20Free-Form%20RPG%20IV%20-%20a%20beginner%27s%20tutorial
© 2015 IBM Corporation 60
Chapter 1 Hello World
■
初期セットアップ
1. IBM Rational developer for i を起動
2. IBM i の接続を作成
3. ライブラリーを作成
4. ソースファイル「QRPGLESRC」を作成
5. ソールメンバー「HELLO.RPGLE」を作成
6. 作成したメンバーを編集
•
初期セットアップの詳細な手順については、下記リンク先を参照くだ
さい。
•
「さわってみよう Rational Developer for i V9.0 ―ILE RPGアプリケ
ーションの操作演習資料―」
•
http://www.ibm.com/developerworks/jp/rational/library/em/c
ms/rdi/rdi90handson/
© 2015 IBM Corporation 61
Chapter 1 Hello World
■
RPGプログラムの編集
1. 以下のコードを⼊⼒
− ※1-7列目までは使⽤できません。Free-formatで使⽤できる列は、8-80列のみです − 列の番号は、編集画面の上に記載されています。また、カーソルを合わせるとその列
番号が表⽰されます
dsply 'Hello World'; return;
■
RPGプログラムのコンパイル
1. ソースメンバー「HELLO.rpgle」を右クリックし、コンパイル(プロンプト) →CRTBNDRPGを選択 2. 「リソースの保存」画面が表⽰されたら − 「OK」をクリックし、保存 3. パラメータを指定し、「OK」をクリックし、 − コンパイルを実⾏ – ※パラメーターは特に指定がなければ デフォルトでOK© 2015 IBM Corporation 62
Chapter 1 Hello World
■
RPGプログラムの実⾏
1. 5250エミュレーターを起動し、ログイン
2. 以下のコマンドを実⾏し、RPGプログラムを実⾏ − ===> CALL yourlibrary/HELLO
実⾏後、5250エミュレーターに「DSPLY Hello World」のメッセージが表⽰されます ※表⽰されない場合は、「F10」キー(詳細なメッセージの組み込み)を押してください。 [補⾜]RDiからRPGプログラムを実⾏するコマンドを発⾏することも可能です。
1. RPGプログラムを右クリック→「実⾏(プロンプト)」→「対話式」を選択 −実⾏後、5250エミュレーターに「DSPLY Hello World」のメッセージが表⽰されます
※RDiの接続を対話式ジョブに関連付けるために以下の 手順を事前に実施してください
1. 5250 エミュレーターを起動し、ログイン 2. 以下のコマンドを実行
3. STRRSESVR NAME(yourhost) ※yourhost: IBM i の接続名
© 2015 IBM Corporation 63
Chapter 1 Hello World
■
コンパイル・エラーの対処例 1/2
•
ここでは、コンパイラー・エラーの例を紹介します
1. HELLO.RPGLEのソースメンバーを以下のように編集
• ‘Hello World’をnameに変更 dsply name; return;2. 再度、コンパイルを実⾏
• 重要度30のエラーによりコンパイルが失敗します • RDiのエラー・リストに「RNF7030: 名前または標識NAMEが定義されていない。」 が表⽰されます • RNF7030のエラーをダブルクリックすると「name」がハイライトされ、エラーの箇 所を確認できます • ※RPGIVでは、変数名は⼤文字、小文字を区別されません。そのため、エラー・リス トの「NAME」とソース内の「name」は同じであることに注意ください。© 2015 IBM Corporation 64
Chapter 1 Hello World
■
コンパイル・エラーの対処例 2/2
3. エラー箇所の修正
• nameが定義されていないというエラーに対して、以下のように定義します。 1. プログラムの一番始めにdcl-sを使⽤し、nameを定義
−dcl-s name char(10) inz('Jim');
−dsply name; −return;
4. 再度、コンパイルを実⾏
• エラーなく、コンパイルが成功します5. RPGプログラムを実⾏
• 実⾏後、5250エミュレーターに「DSPLY Jim」のメッセージが表⽰されますDSPLY Hello World
DSPLY Jim
© 2015 IBM Corporation 65
Chapter 1 Hello World
■
プログラムのデバッグ 1/2
• デバッグの前にコンパイル時に「デバッグ⽤ビュー」のパラメーターを指定し、再度コンパ イルします。 1. ソースメンバー「HELLO.rpgle」を右クリックし、コンパイル(プロンプト)→CRTBNDRPGを選択 2. 「デバッグ⽤ビュー(DBGVIEW )」パラメータに「*LIST」指定し、「OK」をクリックし、 − コンパイルを実⾏ – ※ 「デバッグ⽤ビュー(DBGVIEW )」パラメータは、*NONEと*STMT以外を指 定します。© 2015 IBM Corporation 66
Chapter 1 Hello World
■
プログラムのデバッグ 2/2
• デバッガーを開始し、プログラムを実⾏し、デバッグを⾏ないます
− ※ここでは、5250エミュレーターからの手順を紹介しています。RDiにもデバッグの機能が備わっ
ています。手順は、「さわってみよう Rational Developer for i V9.0 ―ILE RPGアプリケーショ ンの操作演習資料―」の「5 プログラムのデバッグ」をご参照ください。 1. 以下のコマンドを実⾏し、デバッガーを開始 −===> STRDBG PGM(yourlibrary/HELLO) 2. dsply name;の⾏にカーソルを合わせ、F6キーを押し、停止点を追加、F3キーを押し て、プログラムを終了 3. 以下のコマンドを実⾏し、プログラムを実⾏ −===> CALL yourlibrary/HELLO
4. 停止点であるdsply name;のnameにカーソルを合わせ、F11キーを押し、name変数の値
を表⽰ • Name返信に‘Jim’の値が⼊っていることが確認できます。 5. F3キーを押して、プログラムを終了 6. 以下のコマンドを実⾏し、デバッガーを終了 −===> ENDDBG
NAME = 'Jim '
© 2015 IBM Corporation 67
Chapter 2 General info about RPG
■
RPGプログラムでは、列ごとに以下の制限があります
•
8 – 80列:
Free Formatのコード
•
1-5列、81列以降:
コメント
•
7列、8列:
固定形式のコード
■
I仕様書とO仕様書、また、一部の記述は固定形式を使⽤します
■
このチュートリアルでは、Free Format のみを使⽤します
© 2015 IBM Corporation 68
Chapter 3 Variables and procedures
■
定義ステートメント:DCL-x
•
定数(constant):dcl-c
•
独⽴フィールド(standalone field):dcl-s
•
データ構造(data structure):dcl-ds
•
配列(array):dcl-s xxx dim(n)
•
プロトタイプ(prototype):dcl-pr , end-pr
•
プロシージャー(procedure):dcl-proc , end-proc
•
プロシージャー・インターフェース():dcl-pi , end-pi
© 2015 IBM Corporation 69
サンプル・プログラム
定数(constant):dcl-c
■
以下のコードをソースメンバーに貼り付け、コンパイル
し、実⾏します
dcl-c
MAX_ELEMS
100
;
dcl-c
default_city_name
'London';
dsply
max_elems
;
dsply
default_city_name
;
return;
定数を定義
MAX_ELEMS
に100を代⼊
実⾏結果
DSPLY 100
DSPLY London
定数を定義
Default_city_name
に’London‘を代⼊
© 2015 IBM Corporation 70
サンプル・プログラム
独⽴フィールド(standalone field):dcl-s
DSPLY i = 1
DSPLY i = 2
DSPLY i = 3
実⾏結果
dcl-s
num
int(
10
);
for
num
=
1
to
3
;
dsply
('i = '
+
%char
(
num
));
endfor;
return;
numという名前で独⽴フィールド
を定義
int(
10
)
:10digitsの整数
for loop
%char
:char型に変換
+
:文字列の連結
© 2015 IBM Corporation 71
サンプル・プログラム
データ構造(data structure):dcl-ds
dcl-ds
info
qualified
;
name
char
(
10
)
inz
(
'Sam'
);
salary
packed
(
9
:
2
)
inz
(
50000.25
);
end-ds
;
dcl-ds
otherInfo
likeds
(
info
)
inz
(
*likeds
);
dsply
(
info
.
name
+
' has a salary of'
+
%char
(
info
.
salary
));
otherInfo
.
name
=
'Joe'
;
otherInfo
.
salary
+=
10000
;
dsply
(
otherInfo
.
name
+
' has a salary of'
+
%char
(
otherInfo
.
salary
));
return;
infoという名前のデー
タ構造を定義
qualified
キーワー
ド:データ構造名の
後にピリオドとサブ
フィールド名を続け
て指定
likeds
キーワード:別のデータ構
造と同様に定義。サブフィールドは
、パラメーターに指定された親デー
タ構造のサブフィールドと同じ
inz(
*likeds
)
:親データ構造と同
じ⽅法でサブフィールドを初期化
実⾏結果
DSPLY Sam has a salary of50000.25
DSPLY Joe has a salary of60000.25
© 2015 IBM Corporation 72
サンプル・プログラム
配列(array):dcl-s xxx dim(n)
実⾏結果
DSPLY 2015-02-10 2015-02-11 2016-02-10
dcl-s
dates
date(
*iso
)
dim(
3
);
dates
(
1
) =
%date
();
// the current date
dates
(
2
) =
dates
(
1
) +
%days
(
1
);
// tomorrow
dates
(
3
) =
dates
(
1
) +
%years
(
1
);
// next year
dsply
(
%char
(
dates
(
1
)) +
' '
+
%char
(
dates
(
2
)) +
' '
+
%char
(
dates
(
3
)));
return;
datesという名前の配列
を定義
date(
*iso
)
:ISO 形式
(yyyy-mm-dd)の日付タ
イプ
dim
キーワード:要素の
数を指定
%date
()
:パラメータが指
定されない場合、現在の日
付を返す組み込み関数
%days
(
1
)
:パラメータの日
数を加算
%years
(
1
)
:パラメータの
年数を加算
© 2015 IBM Corporation 73
サンプル・プログラム
プロトタイプ(prototype):dcl-pr , end-pr
dcl-pr
qcmdexc
extpgm('QCMDEXC');
theCmd
char(
3000
)
const;
cmdLne
packed(
15
:
5
)
const;
dbcs
char(
3
)
const options(
*nopass
);
end-pr
;
dcl-s
cmd
varchar(
100
);
cmd
=
'DSPJOB OUTPUT(*PRINT)';
qcmdexc
(
cmd
:
%len
(
cmd
));
qcmdexc
('WRKSPLF'
:
7
);
return;
実⾏結果
→DSPJOB OUTPUT(*PRINT)コマンドを実⾏
→WRKSPLFコマンドの実⾏結果画面を表⽰
qcmdexcという
名前のプロトタ
イプを定義
パラメータ
の定義
※dcl-prでEXTPROC、EXTPGMキーワードを指定しない場合、デフォルトはEXTPROCキーワード EXTPROC:プロシージャー、Javaメソッドの呼び出し EXTPGM:プログラムの呼び出し※コマンド実⾏ (QCMDEXC) API :1 つのコマンドを実⾏する IBM 提供のプログラム ※EXTPROC、EXTPGMキーワードのパラメーターは⼤文字と小文字を区別します
const
:読み取り専⽤参
照パラメーターを指定
options(
*nopass
)
:
パラメータの省略可
パラメータ・セ
パレーターは、
コロン(:)
※コンマでない
© 2015 IBM Corporation 74
サンプル・プログラム(1)
プロシージャー(procedure):dcl-proc , end-proc
プロシージャー・インターフェース():dcl-pi , end-pi
/if defined
(
*CRTBNDRPG
)
ctl-opt
dftactgrp(
*no
)
actgrp(
*new
);
/endif
ctl-opt
option(
*srcstmt
);
dcl-s
num
int(
10
)
inz(
25
);
('his message is much longer than the 52 '
+
'characters that DSPLY allows. '
+
'The value of variable "num" is '
+
%char
(
num
));
return;
DSPLY命令コードは最⼤値52byteという制限があります。ここでは、DSPLY
命令コードを使⽤しないprintのサンプル・プログラムをご紹介します。
CRTBNDRPGコマンドによって コンパイルする場合 活動化グループを指定 ACTGRPパラメーターによって指定された活動 化グループに関連付け、静的バインドを許可プロシー
ジャーの
呼び出し
次ページにつづく
コンパイル・リストにソース・ステー トメントと同じ⾏番号を使⽤すること を指定© 2015 IBM Corporation 75
サンプル・プログラム(2)
プロシージャー(procedure):dcl-proc , end-proc
プロシージャー・インターフェース():dcl-pi , end-pi
dcl-proc
;
dcl-pi
*n
;
msg
varchar(
5000
)
const;
end-pi
;
dcl-pr
printf
extproc(
*dclcase
);
template
pointer value options(
*string
);
dummy
int(
10
)
value options(
*nopass
);
end-pr
;
dcl-c
NEWLINE
X'15';
printf
(
msg
+
NEWLINE
);
end-proc
;
前ページのつづき
printという名前のプロシージャーを定義
his message is much longer than the 52 characters that DSPLY allows. The valu
e of variable "num" is 25
実⾏結果
改⾏(
X‘15’
)をNEWLINE
という名前で定義
プロシージャ
ー・インター
フェースを指
定(名前は不
要)
extproc(
*dclcase
)
:
外部名が、「printf」と同
じ名前であることを⽰す
© 2015 IBM Corporation 76
Chapter 4 Introduction to files
■
ファイル・ステートメント:DCL-F
•
DCL-Fで開始
•
ファイル名
•
キーワード
−
DEVICEキーワードを最初のキーワードにする
– DISK, PRINTER, WORKSTN
– DEVICEキーワードのデフォルトは DISK
© 2015 IBM Corporation 77
サンプル・プログラム
ファイルのレコードの読み込み
■
事前準備:最初に以下のコマンドを実⾏し、ファイルを作成
===> DSPOBJD OBJ(QGPL/QRPG*) OBJTYPE(*FILE)
OUTPUT(*OUTFILE) OUTFILE(QTEMP/RPGTESTF)
dcl-f
rpgtestf
usropn;
open
rpgtestf
;
read
rpgtestf
;
dow not
%eof
;
dsply
ODOBNM
;
read
rpgtestf
;
enddo;
close
rpgtestf
;
return;
実⾏結果
DSPLY QRPGLESRC
DSPLY QRPGSRC
rpgtestfをファイルと
して定義
DEVICEキーワードのデフ
ォルトは DISK
=⼊⼒⽤
としてオープン
usropn
:ファイルの最
初のオープンはプログ
ラマーが制御
open
:
ファイルのオープン
read
:
ファイルの読み込み
close
:
ファイルのクローズ
ファイルの最初のレコー
ドから最後のレコードま
で一⾏ずつ読み込み
© 2015 IBM Corporation 78
サンプル・プログラム
プリンターファイルへの書き出し
dcl-c
QPRINT_LEN
132
;
dcl-f
qprint
printer(
QPRINT_LEN
);
dcl-ds
qprint_ds
len(
QPRINT_LEN
)
end-ds;
*inlr
=
‘1’;
qprint_ds
=
‘Hello’;
write
qprint qprint_ds
;
qprint_ds
=
'world';
write
qprint qprint_ds
;
スプール・ファイルの表示 ファイル . . . : QPRINT ページ/行 1/1 制御 . . . 桁 1 - 75 検索 . . . *...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+ Hello world
printer
:プリンターへのアクセ
スを提供し、印刷出⼒の様式を記述
数値パラメータで⻑さを指定し、プ
ログラム記述ファイルを作成
132byteの
データ構造
を定義
Write
:プリンターファイル
「qprint」に「qprint_ds」
を書き出し
実⾏結果
© 2015 IBM Corporation 79