(QA) IBM i ユーザーIDの最小パスワード長を12桁に変更したいで紹介したユーザープロフィールのパスワード有効期間を変更するプログラムをIBM Bob で作成します。

素のIBM Bobでの手順
まずは素のBobに指示してみます。
CLPを作成するプロンプト
ガチ目に指定(^^; 予期しない修正とか逆に面倒なので自己スキルを活用してガチガチにし指定したほうが確実でしょう。
以下を実行するCLPを作成してください。
1.DSPUSRPRF USRPRF(*ALL) OUTPUT(*OUTFILE) OUTFILE(QTEMP/DSPUSRPRF1)を実行する
2.QTEMP/DSPUSRPRF1 を読取る
3.読み取ったユーザープロフィール名がGで始まるユーザープロフィールの場合、パスワードを満了にセットする。
4.2と3を繰り返し、QTEMP/DSPUSRPRF1を全件処理する
3.は無くてもいいのですが、テストとはいえ全部パスワード切れになると怖いですし(^^;
生成したCLP
/*-------------------------------------------------------------------*/
/* プログラム名 : EXPGUSRPW */
/* 概要 : Gで始まるユーザープロフィールのパスワードを満了にする */
/* 処理 : */
/* 1. DSPUSRPRF *ALL をQTEMP/DSPUSRPRF1へ出力 */
/* 2. QTEMP/DSPUSRPRF1を全件読み取る */
/* 3. ユーザー名がGで始まる場合、パスワードを満了にセットする */
/*-------------------------------------------------------------------*/
PGM
/* 変数宣言 */
DCL VAR(&USRPRF) TYPE(*CHAR) LEN(10) /* ユーザープロフィール名 */
DCL VAR(&FIRST) TYPE(*CHAR) LEN(1) /* ユーザー名先頭1文字 */
DCL VAR(&EOF) TYPE(*LGL) /* ファイル終端フラグ */
/* ファイルオーバーライド:QTEMP/DSPUSRPRF1 を読取用にオーバーライド */
OVRDBF FILE(DSPUSRPRF1) TOFILE(QTEMP/DSPUSRPRF1) +
OVRSCOPE(*JOB)
/* STEP1: DSPUSRPRFをアウトファイルへ出力 */
DSPUSRPRF USRPRF(*ALL) OUTPUT(*OUTFILE) +
OUTFILE(QTEMP/DSPUSRPRF1) +
OUTMBR(*FIRST *REPLACE)
/* ファイルをオープン */
OPNQRYF FILE((DSPUSRPRF1)) OPTION(*INP)
/* STEP2: ループ開始 - 全件処理 */
CHGVAR VAR(&EOF) VALUE('0')
LOOP:
/* 1レコード読み取り */
RCVF RCDFMT(QSYDUPRF)
/* ファイル終端チェック */
MONMSG MSGID(CPF0864) EXEC(DO)
CHGVAR VAR(&EOF) VALUE('1')
GOTO CMDLBL(ENDLOOP)
ENDDO
/* STEP3: ユーザー名の先頭1文字を取得 */
CHGVAR VAR(&USRPRF) VALUE(&UPUPRF)
CHGVAR VAR(&FIRST) VALUE(%SST(&USRPRF 1 1))
/* Gで始まるユーザープロフィールの場合、パスワードを満了にセット */
IF COND(&FIRST *EQ 'G') THEN(DO)
CHGUSRPRF USRPRF(&USRPRF) PWDEXP(*YES)
SNDPGMMSG MSG('パスワード満了にセットしました: ' *CAT &USRPRF) +
MSGTYPE(*DIAG)
ENDDO
/* 次のレコードへ */
GOTO CMDLBL(LOOP)
ENDLOOP:
/* ファイルをクローズ */
CLOF OPNID(DSPUSRPRF1)
/* オーバーライドを削除 */
DLTOVR FILE(DSPUSRPRF1) LVL(*JOB)
RETURN
/*-------------------------------------------------------------------*/
/* エラー処理 */
/*-------------------------------------------------------------------*/
ERROR:
/* オーバーライドをクリーンアップ */
DLTOVR FILE(DSPUSRPRF1) LVL(*JOB)
MONMSG MSGID(CPF9841)
RETURN
ENDPGM
うむ問題無いようです。読取り、や、全件処理する、にやや過剰なコーディングしたようにも見えますが(^^;
IBM i のQCLSRC メンバーを作成してコピペ
Bobの作成したプログラムID(ソースメンバー名)をそのまま使用します。IBM i の人ならウム、とうなずく命名です。(わかりにくいですかね(^^;)

RDIかVSCODEにすればよかったです、つい惰性で(最近5250だけの環境で作業してたので(^^;)5250開いてしまった・・
15~16行単位でしかコピーできません・・面倒ですがやってしまいます。。

CLPをコンパイル&ソース修正
エラーなしでコンパイルできるかと思いきや2つエラーが出ました T T

DSPUSRPRF コマンドの出力結果ファイル QTEMP/DSPUSRPRF1 がDCLFされていない、左記のレコード様式名が間違い、の二点が原因でした。
修正したソースはこちら
/*-------------------------------------------------------------------*/
/* プログラム名 : EXPGUSRPW */
/* 概要 : Gで始まるユーザープロフィールのパスワードを満了にする */
/* 処理 : */
/* 1. DSPUSRPRF *ALL をQTEMP/DSPUSRPRF1へ出力 */
/* 2. QTEMP/DSPUSRPRF1を全件読み取る */
/* 3. ユーザー名がGで始まる場合、パスワードを満了にセットする */
/*-------------------------------------------------------------------*/
PGM
/* 変数宣言 */
DCL VAR(&USRPRF) TYPE(*CHAR) LEN(10) /* ユーザープロフィール名 */
DCL VAR(&FIRST) TYPE(*CHAR) LEN(1) /* ユーザー名先頭1文字 */
DCL VAR(&EOF) TYPE(*LGL) /* ファイル終端フラグ */
/* ユーザープロフィールの一覧 */
DCLF FILE(QTEMP/DSPUSRPRF1)
/* ファイルオーバーライド:QTEMP/DSPUSRPRF1 を読取用にオーバーライド */
OVRDBF FILE(DSPUSRPRF1) TOFILE(QTEMP/DSPUSRPRF1) +
OVRSCOPE(*JOB)
/* STEP1: DSPUSRPRFをアウトファイルへ出力 */
DSPUSRPRF USRPRF(*ALL) OUTPUT(*OUTFILE) +
OUTFILE(QTEMP/DSPUSRPRF1) +
OUTMBR(*FIRST *REPLACE)
/* ファイルをオープン */
OPNQRYF FILE((DSPUSRPRF1)) OPTION(*INP)
/* STEP2: ループ開始 - 全件処理 */
CHGVAR VAR(&EOF) VALUE('0')
LOOP:
/* 1レコード読み取り */
RCVF RCDFMT(QSYDSUPB)
/* ファイル終端チェック */
MONMSG MSGID(CPF0864) EXEC(DO)
CHGVAR VAR(&EOF) VALUE('1')
GOTO CMDLBL(ENDLOOP)
ENDDO
/* STEP3: ユーザー名の先頭1文字を取得 */
CHGVAR VAR(&USRPRF) VALUE(&UPUPRF)
CHGVAR VAR(&FIRST) VALUE(%SST(&USRPRF 1 1))
/* Gで始まるユーザープロフィールの場合、パスワードを満了にセット */
IF COND(&FIRST *EQ 'G') THEN(DO)
CHGUSRPRF USRPRF(&USRPRF) PWDEXP(*YES)
SNDPGMMSG MSG('パスワード満了にセットしました: ' *CAT &USRPRF) +
MSGTYPE(*DIAG)
ENDDO
/* 次のレコードへ */
GOTO CMDLBL(LOOP)
ENDLOOP:
/* ファイルをクローズ */
CLOF OPNID(DSPUSRPRF1)
/* オーバーライドを削除 */
DLTOVR FILE(DSPUSRPRF1) LVL(*JOB)
RETURN
/*-------------------------------------------------------------------*/
/* エラー処理 */
/*-------------------------------------------------------------------*/
ERROR:
/* オーバーライドをクリーンアップ */
DLTOVR FILE(DSPUSRPRF1) LVL(*JOB)
MONMSG MSGID(CPF9841)
RETURN
ENDPGM
PGMを実行してみる
パスワードは満了になっていません。
PGMを実行します。
CALL EXPGUSRPW
実行結果、パスワードが満了にセットされました。(パスワードはコマンドで満了に設定 が*YES)

次はPPIだとどうなるかも調べてみたいと思います。

