CAと略すとなにやら解りずらくなってしまいますが、知る人ぞ知る
ClientAccess(クライアントアクセス)のことです。OS400のバージョンが
5.1まではクライアントアクセスと呼ばれていましたが5.2からは名称が
変わり、iSeriesAccess(アイシリーズアクセス)となってしまったようです。
Windowsのエクスプローラと概観が似ていて、マウス操作でAS/400の
あらゆるオブジェクトを操作できるオペレーションナビゲータをはじめとし、
その他さまざまなソフトウェアの集まりの総称と認識しています。
このクライアントアクセスにも「ActiveX自動化オブジェクト」と
呼ばれるAPIが存在します。このAPIを熟知すればどうやらオペレーションナビゲータ
もどきのアプリケーションも開発できそうな勢いです。
○ActiveX自動化オブジェクトとは
PCOMMのところでも説明をしたのですがここでも少し触れます。ActiveXとは
オートメーションとも呼ばれていて、開発言語を意識せずにDLLやEXE内のルーチンを
呼び出す仕組みです。通常のDLLのようにパラメータ(引数)の型に厳しくないのが魅力的です。
○オブジェクトの種類
CAのActiveX自動化オブジェクトには以下のような種類(機能)が存在します。
◇◇AS/400 システム(AS400System)
OS400との認証やセッションを管理します。
◇◇AS/400 データ待ち行列(DataQueue)
OS400のオブジェクトであるデータキュー(*DTAQ)をクライアントから操作することができます。
◇◇AS/400 コマンド(Command)
OS400のコマンドやユーザーが作成したプログラムを実行することができます。コマンドや
プログラムから戻り値を受け取ることはできません。
◇◇AS/400 プログラム(Program)
OS400のAPIやユーザーが作成したプログラムの実行をすることができます。APIやプログラム
から戻り値を受け取ることができます。
◇◇データベース転送(DatabaseTransfer)
OS400側のデータをダウンロードしたりアップロードしたりすることができます。高レベルと
低レベルと呼ばれるインターフェースが存在し、高レベルは簡単に低レベルは細かく指定し
データ転送を行うことができます。
◇◇データ操作(Structure)
データの変換を行います。「AS/400データ待ち行列」の操作や「AS/400プログラム」を使用した
APIの実行でOS400とデータのやり取りを行う済に「バイト配列(OS400上ではバイナリ)」という
形で行う必要があります。その際のデータ変換を行います。
◇◇エラーの処理(Error)
CAの「ActiveX自動化オブジェクト」を操作する上で発生するエラーを管理します。
◇◇Administration(ClientInfo)
PC側にインストールされているClient Access Expressに関する情報の提供を行います。
○実際にできること
前述したオブジェクトの名前や簡単な解説で大体はわかると思います。魅力的に感じられる
のはやはり、OS400のコマンド呼び出しとデータ転送ではないかと思われます。例えばすぐに
思いつくのは、コマンドを発行し*OUTFILEしておき、そのファイルをダウンロードします。
ダウンロード後は適用業務プログラムから読み込むなりExcelへ取り込み印刷するなりと
他にも発想が広がるはずです。これらの動きをCAのインターフェースを使わずに実現することは
できます。しかし、一つの言語からシームレスに行えると言う意味では使い勝手の面からも
開発・テストの面から見ても楽になるのではないかと考えます。
上記の説明で補足したいことがあります。「コマンド」と「プログラム」の2つのオブジェクト
についてです。CAのヘルプではパラメータの受け渡しができる「プログラム」とできない
「コマンド」とかかれていますが使用した限りでは渡す場合はどちらも可能と思われます。
受け取る場合に違いが浮き彫りになります。例えばRTVJOBAというコマンドを例に説明します。
このコマンドは現在実行中のジョブに関する属性(情報)を取得することができます。
このコマンドの場合はどちらのオブジェクトを使用すればいいのでしょうか?
答えはどちらも使うことができません。ヘルプには明確に記述されていないのですがいろいろ
試した結果、ある制約があることに気がつきました。「コマンド」オブジェクトはCLやRPGなど
のプログラムとコマンドを実行することができますが戻り値を受け取ることができません。
「プログラム」オブジェクトはその名の通りプログラムしか実行しません。
つまりコマンドを実行してくれないのです。あくまでも経験則です。しかしAPIや
CLはすんなり実行してくれました。この事実は明らかにコマンドを対象外としているようにしか
思えません。理不尽な仕様と思いますがRTVJOBAの場合はいったんCLに組み込みそのCLを
「コマンド」オブジェクトを使用して呼ぶ形となってしまいます。この結果はきちんと情報が
取得できました。
この他にも「システム」オブジェクトは無視できません。始めは私も軽視していたのですが
実際に実用的なアプリケーションを想定するととても重要なことに気がつきます。前述ににも
ある*OUTFILEをダウンロードする場合を考えてみると良くわかるのですが、*OUTFILEを作成する
場合の作成場所です。通常のライブラリに作成してしまったのではサイズ的に問題となることが
有ります。常にデータがディスクを占領してしまうことになります。そこですぐに思い浮ぶ
のがQTEMPです。ところがQTEMPは同一ジョブからしか参照できません。これはコマンドを実行する
ジョブとダウンロードするジョブが同じでなければならないことになります。何も考えずに(シス
テムオブジェクトを有効に使わずに)コーディングしてしまうとジョブが別になってしまいます。
これでは目的が果たせません。また、OS400に要求を出すたびに認証用のダイアログが出てしまったり
することになります。
○利用方法
CAのヘルプにはVisualBasicからの使用例が載っています。VBScriptとExcelVBAそして
Delphiから試してみた結果、やはりVBAからが一番使い安く、解りやすく手軽と判断しました。
ここでは、ExcelVBAからの利用方法を紹介したいと思います。使い方に関してはVB6とほぼ
差が無いため、VB6でも同じ手順で利用可能と思っています。
また、全てのオブジェクトを試したわけではないので紹介する機能も限定したいと思います。
  □事前準備
それでは事前準備として実験する環境を用意したいと思います。当然のことながらCAとExcelが既に
インストールされているものとします。前提バージョンはCAが5.1.0以上、Excelが2000
以上とします。これ以下のバージョンでは試していません。
Excelを起動し、新規のシートが開かれている状態で、「ツール」→「マクロ」→「VisualBasicEditor」
を選択し、VBAの開発環境を開きます。次に開発環境から「ツール」→「参照設定」を選択します。
「参照可能なライブラリファイル」と見出しのあるリストボックスから「IBM AS/400 Client Access Express ActiveX Object Library」
を探し、チェックを付け[OK]ボタンを押下します。これでCAのAPIを使用する準備はできました。
注意が必要なのですがExcelVBAではファイルを変えた場合は参照設定の手順をやり直しとなってしまいます。
  □実際のコーディング
具体的にCAのオブジェクト(API)を使用するに当たり、何度も引合いに出した*OUTFILEの
ダウンロードについて説明します。使用するオブジェクトは「システム」「コマンド」
「データベース転送」の3っつになります。VB6またはVBAの言語的な基礎知識を前提として
記述しています。(VBの経験がない人ごめんなさい)
'1)まずはオブジェクト変数の宣言とインスタンス化です。
Dim as400 As New cwbx.AS400System
Dim cmd As New cwbx.Command
Dim trnsf As New cwbx.DatabaseDownloadRequest
'2)次にシステムオブジェクトを使いAS/400に対する認証を設定します。
With as400
    .Define "192.10.1.1" 'AS/400のIPアドレスかシステム名を指定
    .UserID = "OZZNE001" 'AS/400に登録のあるプロファイル
    .Password = "PASSWD" '上記プロファイルのパスワードを指定
End With
'3)コマンドオブジェクトを使用してコマンドの実行。
Set cmd.system = as400
cmd.Run "DSPOBJD OBJ(lib/*ALL) OBJTYPE(*ALL) OUTPUT(*OUTFILE) OUTFILE(QTEMP/file)"
'4)データベース転送オブジェクトを使いデータのダウンロードを実行。
Set trnsf.system = as400
trnsf.AS400File.Name = "QTEMP/file" 'AS/400側のテーブル
trnsf.pcFile.FileType = cwbdtCSV 'ダウンロードデータの形式(CSV)
trnsf.pcFile.Name = "C:\file.csv" 'PC側のファイル名
trnsf.Download 'ダウンロード実行
'5)最後にオブジェクトを破棄します。
Set trnsf = Nothing
Set cmd = Nothing
Set as400 = Nothing
○最後に
上記のサンプルを使用する際は自己責任でお願いします。