Your SlideShare is downloading. ×
0
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Ilerpg Study 005
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Ilerpg Study 005

3,625

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
3,625
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
12
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 第5回 ILE - RPGを学ぶ C hubu… S ystem… C orporation
  • 2. Agenda
    • ■ 今回
    • 日付系、キャスト系、例外系、その他のBIF
    • サービスプログラムの作成
    • プログラムのデバッグ
    • ■ 次回以降
    • 活動化グループ
    • ILEのパフォーマンスを考える
    • プログラム設計を考える
    C hubu… S ystem… C orporation
  • 3. リカバリープログラムにILEを使ってみた(1) ■ 障害内容 顧客のオペレーションミスにより、 2009/06/20 の帳簿在庫ファイルの在庫数に不具合が発生。 データの不具合を 6/27 に発見。 ■ リカバリー処置 2009/06/19 と 2009/06/20 は、休業日である。 6/19 と 6/20 の間に、入出庫のトランザクションが発生していない事が確認出来たため、両日の在庫数は同等であると判断。 6/20 の在庫数を 6/19 の在庫数に置き換える事により対応。 C hubu… S ystem… C orporation
  • 4. H ******************************************************************* H ** THTNADF  リカバリ < THR999A > ** H ** WRITTEN 09/06/24 BY CSC Y.USHIDA ** H ** UPDATE ** H **--------------- PROGRAM DESCRIPTION ---------------------------** H ******************************************************************* H DATEDIT(*YMD) H COPYRIGHT('(C) CHUBU SYSTEM CO,.LTD 1996 - ') /IF DEFINED ( *CRTBNDRPG) H DFTACTGRP(*NO) ACTGRP(*NEW) /ENDIF F ******************************************************************* F *-----<< ファイル定義 >>-----* * F ******************************************************************* F * 帳在日別実績 ( キー日付順 ) ** F THTNADL2 U F E K DISK F RENAME(THTNABR:THTNAL2R) F * 帳在日別実績(キー品番順) ** F THTNADF I F E K DISK D *-----<< プロトタイプ定義 >>-----* D INIT PR D SAVE PR D *-----<< 変数定義 >>-----* D WDATE8 S 8 S 0 D WTIME6 S 6 S 0 C *-?************************************************************* C *-?* MAIN ROUTINE ** C *-?************************************************************* /FREE INIT() ; SAVE() ; *INLR = *ON ; RETURN ; /END-FREE P *-?************************************************************* P *-?*< INIT > : 初期処理 ** P *-?************************************************************* P INIT B D INIT PI /FREE WDATE8 = %DEC(%DATE() : *ISO ) ; // 8 桁日付 WTIME6 = %DEC(%TIME() ) ; // 6 桁時間 RETURN ; /END-FREE P E P *-?************************************************************* P *-?*< SAVE > : 初期処理 ** P *-?************************************************************* P SAVE B D SAVE PI D *-----<< 変数定義 >>-----* D READ_RECORD DS LIKEREC(THTNABR :*INPUT) D UPDATE_RECORD DS LIKEREC(THTNAL2R :*INPUT) D *-----<< キー定義 >>-----* D TNAKEY DS LIKEREC(THTNAL2R :*KEY) D TNAKEY2 DS LIKEREC(THTNABR :*KEY) C hubu… S ystem… C orporation
  • 5. /FREE // 開始キーの位置づけ TNAKEY.THNA05 = 20090620 ; TNAKEY.THNA01 = *LOVAL ; SETLL %KDS(TNAKEY) THTNAL2R ; DOU %EOF ; READE %KDS(TNAKEY:1) THTNAL2R UPDATE_RECORD ; IF %EOF ; LEAVE ; ENDIF ; //2009.06.19 の電算在庫参照 TNAKEY2.THNA01 = UPDATE_RECORD.THNA01 ; TNAKEY2.THNA02 = UPDATE_RECORD.THNA02 ; TNAKEY2.THNA03 = UPDATE_RECORD.THNA03 ; TNAKEY2.THNA04 = UPDATE_RECORD.THNA04 ; TNAKEY2.THNA12 = UPDATE_RECORD.THNA12 ; TNAKEY2.THNA05 = 20090619 ; CHAIN %KDS(TNAKEY2 ) THTNABR READ_RECORD ; IF NOT %FOUND ; // NONE KEY ITER ; ENDIF ; //2009.06.19 の電算在庫の適用 UPDATE_RECORD.THNA50 = READ_RECORD.THNA50 ; UPDATE_RECORD.THNA51 = READ_RECORD.THNA51 ; UPDATE_RECORD.THNA52 = READ_RECORD.THNA52 ; UPDATE_RECORD.THNA53 = READ_RECORD.THNA53 ; UPDATE_RECORD.THNA54 = READ_RECORD.THNA54 ; UPDATE_RECORD.THNA55 = READ_RECORD.THNA55 ; UPDATE_RECORD.THNA56 = READ_RECORD.THNA56 ; UPDATE_RECORD.THNA57 = READ_RECORD.THNA57 ; UPDATE_RECORD.THNA58 = READ_RECORD.THNA58 ; UPDATE_RECORD.THNA59 = READ_RECORD.THNA59 ; UPDATE_RECORD.THNA60 = READ_RECORD.THNA60 ; UPDATE_RECORD.THNA61 = READ_RECORD.THNA61 ; UPDATE_RECORD.THNA62 = READ_RECORD.THNA62 ; UPDATE_RECORD.THNA67 = READ_RECORD.THNA67 ; UPDATE_RECORD.THNA68 = READ_RECORD.THNA68 ; UPDATE_RECORD.THNA69 = READ_RECORD.THNA69 ; //2009.06.19 の減耗損の適用 UPDATE_RECORD.THNA74 = READ_RECORD.THNA74 ; UPDATE_RECORD.THNA75 = READ_RECORD.THNA75 ; UPDATE_RECORD.THNA76 = READ_RECORD.THNA76 ; UPDATE_RECORD.THNA77 = READ_RECORD.THNA77 ; //2009.06.19 の帳簿在庫の適用 UPDATE_RECORD.THNA80 = READ_RECORD.THNA80 ; UPDATE_RECORD.THND81 = READ_RECORD.THND81 ; UPDATE_RECORD.THND82 = READ_RECORD.THND82 ; UPDATE_RECORD.THND83 = READ_RECORD.THND83 ; //2009.06.19 の調整数の適用 UPDATE_RECORD.THND84 = READ_RECORD.THND84 ; UPDATE_RECORD.THND85 = READ_RECORD.THND85 ; UPDATE_RECORD.THNDA7 = READ_RECORD.THNDA7 ; // 更 新 UPDATE THTNAL2R UPDATE_RECORD ; ENDDO ; RETURN ; /END-FREE P E C hubu… S ystem… C orporation
  • 6. 日付処理の BIF ( 1 ) ■  ゾーン10進数8桁のシステム日付( %DEC,%DATE ) WZONE8 = %DEC(%DATE() : *ISO ) ; // 8 桁日付 WZONE8 = %DEC(%DATE()) ; // 8 桁日付 ■  ゾーン10進数6桁のシステム時刻 (%DEC,%TIME) WZONE6 = %DEC(%TIME() ) ; // 6 桁時間 ■  ゾーン10進数での年月日の取得 (%SUBDT) // 今日が 2009/01/01 の場合 WZONE8 = %SUBDT(%DATE():*YEARS) ; // 2009 WZONE8 = %SUBDT(%DATE():*MONTHS) ; // 1 WZONE8 = %SUBDT(%DATE():*DAYS ) ; // 1 DSPLY (' 今日の日は ' + %EDITC(WZONE8 :'X'));   // 01 ■  月や日付を2桁の文字にしたい場合は、 %EDITC の“ X” オプションを使う C hubu… S ystem… C orporation
  • 7. 日付処理の BIF ( 2 ) ■  数値・文字から日付型への変換  %DATE( 値 : 形式 ) // *ISO YYYY-MM-DD ,*MDY MM/DD/YY ,*YMD YY/MM/DD WDATEISO1 = %DATE(20090402 : *ISO) ; // ISO 形式 WDATEMDY1 = %DATE(040209 : *MDY) ; // MDY 形式 WDATEISO2 = %DATE('2009-04-02' : *ISO) ; // ISO 形式 WDATEMDY2 = %DATE('04/02/09' : *MDY) ; // MDY 形式 ■  数値・文字から時間型への変換  %TIME( 値 : 形式 ) WTIMEISO1 = %TIME(010101 : *ISO) ; // ISO 形式 WTIMEHMS1 = %TIME(010101 : *HMS) ; // HMS 形式 WTIMEISO2 = %TIME('01.01.01' : *ISO) ; // ISO 形式 WTIMEHMS2 = %TIME('01:01:01' : *HMS) ; // HMS 形式 WTIMEUSA2 = %TIME('01:01 PM' : *USA) ; C hubu… S ystem… C orporation
  • 8. 日付処理の BIF ( 3 ) ■  日時の妥当性チェック  TEST 命令、 %ERROR // 日付の妥当性チェック TEST(DE) 日付チェック // TEST(TE) 時刻チェック // TEST(ZE) タイムスタンプチェック CHECKDATE1 = 090402 ; TEST(DE) *YMD CHECKDATE1 ; IF %ERROR() ; DSPLY (' 日付エラー ') ; ELSE ; DSPLY (' 正しい日付 ') ; ENDIF ; CHECKDATE2 = 20090230 ; TEST(DE) *ISO CHECKDATE2 ; // false CHECKTIME1 = 130101 ; TEST(TE) *HMS CHECKTIME1 ; // true CHECKTIME2 = '27:01:01' ; TEST(TE) *HMS CHECKTIME2 ; // false C hubu… S ystem… C orporation
  • 9. 日付処理の BIF ( 4 ) ■  日時の加減算  YEARS,%MONTHS,%DAYS,%HOURS,%MINUTES,%SECONDS,%DIFF WZONE8 = %DEC(%DATE() + %YEARS(3) : *ISO ) ; // 3年後 WZONE8 = %DEC(%DATE() - %YEARS(15) : *ISO ) ; // 15年前 WZONE8 = %DEC(%DATE() + %MONTHS(17) : *ISO ) ; // 17ヵ月後 WZONE8 = %DEC(%DATE() + %DAYS(90) : *ISO ) ; // 90日後 WTIMESTAMP = %TIMESTAMP() ; WTIMESTAMP += %HOURS(27) ; // 27 時間後 WZONE8 = %DEC(%DATE(WTIMESTAMP)) ; // 27 時間後の10進数日付 // 時間差 %DIFF *DAYS|*MONTH|*YEARS|*HOURS|*MINUTES|*SECONDS DIFFDATE1 = %DATE(19780106 :*ISO) ; DIFFDATE2 = %DATE() ; DSPLY (' 私が生まれて ' + %CHAR(%DIFF(DIFFDATE2: DIFFDATE1 :*YEARS)) + ' 年がたちます '); DSPLY (' 私が生まれて ' + %CHAR(%DIFF(DIFFDATE2: DIFFDATE1 :*DAYS)) + ' 日がたちます '); ※ %DIFF の第一引数には、日付、時間、タイムスタンプのいずれかが使える タイムスタンプ=「 2009-07-14-13.45.20.036000 」 C hubu… S ystem… C orporation
  • 10. キャスト処理の BIF ( 1 ) ■  文字列への変換  %CHAR // ・数値の場合は、前項ゼロは除去される WSTRING1 = %CHAR(00090101) ; // 90101 // ・日付等の場合は第二引数に形式指定が出来る WSTRING2 = %CHAR(%DATE():*USA) ; // mmddyyyy // ・対象が長い場合は、右からカットされる WSTRING3 = %CHAR(-123456.7890123) ; // -12456.78 C hubu… S ystem… C orporation
  • 11. キャスト処理の BIF ( 2 ) ■  パック10進数への変換 %DEC (切り捨て) ,%DECH( 四捨五入あり ) // ・第 1 引数が文字の場合は、第 2 引数に桁数、第 3 引数に小数部が必須 WDEC1 = %DEC('12345678':8:0) ; // 12345678 // ・小数部は受側の変数によりカットされる WDEC2 = %DEC('12345.678':8:3) ; // 12345.6 // ・整数部は受側が小さいとオーバーフローエラーになる MONITOR ; WDEC3 = %DEC('12345.678':8:3) ; ON-ERROR 103 ; DSPLY ('WDEC3 は受側変数が小さい! ' + %CHAR(%STATUS)) ; ON-ERROR *ALL; DSPLY ('WDEC3 は予期しないエラー! ' + %CHAR(%STATUS)) ; ENDMON ; ※ マイナス符号は、前でも後ろでも可。カンマ編集された文字は、変換不可。 C hubu… S ystem… C orporation
  • 12. キャスト処理の BIF ( 3 ) ■  数値編集  %EDITC,%EDTIW // DDS の EDTCDE の編集と同じ。Xのみ例外的にゼロパディングされる特殊コード WEDTC1 = %EDITC(-1234567:'N') ; // -1,234,567 WEDTC2 = %EDITC(0001234567:'X') ; // 0001234567 WEDTC3 = %EDITC(20090403:'Y') ; // 2009/04/03 // DDS の EDTWRD と同じ WEDTW1 = %EDITW(120101 : ' : : ') ; // 12:01:01 ※ その他、使用頻度は低いかもしれないが、整数型への変換で %INT,%INTH などがある C hubu… S ystem… C orporation
  • 13. 例外処理の基本 ■  数値編集  MONITOR ~ ON-ERROR ~ ENDMON // 例外の基本形 MONITOR から ENDMON までで、エラーを監視。 ON-ERROR でエラーをキャッチ。 // 例外がキャッチされると ENDMON 以降に制御が渡る // ・モニター開始 MONITOR ; // ・監視対象ロジック WDEC1 = %DEC('12345.678':8:3) ; // ・例外ロジック、コロンで複数のエラーをリストできる ON-ERROR 103 :105 ; IF %STATUS = 103 ; // %STATUS にエラーコードが返される DSPLY ('ERR:103= 受側変数が小さい! '); ELSE ; DSPLY ('ERR:105= 数値変換出来ない文字がある! '); ENDIF ; ON-ERROR *ALL ; DSPLY ('ERR:' + %CHAR(%STATUS) +'= 予期しないエラー! '); // ・モニター終了 ENDMON ; C hubu… S ystem… C orporation
  • 14. 例外コード ■  代表的なエラーコード // ・代表的なエラーコード(プログラミング編) MONITOR ; ON-ERROR 102 ; // ゼロ除算 ON-ERROR 103 ; // 受側変数のオーバーフロー ON-ERROR 104 ; // 受側変数に対して値が小さすぎる ON-ERROR 112 ; // 日付、時刻、タイムSとして不正 ON-ERROR 113 ; // 日付演算で上位又は下位桁あふれ ON-ERROR 121 ; // 配列指標が正しくない ON-ERROR 907 ; // 10進数データエラー ON-ERROR *ALL ; // 全てのエラー ENDMON ; // ・代表的なエラーコード(ファイル操作編) MONITOR ; ON-ERROR 1021; // 重複キーを書き出そうとした ON-ERROR 1211; // クローズファイルへの入出操作しようとした ON-ERROR 1215; // オープン済ファイルをオープンしようとした ON-ERROR 1216; // 暗黙のオープンでエラー ON-ERROR 1217; // 明示的オープンでエラー ON-ERROR 1222; // 参照制約でレコードを割振る事ができない ENDMON ; C hubu… S ystem… C orporation
  • 15. サービスプログラム概要 モジュール A ・ QRPGSRC ・ QRPGLESRC CRTRPGMOD サービス プログラム A RPG プログラム B CRTSRVPGM 公開プロシージャ ・プロシージャA 非公開プロシージャ ・プロシージャB ・プロシージャA ・ QSRVSRC バインドソース (公開プロシージャ記述) バインディングディレクトリ イコール バインディングしたいプログラムリスト ※ サービスプログラムを、ざっくり大まかに言うと、サブプロシージャを動的に呼び出す為のプログラム CRTBNDRPG ・プロシージャA定義 ※ プロシージャAは、 いつでも呼出が可能 C hubu… S ystem… C orporation
  • 16. バインドソースの記述例 ■ バインドソースの役割は... ・ サービスプログラムで、公開したいプロシージャの指定をする。 ・ CRTSRVPGM でコンパイル時に、このリストから公開プロシージャの指定がされる。 (※通常バインドソースは「 QSRVSRC 」に作成する) STRPGMEXP PGMLVL(*CURRENT) SIGNATURE(*GEN) /* プロシージャ名を記述 */ EXPORT SYMBOL('SHAIN_EXISTS') EXPORT SYMBOL('SHAIN_CHK_CODE') EXPORT SYMBOL('SHAIN_CHK_KANA') EXPORT SYMBOL('SHAIN_CHK_NAME') EXPORT SYMBOL('SHAIN_GET_KANA') EXPORT SYMBOL('SHAIN_GET_NAME') EXPORT SYMBOL('SHAIN_GET_NYUDT') EXPORT SYMBOL('SHAIN_GET_ALL') EXPORT SYMBOL('SHAIN_UPDATE') EXPORT SYMBOL('SHAIN_DELETE') ENDPGMEXP C hubu… S ystem… C orporation
  • 17. バインドソースの使用例 バインドソースは、サービスプログラムのコンパイル時に使用する。 C hubu… S ystem… C orporation
  • 18. バインディングディレクトリの登録例 ■ バインディングディレクトリの役割は... ・ RPGのコンパイルで、バインドするプログラムを、指定する手間を省く為のリスト。 (※バインディングディレクトリは WRKBNDDIR で処理する。命名規則や作成先のライブラリーは統一感を持たせる) C hubu… S ystem… C orporation
  • 19. サービスプログラムを作成してみる(ライブコーディング) ■  前回作成したトランプディーラプログラムを、サービスプログラム化してみる! ※  プログラム名: CARDS 、サブプロシージャ名: DEAL で前回作ったと前提にして説明 ①   DEAL プロシージャのP仕様書で「 EXPORT 」公開とする。 (QRPGSRC.CARDS) ②   CARDS のバインドソースを作成する。( QSRVSRC.CARDS ) ③   CARDS のモジュールを QTEMP に作成する。( CRTRPGMOD=15 ) ④   CARDS のサービスプログラムを作成する。( CRTSRVPGM=SW: 自作) ⑤   WRKOBJ で確認してみる。 ⑥   DEALCALL プログラムで DEAL プロシージャを再利用する ⑧   DEALCALL をコンパイルする( CRTBNDRPG, OPTION:BNDDIR ) ⑦  バインドディレクトリに CARDS サービスプログラムを登録する( WRKBNDDIR ) ⑨   CALL DEALCALL で確認 C hubu… S ystem… C orporation
  • 20. 簡単なデバッグ(デモ) ■  今回作成した DEALCALL プログラムで、デバッグしてみる! ①   STRDBG ②  停止点設定(F6) ③  コマンド実行(F21)  CALL DEALCARDS ④  見たい変数で F11 ⑤   F12 で処理の再開 ⑥   F3 で終了 ⑦   ENDDBG を忘れずに C hubu… S ystem… C orporation
  • 21. 活動化グループ概要 品目マスター RPG プログラム A ※ 活動化グループ=プログラムが実行するメモリ領域 ■ 活動化グループに指定できる値 「 *NEW 」 = 常に新しい活動化グループで実行。 *NEW のトリガーとなった処理が終わるまで有効。 「 *CALLER 」 = 呼び出し元の活動化グループで実行。最初に CALLER が呼び出された場合は、 OPM(*DFTACTGRP) となる。 「任意の名前」 = ユーザー指定の活動家グループ名。省略値は“ QILE” 。一旦作成されるとサインオフまで有効。 ・省略の活動化グループ (*DFTACTGRP) サービス プログラム B *CALLER < 呼 出 > CALLP で呼ばれたサービスプログラム B は活動化グループ内に残る。 CALL で呼ばれた、 RPG プログラム A は OPM 呼出なので活動化グループから解放される。 *CALLER 品目マスター 品目マスター RPG プログラム A ・例えば21 サービス プログラム B *CALLER < 呼 出 > *NEW 品目マスター CALLP で呼ばれたサービスプログラム B は活動化グループ内に一旦残る。 CALL で呼ばれた、 RPG プログラム A は OPM 呼出なので活動化グループが消滅。と同時に、サービスプログラムは解放される。 C hubu… S ystem… C orporation
  • 22. 活動化グループで検証 C hubu… S ystem… C orporation
  • 23. ご清聴ありがとうございました C hubu… S ystem… C orporation

×