Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


Delphi/400 プログラム実行中のジョブ情報取得方法

今回はDelphi/400から、実行中のジョブ情報を取得する方法をご紹介いたします。


概要・設定方法

IBM i(AS/400)コマンドの RTVJOBA を使用すると、
サインオンユーザー名やジョブ名などを取得することができます。

戻り値のあるコマンドを実行する場合、
Delphi/400ではTCmd400コンポーネントを使用します。

例えばサインオンユーザー名を取得し、
Labelコンポーネントに表示するには次のようなコードになります。
設計画面ではCmd400コンポーネントに文字10桁のパラメータを1つ用意します。

  Cmd4001.CommandLine.Text := 'RTVJOBA USER(&P.1)';
  Cmd4001.Execute;
  Label1.Caption := Cmd4001.Value[0]; 

 

ユーザー名を取得するのでパラメータは「USER」としていますが、
ジョブ名であれば「JOB」、ジョブ番号であれば「NBR」となります。

使用できるパラメータや属性/桁数については、
エミュレータで RTVJOBA コマンドを入力してF4を押すと確認できます。

 


 

上記を発展させると、他のコマンドのJOBパラメータでよく使用する

JOB(ジョブ番号/ユーザー名/ジョブ名)

という書式のジョブ情報を、エミュレータのWRKACTJOBを使用しなくても
Delphi/400のジョブ内から直接取得することが可能です。

以下に手順を記載します。

 

①:
画面やデータモジュールにTCmd400コンポーネント(例ではCmd4001)を配置し、
「AS400」プロパティに接続に使用するTAS400コンポーネントを、
「Params」プロパティに以下のようにパラメータを設定します。

 

②:
Cmd4001の「CommandLine」プロパティに以下のようにコマンド文を指定します。
(オブジェクトインスペクタでの指定、ソースコードでの指定いずれでも構いません)

RTVJOBA JOB(&P.1) USER(&P.2) NBR(&P.3)

 

③:
ソースコードで IBM i に接続した後、
次のようにロジックを記述してコマンドを実行させれば、
画面上に取得したJOBパラメータの値を表示・確認することができます。

  // ジョブ情報取得
  Cmd4001.Execute;
  Edit1.Text := 'JOB(' + Trim(Cmd4001.Value[2]) +      // ジョブ番号(NBR)
                   '/' + Trim(Cmd4001.Value[1]) +      // ユーザー(USER)
                   '/' + Trim(Cmd4001.Value[0]) + ')'; // ジョブの名前(JOB)

 

(取得結果のイメージ)

デバッグ時のSTRSRVJOBコマンドや、スプール出力時のCPYSPLFコマンド等で
必要な「JOB」パラメータの値が、このロジックで取得可能です。

 


<共通関数化する場合のロジック例>
(関数名:「GetMyJob」)

{*******************************************************************************
 目的: GetMyJob 使用例
 引数:
 戻値:
*******************************************************************************}
procedure TForm1.Button8Click(Sender: TObject);
begin
  ShowMessage(GetMyJob(AS4001));
end;

{*******************************************************************************
 目的: 自ジョブ情報を取得する
 引数: AAS400 - 接続中のTAS400コンポーネント
 戻値: ジョブ情報(ジョブ番号/ユーザー名/ジョブ名)
*******************************************************************************}
function TForm1.GetMyJob(AAS400: TAS400): String;
var
  cmd: TCmd400; // ※uses節に「Scdcmd」が必要
begin
  cmd := TCmd400.Create(nil); // コンポーネントを内部生成
  try
    // AS400/コマンド/パラメータ指定
    cmd.AS400 := AAS400;
    cmd.CommandLine.Text := 'RTVJOBA JOB(&P.1) USER(&P.2) NBR(&P.3)';
    cmd.AddParam('A', 10, 0);
    cmd.AddParam('A', 10, 0);
    cmd.AddParam('A',  6, 0);

    // ジョブ情報取得して戻り値に返す
    Cmd.Execute;
    Result := Trim(cmd.Value[2]) + '/' + // ジョブ番号(NBR)
              Trim(cmd.Value[1]) + '/' + // ユーザー(USER)
              Trim(cmd.Value[0]);        // ジョブの名前(JOB)
  finally
    FreeAndNil(cmd);  // 使い終わったコンポーネントを解放
  end;
end;