Oracle® Fusion Middleware Oracle Business Intelligence Enterprise Editionシステム管理者ガイド 12c (12.2.1.1.0) E77226-02 |
|
前へ |
次へ |
特定の分析をブロックする必要が生じることがあります。たとえば、特定の列を他の列と併用するようにコンテンツ・デザイナに要求したり、特定の列がリクエストされたときにフィルタを要求したりする場合です。
アンサーには、分析で指定している基準や分析内の式に基づく問合せのブロックに使用できるAPIが含まれています。JavaScriptを使用してこのAPIにアクセスすることによって、条件のチェックや分析の検証を行えます。
この項では、次の項目について説明します。
この項では、JavaScriptを使用した条件のチェックと分析の検証について説明します。
これらのタスクや他の同様のタスクを実行する独自のJavaScriptプログラムを作成します。Oracle BI EEでは、JavaScriptプログラムはインストールされません。JavaScriptプログラムを作成したら、これらをシングルトン・データ・ディレクトリ(SDD)に保存できます。これらは仮想ディレクトリとして最初にデプロイするディレクトリです。
SDD/components/OBIPS/analyticsRes
SDDはDOMAIN_HOME/bidata
などのシングルトン・データ・ディレクトリです(詳細は、「Oracle Business Intelligenceの主なディレクトリ」を参照)。
詳細は、「共有ファイルとディレクトリの設定」を参照してください。
これ以外のディレクトリにJavaScriptプログラムを配置する場合は、プログラムを呼び出すコードでフルパス名を指定してください。たとえば、次のようなコードを使用できます。
<script type="text/javascript" src="http://example/mydir/myblocking.js" />
コードによるブロック対象の分析をユーザーが実行しようとしたときに、エラー・メッセージを表示できます。分析は実行されません。
answerstemplates.xmlファイルには、kuiCriteriaBlockingScriptというメッセージが含まれており、validateAnalysisCriteria関数を定義するJavaScriptを含むかまたはこのようなJavaScriptを定義するように、このメッセージをオーバーライドできます。デフォルトでは、このメッセージには、常にtrueを返す関数が含まれます。
ユーザーが分析を実行しようとすると、編集したvalidateAnalysisCriteria関数がアンサーによって呼び出されます。分析がブロックされない場合、この関数はtrueを返し、分析がブロックされる場合は、falseまたはメッセージを返します。メッセージまたはfalse以外の値が返された場合は、ポップアップ・ウィンドウにそのメッセージが表示されます。いずれにしても、問合せはブロックされます。
次のコード例は、問合せのブロックを示しています。最初に、answerstemplates.xmlファイルに次のXMLコードを追加します。
<?xml version="1.0" encoding="utf-8"?> <WebMessageTables xmlns:sawm="com.siebel.analytics.web.messageSystem"> <WebMessageTable system="QueryBlocking" table="Messages"> <WebMessage name="kuiCriteriaBlockingScript" translate="no"> <HTML> <script type="text/javascript" src="fmap:myblocking.js" /> </HTML> </WebMessage> </WebMessageTable> </WebMessageTables>
このXMLコードは、myblocking.jsというJavaScriptプログラムを呼び出します。次のディレクトリにこのファイルが配置されていることを確認します。
SDD/components/OBIPS/analyticsRes
SDDはシングルトン・データ・ディレクトリです(「Oracle Business Intelligenceの主なディレクトリ」を参照)。
このmyblocking.jsプログラムのサンプル・コードを次に示します。
// This is a blocking function. It ensures that users select what // the designer wants them to. function validateAnalysisCriteria(analysisXml) { // Create the helper object var tValidator = new CriteriaValidator(analysisXml); // Validation Logic if (tValidator.getSubjectArea() != "Sample Sales") return "Try Sample Sales?"; if (!tValidator.dependentColumnExists("Markets","Region","Markets","District")) { // If validation script notifies user, then return false alert("Region and District are well suited, do you think?"); return false; } if (!tValidator.dependentColumnExists("Sales Measures","","Periods","Year")) return "You selected a measure so pick Year!"; if (!tValidator.filterExists("Sales Measures","Dollars")) return "Maybe filter on Dollars?"; if (!tValidator.dependentFilterExists("Markets","Market","Markets")) return "Since you are showing specific Markets, filter the markets."; var n = tValidator.filterCount("Markets","Region"); if ((n <= 0) || (n > 3)) return "Select 3 or fewer specific Regions"; return true; }
前述のテンプレートを使用してこの関数をオーバーライドしなかった場合や、この関数でfalse以外が返された場合は、基準は有効とみなされ、分析が発行されます。プレビューおよび保存操作に対しても、同じメカニズムで基準が検証されます。
この変更を行った後は、Oracle BIプレゼンテーション・サービスのサーバーを停止して再起動するか、または管理ページで「ファイルとメタデータの再ロード」リンクをクリックします。
アンサー付属のフックを使用して、JavaScript検証機能を組み込み、コンテンツ・デザイナが列の式を入力または変更したときにアンサーからこの検証機能を呼び出すことができます。呼出しに失敗してメッセージが返されると、アンサーによってそのメッセージが表示され、操作が取り消されます。
また、ヘルパー関数を使用することによって、Document Object Model(DOM)を手動で走査するかわりに、問合せブロック関数でフィルタや列などをチェックできます(DOMは、アンサーで現在表示されているHTML UIページの内部ブラウザ表現を記述する手段です)。ヘルパー関数の詳細は、「検証ヘルパー関数」を参照してください。
criteriatemplates.xmlファイルには、kuiFormulaBlockingScriptというメッセージが含まれており、validateAnalysisFormula関数を定義するJavaScriptを含むようにこのメッセージをオーバーライドできます。デフォルトでは、このメッセージには、常にtrueを返す関数が含まれます。
アンサーは、コンテンツ・デザイナが行った変更を適用する前にvalidateAnalysisFormulaを呼び出します。この関数がtrueを返すと、式は受け入れられます。この関数がfalseを返すと、式は拒否されます。それ以外の場合は、無効な式が入力されたときの現行の動作と同じように、この関数からの戻り値が式の下のメッセージ領域に表示されます。
コンテンツ・デザイナは、必要に応じて「OK」をクリックしてエラーを無視できます。独自のアラートを表示して、コンテンツ・デザイナが作業を続行できるようにするには、関数からtrueを返すようにします。問合せをブロックするには、falseまたはメッセージを返します。JavaScript文字列および正規表現技術を使用して関数に渡された式をチェックし、関数で式を検証する必要があります。
次のコード例は、サンプルのカスタム・メッセージを示しています。
<?xml version="1.0" encoding="utf-8"?> <WebMessageTables xmlns:sawm="com.siebel.analytics.web.messageSystem"> <WebMessageTable system="QueryBlocking" table="Messages"> <WebMessage name="kuiFormulaBlockingScript" translate="no"> <HTML> <script type="text/javascript" src="fmap:myblocking.js" /> </HTML> </WebMessage> </WebMessageTable> </WebMessageTables>
次のコード例は、入力された式に基づくブロックを示しています。
// This is a formula blocking function. It makes sure the user does not enter an unacceptable formula. function validateAnalysisFormula(sFormula, sAggRule) { // do not allow the use of concat || in our formulas var concatRe = /\|\|/gi; var nConcat = sFormula.search(concatRe); if (nConcat >= 0) return "You used concatenation (character position " + nConcat + "). That is not allowed."; // no case statements var caseRe = /CASE.+END/gi; if (sFormula.search(caseRe) >= 0) return "Do not use a case statement."; // Check for a function syntax: aggrule(formula) aggrule should not contain a '.' var castRe = /^\s*\w+\s*\(.+\)\s*$/gi; if (sFormula.search(castRe) >= 0) return "Do not use a function syntax such as RANK() or SUM()."; return true; }
この変更を行った後は、Oracle BIプレゼンテーション・サービスのサーバーを停止して再起動するか、または管理ページで「ファイルとメタデータの再ロード」リンクをクリックします。
検証ヘルパー関数はJavaScriptファイルに定義されています。
これらの関数は、answers/queryblocking.jsという名前のファイル内で定義されます。この表に各ヘルパー関数を示し、それぞれについて説明します。
検証ヘルパー関数 | 説明 |
---|---|
CriteriaValidator.getSubjectArea() |
分析で参照されたサブジェクト・エリアの名前を返します。通常これは、他の検証を実行する前に関数内のswitch文で使用されます。分析がセット・ベースの基準である場合はnullを返します。 |
CriteriaValidator.tableExists(sTable) |
指定されたフォルダ(表)がコンテンツ・デザイナによって分析に追加されている場合はtrue、フォルダが追加されていない場合はfalseを返します。 |
CriteriaValidator.columnExists(sTable, sColumn) |
指定された列がコンテンツ・デザイナによって分析に追加されている場合はtrue、列が追加されていない場合はfalseを返します。 |
CriteriaValidator.dependentColumnExists(sCheckTable, sCheckColumn, sDependentTable, sDependentColumn) |
checkColumnが存在する場合に、dependentColumnが存在するかチェックして確認します。checkColumnが存在しない場合またはcheckColumnと依存列がどちらも存在する場合はtrueを返します。checkColumnとdependentColumnがnullの場合は、フォルダが検証されます。checkTableのいずれかの列が存在する場合は、dependentTableの列が存在する必要があります。 |
CriteriaValidator.filterExists(sFilterTable, sFilterColumn) |
指定された列にフィルタが存在する場合はtrueを、存在しない場合はfalseを返します。 |
CriteriaValidator.dependentFilterExists(sCheckTable, sCheckColumn, sFilterTable, sFilterColumn) |
プロジェクション・リストにcheckColumnが存在する場合に、dependentFilterが存在するかチェックして確認します。checkColumnが存在しない場合またはcheckColumnと依存フィルタがどちらも存在する場合はtrueを返します。 |
CriteriaValidator.filterCount(sFilterTable, sFilterColumn) |
特定の論理列に対して指定されたフィルタ値の数を返します。フィルタ値がequals、null、notNullまたはinの場合は、選択された値の数を返します。フィルタで列が使用されていない場合は、ゼロを返します。列がデフォルトなしで要求されている場合は-1を返します。他のフィルタ操作(greater than、begins withなど)に対しては、値の数が判定不可能なため、いずれも999を返します。 |