今回は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を全く使用していない場合など、
ネイティブ接続を不使用のときにはTAS400・TCmd400コンポーネントが使えません。
このような場合は、クエリーコンポーネント(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