Migaro. 技術Tips

                       

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


Delphi/400 メソッド入門

ClientObjects/400では、IBM i 内のファイルやメンバーを探知する便利な機能が含まれています。
SCDToolsユニットで、次の7種類の要素が宣言されています。

  • ① TcGetListDataArea(データエリアのリスト)
  • ② TcGetListDataQueue(データキューのリスト)
  • ③ TcGetListFile(ファイルのリスト)
  • ④ TcGetListLib(ライブラリのリスト)
  • ⑤ TcGetListMbr(ファイルメンバーのリスト)
  • ⑥ TcGetListProg(プログラムのリスト)
  • ⑦ TcGetListOutqueue(アウトキューのリスト)

※共通のご留意事項

本記事の各関数を使用する場合には、
いずれもDelphiの当該ユニットのuses節に「ScdTools」の追加が必要になります。

これらのメソッドを実行するときには、TAS400コンポーネントのActiveプロパティをTrueにするか、
Connectメソッドで接続が確立されている必要があります。

また、2回以上連続で実行した場合、
結果が返ってくるパラメータはクリアされずに追記される(前の値が残ります)ので、
実行する前にクリアを行う必要があります。

 
 


① TcGetListDataArea(データエリアのリスト)

TcGetListDataArea」は、ライブラリを指定すると、
そのライブラリにあるDataAreaのリスト及び記述を取得できます。

また6つの引数が必要ですが、その内容は次の通りです。

  • 第1パラメータ:hnd(Smallint型)
    • IBM i の接続ハンドルです。
      TAS400クラスのGetHandleメソッドで取得できます。
  • 第2パラメータ:searchFile(string型)
    • 検索ストリングです。
      ‘D*’ ならば ‘D’ で始まる データエリアを受け取ります。
      すべてのデータエリアの場合には、”(空白) もしくは ‘*ALL’ と指定します。
  • 第3パラメータ:Libraryname(string型)
    • 検索対象のライブラリの名前です。
      直接指定または、’*LIBL’ や ‘*ALL’ も指定可能です。
  • 第4パラメータ:listFiles(TStrings型)
    • データエリア名のリストを受け取ります。
      TStrings型ですので、TStringListや、TListBoxクラスやTComboBoxなどのItemsプロパティも指定できます。
  • 第5パラメータ:listdesc(TStrings型)
    • データエリアの記述リストを受け取ります。
      TStrings型ですので、TStringListや、TListBoxクラスやTComboBoxなどのItemsプロパティも指定できます。
  • 第6パラメータ:taille(Word型)
    • 上に説明したリストを取得するために使用するバッファサイズです。

例えば、AS4001というNAMEを持つAS400コンポーネントのハンドルで、
ライブラリ「CO422」にあるすべてのデータエリアをTMemoコンポーネントに表示する場合、
以下のようにロジックを記述します。

 

TStringListの「List1」「List2」の変数を用意し、そこにデータエリアの名前と記述を取得し、
結果を「Memo1」「Memo2」にセットするには次のようなロジックになります。
(以下、他のメソッドのサンプルロジックも同様)

{*******************************************************************************
  TcGetListDataArea ボタン押下時処理
*******************************************************************************}
procedure TForm1.Button1Click(Sender: TObject);
var
  List1, List2 : TStringList; // 結果格納用StringList
begin
  // 結果格納用StringListの生成
  List1 := TStringList.Create;
  List2 := TStringList.Create;
  try
    // データエリアリストの取得
    TcgetListDataArea(AS4001.GetHandle, // 接続ハンドル
                      '',               // 絞込み文字列
                      'CO422',          // ライブラリ名
                      List1,            // データエリア名リスト(戻り)
                      List2,            // データエリア記述リスト(戻り)
                      32000);           // バッファサイズ

    // Memoに結果を表示
    Memo1.Lines.Text := List1.Text;
    Memo2.Lines.Text := List2.Text;

  finally
    List1.Free; // StringListの破棄
    List2.Free; // StringListの破棄
  end;
end;

 
 


② TcGetListDataQueue(データキューのリスト)

TcGetListDataQueue」はライブラリを指定すると、
そのライブラリにあるDataQueueのリスト及び記述を取得できます。

また6つの引数が必要ですが、
その内容は上記①の「TcGetListDataArea」と同じになります。

  • 第1パラメータ:hnd(Smallint型)
    • IBM i の接続ハンドルです。
      TAS400クラスのGetHandleメソッドで取得できます。
  • 第2パラメータ:searchFile(string型)
    • 検索ストリングです。
      ‘D*’ならば ‘D’ で始まるデータキューを受け取ります。
      すべてのデータキューの場合には、”(空白) もしくは ‘*ALL’ と指定します。
  • 第3パラメータ:Libraryname(string型)
    • 検索対象のライブラリの名前です。
      直接指定または、’*LIBL’ や ‘*ALL’ も指定可能です。
  • 第4パラメータ:listFiles(TStrings型)
    • データキュー名のリストを受け取ります。
      TStrings型ですので、TStringListや、TListBoxクラスやTComboBoxなどのItemsプロパティも指定できます。
  • 第5パラメータ:listdesc(TStrings型)
    • データキューの記述リストを受け取ります。
      TStrings型ですので、TStringListや、TListBoxクラスやTComboBoxなどのItemsプロパティも指定できます。
  • 第6パラメータ:taille(Word型)
    • 上に説明したリストを取得するために使用するバッファサイズです。

使用方法も上記①の「TcGetListDataArea」と同じになります。

{*******************************************************************************
  TcGetListDataQueue ボタン押下時処理
*******************************************************************************}
procedure TForm1.Button2Click(Sender: TObject);
var
  List1, List2 : TStringList; // 結果格納用StringList
begin
  // 結果格納用StringListの生成
  List1 := TStringList.Create;
  List2 := TStringList.Create;
  try
    // データキューリストの取得
    TcGetListDataQueue(AS4001.GetHandle, // 接続ハンドル
                      '',                // 絞込み文字列
                      'CO422',           // ライブラリ名
                       List1,            // データキュー名リスト(戻り)
                       List2,            // データキュー記述リスト(戻り)
                       32000);           // バッファサイズ

    // Memoに結果を表示
    Memo1.Lines.Text := List1.Text;
    Memo2.Lines.Text := List2.Text;

  finally
    List1.Free; // StringListの破棄
    List2.Free; // StringListの破棄
  end;
end;

 
 


③ TcGetListFile(ファイルのリスト)

TcGetListFile」はライブラリを指定すると、
そのライブラリにあるファイルのリスト及び記述を取得できます。

また6つの引数が必要ですが、その内容は上記①②と同じになります。

  • 第1パラメータ:hnd(Smallint型)
    • IBM i の接続ハンドルです。
      TAS400クラスのGetHandleメソッドで取得できます。
  • 第2パラメータ:searchFile(string型)
    • 検索ストリングです。
      ‘D*’ならば ‘D’ で始まるファイルを受け取ります。
      すべてのファイルの場合には、”(空白) もしくは ‘*ALL’ と指定します。
  • 第3パラメータ:Libraryname(string型)
    • 検索対象のライブラリの名前です。
      直接指定または、’*LIBL’ や ‘*ALL’ も指定可能です。
  • 第4パラメータ:listFiles(TStrings型)
    • ファイル名のリストを受け取ります。
      TStrings型ですので、TStringListや、TListBoxクラスやTComboBoxなどのItemsプロパティも指定できます。
  • 第5パラメータ:listdesc(TStrings型)
    • ファイルの記述リストを受け取ります。
      TStrings型ですので、TStringListや、TListBoxクラスやTComboBoxなどのItemsプロパティも指定できます。
  • 第6パラメータ:taille(Word型)
    • 上に説明したリストを取得するために使用するバッファサイズです。

使用方法もこれまでと同じになりますが、第2パラメータでファイル名を指定し、
受け取った第4パラメータに値があるかどうかで、存在チェックを行うことができます。

例えば、AS4001というNAMEを持つTAS400コンポーネントのハンドルで、
ライブラリCO422にファイル「CUSTOMER」が存在するかをチェックする方法をご説明します。

TStringListの「List1」「List2」の変数を用意し、
そこにファイル名、ファイルの記述をセットするようにし、
List1のCountプロパティで存在チェックを行います。
この値が「1」ならば、存在することになります。

{*******************************************************************************
  TcGetListFile ボタン押下時処理
*******************************************************************************}
procedure TForm1.Button3Click(Sender: TObject);
var
  List1, List2 : TStringList; // 結果格納用StringList
begin
  // 結果格納用StringListの生成
  List1 := TStringList.Create;
  List2 := TStringList.Create;
  try
    // ファイル名リストの取得
    TcgetListFile(AS4001.GetHandle, // 接続ハンドル
                  'CUSTOMER',       // 絞込み文字列
                  'CO422',          // ライブラリ名
                  List1,            // ファイル名リスト(戻り)
                  List2,            // ファイル記述リスト(戻り)
                  32000);           // バッファサイズ

    // 存在しない場合はメッセージを出す
    if (List1.Count < 1) then
    begin
      ShowMessage('ファイルが存在しません。');
    end;

    // Memoに結果を表示
    Memo1.Lines.Text := List1.Text;
    Memo2.Lines.Text := List2.Text;

  finally
    List1.Free; // StringListの破棄
    List2.Free; // StringListの破棄
  end;
end;

第4、第5パラメータで受け取ったファイル名や記述リストですが、
リスト内の文字列はファイル名で10桁、記述リストで50桁未満の場合には後ろに空白が埋められます。
必要に応じてTrim関数で空白を除いて下さい。
ファイル名が10桁より長い場合には、切り捨てられることはありません。

「ファイルが存在しなければファイルを作成する」といったときに利用できる方法です。

 
 


④ TcGetListLib(ライブラリのリスト)

TcGetListLib」は接続先のIBM i にあるライブラリのリスト及び記述を取得できます。
今回は5つの引数が必要ですが、その内容は次の通りです。

  • 第1パラメータ:hnd(Smallint型)
    • IBM i の接続ハンドルです。
      TAS400クラスのGetHandleメソッドで取得できます。
  • 第2パラメータ:searchLib(string型)
    • 検索ストリングです。
      ‘D*’ならば ‘D’ で始まるライブラリを受け取ります。
      ‘*LIBL’ や ‘*ALL’ も指定可能です。
  • 第3パラメータ:listBib(TStrings型)
    • ライブラリ名のリストを受け取ります。
      TStrings型ですので、TStringListや、TListBoxクラスやTComboBoxなどのItemsプロパティも指定できます。
  • 第4パラメータ:listdesc(TStrings型)
    • ライブラリの記述リストを受け取ります。
      TStrings型ですので、TStringListや、TListBoxクラスやTComboBoxなどのItemsプロパティも指定できます。
  • 第5パラメータ:taille(Word型)
    • 上に説明したリストを取得するために使用するバッファサイズです。

使用方法もほとんどこれまでと同じになりますが、第2パラメータでライブラリ名を指定し、
受け取った第3パラメータに値があるかで、存在チェックを行うことができます。

例えば、画面からEdit1に入力した名前でライブラリを検索し、
存在しなければAS400コンポーネントのRemoteCmdメソッドを使用して、
ライブラリを作成するには以下のように記述します。

{*******************************************************************************
  TcGetListLib ボタン押下時処理
*******************************************************************************}
procedure TForm1.Button4Click(Sender: TObject);
var
  List1, List2 : TStringList; // 結果格納用StringList
begin
  // 結果格納用StringListの生成
  List1 := TStringList.Create;
  List2 := TStringList.Create;
  try
    // ライブラリ名リストの取得
    TcGetListLib(AS4001.GetHandle, // 接続ハンドル
                 Edit1.Text,       // 絞込み文字列
                 List1,            // ライブラリ名リスト(戻り)
                 List2,            // ライブラリ記述リスト(戻り)
                 32000);           // バッファサイズ

    // 存在しない場合はメッセージを出す
    if (List1.Count < 1) then
    begin
      //ライブラリを作成
      AS4001.RemoteCmd('CRTLIB ' + Edit1.Text + ' TEXT(TestLibrary)');
    end;

    // Memoに結果を表示
    Memo1.Lines.Text := List1.Text;
    Memo2.Lines.Text := List2.Text;

  finally
    List1.Free; // StringListの破棄
    List2.Free; // StringListの破棄
  end;
end;

第3、第4パラメータで受け取ったライブラリ名や記述リストですが、
リスト内の文字列はライブラリ名で10桁、記述リストで50桁未満の場合には後ろに空白が埋められます。
必要に応じてTrim関数で空白を除いて下さい。

 
 


⑤ TcGetListMbr(ファイルメンバーのリスト)

TcGetListMbr」はファイルとライブラリを指定すると、
そのファイルメンバー名リスト及び記述を取得できます。

また7つの引数が必要ですが、その内容は次の通りです。

  • 第1パラメータ:hnd(Smallint型)
    • IBM i の接続ハンドルです。
      TAS400クラスのGetHandleメソッドで取得できます。
  • 第2パラメータ:searchmbr(string型)
    • 検索ストリングです。
      ‘D*’ならば ‘D’ で始まるメンバーを受け取ります。
      すべてのメンバーの場合には、”(空白) もしくは ‘*ALL’ と指定します。
  • 第3パラメータ:Files(string型)
    • 検索対象のファイルの名前です。
      他の関数とは異なり、ファイル名は完全一致で指定する必要があります。
  • 第4パラメータ:Libraryname(string型)
    • 検索対象のライブラリの名前です。
      直接指定または、’*LIBL’ や ‘*ALL’ も指定可能です。
  • 第5パラメータ:listFiles(TStrings型)
    • メンバー名のリストを受け取ります。
      TStrings型ですので、TStringListや、TListBoxクラスやTComboBoxなどのItemsプロパティも指定できます。
  • 第6パラメータ:listdesc(TStrings型)
    • メンバーの記述リストを受け取ります。
      TStrings型ですので、TStringListや、TListBoxクラスやTComboBoxなどのItemsプロパティも指定できます。
  • 第7パラメータ:taille(Word型)
    • 上に説明したリストを取得するために使用するバッファサイズです。

ここでは第2パラメータでファイルメンバー名を指定し、
受け取った第5パラメータに値があるかで、存在チェックを行うことができます。

ライブラリ「MIGARO」、ファイル「URIAGE」のメンバー名を
「MBR001」と指定して検索する例は次の通りです。

{*******************************************************************************
  TcGetListMbr ボタン押下時処理
*******************************************************************************}
procedure TForm1.Button5Click(Sender: TObject);
var
  List1, List2 : TStringList; // 結果格納用StringList
begin
  // 結果格納用StringListの生成
  List1 := TStringList.Create;
  List2 := TStringList.Create;
  try
    // メンバー名リストの取得
    TcGetListMbr(AS4001.GetHandle, // 接続ハンドル
                 'MBR001',         // 絞込み文字列
                 'URIAGE',         // ファイル名
                 'MIGARO',         // ライブラリ名
                 List1,            // メンバー名リスト(戻り)
                 List2,            // メンバー記述リスト(戻り)
                 32000);           // バッファサイズ

    // 存在しない場合はメッセージを出す
    if (List1.Count < 1) then
    begin
      ShowMessage('メンバーが見つかりません。');
    end;

    // Memoに結果を表示
    Memo1.Lines.Text := List1.Text;
    Memo2.Lines.Text := List2.Text;

  finally
    List1.Free; // StringListの破棄
    List2.Free; // StringListの破棄
  end;
end;

第5、第6パラメータで受け取ったメンバー名や記述リストですが、
リスト内の文字列はメンバー名で10桁、記述リストで50桁未満の場合には後ろに空白が埋められます。
必要に応じてTrim関数で空白を除いて下さい。

dbExpress接続やFireDAC接続でQuery・Tableコンポーネントから
ファイル内のメンバーへアクセスする場合は、OVRDBFコマンドを使用します。
使用後は、DLTOVRコマンドで使用終了をIBM i に通知します。

 
 


⑥ TcGetListProg(プログラムのリスト)

TcGetListProg」はライブラリを指定すると、
そのライブラリにあるプログラム名のリスト及び記述を取得できます。

上記①②③と同様に6つの引数が必要ですが、その内容は次の通りです。

  • 第1パラメータ:hnd(Smallint型)
    • IBM i の接続ハンドルです。
      TAS400クラスのGetHandleメソッドで取得できます。
  • 第2パラメータ:searchFile(string型)
    • 検索ストリングです。
      ‘D*’ならば ‘D’ で始まるプログラムを受け取ります。
      すべてのプログラムの場合には、”(空白) もしくは ‘*ALL’ と指定します。
  • 第3パラメータ:Libraryname(string型)
    • 検索対象のライブラリの名前です。
      直接指定または、’*LIBL’ や ‘*ALL’ も指定可能です。
  • 第4パラメータ:listFiles(TStrings型)
    • プログラム名のリストを受け取ります。
      TStrings型ですので、TStringListや、TListBoxクラスやTComboBoxなどのItemsプロパティも指定できます。
  • 第5パラメータ:listdesc(TStrings型)
    • プログラムの記述リストを受け取ります。
      TStrings型ですので、TStringListや、TListBoxクラスやTComboBoxなどのItemsプロパティも指定できます。
  • 第6パラメータ:taille(Word型)
    • 上に説明したリストを取得するために使用するバッファサイズです。

第2パラメータでプログラム名を指定し、受け取った第4パラメータに値があるかで、
存在チェックを行うことが可能です。

例えば、指定したプログラム名を検索し、存在すればそのプログラムを実行する場合には、
存在チェック後にCall400コンポーネントのProgramNameプロパティに設定し、実行します。

{*******************************************************************************
  TcgetListProg ボタン押下時処理
*******************************************************************************}
procedure TForm1.Button6Click(Sender: TObject);
var
  List1, List2 : TStringList; // 結果格納用StringList
begin
  // 結果格納用StringListの生成
  List1 := TStringList.Create;
  List2 := TStringList.Create;
  try
    // プログラム名リストの取得
    TcgetListProg(AS4001.GetHandle, // 接続ハンドル
                  '',               // 絞込み文字列
                  'CO422',          // ライブラリ名
                  List1,            // プログラム名リスト(戻り)
                  List2,            // プログラム記述リスト(戻り)
                  32000);           // バッファサイズ

    // 存在しない場合はメッセージを出す
    if (List1.Count < 1) then
    begin
      ShowMessage('プログラムが存在しません。');
    end;

    // Memoに結果を表示
    Memo1.Lines.Text := List1.Text;
    Memo2.Lines.Text := List2.Text;

  finally
    List1.Free; // StringListの破棄
    List2.Free; // StringListの破棄
  end;
end;

第4、第5パラメータで受け取ったプログラム名や記述リストですが、
リスト内の文字列はプログラム名で10桁、記述リストで50桁未満の場合には後ろに空白が埋められます。
必要に応じてTrim関数で空白を除いて下さい。

 
 


⑦ TcGetListOutqueue(アウトキューのリスト)

TcGetListOutqueue」はライブラリを指定すると、
そのライブラリにあるOUTQのリスト及び記述を取得できます。

こちらも上記①②③と同様に6つの引数が必要ですが、その内容は次の通りです。

  • 第1パラメータ:hnd(Smallint型)
    • IBM i の接続ハンドルです。
      TAS400クラスのGetHandleメソッドで取得できます。
  • 第2パラメータ:searchFile(string型)
    • 検索ストリングです。
      ‘D*’ならば ‘D’ で始まるアウトキューを受け取ります。
      すべてのアウトキューの場合には、”(空白) もしくは ‘*ALL’ と指定します。
  • 第3パラメータ:Libraryname(string型)
    • 検索対象のライブラリの名前です。
      直接指定または、’*LIBL’ や ‘*ALL’ も指定可能です。
  • 第4パラメータ:listFiles(TStrings型)
    • アウトキュー名のリストを受け取ります。
      TStrings型ですので、TStringListや、TListBoxクラスやTComboBoxなどのItemsプロパティも指定できます。
  • 第5パラメータ:listdesc(TStrings型)
    • アウトキューの記述リストを受け取ります。
      TStrings型ですので、TStringListや、TListBoxクラスやTComboBoxなどのItemsプロパティも指定できます。
  • 第6パラメータ:taille(Word型)
    • 上に説明したリストを取得するために使用するバッファサイズです。

第2パラメータでアウトキュー名を指定し、受け取った第4パラメータに値があるかで、
存在チェックを行うことが可能です。

例えば、指定したOUTQ名を検索し、
存在すればそこを出力対象にするといったコーディングが可能です。

{*******************************************************************************
  TcGetListOutQueue ボタン押下時処理
*******************************************************************************}
procedure TForm1.Button7Click(Sender: TObject);
var
  List1, List2 : TStringList; // 結果格納用StringList
  Filter: String;     // 絞込み文字列
begin
  // 結果格納用StringListの生成
  List1 := TStringList.Create;
  List2 := TStringList.Create;
  try
    // アウトキューリストの取得
    TcGetListOutQueue(AS4001.GetHandle, // 接続ハンドル
                      '',               // 絞込み文字列
                      'MIGARO',         // ライブラリ名
                      List1,            // アウトキューリスト(戻り)
                      List2,            // アウトキュー記述リスト(戻り)
                      32000);           // バッファサイズ

    // Memoに結果を表示
    Memo1.Lines.Text := List1.Text;
    Memo2.Lines.Text := List2.Text;

  finally
    List1.Free; // StringListの破棄
    List2.Free; // StringListの破棄
  end;
end;


 

(ミガロ.情報マガジン「MIGARO News!!」Vol.073~078 2007年2~7月号「ブレイクタイム」より)