今回はOVRDBFコマンドを利用することで、
IBM i の物理(論理)ファイルのデフォルト以外のメンバーを利用する手法をご紹介します。
概要
Delphi/400で扱われる標準のSQLにはメンバーという概念がありません。
そのため、dbExpressやFireDACといったSQLベースのデータベースエンジンでは
デフォルト以外のメンバーに直接アクセスすることはできません。
(古いBDE接続では、TTableを使えば各メンバーにアクセスできましたが、
dbExpressやFireDACにはそのような機能がありません。)
しかしDelphi/400ではIBM i のNativeコマンドを利用することができます。
特定のメンバーに対してOVRDBFコマンド(ファイルの一時利用)を発行することで、
そのメンバー名を都度指定しなくとも、ファイル名だけで対象のメンバーを扱えるようになります。
その場合、SQLを実行するより前に、同一セッションでOVRDBFコマンドを実行します。
このとき、OVRSCOPEパラメータに*JOBを指定すると、その接続中を通して有効になります。
通常の利用方法
OVRDBFコマンドとSQLを実行するセッション(ジョブ)が同一の場合、
以下の手順でOVRDBFコマンドを利用可能です。
まずコネクションとクエリー(※)、TAS400の各コンポーネントを画面に貼り付けます。
(※)FireDAC接続の場合はTFDConnectionとTFDQuery
dbExpress接続の場合はTSQLConnectionとTSQLQuery
接続設定を行った後、以下のようにTAS400のRemoteCmdメソッドで
OVRDBFコマンドを発行することで、SQLからでもメンバーを利用できます。
//(Delphi/400でのコマンド実行例)
AS4001.RemoteCmd('OVRDBF FILE(FILENM) TOFILE(LibName/FileName) MBR(MemberName) OVRSCOPE(*JOB)');
[FILENM]にはSQLで抽出する際に利用するファイル名を、
[LibName/FileName] および [MemberName]には、
実際に利用するライブラリ・ファイル・メンバー名を指定します。
(FILENMとFileNameは基本的に同名を使用することが多いですが、
同じファイルの別々のメンバーを参照する場合など、別名を指定することも可能です。)
上記の場合、次のSQL文を発行するだけで、OVRDBFしたメンバーを扱うことができます。
SELECT * FROM FILENM
OVRDBFはTAS400のRemoteCmdメソッドで指定する他に、TCall400からCLを実行する方法もあります。
その場合は以下のようなCLを作成しておき、Delphi/400ではこれを呼び出します。
パラメータはファイル名・メンバー名(それぞれ文字10桁)を設定します。
以下の例では利用するファイル名と元のファイル名は同名で、
かつライブラリは省略(常に「*LIBL」を使用)しています。必要な場合は別途設定します。
このOVRDBFコマンドを使えば、
ファイル内で複数のメンバーを使った仕組みにも対応ができますので、是非ご活用ください。
/********************************************************************/
/* NAME : DELPHI 用 OVRDBF */
/********************************************************************/
PGM PARM(&P@FILE &P@MBR)
/*パラメータ*/
/* ファイル (文字10桁) */
DCL VAR(&P@FILE) TYPE(*CHAR) LEN(10)
/* メンバー (文字10桁) */
DCL VAR(&P@MBR) TYPE(*CHAR) LEN(10)
/*コマンド実行*/
OVRDBF FILE(&P@FILE) TOFILE(&P@FILE) MBR(&P@MBR) +
OVRSCOPE(*JOB)
/* 正常終了*/
ENDPGM
ネイティブ接続不使用時の利用方法
IntraWebで構築している場合やTAS400を全く使用していない場合など、
ネイティブ接続を不使用のときにはTAS400・TCall400コンポーネントが使えません。
このような場合は、クエリー(TFDQueryやTSQLQuery)コンポーネントを使って呼び出すことが可能です。
Delphi/400では、クエリーのSQL文にCALLコマンドを指定してExecSQLすると、
そのコマンドを実行することができます。
(TAS400のRemoteCmdと同様、戻り値を受け取ることはできません。)
CALLコマンドの指定方法は、以下の2通りがあります。
以下1.2.いずれかのコマンドをクエリーのSQLプロパティにセットしてExecSQLします。
1.OVRDBFを行うCLを呼び出す
LibName・CLNameは、それぞれCALLするCLのライブラリ名とプログラム名です。
このコマンドは上記で例示した「DELPHI 用 OVRDBF」を呼び出すイメージとなっています。
2.コマンド実行 (QCMDEXC) APIを使ってコマンドを直接発行する
こちらは直接コマンドを発行する例です。
1.OVRDBFを行うCLを呼び出す例
CALL PGM(LibName/CLName) PARM(('FileName') ('MemberName'))
2.コマンド実行 (QCMDEXC) APIを使ってコマンドを直接発行する例
CALL QCMDEXC('OVRDBF FILE(FILENM) TOFILE(LibName/FileName) MBR(MemberName) OVRSCOPE(*JOB)')
OVRDBFを解除する方法
OVRDBFは同名で複数回にわたって実行すると後から実行したほうが優先(上書き)されますが、
初期化の観点から、使用後は元に戻しておきたいという考え方もあります。
OVRDBFを解除(ファイル一時利用の終了)する場合は、DLTOVRコマンドを実行します。
ここではパラメータに利用していたファイル名(上記の例では「FILENM」)と、
OVRSCOPEの代替となるLVLのみを指定します。
//(Delphi/400でのコマンド実行例)
AS4001.RemoteCmd('DLTOVR FILE(FILENM) LVL(*JOB)');
CLを作成して呼び出す場合は、以下のようなソースになります。
パラメータは利用していたファイル名のみとなります。
/********************************************************************/
/* NAME : DELPHI 用 DLTOVR */
/********************************************************************/
PGM PARM(&P@FILE)
/*パラメータ*/
/* ファイル (文字10桁) */
DCL VAR(&P@FILE) TYPE(*CHAR) LEN(10)
/*コマンド実行*/
DLTOVR FILE(&P@FILE) LVL(*JOB)
/* 正常終了*/
ENDPGM
次回のTipsでは、Delphi/400から
今回紹介したファイルのメンバーを作成・削除する手順を紹介します。
(ミガロ.情報マガジン「MIGARO News!!」Vol.84 2008年1月号より)
(ミガロ.情報マガジン「MIGARO News!!」Vol.111 2010年2月号より)
(ミガロ.情報マガジン「MIGARO News!!」Vol.210 2018年5月号より)