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;

 

 

 


概要・設定方法(SQLのみ使用時)

IntraWebで構築している場合やTAS400を全く使用していない場合など、
ネイティブ接続を不使用のときにはTAS400TCmd400コンポーネントが使えません。

このような場合は、クエリーコンポーネント(TFDQueryやTSQLQuery)を使って
SQL単独で呼び出すことが可能です。【※V7R1以降で確認】


<事前準備>

準備①:
ご利用の環境のIBM i エミュレータ(PCOMMやACS)で、
STRSQLコマンドから以下のACTIVE_JOB_INFO関数を使ったSQLが実行できるか確認しておきます。
このSQLはアクティブなジョブの各情報を取得するもので、
最終行の第3引数「*」をブランクにすれば他のジョブの情報も参照できます。

(詳細:ACTIVE_JOB_INFO テーブル関数 – IBM Documentation

SELECT
JOB_NAME,
SUBSYSTEM,
AUTHORIZATION_NAME,
JOB_STATUS,
TRUNC(CPU_TIME / 1000, 2) AS VV4,
THREAD_COUNT,
ELAPSED_CPU_PERCENTAGE,
ELAPSED_TOTAL_DISK_IO_COUNT
FROM
TABLE(QSYS2/ACTIVE_JOB_INFO('NO', '', '*', '')) AS ACT_JOBS

 
準備②:
上記のSQLで、最初にSELECTした「JOB_NAME」というフィールドで
自ジョブの『ジョブ番号/ユーザー名/ジョブ名』が取得できたかと思います。

ではこのSQLをDelphi/400から実行……と行きたい所ですが、
残念ながらDelphi/400では今回のようなTABLE関数に対応していません。

そこで、今回のTABLE関数を内包するビューを作成しておきます。
このビューをSELECTすることはDelphi/400でも可能です。
(ビュー名は任意。今回は「TESTLIB/MYJOBINFO」として作成。
 QTEMPに作成する場合を除き、1度だけ作成しておけば引き続き利用できます。)

(ビュー作成のSQL例)

CREATE VIEW TESTLIB/MYJOBINFO AS SELECT JOB_NAME FROM
TABLE(QSYS2/ACTIVE_JOB_INFO('NO', '', '*', '')) XXTEST


<SQL実行>

上記の事前準備で作成したビューをSELECTすることで、
Delphi/400のSQLだけを使ってジョブ情報が取得可能です。

(上記で作成したビューをSELECTするSQLの例)
SELECT * FROM TESTLIB/MYJOBINFO

(このようにSUBSTRすればジョブ番号だけを取得することも可能)
SELECT SUBSTR(JOB_NAME,1,6) AS JOBNO FROM TESTLIB/MYJOBINFO