2007/7/30 月曜日

画面カーソル制御1

Filed under: RPG — takahashi @ 20:31:32

今回は画面のカーソルを入力項目のみに移動さる方法をお伝えします

DDSソースのキーワードにCSRINPONLYを指定するだけで完了です。

RPG:
  1. A                                      PRINT(*LIBL/QPRINT)
  2. A                                      DSPSIZ(24 80 *DS3)
  3. A                                      CSRINPONLY

これにより、画面上のカーソルの移動できる場所を入力項目のみに限定でき
、矢印キーで次の項目へ移動する事が可能となります
エンドユーザーが端末に不慣れな場合に入力項目にのみカーソルが移動するので、入力するべき項目がはっきりするので意外と使えます。

2007/7/21 土曜日

標識を節約してみよう

Filed under: RPG — takahashi @ 17:30:28

今回は前回の標識の話にちなんだ内容にします。
前回は標識を使用しない方法をお伝えしましたが、今回は標識を節約する方法です。
画面のファンクションの標識、何も指定しないと*INKC や *INKLなど♪ABCDEFG・・・・と口ずさみながらじゃないと?わかりづらいですよね。
そこで,CF01(01),CF02(02)とファンクションと標識を関連づけると、標識が最大で24個も使われてしまいますね。
そこで、今回は標識も使用せず尚且つソースも見やすくなる方法をお伝えします。

RPG側のコーディングです。
I仕様書にてファンクションキーの定義を行います。
F01,F02...は好きな名前で定義して結構です。

RPG:
  1. I**--ファンクション戻り値定義
  2. I              X'31'                 C         F01
  3. I              X'32'                 C         F02
  4. I              X'33'                 C         F03
  5. I              X'34'                 C         F04
  6. I              X'35'                 C         F05
  7. I              X'36'                 C         F06
  8. I              X'37'                 C         F07
  9. I              X'38'                 C         F08
  10. I              X'39'                 C         F09
  11. I              X'3A'                 C         F10
  12. I              X'3B'                 C         F11
  13. I              X'3C'                 C         F12
  14. I              X'B1'                 C         F13
  15. I              X'B2'                 C         F14
  16. I              X'B3'                 C         F15
  17. I              X'B4'                 C         F16
  18. I              X'B5'                 C         F17
  19. I              X'B6'                 C         F18
  20. I              X'B7'                 C         F19
  21. I              X'B8'                 C         F20
  22. I              X'B9'                 C         F21
  23. I              X'BA'                 C         F22
  24. I              X'BB'                 C         F23
  25. I              X'BC'                 C         F24
  26. I              X'F1'                 C         ENTER
  27. I              X'F4'                 C         ROLLDN
  28. I              X'F5'                 C         ROLLUP

RPG:
  1. IWINFDS      DS
  2. I                                        1   8 W#DSID
  3. I                                      369 369W#FUNK
  4. I                                    B 370 3710W#CSL
  5. I                                      370 370 W#LIN1
  6. I                                      371 371 W#COL1
  7. I                                    B 378 3790TPRRN

F仕様書で定義しているINFDSにファンクションを定義します
369 369バイト目に任意の名前で定義します
今回はW#FUNKとして定義します

実際のファンクションの判定です。

RPG:
  1. C**-- 判定
  2. C                     SELEC
  3. C           W#FUNK    WHEQ F01
  4. C                     EXSR @D1CLR
  5. C                     EXSR @D1OFF
  6. C           W#FUNK    WHEQ F03
  7. C                     MOVEL'END'     W#CTL     P
  8. C                     MOVEL'PF03'    E#0090
  9. C           W#FUNK    WHEQ F05
  10. C                     EXSR @D1CLR
  11. C                     OTHER
  12. C                     EXSR @D1ENT
  13. C                     ENDSL

2007/7/19 木曜日

標識を使用せず、画面項目の制御を行う方法

Filed under: RPG — takahashi @ 22:45:40

画面系のPRGプログラムを組んでいると、項目の多いPGになると標識が足らなくなって困った経験はありませんか!?
そこで今回は、標識を使用せずに画面項目の制御する方法をお伝えしようと思います

まず、画面DDS側でのコーディング方法を説明します

RPG:
  1. 0113.00 A            D1KIEN         2Y 0B  5  9TEXT(' 枝番 ')
  2. 0114.00 A                                      CHECK(RB)
  3. 0115.00 A                                      EDTCDE(Z)
  4. 0116.00 A                                      DSPATR(UL)
  5. 0117.00 A                                      DSPATR(&P1KIEN)
  6.  
  7. 0259.00 A            P1KIEN         1A  P      TEXT(' 枝番 ')

DSPATRにはBL等のキーワードではなく&の後に任意の名前を入力します。
次に&の後につけた名前と同じフィールドを追加します。ここでフィールドのタイプはPタイプ(プログラム-システム間)を指定します。

プログラム-システム間フィールドはプログラムとシステム間でデータの受け渡しに使用されます。 次にRPG側のコーディングです。

RPG:
  1. 0136.00      I*==============================================================*
  2. 0137.00      I*           デ  ー  タ  構  造                         *
  3. 0138.00      I*==============================================================*
  4. 0139.00      I* 固定値(表示属性 16 進 フィールド)
  5. 0140.00      I              X'24'                 C         P#CLR
  6. 0141.00      I              X'A0'                 C         P#PRO
  7. 0142.00      I              X'2A'                 C         P#ERR

I仕様書にて、項目の表示属性を16進数で定義します。
上記の例で説明すると
X'2A'は下線表示の入力項目
X'A0'は下線なしの非入力項目
X'2A'は明滅の高輝度表示の入力項目 となります

通常、標識のON、OFFで項目の表示属性を制御している所は、次の様に行います

RPG:
  1. 0732.00      C                     MOVELP#CLR     P1KIEN            枝番

16進数で定義した値を、画面DDSで定義したプログラム-システム間フィールドにセットします。

今回の例では
P#CLRをセットすれば、画面は下線付きの入力項目(DSPATR ULと同じ)になり
P#PROをセットすれば、画面は下線なしの保護項目(DSPATR PRと同じ)になり
P#ERRをセットすれば、画面は高輝度の明滅項目(DSPATR BL HIと同じ)になります。

但し、DSPATR(PC)と同等の動きをさせる事は不可能なので、カーソル制御は別途する必要があります。

2007/7/6 金曜日

5250画面のESCキー

Filed under: OS,PCOMM — takahashi @ 0:16:09

みなさん、5250画面でESCキーは使用していますか?
デフォルトのままだと、「AS/400 操作援助機能 (TM) メニュー」ってなものが表示されると思います。
でも、これってイマイチ使い道がないですよね?
そこで、ESCキーを押したときにQCMDが起動されたら便利だと思いませんか?
例えば、画面PGMをCALL時にESCキーを押してQCMDが呼び出されれば、
QTEMPのファイルの中身をタイムリーに確認する事もできます。

方法はユーザープロフィールの「アテンション・プログラム」にQCMDを指定すればOKです。
もちろん、QCMD以外のPGMを指定する事も可能です。
エンドユーザー用のアテンション・プログラムを印刷スプールの制御が行える
独自画面を設定した例もあります。

でも、うちはユーザープロフィールを共用で使用しているから、
勝手に変えられないとお困りの場合も大丈夫です。
サイン・オン後のコマンド画面にて SETATNPGM PGM(QCMD) を実行すれば、
それ以降はESCキーがQCMDとなるのでご安心を!

ちょいとした小技ですが、是非お試し下さい。

2007/7/2 月曜日

STRDBGの活用方法

Filed under: 小技 — takahashi @ 0:56:54

今回はSTRDBGの活用方法です。

本番環境のあるマシンで開発作業は、
本番環境のデータ更新してしまうというリスクが発生します。
そこで、本番環境のファイルを間違って更新してしまわない為に。。。。

本番環境のあるマシンでの開発で特に注意しないといけない事は、
誤って本番環境のファイルを更新してしまわない事です。
本番環境でテスト環境を作成する方法は大きく分けて2通りあると思います。

1・本番環境を丸々複製したテストライブラリーを作成する。
大々的な開発プロジェクト向きだと思います。
DIKS容量の問題や、本番環境からのマスターデータの反映等の問題があります

2・開発に必要なファイルだけをテストライブラリーに作成する。
小さなプロジェクト開発や、PG単体での修正には向いていると思います。
テストライブラリーに、テストしているPG全ての更新系の
ファイルが含まれているか注意が必要です

何れの場合もライブラリーリストには気をつけなければいけません。
CLの中でCHGLIBLを行う様な仕様になっていると、
いつの間にかライブラリーリストが変更されてしまって知らないうちに
本番データが更新なんて事態が発生してしまいます。

1の場合は、しっかりした環境作りがされているでしょうから
さほど気にはならないのですが、
2の場合のPG単体での修正時は特に注意が必要です。
修正するPGの修正ファイルを把握したつもりでも、
そのPGから別PGがCALLされていた為に
CALL先のPGで本番ファイルが更新されてしまったって事も十分に考えられます。

上記のようなミスにより本番環境のファイルを更新させない方法があります。

それは、デバッグの活用です。

みなさんは、デバックをかける時 STRDBG XXXXXX UPDPROD(*YES)
と無意識に 実行ファイルの更新のUPDPROD(*YES)としていませんか?。

このUPDPRODが重要なのです。
まず、テストライブラリーを作成する時にライブラリーの
タイプを*TESTで作成します。
すでに作成してあるライブラリーはCHGLIBで変更可能です。
PGをCALLする前に STRDBGと打ち実行キー。
UPDPRODは省略値の(*NO)です。プログラム名は省略です。
入力しても構いません。

UPDPROD(*NO)とした事により、
これから先はライブラリーのタイプが*TESTとなっている中のファイルは更新できますが、
タイプが*PROD(CTRLIBのデフォルト値)の中のファイルは更新不可となった訳です。
実際にRPGをCALLした場合はファイルのOPEN時にエラーとなる為、
プログラムを実行する事ができません。
また、これはPGだけでなくコマンドラインからの
CLRPFM,STRDFU等にも有効ですので、誤って消したりする事もありません。
(注:UPDPROD(*NO)のままSEUでソースの修正を行うと、
メンバー保管時にエラーとなりますのでその場合は慌てず編集画面に戻り,
F21のコマンドラインを呼び出し ENDDBGを実行して下さい。)

また、STRDBG時にPGM名を指定しても
そのPGMだけSTRDBGが有効になる訳ではないのでご安心下さい。

付け加えますと、QTEMPというライブラリーは*TESTになっています。
ですのでQTEMPに作成したファイルは、UPDPROD(*NO)でも更新可能です。
言い換えれば、ちょっとしたテスト環境はQTEMPにファイルを
作成すればいい訳です。

従って、テストライブラリーを作成する場合はタイプを*TESTで作成し、
実行前にSTRDBGを起動する事で不要なミスが防げます。

HTML convert time: 0.682 sec. Powered by WordPress ME