27 カスタム定義計算関数の開発
Essbaseブロック・ストレージ・キューブで使用可能な計算関数を拡張するために、Javaを使用して独自のカスタム定義関数(CDF)を開発できます。関数を記述した後、Javaクラスをインストールしてから、その関数をEssbaseサーバーにグローバルに登録するか、アプリケーションに対してローカルに登録します。
Essbase計算スクリプトでカスタム定義関数を使用できます。
Essbaseには、Javaのクラスとアーカイブを作成するためのツールがありません。このため、サポートされるバージョンのJDKが必要です。
カスタム定義関数の例は、Javaコードの例を参照してください。
カスタム定義関数は、ブロック・ストレージ・キューブの場合のみ使用できます(集約ストレージ・キューブには関係ありません)。
カスタム定義関数を作成するには、次のワークフローを使用します。
-
カスタム定義関数の要件を確認してください: カスタム定義関数の妥当性の要件
-
カスタム定義関数として使用するためのpublicかつstaticなメソッドを少なくとも1つ含む、publicなJavaクラスを記述します: カスタム定義関数用のJavaクラスの作成とコンパイル
-
Javaクラスをインストールします: EssbaseサーバーへのJavaクラスのインストール
-
カスタム定義関数をローカル関数またはグローバル関数として登録します: カスタム定義関数の登録
カスタム定義関数の妥当性の要件
Essbaseカスタム定義関数は、Javaクラスでのメソッドとして設計します。グローバル関数の場合は、1つのクラスで複数のメソッドを記述します。アプリケーション関数の場合は、アプリケーションごとに別個のクラスとjarファイルを使用します。関数を1つのアプリケーションに対してローカルにテストしてから、それらをグローバルに登録します。サポートされているデータ型、変数および命名規則に注意してください。
カスタム定義関数として使用する複数のメソッドを1つのクラスの中に作成できます。一般的には、Essbaseサーバー上のすべてのアプリケーションでカスタム定義関数として使用する予定のメソッドを、まとめて単一クラス内に作成することをお薦めします。ただし、Essbaseサーバー上の特定のアプリケーションのみで使用されるカスタム定義関数を追加する場合は、そのカスタム定義関数を別のクラス内に作成し、別の.jar
ファイルでEssbaseサーバーに登録してください。
カスタム定義関数として使用されるメソッドを持つJavaクラスを複数作成するときは、各クラス名が一意であることを確認してください。クラス名が重複していると、重複するクラス内のメソッドが認識されず、そのメソッドをカスタム定義関数として登録できません。
Javaのテスト・プログラムを使用して、Javaのクラスとメソッドをテストします。メソッドの出力に問題がなければ、メソッドをEssbaseサーバー上でインストールして単一のテスト・アプリケーションに登録します。テスト目的で関数をグローバルに登録しないでください。そのようにすると、問題が発生したときに関数を更新することがより難しくなります。
カスタム定義関数内のメソッドは、次のサポートされるデータ型の任意の組合せを入力パラメータにできます。
-
boolean
-
byte
-
char
-
com.hyperion.essbase.calculator.CalcBoolean
-
float、double
-
java.lang.String
-
short、int、long
-
これらのいずれかの型の配列
CalcBooleanはEssbase固有のデータ型であり、TRUE、FALSEおよび#MISSINGの3つの値を持つことができます。リストされている他のデータ型の詳細は、JDKのドキュメンテーションを参照してください。
メソッドの戻りデータ型は、voidか、前述のいずれかのデータ型にできます。戻されたデータ型は、Essbase固有のデータ型に変換されます。文字列はstring型にマッピングされます。ブール値はCalcBooleanデータ型にマッピングされます。その他のすべての値はdouble型にマッピングされます。
ノート:
Essbaseでは、戻されるdouble型の変数の値が無限値または非数(Not-a-Number)値であることはサポートされません。これらの値がJavaプログラムから戻された場合は、その値がEssbaseで正しく記録または表示されない可能性があります。double型の変数に無限値または非数値があるかどうかを調べて、有限値に設定してからEssbaseに戻す必要があります。JDKドキュメントでクラスDoubleに関する説明を参照してください。
Essbaseでカスタム定義関数の作成、削除および管理を行うには、次のセキュリティ権限が必要です。
-
ローカル、アプリケーション全体のカスタム定義関数: アプリケーション・マネージャ以上
-
グローバルな、サーバー全体のカスタム定義関数: システム管理者
カスタム定義関数をEssbaseに登録するときに、関数に名前を付けます。この名前が計算スクリプトと式で使用されます。この名前は、関数内で使用されるJavaクラスとメソッドの名前とは別のものです。
カスタム定義関数に名前を付けるときは、次の要件に従います。
-
名前の先頭に@記号を付けます。関数名の残りの部分には、英字、数字および記号(@、#、$および_)を使用できます。関数名にスペースを含めることはできません。
例: @MYFUNCTION
-
カスタム定義マクロからのみ呼び出されるカスタム定義関数の場合は、名前の先頭に@_を付けます。これは、一般用途の関数およびマクロと区別するためです。
例: @_MYFUNCTION
-
カスタム定義関数の名前は一意である必要があります。関数名は、他の関数名、カスタム定義マクロの名前および既存の計算関数の名前とは異なっている必要があります。
-
Essbaseアプリケーションの中にあるローカル関数と同じ名前のグローバル関数がある場合は、ローカル関数が計算に使用されます。
カスタム定義関数用のJavaクラスの作成とコンパイル
Essbaseカスタム定義関数のJavaクラスを作成しコンパイルするには、テキスト・エディタまたはIDE (統合開発環境)を使用してクラスを記述し、javac
ツールを使用してそれをコンパイルします。
カスタム定義関数用のJavaクラスを作成するためのワークフロー例を次に示します。
EssbaseサーバーへのJavaクラスのインストール
カスタム定義計算関数(CDF)のJavaクラスをEssbaseサーバーにインストールするには、それらをコンパイルし、これらの手順で指定したグローバル・レベルまたはアプリケーション・レベルのudf
ディレクトリにjarファイルをコピーし、アプリケーションまたはサーバーを再起動します。
Javaクラスは、JDK jar
ツールを使用してJARファイルにコンパイルする必要があります。
.jar
ファイルを作成してEssbaseサーバーにインストールするには:
カスタム定義関数の登録
MaxLを使用してカスタム定義関数をEssbaseに登録します。登録タスクは、Javaクラス内でCDFを記述し、それらのクラスをコンパイルし、jarファイルをインストールした後に実行します。
カスタム定義関数用のJavaクラスを.jar
ファイルにコンパイルし、その.jar
ファイルをEssbaseサーバーにインストールしたら、計算スクリプトと式で使用できるように、カスタム定義関数を登録する必要があります。「カスタム定義関数の妥当性の要件」を参照してください。
グローバル・カスタム定義関数を登録すると、Essbaseサーバー上のすべてのEssbaseアプリケーションでその関数を使用できます。カスタム定義関数をグローバル関数にする前に、単一のアプリケーションでその関数をテスト(およびそのアプリケーションでのみその関数を登録)します。
マクロのカタログを更新する場合と同じプロセスを使用して関数のカタログを更新します。カスタム定義マクロのカタログのリフレッシュを参照してください。
注意:
グローバル関数をテスト目的で登録しないでください。問題が発生した場合に変更がより難しくなります。
カスタム定義関数を登録するには、MaxLのcreate function文を使用します。
ローカル・スコープでカスタム定義関数を登録する場合は、アプリケーション名を接頭辞として含めます。たとえば、次のMaxL文では、CalcFuncクラスのカスタム定義関数@JSUMが、Sampleアプリケーション内で使用するためのローカル関数として登録されます。
create function Sample.'@JSUM'
as 'CalcFunc.sum'
spec '@JSUM(memberRange)'
comment 'adds list of input members';
グローバル・スコープでカスタム定義関数を登録する場合は、アプリケーション名を接頭辞として含めません。たとえば、次のMaxL文では、CalcFuncクラスのカスタム定義関数@JSUMが、Essbaseサーバー上のすべてのアプリケーションで使用するためのグローバル関数として登録されます。
create function '@JSUM'
as 'CalcFunc.sum'
spec '@JSUM(memberRange)'
comment 'adds list of input members';
ノート:
Javaメソッドの入力パラメータの指定はオプションです。入力パラメータを指定しない場合、Essbaseでは、Javaコードのメソッド定義から入力パラメータが読み取られます。ただし、複数のカスタム定義関数を登録するときにメソッド名は同じですがパラメータ・セットが異なる場合、関数のバージョンごとに個別に登録し、関数のバージョンごとにパラメータを指定する必要があります。
登録済カスタム定義関数の使用方法
登録したカスタム定義関数は、ネイティブのEssbase計算関数を使用するのと同じ方法で、計算スクリプトおよび式で使用できます。
登録済カスタム定義関数を使用するには、次のようにします。
カスタム定義関数の更新
Essbaseカスタム定義関数を更新するには、そのスコープがローカルかグローバルかを特定し、影響を受けるアプリケーションを停止し、その関数のコードを含む.jar
ファイルを置き換え、その関数を再登録します。
カスタム定義関数を更新する手順は、次の条件に応じて異なります。
-
関数がローカルに登録されているか、グローバルに登録されているか
-
カスタム定義関数のシグネチャ(クラス名、メソッド名または入力パラメータ)が、カスタム定義関数のJavaコードで変更されているかどうか
通常、カスタム定義関数を更新するには、関数のコードを含む.jar
ファイルを置換して、次に関数を再登録する必要があります。ただし、カスタム定義関数のシグネチャが変更されていない場合で、関数の入力パラメータが1セットのみである(オーバーロードされたメソッドではない)場合は、関数を含む.jar
ファイルを置換できます。
ノート:
グローバル・カスタム定義関数の更新は、DBAのみが行うようにしてください。
カスタム定義関数を更新するには、次のようにします。
カスタム定義関数の表示
Essbaseでカスタム定義関数を表示して、その関数が正常に登録されたかどうか、およびそのスコープがローカルかグローバルかを確認します。カスタム定義関数は、作成して登録するまで表示されません。
カスタム定義関数を表示するには:
MaxLのdisplay function文を使用します。
たとえば、Sampleアプリケーションのカスタム定義関数、およびすべての登録済グローバル関数を表示するには、次のMaxL文を使用します。
display function Sample;
display function文によって、アプリケーション名なしでグローバル関数がリストされ、それらがグローバルであることが示されます。アプリケーションにグローバル関数と同じ名前の関数が含まれている場合は、ローカル関数のみがリストされます。
カスタム定義関数の削除
Essbaseカスタム定義関数を削除するには、まずそれらが使用されていないことを確認します。次に、CDFが定義されているアプリケーションをシャットダウンし、MaxLのdrop function文を発行することでCDFを削除し、影響を受けるアプリケーションを再起動します。
カスタム定義関数を削除するには、次の権限が必要です。
-
ローカル: アプリケーションに対するアプリケーション・マネージャ権限以上
-
グローバル: システム管理者権限
カスタム定義関数を削除する前に、その関数を使用している計算スクリプトや式がないことを確認する必要があります。グローバル・カスタム定義関数は、Essbaseサーバー全体の計算スクリプトと式で使用できるため、グローバル・カスタム定義関数を削除する前に、Essbaseサーバー上でその関数を使用している計算スクリプトや式がないことを確認する必要があります。
注意:
グローバルなカスタム定義関数は、Essbaseキューブにアクセスしているユーザーがおらず計算ルーチンが実行されていない場合のみ削除します。
カスタム定義関数を削除するには:
カスタム定義関数のコピー
カスタム定義関数は、適切なアクセス権がある任意のEssbaseサーバーとアプリケーションにコピーできます。
カスタム定義関数をコピーするには、MaxL文のcreate or replace function asを使用します。