IBM Books

管理およびプログラミングの手引き OS/2 版、Windows NT 版、Unix 版


言語環境の使用

Net.Data はデータ・ソースへのアクセスと、 ビジネス・ロジックを持つアプリケーション・プログラムの実行のための、 言語環境を提供します。 たとえば、SQL 言語環境によって、 SQL ステートメントを DB2 データベース に渡すことが可能になり、 REXX 言語環境によって、REXX プログラムを起動できるようになります。 また、SYSTEM 言語環境を使用することにより、 プログラムを実行したり、 コマンドを発行したりすることができます。

Net.Data を使うことにより、 ユーザー作成の言語環境をプラグイン方式で追加することができます。 ユーザー作成言語環境は、それぞれ Net.Data によって定義された、 標準的なインターフェースのセットをサポートしていなければなりません。さらに、 ダイナミック・リンク・ライブラリー (DLL) 、または共用ライブラリーとして実装されていなければなりません。 Net.Data 提供の言語環境および ユーザー作成の言語環境の作成方法の詳細については、 Net.Data 言語環境解説書 を参照してください。

図 21 では、 Web サーバー、Net.Data、および Net.Data 言語環境間の関連を表示しています。

図 21. Net.Data 言語環境
Net.Data 言語環境


以下のセクションでは、Net.Data 言語環境と、 それをマクロで使用する方法について解説しています。

Net.Data 提供の言語環境の構成情報については、 言語環境のセットアップ を参照してください。

言語環境を使用した場合のパフォーマンスの向上については、 言語環境の最適化を参照してください。


Net.Data 提供の言語環境の概説

Net.Data は、アプリケーション用の、 データおよびプログラミング資源へのアクセスを可能にしてくれる、 言語環境を提供します。

Net.Data は次の 2 つの型の言語環境を提供します。

表 8 では、各言語環境を簡単に説明しています。 どのオペレーティング・システムが、 どの言語環境をサポートしているかを知るには、 Net.Data 解説書 のオペレーティング・システムの付録を参照してください。


表 8. Net.Data 言語環境
言語環境 環境名 説明
フラット・ファイル・インターフェース DTW_FILE フラット・ファイル・インターフェース (FFI) は、 データ・ソースとしてのテキスト・ファイルをサポートする関数をサポートしています。
IMS Web HWS_LE IMS Web 言語環境では、IMS Web を使用して IMS トランザクションを処理依頼し、 Web ブラウザーでそのトランザクションの出力を受け取ることができます。
Java アプレット DTW_APPLET Java アプレット言語環境では、Net.Data アプリケーションで、 Java アプレットを使用することができます。 applet タグ を生成するには、 applet タグの限定子とアプレットのパラメーター・リストを指定しなければなりません。
Java アプリケーション DTW_JAVAPPS Net.Data は、Java 言語環境により既存の Java アプリケーションをサポートします。
ODBC DTW_ODBC ODBC 言語環境は、複数のデータベース管理システムにアクセスするための、 ODBC インターフェースにより SQL を実行します。
Oracle DTW_ORA Oracle 言語環境では、Oracle データに直接アクセスすることができます。
Perl DTW_PERL Perl 言語環境は、Net.Data の FUNCTION ブロックで指定された、 内部 Perl スクリプトを解釈したり、 別のファイルに保管されている外部 Perl スクリプトを実行したりします。
REXX DTW_REXX REXX 言語環境は、Net.Data の FUNCTION ブロックで指定された、 内部 REXX プログラムを解釈したり、 別のファイルに保管されている外部 REXX プログラムを実行したりします。
SQL DTW_SQL SQL 言語環境は、DB2 を介して SQL ステートメントを実行します。 SQL ステートメントの結果は、表変数に格納して戻すことができます。
Sybase DTW_SYB Sybase 言語環境では、Sybase データに直接アクセスすることができます。
システム DTW_SYSTEM

システム言語環境は、コマンドの実行と外部プログラムの呼び出しをサポートします。

Web レジストリー DTW_WEBREG

Web レジストリー言語環境は、 アプリケーション関連の永続的記憶域のための関数を提供します。

言語環境の呼び出し

言語環境を呼び出すには、以下のことを行います。

例 :

%FUNCTION(DTW_SQL) custinfo() {
 select CUSTNAME, CUSTNO from ibmuser.customer
 %}
 ...
%HTML(REPORT) {
 @custinfo()
 %}

エラー条件の処理

言語環境関数にエラーが検出されると、 言語環境はエラー・コードを含む Net.Data の RETURN_CODE 変数を設定します。

以下のリソースを使用して、エラー条件を処理することができます。

機密保護

Net.Data を実行しているユーザー ID が、 言語環境ステートメントのターゲットが参照できる任意のオブジェクトにアクセスする、 正当な権限を持っていることを、確認してください。 たとえば、SQL 言語環境が SQL ステートメントを実行し、 SQL ステートメントがデータベース・ファイルにアクセスします。 だから、Net.Data を実行するユーザー ID は、 そのデータベース・ファイルを利用する権限を持っている必要があります。


データ言語環境

Net.Data が提供するデータ言語環境では、 関係データベースおよび階層データベースからデータにアクセスできます。 また、その他のデータ・ソースには Net.Data のマクロからアクセスできます。 以下のセクションでは、Net.Data が提供するデータ言語環境と、 Net.Data マクロにおけるその使用方法について説明します。

関係データベース言語環境

Net.Data は、 関係データ・ソースにアクセスするのに役立つ関係データベース言語環境を提供します。 Net.Data は以下の関係データベース言語環境を提供します。

ODBC 言語環境
オープン・データベース・コネクティビィティー (ODBC) 言語環境は、 ODBC インターフェースを介して SQL ステートメントを実行します。 ODBC は X/Open SQL CAE 仕様に基づいています。この仕様では、 単一のアプリケーションから多数のデータベース管理システムにアクセスできます。

ODBC 言語環境の使用方法 :

ODBC ドライバーおよびドライバー・マネージャーを用意します。 ODBC ドライバーの資料には、ODBC 環境のインストールとその構成方法が説明されています。

以下の構成ステートメントが、 初期設定ファイルに 1 行で記述されていることを確認してください。

ENVIRONMENT (DTW_ODBC) DTWODBC ( IN DATABASE, LOGIN, PASSWORD,
  TRANSACTION_SCOPE, SHOWSQL, ALIGN, START_ROW_NUM, DTW_SET_TOTAL_ROWS)

制約事項

Oracle 言語環境

Oracle 言語環境では、Oracle データへのネイティブなアクセスが提供されます。 CGI、FastCGI、NSAPI、ISAPI、ICAPI、あるいは GWAPI を使用して、 Net.Data から Oracle のデータベースにアクセスできます。 この言語環境では、Oracle 7.2、7.3、および 8.0 がサポートされています。

Oracle 言語環境の使用方法 :

以下の構成ステートメントが、 初期設定ファイルに 1 行で記述されていることを確認してください。

ENVIRONMENT (DTW_ORA) DTWORA (IN DATABASE, LOGIN, PASSWORD,
  TRANSACTION_SCOPE, SHOWSQL, ALIGN, START_ROW_NUM, DTW_SET_TOTAL_ROWS)

重要 : Oracle 言語環境のセットアップ方法については、 Oracle 言語環境のセットアップを参照してください。

制約事項

Oracle 言語環境には、以下の制約事項があります。

SQL 言語環境

SQL 言語環境では、DB2 データベースにアクセスできます。 DB2 へのアクセス時に最適のパフォーマンスを得るには、この言語環境を使用してください。

SQL 言語環境の使用方法 :

以下の構成ステートメントが、 初期設定ファイルに 1 行で記述されていることを確認してください。

ENVIRONMENT (DTW_SQL) DTWSQL (IN DATABASE, LOGIN, PASSWORD,
  TRANSACTION_SCOPE, SHOWSQL, ALIGN, START_ROW_NUM, DTW_SET_TOTAL_ROWS)

制約事項 :

インラインのステートメント・ブロックの、SQL ステートメントの最大サイズは 64KB です。 DB2 ユニバーサル・データベースには、以下の制約事項があります。

ご使用のデータベースによっては別の制限がある場合があります。 そのような制限があるかどうかを判別するには、データベースの資料を参照してください。

Sybase 言語環境
Sybase 言語環境は、Sybase データへのネイティブなアクセスを提供します。 CGI、FastCGI、NSAPI、ISAPI、ICAPI、あるいは GWAPI を使用して、 Net.Data から Sybase のデータベースにアクセスできます。

Sybase 言語環境の使用方法 :

以下の構成ステートメントが、 初期設定ファイルに 1 行で記述されていることを確認してください。

ENVIRONMENT (DTW_SYB)      DTWSYB    ( IN DATABASE, LOGIN, PASSWORD,
  TRANSACTION_SCOPE, SHOWSQL, ALIGN, START_ROW_NUM, DTW_SET_TOTAL_ROWS)

重要 : Sybase 言語環境のセットアップ方法については、 Sybase 言語環境のセットアップを参照してください。

制約事項 :

Sybase 言語環境には、以下の制約事項があります。

以下のセクションでは、これらの言語環境の使用方法について説明しています。

Net.Data アプリケーションにおけるトランザクション管理

挿入、削除、または更新ステートメントを用いてデータベースの内容を変更する場合、 その変更は、データベースが Net.Data からコミット・ステートメントを受け取るまでは永続的なものとはなりません。 エラーが発生すると、Net.Data はデータベースにロールバック・ステートメントを送り、 前回のコミットからの修正をすべてリバースにします。

Net.Data によるコミットおよび場合によってはロールバックの送信は、 TRANSACTION_SCOPE の設定方法、およびマクロにコミットが明示的に指定されたいるかどうかにより異なります。 TRANSACTION_SCOPE の値は MULTIPLE および SINGLE です。

MULTIPLE

コミットおよび場合によってはロールバック・ステートメントが発行される前に、Net.Data がすべての SQL ステートメントを実行するかを指定します。 Net.Data は要求の最後にコミットを送信し、 各 SQL ステートメントが正常に発行されると、 コミットによりデータベースのすべての変更が永続的なものとなります。 ステートメントのいずれかがエラーを戻すと、Net.Data はロールバック・ステートメントを発行し、 データベースの設定は元の状態に戻ります。TRANSACTION_SCOPE が設定されていなければ、 MULTIPLE がデフォルトです。

このコミット・メソッドを活動化するには、TRANSACTION_SCOPE を MULTIPLE に設定します。

たとえば、以下のような場合です。

@DTW_ASSIGN(TRANSACTION_SCOPE,"MULTIPLE")
 

SINGLE

各 SQL ステートメントが正常に終了した後に Net.Data がコミット・ステートメントを発行するよう指定します。 SQL ステートメントがエラーを戻すと、ロールバック・ステートメントが発行されます。 単一トランザクション効力範囲によりデータベースの即時変更が確実となりますが、 この効力範囲では後でロールバック・ステートメントを使用して変更を取り消すことはできません。

このコミット・メソッドを活動化するには、TRANSACTION_SCOPE を SINGLE に設定します。 たとえば、以下のような場合です。

@DTW_ASSIGN(TRANSACTION_SCOPE,"SINGLE")
 

コミット・ステートメントは、COMMIT SQL ステートメントを使用することによりマクロ内の任意の SQL ステートメントの最後で発行することができます。 アプリケーション開発者は、TRANSACTION_SCOPE の設定を MULTIPLE にして、トランザクションとみなしたステートメント・グループの最後にコミット・ステートメントを発行することにより、 アプリケーションにおけるコミットおよびロールバックの振る舞いを完全に管理することができます。たとえば、マクロ中のそれぞれの更新の後にコミット・ステートメントを発行することにより、 データの保全性が保証できます。

SQL コミット・ステートメントを発行するには、 HTML ブロックの任意のポイントに呼び出し可能な関数を定義します。

%FUNCTION(DTW_SQL) user_commit() {
  commit
%}
 
..
 
  %HTML {
  ...
  @user_commit()
  ...
%}
 

ラージ・オブジェクトを使用する

ラージ・オブジェクト・ファイル (LOB) を DB2 データベースに保管し、 ユーザーの Web アプリケーションの SQL または ODBC 言語環境を使用してそれらのファイルにアクセスすることができます。

SQL または ODBC 言語環境では、 SQL 照会が結果セットで LOB を戻す場合は、 変数 (V1 または V2 など) を処理する Net.Data 表または Net.Data 表フィールドに、 ラージ・オブジェクトを保管しません。 代わりに、Net.Data に LOB がある場合は、in Net.Data で作成されるファイルにその LOB を保管します。 このファイルは、HTML_PATH パス構成変数で指定されるディレクトリーにあります。 変数を処理する Net.Data 表フィールドおよび表の値は、 そのファイルのパスに設定されます。 そのファイルにアクセスできるのは、 Net.Data を実行しているユーザー ID に限定されます。

LOB を保管するファイルの名前は動的に構成され、 その形式は以下のようになります。

name[.extension]

変数:

name
ラージ・オブジェクトを識別する固有のストリング

extension
オブジェクトの型を識別するストリング。 CLOB および DBCLOB の場合、拡張子は 'txt' です。 BLOB の場合、SQL 言語環境では、 LOB が表す内容を示す LOB ファイルの最初の数バイトのシグニチャーを捜して、 拡張子を判別しようとします。 SQL 言語環境では、以下の型のデータ (括弧内は使用する拡張子) を認識します。

BLOB のオブジェクトの型が認識されないと、ファイル名には拡張子が付加されません。

LOB がマクロ・ファイル内で参照されている場合、 SQL 言語環境では、以下の構文を使用して、 LOB ファイル名の前に /tmplobs/ のストリングが付いたファイル名を戻します。

/tmplobs/name.[extension]

計画のためのヒント : 照会が LOB を戻すと、 HTML_PATH パス構成変数で指定されたディレクトリーにファイルが作成されます。 LOB を使用する場合、リソースがすぐに消費されるため、システムの制限を考慮してください。 定期的にディレクトリーを整理するバッチ・プログラムを作成するか 、 あるいは dtwclean デーモンを実行しても構いません。 詳しくは、一時的 LOBS の管理 を参照してください。 DataLinks を使用することをお勧めします。 これによって、SQL 言語環境でディレクトリーにファイルを保管する必要性がなくなり、 パフォーマンスが向上して、システム資源の使用量が少なくなります。

例: アプリケーションでは MPEG オーディオ (.MPA) ファイルを使用するため、 アプリケーション・ユーザーはファイル名をクリックしてビューアーを起動する必要があります。 SQL 言語環境ではこのファイル型を認識しないため、 EXEC 変数を使用してファイルに拡張子を追加します。

%DEFINE{
docroot="/usr/lpp/internet/server_root/html"
myFile=%EXEC "rename $(docroot)$(V3) $(docroot)$(V3).mpa"
%}
 
%{ where rename is the rename command on your operating system %} 
%FUNCTION(DTW_SQL) queryData() {
SELECT Name, IDPhoto, Voice FROM RepProfile
%REPORT{
<P>Here is the information you selected:<P>
%ROW{
$(myFile)
$(V1) Voice sample <IMG SRC="$(V2)">
<A HREF="$(V3).mpa")>Voice sample</A><P>
%}
%}
%}
 
%HTML(REPORT) {
@queryData()
%}

queryData 関数は以下の HTML 出力を戻します。

<P>Here are the images you selected:<P>
Kinson Yamamoto
<IMG SRC="/tmplobs/p2345n1.gif">
<A HREF="/tmplobs/p2345n2.mpa">Voice sample</A><P>
Merilee Lau
<IMG SRC="/tmplobs/p2345n3.gif">
<A HREF="/tmplobs/p2345n4.mpa">Voice sample</A><P>

前述の例の REPORT ブロックでは、暗黙のテーブル変数 V1、V2、および V3 を使用しています。

LOB のためのアクセス権 : LOB 用のデフォルトの tmplobs ディレクトリーは、 出荷された Net.Data 初期設定ファイルの HTML_PATH で指定されたディレクトリーにあります。 どんなユーザー ID でも、アクセス可能です。 HTML_PATH 値が変更されている場合は、 Web サーバーが実行されているユーザー ID が、 HTML_PATH で指定されたディレクトリーに書き込みアクセスできることを確認してください (詳しくは、HTML_PATH を参照してください)。

一時的 LOB の管理

Net.Data は、HTML_PATH パス構成変数で指定されたディレクトリーの下にある、 tmplobs というサブディレクトリーに一時的 LOB を保管します。 これらのファイルは大きくても構いませんが、 定期的に整理し、受け入れ可能なパフォーマンスを保守する必要があります。

Net.Data には、dtwclean というデーモンが備えられています。 これは、tmplobs ディレクトリーを定期的に管理する際に役立ちます。 dtwclean は、ポート 7127 を使用します。

dtwcleanデーモンを実行するには、以下のようにします。 コマンド行ウィンドウで、以下のコマンドを入力します。

dtwclean [-t xx] [-d|-l] 

変数:

-t
dtwclean がディレクトリーを整理する間隔を指定するフラグ

xx
dtwclean がファイルを消去する前に、 そのファイルがディレクトリー内にとどまる間隔 (秒)。 この値には、制限がありません。 デフォルトは、3600 秒です。

-d
デバッグ・モードを指定するフラグ。 トレース情報はコマンド・ウィンドウに表示されます。

-l
ログ・モードを指定するフラグ。 トレース情報はログ・ファイルに表示されます。

ストアード・プロシージャー

ストアード・プロシージャーは DB2 に保管されたコンパイル済みのプログラムで、 SQL ステートメントを実行することができます。Net.Data では、ストアード・プロシージャーは、 CALL ステートメントを使用して、Net.Data の関数から呼び出されます。ストアード・プロシージャーのパラメーターは、 Net.Data の関数仮引き数リストから渡されます。ストアード・プロシージャーを使用すると、 コンパイル済みの SQL ステートメントを、データベース・サーバーと一緒に保管することにより、 パフォーマンスと保全性を改良することができます。Net.Data は、 SQL および ODBC 言語環境での DB2 によるストアード・プロシージャー使用をサポートします。

このセクションでは、以下のトピックについて説明します。

ストアード・プロシージャーの構文

ストアード・プロシージャーの構文は FUNCTION ステートメント、CALL ステートメント、 および REPORT ブロック (任意選択) を使用します。

%FUNCTION (DTW_SQL) function_name ([IN datatype arg1, INOUT datatype arg2, 
    OUT tablename, ...]) {
  CALL stored_procedure [(resultsetname, ...)]
[%REPORT [(resultsetname)] { %}]
..
[%REPORT [(resultsetname)] { %}]
[%MESSAGE %}]
 
%}

変数:

function_name
ストアード・プロシージャーの呼び出しを開始する Net.Data 関数名

stored_procedure
ストアード・プロシージャーの名前

datatype
Net.Data がサポートするデータベース・データ型の 1 つ (表 9を参照)。 パラメーター・リストで指定されるデータ型は、 ストアード・プロシージャー内のデータ型と一致しなければなりません。これらのデータ型に関するさらに詳しい情報については、データベースの文書を参照してください。

tablename
結果セットを保管する Net.Data テーブルの名前 (結果セットを Net.Data テーブルに保管する場合のみ使用)。指定した場合、 パラメーター名は resultsetname の関連パラメーター名に一致する必要があります。

resultsetname
ストアード・プロシージャーから戻された結果を REPORT ブロックまたは関数仮引き数リスト (あるいはその両方) に関連付ける名前。REPORT ブロックの resultsetname は、 CALL ステートメントの結果セットに一致する必要があります。

表 9. ストアード・プロシージャーのデータ型
BIGINT DOUBLEPRECISION SMALLINT
CHAR FLOAT TIME
DATE INTEGER TIMESTAMP
DECIMAL GRAPHIC VARCHAR
DOUBLE LONGVARCHAR VARGRAPHIC

LONGVARGRAPHIC



ストアード・プロシージャーの呼び出し

  1. ストアード・プロシージャーへの呼び出しを開始する関数を定義します。
    %FUNCTION (DTW_SQL) function_name() 
    

  2. オプションで任意の IN、INOUT、または OUT パラメーターをストアード・プロシージャーに指定します。 これには、結果セットを Net.Data テーブルに保管するためにテーブル変数名 (結果セットを Net.Data テーブルに保管する場合は、Net.Data テーブルのみを指定) が含まれます。他のストアード・プロシージャーからのテーブル名または結果セットとして (IN または INOUT パラメーターとして) 指定することもできます。
    %FUNCTION (DTW_SQL) function_name (IN datatype
    arg1, INOUT datatype arg2, 
        OUT tablename...) 
    

  3. CALL ステートメントを使用して、ストアード・プロシージャー名を識別します。
      CALL stored_procedure
    

  4. ストアード・プロシージャーが 1 つの結果セットを生成する場合は、 オプションで REPORT ブロックを指定して Net.Data による結果セットの表示方法を定義します。
    %REPORT (resultsetname) {
    ..
    %}
    

    例 :

    %FUNCTION (DTW_SQL) mystoredproc (IN CHAR(30) arg1)  {
        CALL myproc   
     %REPORT (mytable){
      ...
      %ROW {  ...   %}
      ...   
     %} 
    %}
    

  5. ストアード・プロシージャーが複数の結果セットを生成する場合には以下のようにします。

パラメーターを渡す

ストアード・プロシージャーにパラメーターを渡すことができます。 また、ストアード・プロシージャーがパラメーターを更新するようにして、 新規値が Net.Data マクロに渡されるようにできます。関数仮引き数リストのパラメーターの数および型は、 ストアード・プロシージャーに定義した数および型に一致する必要があります。 たとえば、ストアード・プロシージャーに定義したパラメーター・リストのパラメーターが INOUT の場合、関数仮引き数リストにある対応パラメーターは INOUT でなくてはなりません。 ストアード・プロシージャーに定義したリストのパラメーターが CHAR(30) 型の場合、 関数仮引き数リストの対応パラメーターは CHAR(30) でなくてはなりません。

例 1: ストアード・プロシージャーにパラメーター値を渡す

%FUNCTION (DTW_SQL) mystoredproc (IN CHAR(30) valuein)  {
    CALL myproc 
..

例 2: ストアード・プロシージャーから値を戻す

%FUNCTION (DTW_SQL) mystoredproc (OUT VARCHAR(9) retvalue)  {
    CALL myproc  
..

結果セットの処理

SQL または ODBC 言語環境を使用することによりストアード・プロシージャーから 1 つ以上の結果セットを戻すことができます。 結果セットは、Net.Data テーブルに保管してさらにマクロで処理をするか、 または REPORT ブロックを使用して処理することができます。ストアード・プロシージャーが複数の結果セットを生成する場合、 ストアード・プロシージャーの生成した結果セットにそれぞれ名前を関連付ける必要があります。 これは、CALL ステートメントにパラメーターを指定して行います。 結果セットに指定する名前を REPORT ブロックまたは Net.Data 表と関連付け、 Net.Data が各結果セットを処理する方法を決めることができます。 以下を行うことができます。

複数のレポート・ブロックを使用する場合は、複数の REPORT ブロックに関するガイドラインおよび制約事項のガイドラインおよび制限を参照してください。

単一の結果セットを戻してデフォルトのレポートを使用する

以下の構文を使用します。

%FUNCTION (DTW_SQL) function_name () {
    CALL stored_procedure 
%}

たとえば、以下のような場合です。

 %FUNCTION (DTW_SQL) mystoredproc () {
    CALL myproc 
%}

単一の結果セットを戻して REPORT ブロックを指定する

以下の構文を使用します。

%FUNCTION (DTW_SQL) function_name () {    
     CALL stored_procedure  [(resultsetname)]
 %REPORT [(resultsetname)] {
  ...
 %}
%}

たとえば、以下のような場合です。

%FUNCTION (DTW_SQL) mystoredproc () {
    CALL myproc   
%REPORT {
      ...
  %ROW {  ...   %}
      ...  
 %} 
%}

代わりに、以下の構文を使用することもできます。

%FUNCTION (DTW_SQL) function_name () {
    CALL stored_procedure (resultsetname) 
 
 %REPORT (resultsetname) {
  ...
 %}
%}

たとえば、以下のような場合です。

%FUNCTION (DTW_SQL) mystoredproc () {
    CALL myproc (mytable1)  
 %REPORT (mytable1) {
  ...      
  %ROW {  ...   %}
  ...  
 %} 
%}

処理を続行するために、 Net.Data 表に単一の結果セットを保管するには、以下のようにします。

以下の構文を使用します。

%FUNCTION (DTW_SQL) function_name (OUT tablename) {
   CALL stored_procedure (resultsetname) 
%}

たとえば、以下のような場合です。

%DEFINE DTW_DEFAULT_REPORT = "NO"  
 
%FUNCTION (DTW_SQL) mystoredproc (OUT mytable1) {
   CALL myproc (mytable1) 
%}

DTW_DEFAULT_REPORT が NO に設定され、 デフォルトのレポートが結果セットのために生成されないことに注意してください。

複数の結果セットを戻し、 それをデフォルトのレポート形式設定を使用して表示するには、以下のようにします。

以下の構文を使用します。

%FUNCTION (DTW_SQL) function_name () {
    CALL stored_procedure [(resultsetname1, resultsetname2, ...)]
%}

ただし、レポート・ブロックは指定されていません。

たとえば、以下のような場合です。

%DEFINE DTW_DEFAULT_REPORT = "YES"
%FUNCTION (DTW_SQL) mystoredproc () {
    CALL myproc
%}

複数の結果セットを戻し、 処理を続行するために Net.Data 表にその結果セットを保管するようにするには、 以下のようにします。

以下の構文を使用します。

 %FUNCTION (DTW_SQL) function_name (OUT tablename1, tablename2, ...) {
    CALL stored_procedure (resultsetname1, resultsetname2, ...) 
%}

たとえば、以下のような場合です。

%DEFINE DTW_DEFAULT_REPORT = "NO"  
 
%FUNCTION (DTW_SQL) mystoredproc (OUT mytable1, mytable2) {
     CALL myproc (mytable1, mytable2) 
%}

DTW_DEFAULT_REPORT が NO に設定され、 デフォルトのレポートが結果セットのために生成されないことに注意してください。

複数の結果セットを戻し、 表示処理のために REPORT ブロックを指定するには、以下のようにします。

それぞれの結果セットは、1 つまたは複数の REPORT ブロックに関連付けられています。以下の構文を使用します。

%FUNCTION (DTW_SQL) function_name (, ...) {
   CALL stored_procedure (resultsetname1, resultsetname2, ...)
 %REPORT (tablename1) 
   ...      
  %ROW {  ...   %}   
   ...   
 %}    
 %REPORT (tablename2)       
   ...      
  %ROW {  ...   %} 
   ...   
 %} 
 
..
%}

たとえば、以下のような場合です。

%FUNCTION (DTW_SQL) mystoredproc () {
   CALL myproc (mytable1, mytable2)   
 
 %REPORT(mytable1) {     
  ...    
  %ROW {  ...   %}     
  ...  
 %}   
 
 %REPORT(mytable2) {     
  ...     
  %ROW {  ...   %}     
  ...  
 %} 
%}

複数の結果セットを戻し、 各結果セットに異なる表示または処理オプションを指定するには、以下のようにします。

固有のパラメーター名を使用して、 各結果セットに異なる処理オプションを指定することができます。 たとえば、以下のような場合です。

%FUNCTION (DTW_SQL) mystoredproc (OUT mytable2) {
    CALL myproc (mytable1, mytable2, mytable3)   
 
 %REPORT(mytable1)      
 ...     
  %ROW {  ...   %}      
 ...   
 %} 
%}
結果セット mytable1 は、 対応する REPORT ブロックにより処理され、 マクロ書き込みプロセスの指定どおりに表示されます。 結果セット mytable2 は、Net.Data 表 mytable2 に保管され、 ほかの関数に渡すなどの処理を続行するために使用することができます。 結果セット mytable3 は、 Net.Data のデフォルトのレポート形式設定を使用して表示することができます。 これは、この結果セットに対して、REPORT ブロックを指定しなかったからです。

結果セットでの DataLink URL のコード化

DataLink データ型は、データベース・ファイルに保管できるデータの型を拡張するための、 基本作成ブロックです。 DataLink の場合、列に保管される実際のデータは、ファイルを指すポインターだけです。 このファイルは、イメージ・ファイル、音声記録方式、 またはテキスト・ファイルのいずれの型のファイルでも構いません。 DataLinks は URL を保管して、ファイルのロケーションを解決します。

DATALINK データ型については、DataLink ファイル・マネージャーを使用する必要があります。 DataLink ファイル・マネージャーの詳細については、 使用しているオペレーティング・システムの DataLinks の資料を参照してください。 DATALINK データ型を使用する前に、 Web サーバーが、 DB2 ファイル・マネージャー・サーバーの管理するファイル・システムにアクセスできることを確認します。

SQL 照会が DataLinks を使って結果セットを戻し、 その DataLink 列が、 READ PERMISSION DB DataLink オプションをもつ FILE LINK CONTROL を使って作成されている場合は、 DataLink 列のファイル・パスにはアクセス・トークンが含まれています。 DB2 はそのアクセス・トークンを使用して、ファイルへのアクセスを認証します。 このアクセス・トークンがない場合は、 ファイルにアクセスしようとしても、権限違反のために、すべて失敗します。 ただし、アクセス・トークンには、 ブラウザーに戻される URL では使用できない文字 (セミコロン (;) 文字など) が組み込まれている可能性があります。 たとえば、以下のような場合です。

/datalink/pics/UN1B;0YPVKGG346KEBE;baibien.jpg
 

URL にはセミコロン (;) が含まれているため、これは無効です。 有効な URL にするには、Net.Data の組み込み関数 DTW_URLESCSEQ を使用してセミコロンをエンコードしなくてはなりません。ただし、 この関数は (/) もエンコードするため、関数を適用する前に行う必要のあるストリング処理もあります。

Net.Data MACRO_FUNCTION を記述してストリング処理を自動化し、 DTW_URLESCSEQ 関数を使用することができます。 DATALINK データ型の列からデータを検索するマクロについてそれぞれこの方法を用います。

例 1: DB2 UDB から戻された URL のエンコードを自動化する MACRO_FUNCTION

%{ TO DO: Apply DTW_URLESCSEQ to a DATALINK URL to make it a valid URL.
    IN: DATALINK URL from DB2 File Manager column.                   
    RETURN: The URL with token portion is URL encoded               
%}
%MACRO_FUNCTION encodeDataLink(in DLURL) {                        
  @DTW_rCONCAT( @DTW_rDELSTR( DLURL, 
  @DTW_rADD(@DTW_rLASTPOS("/", DLURL), "1" ) ),
  @DTW_rURLESCSEQ( @DTW_rSUBSTR(DLURL,
  @DTW_rADD( @DTW_rLASTPOS("/", DLURL), "1" ) ) ) )
%}

この MACRO_FUNCTION を使用すると、URL は正しくエンコードされ、 DATALINK 列に指定されたファイルはいずれの Web ブラウザーにおいても参照可能となります。

例 2: DATALINK URL を戻す SQL 照会を指定する Net.Data マクロ

    
%FUNCTION(DTW_SQL) myQuery() {
  select name, DLURLCOMPLETE(picture) from myTable where name like '%river%'
%REPORT{ 
%ROW{ 
      <p> $(V1) <br> 
      Before Encoding: $(V2) <br> 
      After Encoding: @encodeDataLInk($(V2)) <br> 
      Make HREF: <a href="@encodeDataLink($(V2))"> click here </a> <br> <p> 
    %}
  %}
%}

DataLink ファイル・マネージャーの関数が使用されることに注意してください。関数 dlurlcomplete は完全な URL を戻します。

関係データベース言語環境の例

以下の例では、 マクロから関係データベース言語環境を呼び出す方法を示しています。

ODBC

次の例は、ODBC 言語環境に対して複数の関数を定義し、それらを呼び出しています。

%DEFINE {
   DATABASE="qesq1"
   SHOWSQL="YES"
   table="int_null"
   LOGIN="netdata1"
   PASSWORD="ibmdb2"%}
%function(dtw_odbc) sq1() {
create table int_null (int1 int, int2 int)
%}
%function(dtw_odbc) sql2() {
insert into $(table) (int1) values (111)
%}
%function(dtw_odbc) sql3() {
insert into $(table) (int2) values (222)
%}
%function(dtw_odbc) sql4() {
select * from $(table)
%}
%function(dtw_odbc) sql5() {
drop table $(table)
%}
%HTML(REPORT) {
@sql1()
@sql2()
@sql3()
@sql4()
%}

Oracle
以下の例は、Oracle のデータベース udatabase を照会する、 関数定義が DTW_ORA のマクロを表すもので、変数参照を使用して、 照会すべきデータベース・テーブルを決定します。 FUNCTION ブロックには、エラー条件を処理する MESSAGE ブロックも含まれます。 Net.Data がマクロを処理する場合は、デフォルトのレポートがブラウザーに表示されます。

%DEFINE {
   LOGIN="ulogin"
   PASSWORD="upassword"
   DATABASE="udatabase"
   table= "utable"
%}
%FUNCTION(DTW_ORA) myQuery(){
select ename,job,empno,hiredate,sal,deptno from $(table) order by ename
%}
  %MESSAGE{
100 : "<b>WARNING</b>: No employee were found that met your search criteria.<p>"
    : continue
%}
%HTML(REPORT) {
@myQuery()
%}

SQL

以下の例は、DTW_SQL 関数定義を持つ、 SQL ストアード・プロシージャーを呼び出すマクロを示しています。 この例は、データ型が異なる 3 つのパラメーターを持っています。 DTW_SQL 言語環境は各パラメーターを、 そのデータ型に従ってストアード・プロシージャーに渡します。 ストアード・プロシージャーが処理を完了すると、出力パラメーターが戻され、 Net.Data はそれに応じて変数を更新します。

%{***********************************************************
                    DEFINE BLOCK
************************************************************%}
%DEFINE {
 MACRO_NAME     = "TEST ALL TYPES"
 DTW_HTML_TABLE = "YES"
 Procedure      = "TESTTYPE"
 parm1          = "1"              %{SMALLINT     	%}
 parm2          = "11"             %{INT    		    %}
 parm3          = "1.1"            %{DECIMAL (2,1) 	%}
 %}
 %FUNCTION(DTW_SQL)   myProc
  (INOUT SMALLINT    		parm1,
   INOUT INT       	   	parm2,
   INOUT DECIMAL(2,1)   	parm3){
CALL $(Procedure)
%}
%HTML(REPORT) {
<HEAD>
<TITLE>Net.Data : SQL Stored Procedure: Example '$(MACRO_NAME)'. </TITLE>
</HEAD>
<BODY BGCOLOR="#BBFFFF" TEXT="#000000" LINK="#000000">
<p><p>
Calling the function to create the stored procedure.
<p><p>
 @CRTPROC()
< hr>
<h2>
Values of the INOUT parameters
 prior to calling the stored procedure:<p>
</h2>
<b>parm1  (SMALLINT)</b><br>
$(parm1)<p>
<b>parm2  (INT)</b><br>
$(parm2)<p>
<b>parm3  (DECIMAL)</b><br>
$(parm3)<p>
<p>
< hr>
<h2>
Calling the function that executes the stored procedure.
</h2>
<p><p>
 @myProc(parm1,parm2,parm3)
< hr>
<h2>
Values of the INOUT parameters after
calling the stored procedure:<p>
</h2>
<b>parm1  (SMALLINT)</b><br>
$(parm1)<p>
<b>parm2  (INT)</b><br>
$(parm2)<p>
<b>parm3  (DECIMAL)</b><br>
$(parm3)<p>
</body>
%}

Sybase
以下の例は、Sybase のデータベース udatabase を照会する、 関数定義が DTW_SYB のマクロを表すもので、変数参照を使用して、 照会すべきデータベース・テーブルを決定します。 FUNCTION ブロックには、エラー条件を処理する MESSAGE ブロックも含まれます。 Net.Data がマクロを処理する場合は、デフォルトのレポートがブラウザーに表示されます。

%DEFINE {
   LOGIN="ulogin"
   PASSWORD="upassword"
   DATABASE="udatabase"
   table= "utable"
%}
%FUNCTION(DTW_SYB) myQuery(){
select ename,job,empno,hiredate,sal,deptno from $(table) order by ename
%}
  %MESSAGE{
100 : "<b>WARNING</b>: No employee were found that met your search criteria.<p>"
    : continue
%}
%HTML(REPORT) {
@myQuery()
%}

フラット・ファイル・インターフェース言語環境

データ・ソースとしてフラット・ファイル (すなわち平文ファイル) を使用する場合は、 フラット・ファイル・インターフェース (FFI) と、 それに関連付けられている Web サーバー上のファイルを、オープン、クローズ、 読み取り、書き込み、そして削除するための関数を使用します。 ファイル言語サポートは、ブラウザーから Web クライアントの要求が発生すると、 FFI 関数を使用して Web サーバー上のファイルに対して読み取り、 または書き込みを行います。 FFI はファイルをレコード・ファイルとして表示します。 レコードは Net.Data マクロ表変数の行と等価であり、レコードの値は、 Net.Data マクロ表変数のフィールドの値と等価です。 FFI はファイルからレコードを Net.Data マクロ表の行に読み込み、 行を表からレコードに書き込みます。

FFI 組み込み関数の説明と構文については、 Net.Data 解説書 を参照してください。

FFI 言語環境の構成

以下の構成ステートメントが、 初期設定ファイルに 1 行で記述されていることを確認します。

ENVIRONMENT (DTW_FILE)   DTWFILE   ( OUT RETURN_CODE )

Net.Data 初期設定ファイル、および言語環境の ENVIRONMENT ステートメントの詳細は、 環境構成ステートメントを参照してください。

FFI 組み込み関数の呼び出し

FFI 関数の呼び出しは、他の関数の呼び出しと同じです。 DEFINE ステートメントを使用して、渡したいパラメーターを変数として定義します。 たとえば次のように定義します。

%DEFINE {
    myFile = "c:/private/myfile"
    myTable = %TABLE
    myWait = "1500"
    myRows = "2"
 %}

次に関数呼び出しステートメントを使用して関数を呼び出します。 たとえば次のようにします。

@DTWF_UPDATE(myFile, "Delimited", "|", myTable, myWait, myRows)

この例では、Net.Data はffi001.dat の内容を Net.Data の表に読み込み、 この表の内容を tmp.dat ファイルに書き込みます。 最後に、Net.Data は tmp.dat ファイルを削除します。

%DEFINE {
mytable = %TABLE(ALL)
myfile  = "/usr/lpp/netdata/ffi//ffi001.dat"
tmpfile = "/usr/lpp/netdata/ffi/tmp.dat"
%}
%HTML(report){
@DTWF_READ(myfile, "ASCIITEXT", " ", mytable)
@DTW_TB_TABLE(mytable)
@DTWF_WRITE(tmpfile, "ASCIITEXT", " ", mytable)
@DTW_TB_TABLE(mytable)
@DTWF_REMOVE(tmpfile)
%}

Web レジストリー言語環境

Net.Data の Web レジストリーは、 アプリケーションに関連するデータ用の永続的な記憶域を提供します。 Web レジスターには、 実行時に Web ベースのアプリケーションが動的にアクセスできる構成情報、 およびその他のデータが保管されます。 Web レジストリーには、 Net.Data と Web レジストリーの組み込みサポートを使用する Net.Data マクロを介するか、 この目的のために作成された CGI プログラムからしかアクセスできません。 Web レジストリーは、オペレーティング・システムのサブセットで使用できます。 Web レジストリーの組み込み関数の説明と構文、 およびこの言語環境をサポートするオペレーティング・システムのリストについては、 Net.Data 解説書 を参照してください。

標準的な Web ページの開発では、 URL は直接 Web ページの HTML ソースに挿入しなければなりません。 このため、リンクの変更が難しくなります。 また、静的な性格のため、Web ページに簡単に挿入できるリンクのタイプも制限されます。 Web レジストリーを使用して、 アプリケーションに関連するデータ (たとえば URL) を保管しておけば、 動的に設定されたリンクを持つ HTML のページを作成するのに役に立ちます。

レジストリーへの情報の保管およびその保守は、 レジストリーへの書き込みアクセス権を持つアプリケーション開発者、 あるいは Web 管理者が行うことができます。 アプリケーションは、それに関連付けられているレジストリーから実行時に情報を取得します。 これにより、柔軟なアプリケーションを設計でき、 アプリケーションとサーバーの移動も可能になります。 Net.Data のマクロを使用すると、 動的に設定されたリンクを持つ HTML のページを作成できます。

情報は Web レジストリーにレジストリー項目の形で保管されます。 各レジストリー項目は、RegistryVariable ストリングと、 それに対応する RegistryData ストリングという、ペアの文字ストリングで構成されます。 ペアのストリングで表示できる情報はすべて、レジストリー項目として保管できます。 Net.Data は、この変数ストリングを、レジストリーの特定の項目を見つけ、 取得するための検索キーとして使用します。

表 10 は、Web レジストリーのサンプルを表示したものです。


表 10. Web レジストリーのサンプル
CompanyName WorldConnect
Server ftp.einet.net
JohnDoe/foreground Green
CompanyURL/IBM Corp. http://www.ibm.com
CompanyURL/Sun Microsystems Corp. http://www.sun.com
CompanyURL/Digital Equipment Corp. http://www.dec.com
JaneDoe/Home_page http://jane.info.net

Web レジストリーの使用を考慮すべき理由 :

Web レジストリーの索引付け項目は、 Index ストリングが付加された RegistryVariable ストリングを持つ項目で、 次の構文を使用します。

RegistryVariable/Index

ユーザーは、個々のパラメーターの索引ストリングの値を、 索引付け項目を操作するように設計された組み込み関数に与えます。 複数の索引付けレジストリー項目は、 同じ RegistryVariable ストリング値を持つことができますが、 異なる Index ストリング値を持つことにより、各項目を一意的に識別することができます。


表 11. 索引付け Web レジストリーのサンプル
Smith/Company_URL http://www.ibmlink.ibm.com
Smith/Home_page http://www.advantis.com

上の 2 つの索引付け項目は、 同じ Smith という RegistryVariable ストリング値を持っていますが、 それぞれ異なる Index ストリングを持っています。 これらの項目は、Web レジストリー関数では異なる 2 つの項目として処理されます。

Web レジストリー言語環境の構成

以下の構成ステートメントが、 初期設定ファイルに 1 行で記述されていることを確認します。

ENVIRONMENT (DTW_WEBREG)   DTWWEB    ( OUT RETURN_CODE )

Net.Data 初期設定ファイル、および言語環境の ENVIRONMENT ステートメントの詳細は、 環境構成ステートメントを参照してください。

Web レジストリーの組み込み関数の呼び出し

Web レジストリー関数を、他の関数を呼び出すのと同じように呼び出します。 DEFINE ステートメントを使用して、渡したいパラメーターを変数として定義します。 例 :

%DEFINE {
    name = "smith"
 %}

次に関数呼び出しステートメントを使用して関数を呼び出します。 たとえば次のようにします。

@DTWR_ADDENTRY("URLLIST", name, "http://www.software.ibm.com/",
    "WORK_URL"

次の例では Web レジストリーを作成し、記入項目を追加しています。 その後、記入項目を含むレポートを表示します。

%DEFINE {
	RegTable = %TABLE(ALL)
%}
%MESSAGE {
    default:"<p>Function Error: Return code: $(RETURN_CODE)." :continue
%}
%FUNCTION(DTW_WEBREG) ListTable(INOUT RegTable) {
%}
%HTML(report){
@DTWR_CREATEREG("MYREG")
@DTWR_ADDENTRY("MYREG", "Dept. 1", "Payroll")
@DTWR_ADDENTRY("MYREG", "Dept. 2", "Technical Support")
@DTWR_ADDENTRY("MYREG", "Dept. 3", "Research")
@DTWR_LISTREG("MYREG", RegTable)
<p>Report:<br>
@ListTable(RegTable)
%}

IMS Web 言語環境

IMS Web 言語環境は、Net.Data を使用して、 WWW 環境で IMS トランザクションを実行するための完全な終端間解決のパーツです。 IMS Web 言語環境は、以下を提供します。

IMS Web Studio ツールは、DLL およびマクロのためのコードと、 DLL 実行可能ファイル、 または共有ライブラリーを構築するための作成ファイルを、 トランザクションのメッセージ形式サービス (MFS) のソース、 および IMS Web の Net.Data アプリケーションのための HTML ページのサンプルから、 生成します。 実行可能な形式の DLL を構築後、ユーザーはその DLL とマクロを、 Net.Data を実行している Web サーバーに移動します。 トランザクションは、Web 環境で作動可能になります。

IMS Web は、Web サーバーと IMS 環境との間で通信を行うために、 IMS TCP/IP オープン・トランザクション・マネージャー・アクセス (OTMA) 接続を使用します。

IMS Web の使い方の詳細は、IMS Web のホーム・ページを参照してください。

http://www.software.ibm.com/data/ims/about/imsweb/document/

IMS Web 言語環境の構成

IMS Web 言語環境を使用するには、Net.Data 初期設定ファイルを検査し、 言語環境をセットアップしなければなりません。

以下の構成ステートメントが、 初期設定ファイルに 1 行で記述されていることを確認してください。

ENVIRONMENT (HWS_LE)       DTWHWS    ( OUT RETURN_CODE )

Net.Data 初期設定ファイル、および言語環境の ENVIRONMENT ステートメントの詳細は、 環境構成ステートメントを参照してください。

重要 : IMS 言語環境のセットアップ方法については、 IMS Web 言語環境のセットアップを参照してください。

制約事項

Net.Data の Web 言語環境は、 Net.Data が CGI アプリケーションとして実行される場合しかサポートされません。


プログラミング言語環境

Net.Data は、外部プログラムを呼び出す際に使用するための、 以下の言語環境を提供しています。

アクセス権 : Net.Data を実行するときのユーザー ID が、 プログラムがアクセスする可能性のあるオブジェクトを含めて、 プログラムを実行するためのアクセス権を持っていることを確認してください。 詳しくは、Net.Data がアクセスするファイルへのアクセス権の授与を参照してください。

Java アプレット言語環境

Java アプレット言語環境では、Net.Data アプリケーションに、 Java アプレット用の HTML タグを簡単に生成することができます。 Java アプレット言語環境を呼び出す際に、アプレット名を指定し、 そのアプレットが必要とするパラメーターを渡します。 Java アプレット言語環境は、マクロを処理し、HTML アプレット・タグを生成します。 Web ブラウザーはこのタグを使用して、アプレットを実行します。

さらにNet.Data は、アプレットが表パラメーターにアクセスするのに使用可能な、 インターフェースのセットを提供します。 これらのインターフェースは DTW_Applet.class というクラスに含まれています。

以下のセクションでは、Java アプレット言語環境を使用して、 Java アプレットを実行する方法について説明しています。

Java アプレット言語環境の構成

以下の構成ステートメントが、 初期設定ファイルに 1 行で記述されていることを確認します。

ENVIRONMENT (DTW_APPLET)   DTWJAVA    ( OUT RETURN_CODE )

Net.Data 初期設定ファイル、および言語環境の ENVIRONMENT ステートメントの詳細は、 環境構成ステートメントを参照してください。

Java アプレットの作成

Net.Data の Java アプレット言語環境を使用する前に、どのアプレットを使用するのか、 あるいはどのアプレットを作成する必要があるのかを決定する必要があります。 アプレットの作成の詳細については、Java の資料を参照してください。

アプレット・タグの生成

アプレット言語環境は、Net.Data の関数呼び出しを使って呼び出します。 関数呼び出しには宣言は不要です。 関数呼び出しの構文を以下に示します。

@DTWA_AppletName(parm1, parm2, ..., parmN)

アプレット・タグを生成するマクロの作成方法 :

  1. アプレットに必要なパラメーターをすべて、 マクロの DEFINE セクションに定義する。 これらのパラメーターには、アプレットの入力として必要な、 アプレット・タグの属性、Net.Data の変数、 および Net.Data の表パラメーターをすべて含めます。 例 :

    %define{
    DATABASE = "celdial"                   <=Net.Data variable: name of the database
    MyGraph.codebase = "/netdata-java/"    <=Required applet attribute
    MyGraph.height = "200"                 <=Required applet attribute
    MyGraph.width = "400"                  <=Required applet attribute
    MyTitle = "This is my Title"           <=Net.Data variable: name of the Web page
    MyTable = %TABLE(all)                  <=Table to store query results
    %}
    

  2. オプション : アプレットの入力としての結果セットを生成するための、 データベースへの照会を指定する。 これは、図あるいは表を生成するアプレットを使用する場合に役に立ちます。 例 :
    %FUNCTION(DTW_SQL) mySQL(OUT table){
    select name, ages from ibmuser.guests
    %}
    

  3. Java アプレット言語環境を呼び出し、 アプレットを起動するための関数呼び出しを Net.Data マクロに指定する。 関数呼び出しは、アプレットの名前と、言語環境に渡したいパラメーターを指定します。 これらのパラメーターには、アプレットの入力として必要な Net.Data 変数、 および Net.Data の表または列パラメーターをすべて含めます。

    例 :

    %HTML(report){                                    <=The start of the HTML block
    @mySQL(MyTable)                                   <=A call to the SQL function
                                                             mySQL
    @DTWA_MyGraph(MyTitle, DTW_COLUMN(ages) MyTable) <=Applet function call
    %}
     
    

アプレット・タグの属性

アプレット・タグの属性は Net.Data マクロの任意の位置に指定できます。 Net.Data は、 AppletName.attribute という形式を持つすべての変数を、 属性としてアプレット・タグに置き換えます。 属性をアプレット・タグに定義するための構文を以下に示します。

%define AppletName.attribute = "value"

以下に示した属性はすべてのアプレットで必須です。

以下の属性はオプションです。

たとえば、MyGraph という名前のアプレットに対しては、 これら必須の属性を以下のように定義できます。

%DEFINE{
MyGraph.codebase = "/netdata-java/"
MyGraph.height = "200"
MyGraph.width = "400"
%}

実際の指定は DEFINE セクションにある必要はありません。 値は DTW_ASSIGN 関数で設定できます。 AppletName.code 変数に変数を定義しない場合は、 Net.Data はデフォルトの code パラメーターを、 アプレット・タグに追加します。 code パラメーターの値は AppletName.class です。 ここで、AppletName はアプレットの名前です。

アプレット・タグのパラメーター

関数呼び出しの際に Java アプレット言語環境に渡すパラメーターのリストを定義します。 以下を含むパラメーターを渡すことができます。

パラメーターを渡すと、Net.Data は、 パラメーターに割り当てた名前と値を持つ Java アプレットの PARAM タグを、 HTML 出力に作成します。 文字列リテラルまたは関数呼び出しの結果は渡すことができません。

Net.Data の変数パラメーター

Net.Data 変数はパラメーターとして使用することができます。 変数をマクロの DEFINE ブロックで定義し、 その変数の値を DTWA_AppletName 関数呼び出しで渡すと、 Net.Data は、その変数と同じ名前と値を持つ PARAM タグを生成します。 たとえば、次のマクロ・ステートメントが与えられたとします。

%define{
...
MyTitle = "This is my Title"
%}
%HTML(report){
@DTWA_MyGraph( MyTitle, ...)
%}

Net.Data は次のアプレット・タグ PARAM を作成します。

<param name = 'MyTitle' value = "This is my Title" >
 

Net.Data の表パラメーター

Net.Data は、Java アプレット言語環境が呼び出されるたびに、 DTW_NUMBER_OF_TABLES という名前の PARAM タグを生成し、 関数呼び出しが何らかの表変数を渡したかどうかを指定します。 値は Net.Data が関数で使用する表変数の数です。 関数呼び出しに表変数が指定されていない場合は、以下のタグが生成されます。

<param name = "DTW_NUMBER_OF_TABLES" value = "0" >

関数呼び出しでは、1 つ以上の Net.Data の表変数を渡すことができます。 Net.Data の表変数を DTWA_AppletName 関数呼び出しで指定すると、 Net.Data は以下の PARAM タグを生成します。

表名パラメーター・タグ :

このタグは渡す表の名前を指定します。このタグの構文は、以下のとおりです。

<param name = 'DTW_TABLE_i_NAME' value = "tname" >

ここで、i は関数呼び出しの順序に基づく表の番号です。 また、tname は表の名前です。

行および列の仕様パラメーター・タグ :

PARAM タグは特定の表の行と列の数を指定するために生成されます。 このタグの構文は、以下のとおりです。

<param name = 'DTW_tname_NUMBER_OF_ROWS' value = "rows" >
<param name = 'DTW_tname_NUMBER_OF_COLUMNS' value = "cols" >

ここで、表の名前は tnamerows は表の行の数、 そして cols は表の列の数です。 このタグのペアは、関数呼び出しで指定された固有の表ごとに生成されます。

列値パラメーター・タグ :

この PARAM タグは、特定の列の列名を指定します。 このタグの構文は、以下のとおりです。

<param name = 'DTW_tname_COLUMN_NAME_j' value = "cname" >

ここで、表名は tnamej は列番号、 cname は表の列の名前です。

行値パラメーター・タグ :

この PARAM タグは、特定の行と列にある値を指定します。 このタグの構文は、以下のとおりです。

<param name = 'DTW_tname_cname_VALUE_k' value = "val" >

ここで、表名は tnamecname は列名、k は行番号、 そして val は対応する行と列の値に一致する値です。

表列パラメーター

表列を関数呼び出し時にパラメーターとして渡すことにより、 特定の列のタグを生成することができます。 Net.Data は、指定された列に対してのみ対応するアプレット・タグを生成します。 表列パラメーターは次の構文を使用します。

@DTWA_AppletName(DTW_COLUMN( x )Table)

ここで、x は表の列の名前または番号です。

表列パラメーターは、表パラメーターに対して定義された同じアプレット・タグを使用します。

Java に非対応のブラウザーでのアプレット・タグの代替テキスト

変数 DTW_APPLET_ALTTEXT は、Java をサポートしていないブラウザー、 あるいは Java のサポートをオフにしているブラウザーに表示するテキストを指定します。 たとえば、次の変数定義

%define DTW_APPLET_ALTTEXT = "<P>Sorry, your browser is not Java-enabled."

は、以下の HTML タグとテキストを作成します。

<P>Sorry, your browser is not Java-enabled.<BR>

この変数が定義されていない場合は、代替テキストは表示されません。

Java アプレットの例

次の例は、Java アプレット言語環境を呼び出す Net.Data マクロと、 呼び出された Java アプレット言語環境によって生成されたアプレット・タグを示しています。

Net.Data マクロには、Java アプレット言語環境への次の関数呼び出しが含まれています。

%define{
DATABASE = "celdial"
DTW_APPLET_ALTTEXT = "<P>Sorry, your browser is not Java-enabled."
DTW_DEFAULT_REPORT = "no"
MyGraph.codebase = "/netdata-java/"
MyGraph.height = "200"
MyGraph.width = "400"
MyTitle = "This is my Title"
%}
%FUNCTION(DTW_SQL) mySQL(OUT table){
select name, ages from ibmuser.guests
%}
%HTML(report){
@mySQL(MyTable)
@DTWA_MyGraph(MyTitle, DTW_COLUMN(ages) MyTable)
%}

DEFINE セクションの Net.Data マクロの行は、アプレット・タブの属性を指定しています。

MyGraph.codebase = "/netdata-java/"
MyGraph.height = "200"
MyGraph.width = "400"

この言語環境は、次の限定子を持つアプレットを生成します。

<applet code = 'MyGraph.class' codebase = '/netdata-java/' width = '400' height = '200' >

Net.Data は、Net.Data マクロの SQL セクションから、 SQL 照会結果を出力表 MyTable に戻します。 この表は次のように DEFINE セクションで指定されています。

MyTable = %TABLE(all)

マクロでのアプレットの呼び出しは、次のように HTML セクションで指定されます。

@DTWA_MyGraph(MyTitle, DTW_COLUMN(ages) MyTable)

関数呼び出しのパラメーターに基づき、Net.Data は、 結果表に関する情報 (たとえば、戻される列と行の数、 結果行など) を含む完全なアプレット・タグを生成します。 Net.Data は、次の例のように、 結果表のセルごとに 1 つのパラメーター・タグを生成します。

param name = 'DTW_MyTable_ages_VALUE_1' value = "35">

パラメーター名 DTW_MyTable_ages_VALUE_1 は、 表 MyTable の表セル (行 1、列 ages) を指定します。 このセルの値は 4 です。アプレットへの関数呼び出しの際のキーワード DTW_COLUMN は、 必要なのは結果表 MyTable の列 ages だけであることを指定します。

@DTWA_MyGraph(MyTitle, DTW_COLUMN(ages) MyTable)

以下の出力は、この例に対して Net.Data が生成する完全なアプレット・タグを示しています。

<applet code = 'MyGraph.class' codebase = '/netdata-java/' width = '400' height = '200' >
<param name = 'MyTitle' value = "This is my Title" >
<param name = 'DTW_NUMBER_OF_TABLES' value = "1" >
<param name = 'DTW_TABLE_1_NAME' value = "MyTable" >
<param name = 'DTW_MyTable_NUMBER_OF_ROWS' value = "5" >
<param name = 'DTW_MyTable_NUMBER_OF_COLUMNS' value = "1" >
<param name = 'DTW_MyTable_COLUMN_NAME_1' value = "ages" >
<param name = 'DTW_MyTable_ages_VALUE_1' value = "35">
<param name = 'DTW_MyTable_ages_VALUE_2' value = "32">
<param name = 'DTW_MyTable_ages_VALUE_3' value = "31" >
<param name = 'DTW_MyTable_ages_VALUE_4' value = "28" >
<param name = 'DTW_MyTable_ages_VALUE_5' value = "40" >
<P>Sorry, your browser is not Java-enabled.<BR>
</applet> 

Net.Data の Java アプレット・インターフェースの使い方

Net.Data は、DTW_Applet.class と呼ばれるインターフェース・セットを提供しています。これを Java アプレットで使用すると、表変数に対して生成される PARAM タグを処理するのに役に立ちます。 このインターフェースを拡張するアプレットを作成して、 アプレットからそのルーチンを呼び出すことができます。

Net.Data が提供するインターフェースには以下のものがあります。

インターフェースにアクセスするには、 EXTENDS キーワードをアプレットのコードで使用して、 アプレットを DTW_APPLET クラスからサブクラス化します。その例を、以下に示します。

import java.io.*;
import java.applet.Applet;
public class myDriver extends DTW_Applet
    {
    public void init()
        {
        super.init();
        if (GetNumberOfTables() > 0)
            {
            String [] tables = GetTableNames();
            printTables(tables);
            }
        }
    private void printTables(String[] tables)
        {
        String table_name;
        for (int i = 0; i < tables.length; i++)
            {
            table_name = tables[i];
            printTable(table_name);
            }
        }
    private void printTable(String table_name)
        {
        int nrows = GetNumberOfRows(table_name);
        int ncols = GetNumberOfColumns(table_name);
        System.out.println("Table: " + table_name + " has " + ncols + " columns and
                             " + nrows + " rows.");
        String [] col_names = GetColumnNames(table_name);
        System.out.println("------------------------------------------------------");
            for (int i = 0; i < ncols; i++)
            System.out.print("   " + col_names[i] + "   ");
        System.out.println("\n----------------------------------------------------");
        String [][] mytable = GetTable(table_name);
        for (int j = 0; j < nrows; j++)
            {
            for (int i = 0; i < ncols; i++)
                System.out.print("   " + mytable[i][j] + "   ");
            System.out.println("\n");
            }
        }
    }

Java アプリケーション言語環境

Net.Data は、Java 言語環境により既存の Java アプリケーションをサポートします。 Java アプレットおよび Java メソッド (またはアプリケーション) をサポートすることで、 Java データベース・コネクティビティー (JDBC**) API から DB2 へのアクセスが可能です。

JDBC に関する詳細は、以下の Web サイトで入手できます。

Java 言語環境の構成

Java 言語環境を使用するには、Net.Data 初期設定を検証し、 言語環境を設定する必要があります。

以下の構成ステートメントが、 初期設定ファイルに 1 行で記述されていることを確認します。

ENVIRONMENT (DTW_JAVAPPS)   ( OUT RETURN_CODE ) CLIETTE "DTW_JAVAPPS"

Net.Data 初期設定ファイル、および言語環境の ENVIRONMENT ステートメントの詳細は、 環境構成ステートメントを参照してください。

重要 : Java 言語環境の設定方法については、 Java 言語環境のセットアップを参照してください。

Java 関数の呼び出し

Java 言語環境には、 リモート・プロシージャー呼び出し (RPC) と同様のインターフェースが提供されています。 Net.Data ストリングをパラメーターに持つ Net.Data マクロから、 Java 関数呼び出しが発行でき、起動した Java 関数からストリングが戻されます。 Java 言語環境を使用する際は、 Net.Data Live Connection を使用する必要があります (Live Connection に関する詳細は、 接続管理を参照)。

Java 関数の呼び出し方法

  1. Java 関数を記述する。

  2. すべての Java 関数について、 Net.Data クライエットを作成する (Net.Data クライエットは、 Java 仮想マシンを立ち上げて Java 関数を実行します)。

  3. Live Connection 構成ファイルの Java ENVIRONMENT ステートメントに、 クライエットを定義する。

    新規の Java 関数を追加する度に、Java クライエットを再度作成する必要があります。

  4. 接続管理プログラムを開始する。

  5. Net.Data マクロを実行して、Java 言語環境を起動する。

Java 関数の作成

Java 関数サンプル・ファイル UserFunctions.java を変更するか、 または以下の myfile.java という名前のサンプル・ファイルをモデルに、 新規ファイルを作成します。

====================myfile.java====================
import mypackage.*                                  <=contain your functions
 public String myfctcall(...parameters from macro...)
{
 return ( mypackage.mymethod(...parameters...));    <=high-level call to your functions
 }
public String lowlevelcall(...parameters...)
{
 string result;
  .......code using many functions of your package...
  return(result)
}
   

Java 言語環境ファイル構造

Net.Data は、Net.Data のインストール中に複数のディレクトリーを作成します。 これらのディレクトリーには、以下のような、Java 関数の作成、クライエットの定義、 および Java 言語環境でのマクロの実行に必要なファイルが含まれています。

表 12 には、ご使用のオペレーティング・システムにおけるファイルの、 ディレクトリーおよびファイル名が記述されています。


表 12. Java 関数作成用ファイル
オペレーティング・システム ファイル名 ディレクトリー
OS/2 UserFunctions.java javaapps
launchjv.com connect
Windows NT UserFunctions.java javaclas
makeClas.bat javaclas
launchjv.bat connect
UNIX UserFunctions.java javaapps
launchjv javaapps

Java 言語環境クライエットの定義

サンプル・ファイル makeClas.bat を変更するか、 または新規の .bat ファイルを作成し、すべての Java 関数について、 dtw_samp.class という名前の Net.Data クライエット・クラスを生成します。 以下の例に、 バッチ・ファイル CreateServer による 3 つの Java 関数の処理方法を示します。

rem Batch file to create dtw_samp for Net.Data
java CreateServer dtw_samp.java UserFunctions.java myfile.java
javac dtw_samp.java

バッチ・ファイルは、 Net.Data に提供される Stub.java という名前のスタブ・ファイルに加えて、 以下のファイルを処理して dtw_samp.class を作成します。

JDBC アプリケーションまたはアプレットの作成は、DB2 CLI または ODBC を使用した、 データベース・アクセス用 C アプリケーションの作成に類似しています。 アプリケーションとアプレットの主な違いとして、 アプリケーションは DB2 との通信に特別なソフトウェア (たとえば、 DB2 クライアント・アプリケーション・イネーブラー) を必要とする場合があります。 アプレットは Java を使用可能な Web ブラウザーに依存し、 DB2 コードがクライアントにインストールされている必要はありません。

JDBC を使用する前に、システムの構成を行う必要があります。 これらの考慮事項については、 DB2 JDBC アプリケーションおよびアプレット・サポートの Web サイトで説明されています。

http://www.software.ibm.com/data/db2/jdbc/db2java.html

Java 言語環境の例

Java 関数の作成、クライエット・クラスの定義、および Net.Data の構成が終了したら、 Java 関数への参照を含むマクロを実行することができます。 重要 : Net.Data マクロを起動する前に、 接続管理プログラムを開始してください。

以下の例では、関数呼び出しの myfctcall が、 クライエット DTW_JAVAPPS を使用して、 Net.Data に提供されるサンプル関数を呼び出します。

%FUNCTION (DTW_JAVAPPS) myfctcall( ....parameters from macro ....)
%{ to call the sample provided with Net.Data %}
%FUNCTION (DTW_JAVAPPS) reverse_line(str);
%HTML(report){
you should see the string "Hello World" in reverse.
@reverse_line("Hello World")
You should have the result of your function call.
@myfctcall( ... ....)
%}

Perl 言語環境

Perl 言語環境は、Net.Data マクロの FUNCTION ブロックで指定した、 インラインの Perl スクリプトを解釈することができます。あるいは、 サーバー上の別ファイルに保管されている外部の Perl スクリプトを処理することができます。

Perl 言語環境の構成

以下の構成ステートメントが、 Net.Data の初期設定ファイルに 1 行で記述されていることを確認してください。

ENVIRONMENT (DTW_PERL)     DTWPERL   ( OUT RETURN_CODE )

Net.Data 初期設定ファイル、および言語環境の ENVIRONMENT ステートメントの詳細は、 環境構成ステートメントを参照してください。

外部 Perl スクリプトの呼び出し

外部 Perl スクリプトの呼び出しは、 EXEC ステートメントにより FUNCTION ブロックで識別されます。 使用する構文は以下のとおりです。

%EXEC{ perl_script_name [optional parameters] %}

必須 : Perl のスクリプト名 perl_script_name が、 Net.Data の初期設定ファイルの EXEC_PATH 構成変数に対して指定されているパスに、 リストされていることを確認してください。

 %FUNCTION(DTW_PERL) rexx1() {
 %EXEC{MyPerl.pl %}
 %}

パラメーターを渡す

Perl によって呼び出されるプログラムに情報を渡すには、 2 つの方法があります (DTW_PERL 言語環境では、直接渡しと間接渡し)。

直接
Perl スクリプトの呼び出し時にパラメーターを直接渡します。 たとえば、次のようにします。

%DEFINE INPARM1 = "SWITCH1"
%FUNCTION(DTW_PERL) sys1() {
 %EXEC{
    MyPerl.pl $(INPARM1) "literal string"
 %}
%}

Net.Data 変数 INPARM1 が参照され、Perl スクリプトに渡されます。 パラメーターを Perl スクリプトに渡す方法は、 Perl スクリプトがコマンド行から呼び出された場合に、 Perl スクリプトにパラメーターを渡すのと同じです。 この方法で渡されるパラメーターは、 入力タイプのパラメーターと考えられます (Perl スクリプトに渡されるパラメーターは、 Perl スクリプトで使用し、操作することができますが、 パラメーターの変更は Net.Data には反映されません)。

間接

以下に示す方法のいずれかを使用して、 Perl スクリプトの呼び出し時に間接的にパラメーターを渡します。

以下の例では、Net.Data がマクロの変数を渡す方法を示しています。

%FUNCTION(DTW_PERL) today() RETURNS(result) {
  $date = `date`;
  chop $date;
  open(DTW, "> $ENV{DTWPIPE}") || die "Could not open: $!";
  print DTW "result = \"$date\"\n";
%}
%HTML(INPUT){
  @today()
%}

Perl スクリプトがtoday.pl と呼ばれる外部ファイルにある場合は、 次の例にある関数と同じ関数を作成することができます。

%FUNCTION(DTW_PERL) today() RETURNS(result) {
  %EXEC { today.pl %}
%}

Net.Data の表は、Perl 言語環境で呼び出される Perl スクリプトに渡すことができます。 Perl スクリプトは、Net.Data 名によって、 Net.Data のマクロの表パラメーターの値にアクセスします。 列見出しおよびフィールド値は、表名および列番号により識別される変数に含まれます。 たとえばテーブル myTable では、 列見出しは myTable_N_j で、 フィールド値は myTable_V_i_j です。 ここで、i は行番号、j は列番号です。 テーブルの行および列番号は、 myTable_ROWS および myTable_COLS です。

FUNCTION セクションの REPORT ブロックと MESSAGE ブロック

REPORT および MESSAGE ブロックは、 どの FUNCTION セクションにおいても同じように使用することができます。 これらのブロックは Net.Data によって処理され、言語環境では処理されません。 ただし、Perl スクリプトはテキストを標準出力ストリームに書き込み、 Web ページの一部として組み込むことはできます。

Perl 言語環境の例

次の例は、Net.Data が外部 Perl スクリプトを実行して、 どのように表を生成するかを示しています。

%define {
 c = %TABLE(20)
 rows = "5"
 columns = "5" %}
 %function(DTW_PERL) genTable(in rows, in columns, out table) {
 %exec{ perl.pl
 %}
 %message{
 default: "genTable: Unexpected Error"
 %}
 %}
%HTML(REPORT) {
 @genTable(rows, columns, c)
 return code is $(RETURN_CODE)
 %}
 The Perl script (perl.pl):
 open(D2W,"> $ENV{DTWPIPE}");
 print "genTable begins ...
 ";
 $r = $ENV{ROWS};
 $c = $ENV{COLUMNS};
 print D2W "table_ROWS=\"$r\" ";
 print D2W "table_COLS=\"$c\" ";
 print "rows: $r
 ";
 print "columns: $c";
 for ($j=1; $j<=$c; $j++)
 {
 print D2W "table_N_$j=\"COL$j\" ";
 }
 for ($i=1; $i<=$r; $i++)
 {
 for ($j=1; $j<=$c; $j++)
 {
 print D2W "table_V_$i","_","$j=\"&splitvbar. $i $j &invq.\" ";
 }
 }
 close(D2W); 

結果 : genTable は以下を生成します。

rows: 5 columns: 5
  COL1  |  COL2   |  COL3   |  COL4   |  COL5   |
--------------------------------------------------
[ 1 1 ] | [ 1 2 ] | [ 1 3 ] | [ 1 4 ] | [ 1 5 ] |
--------------------------------------------------
[ 2 1 ] | [ 2 2 ] | [ 2 3 ] | [ 2 4 ] | [ 2 5 ] |
--------------------------------------------------
[ 3 1 ] | [ 3 2 ] | [ 3 3 ] | [ 3 4 ] | [ 3 5 ] |
--------------------------------------------------
[ 4 1 ] | [ 4 2 ] | [ 4 3 ] | [ 4 4 ] | [ 4 5 ] |
--------------------------------------------------
[ 5 1 ] | [ 5 2 ] | [ 5 3 ] | [ 5 4 ] | [ 5 5 ] |
--------------------------------------------------
return code is 0  

REXX 言語環境

REXX 言語環境を使用すると、REXX プログラムを実行することができます。

REXX 言語環境の構成

REXX 言語環境を使用するには、Net.Data 初期設定を検証し、 言語環境を設定する必要があります。

以下の構成ステートメントが、 初期設定ファイルに 1 行で記述されていることを確認します。

ENVIRONMENT (DTW_REXX)     DTWREXX   ( OUT RETURN_CODE )
 

Net.Data 初期設定ファイル、 および言語環境の ENVIRONMENT ステートメントの詳細は、環境構成ステートメントを参照してください。

REXX プログラムの実行

REXX 言語環境を使用すると、インライン REXX プログラムまたは 外部 REXX プログラムの両方を実行することができます。 インライン REXX プログラムは、 マクロ内に REXX プログラムのソースがある REXX プログラムです。 外部 REXX プログラムでは、外部ファイルに REXX プログラムのソースがあります。

インライン REXX プログラムを実行するには、以下のようにします。

REXX (DTW_REXX) 言語環境を使用する関数で、 関数の言語環境が実行可能なセクション内に REXX コードを含む関数を定義します。

例 : インライン REXX プログラムを含む関数

%function(DTW_REXX) helloWorld() {
        SAY 'Hello World'
%}

外部 REXX プログラムを実行するには、以下のようにします。

REXX (DTW_REXX) 言語環境を使用する関数で、 REXX ステートメントで実行される EXEC プログラムを含む関数を定義します。

例 : 外部プログラムを指す EXEC ステートメントを含む関数

%function(DTW_REXX) externalHelloWorld() {        
%EXEC{ helloworld.exe%}       
%}

必須 : REXX ファイル名は、 Net.Data の初期設定ファイルにある EXEC_PATH 構成変数に対して指定されているパスにリストされていることを確認してください。 EXEC_PATH 構成変数の定義方法を理解するには、 EXEC_PATH を参照してください。

パラメーターを REXX プログラムに渡す

REXX (DTW_REXX) 言語環境によって呼び出される REXX プログラムに情報を渡すには、 直接的な方法と間接的な方法の 2 つがあります。

直接
%EXEC ステートメントを使用して、外部 REXX プログラムに直接パラメーターを渡します。 たとえば、以下のような場合です。

 %FUNCTION(DTW_REXX) rexx1() {                               
 %EXEC{                                   
    CALL1.CMD $(INPARM) "literal string"   %}                            
%}

Net.Data 変数 INPARM1 が参照解除され、 外部 REXX プログラムに渡されます。 REXX プログラムは、REXX PARSE ARG 命令を使用して変数を参照することができます。このメソッドを使用してプログラムに渡されるパラメーターは、 入力型パラメーターとみなされます (プログラムに渡されるパラメーターは、 そのプログラムにより使用して操作できますが、 パラメーターに対する変更は Net.Data に反映されません)。

間接

REXX プログラムの 変数プール 経由で、 パラメーターを間接的に渡します。 REXX プログラムが開始すると、 REXX インタープリターによりすべての変数に関する情報を含むスペースが作成され保守されます。 このスペースは、変数プールと呼ばれます。

REXX 言語環境 (DTW_REXX) 関数が呼び出されると、REXX プログラムの実行の前に、入力 (IN) または入出力 (INOUT) となる関数仮引き数が REXX 言語環境により変数プールに保管されます。 REXX プログラムは、起動されると、これらの変数に直接アクセスすることができます。 REXX プログラムが正常に終了すると、DTW_REXX 言語環境は、 OUT または INOUT 関数仮引き数があるかどうかを判別します。 ある場合は、 言語環境はこの関数パラメーターに対応する値を変数プールから検索し、 この新しい値で関数パラメーター値を更新します。 Net.Data は、制御を受け取ると、 REXX 言語環境から取得した新しい値ですべての OUT または INOUT パラメーターを更新します。 たとえば、以下のような場合です。

%DEFINE a = "3"
%DEFINE b = "0"
%FUNCTION(DTW_REXX) double_func(IN inp1, OUT outp1){
   outp1 = 2*inp1
%}
 
%HTML(REPORT) { 
Value of b is $(b), @double_func(a, b) Value of b is $(b)
%}

上記の例では、@double_func の呼び出しによって、 a および b の 2 つのパラメーターが渡されます。 REXX 関数 double_func は、第 1 パラメーターを 2 倍にし、 その結果を第 2 パラメーターに保管します。 Net.Data がマクロを呼び出すと、b の値は 6 になります。

Net.Data の表を REXX プログラムに渡すことができます。 REXX プログラムでは、 Net.Data マクロの表パラメーターの値には REXX の stem 変数としてアクセスします。 REXX プログラムでは、列見出しおよびフィールド値は、 表名および列番号で識別される変数に含まれます。 たとえば、表 myTable では、 列見出しは myTable_N.j であり、 フィールド値は myTable_N.i.j です。 ここで、i は行番号、j は列番号です。 この表の行数は myTable_ROWS であり、 行数は myTable_COLS です。

AIX オペレーティング・システムのパフォーマンス向上

AIX システムで REXX 言語環境への呼び出しが多くある場合は、 RXQUEUE_OWNER_PID 環境変数を 0 に設定してください。 REXX 言語環境に多くの呼び出しを行うマクロは、 多くのプロセスを spawn しやすくなり、システム資源が消費されます。

以下の 3 つの方法のいずれかで環境変数を設定します。

REXX 言語環境の例

以下の例では、REXX 関数を呼び出して 2 つの列および 3 つの行を持つ Net.Data テーブルを生成するマクロを示しています。 REXX 関数への呼び出しに続いて組み込み関数 DTW_TB_TABLE() が呼び出され、 HTML 表を生成してブラウザーに戻します。

%DEFINE myTable = %TABLE
%DEFINE DTW_DEFAULT_REPORT = "NO"     
 
%FUNCTION(DTW_REXX) genTable(out out_table) {
  out_table_ROWS = 3
  out_table_COLS = 2
 
  /* Set Column Headings */
  do j=1 to out_table_COLS
    out_table_N.j = 'COL'j
  end
 
  /* Set the fields in the row */
  do i = 1 to out_table_ROWS
    do j = 1 to out_table_COLS
      out_table_V.i.j = '[' i j ']'
  end
  end
%}
 
%HTML(REPORT) {
 @genTable(myTable)
 @DTW_TB_TABLE(myTable)
%}

結果は以下のとおりです。

 
   COL1      COL2
[ 1 1 ]   [ 1 2 ] 
[ 2 1 ]   [ 2 2 ] 
[ 3 1 ]   [ 3 2 ]  

System 言語環境

System 言語環境では、コマンドの実行と外部プログラムの呼び出しをサポートしています。

System 言語環境の構成

以下の構成ステートメントを初期設定ファイルに 1 行で追加します。

ENVIRONMENT (DTW_SYSTEM)   DTWSYS    ( OUT RETURN_CODE )

Net.Data 初期設定ファイル、 および言語環境の ENVIRONMENT ステートメントの詳細は、環境構成ステートメントを参照してください。

コマンドの発行およびプログラムの呼び出し

コマンドを発行するには、 EXEC ステートメントで発行されるコマンドへのパスを含む System (DTW_SYSTEM) 言語環境を使用する関数を定義します。 たとえば、以下のような場合です。

%FUNCTION(DTW_SYSTEM) sys1() {
      %EXEC { ADDLIBLE.CMD %}
 %}

EXEC_PATH 構成変数を使用して、 オブジェクト (コマンドおよびプログラムなど) を含むディレクトリーへのパスを定義すると、 実行可能なオブジェクトへのパスを短縮することができます。 EXEC_PATH 構成変数の定義方法を理解するには、 EXEC_PATH を参照してください。

例 1: コマンドを発行する

%FUNCTION(DTW_SYSTEM) sys2() {
      %EXEC { MYPGM %}
 %}

例 2: プログラムの呼び出し

%FUNCTION(DTW_SYSTEM) sys3() {
      %EXEC {MYPGM.EXE %}
 %

プログラムにパラメーターを渡す

System (DTW_SYSTEM) 言語環境により起動するプログラムに情報を渡すには、 直接および間接の 2 とおりの方法があります。

直接
プログラムへの呼び出し時にパラメーターを直接渡す。 たとえば、以下のような場合です。

%DEFINE INPARM1 = "SWITCH1"
                           
%FUNCTION(DTW_SYSTEM) sys1() {
 %EXEC{
  CALL1.CMD  $(INPARM1) "literal string"
 %}
%}

Net.Data 変数 INPARM1 が参照され、プログラムに渡されます。 パラメーターはプログラムに渡されます。 これはコマンド行からプログラムを呼び出す場合と同様に行われます。 このメソッドを使用してプログラムに渡されるパラメーターは、 入力型パラメーターとみなされます (プログラムに渡されるパラメーターは、 そのプログラムにより使用して操作できますが、 パラメーターに対する変更は Net.Data に反映されません)。

間接

System 言語環境は Net.Data 変数を直接に渡すまたは検索することができないため、 以下のようにしてプログラムに対し変数を使用可能にします。

以下の例では、Net.Data がマクロから変数を渡す方法を示しています。

 %FUNCTION(DTW_SYSTEM) sys1 (IN P1, OUT P2, P3) {
   %EXEC {
      UPDPGM
   %}
 %}

Net.Data 表を、System 言語環境によって呼び出されるプログラムに渡すことができます。 プログラムでは、Net.Dataマクロの表パラメーターの値に、Net.Data 名でアクセスします。 列見出しおよびフィールド値は、表名および列番号で識別される変数に含まれます。 たとえば、表 myTable では、 列見出しは myTable_N_j で、 フィールド値は myTable_V_i_j です。 ここで、i は行番号、j は列番号です。 この表の行と列の数は myTable_ROWSmyTable_COLS です。

プロセスに対する環境変数の数には制限があるため、 行が多い表を渡すことはお勧めできません。

System 言語環境の例

以下の例では、 3 つのパラメーター P1P2、 および P3 を持つ関数定義を含むマクロを示しています。P1 は入力 (IN) パラメーター、 P2 および P3 は出力 (OUT) パラメーターです。 この関数はプログラム UPDPGM を呼び出して、 パラメーター P2P1 の値で更新し、 P3 を文字ストリングに設定します。 %EXEC ブロックのステートメントを処理する前に、 DTW_SYSTEM 言語環境は P1 および対応する値を環境スペースに保管します。

%DEFINE {
   MYPARM2 	= "ValueOfParm2"
   MYPARM3 	= "ValueOfParm3"
 %}
 %FUNCTION(DTW_SYSTEM) sys1 (IN P1, OUT P2, P3) {
   %EXEC {
      UPDPGM
   %}
 %}
 
 %HTML(upd1) {
 <P>
 Passing data to a program.  The current value 
 of MYPARM2 is "$(MYPARM2)", and the current value of MYPARM3 is
 "$(MYPARM3)".  Now we invoke the Web macro function.
 
 @sys1("ValueOfParm1", MYPARM2, MYPARM3)  
 
 <P>
 After the function call, the value of MYPARM2 is "$(MYPARM2)", 
 and the value of MYPARM3 is "$(MYPARM3)".
 %}


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]