Migaro. 技術Tips

                       

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


【Delphi/400】ファイルのメンバーを利用する手法

今回は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接続の場合はTFDConnectionTFDQuery
   dbExpress接続の場合はTSQLConnectionTSQLQuery

接続設定を行った後、以下のように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を全く使用していない場合など、
ネイティブ接続を不使用のときにはTAS400TCall400コンポーネントが使えません。

このような場合は、クエリー(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月号より)