この文書は SAP Community Network 掲載の SAP BI Upgrade Series『SAP BusinessObjects Web Intelligence 4.1: Calculation Engine Changes』を日本語化した文書です。
原文は Web Intelligence の製品責任者である Pierr Saurel(ピエール・ソーレル)によって執筆されました。
製品バージョンの変遷に伴い、Web Intelligence の計算エンジンに対していくつかの不具合修正や仕様変更が行われています。この文書では Web Intelligence バージョンXI R2 SP3 と SP6、XI 3.0、XI 3.1 および 4.1 について、計算エンジンの変更点を説明し、新旧の計算エンジンの挙動を比較します。またアップグレード作業に関する有用な情報として、一部の仕様変更点について、変更前の挙動を維持するための対応策を説明します。
この章では Web Intelligence XI 3.0 に含まれている計算エンジンの変更点について説明します。
XI 3.0 以前のバージョンでは、Where 演算子はディメンションや詳細オブジェクトを使用した条件式についてのみ正しく機能していました。メジャーを使用した条件式も記述することはできましたが、正しい結果が得られない場合がありました。
バージョン XI 3.0 では、Where 演算子はメジャーを使用した条件式についても正しく機能するようになりました。
バージョン XI R2 では、If関数の戻り値に対する集計は、式をセルに直接記述する場合と変数に記述する場合とによって異なる結果が返されていましたが、バージョン XI 3.0 ではいずれの場合も同じ結果が得られるようになりました。
例えば、「重複行は集計しない」オプションをオフ(デフォルト)に設定したテーブルをバージョン XI R2 で作成し、以下の式によって得られる値を Sum 関数によって集計するとき:
=if([Year]="2002";1;0)
上記の式を記述したセル値の集計結果は、レポート上のテーブルに表示されている値の合計である「3」を返します。一方、同じ式を定義した変数「MyVarIf」を使用した場合には、クエリーに含まれるデータの合計値である「34」が返されます。
バージョン XI 3.0 においてこの動作が修正され、式をセルに直接記述する場合と変数に記述する場合のいずれにおいても同一の計算結果が得られるようになりました。
XI R2 SP3 以前のバージョンでは、セクションごとに積算計算が自動的にリセットされていました。
SP3 以降では、セクションによる自動的な積算計算のリセットが行われなくなり、セクション値インスタンスのブロックにおける最初のセルの積算計算は、直前のセクション値インスタンスのブロックにおける最後のセルの値に基づいて行われるようになりました。
以下は XI R2 SP3 以前のバージョンにおける積算計算実行例です。
積算合計値は「Year」セクションによってリセットされており、2005 年の積算合計値(太枠セル)は、2004 の積算合計値から独立して算出されています。
同様の計算を SP3 以降で行うと、積算合計値はセクションをまたがって算出されるため、2005 年の積算合計値は 2004 年の積算合計値を引き継いでいます。
仕様変更前の動作を維持するための Tips
以前のバージョンと同様の動作を維持するためには、積算計算の関数にリセットパラメーターとしてディメンションを明示的に指定します。
以下の記述例では [Sales Revenue] の積算集計が [State] ディメンションによってリセットされます。
=RunningSum([Sales Revenue];([State]))
また BI 4.1 SP03 以降では、式自動書き換えソリューションを使用することによって、従来バージョンと同様の動作を実装した式への自動変更が可能となっています。このソリューションにより自動変更された式では、リセットディメンションの指定に代わり、Section キーワードが使用されます。
=RunningSum([Sales Revenue];Section)
ただし、式自動書き換えソリューションによる自動変更は、XI R2 SP5 FP9 以前のバージョンを使用して作成されたドキュメントに対してのみ行われます。
詳細は「7. 式自動書き換えソリューション」を参照してください。
この章では Web Intelligence XI 3.1 に含まれている計算エンジンの変更点について説明します。
日付と時刻の表記に関する国際規格である ISO8601 への準拠、および DayNumberOfWeek 関数との動作の一貫性を考慮し、LastDayOfWeek 関数は月曜日を週の最初の日とするよう、仕様変更されました。
例えば以下の式をバージョン XI R2 で実行した場合、結果は「2005年5月14日(土曜日)」となる一方、バージョン XI 3.1での実行結果は「2005年5月15日(日曜日)」となります。
=LastDayOfWeek(todate("05/11/2005";"MM/dd/yyyy"))
仕様変更前の動作を維持するためのTips
バージョン XI 3.1 以前の動作を維持したい場合は RelativeDate 関数を使用します。
例えば以下のような式を記述することにより、バージョン XI R2 と同じく「2005年5月14日(土曜日)」という実行結果を得ることができます。
=RelativeDate(LastDayOfWeek(todate("05/11/2005";"MM/dd/yyyy")),-1)
XI 3.1 以前のバージョンでは、クロステーブルで Previous 関数を使用すると、行内の最終列の値が次の行の先頭列の値として持ち越されます。行の最終列と次行の先頭列は何の関連も持たないケースが多いため、この動作は混乱を招くことがありました。
例えば以下のクロステーブルでは、前年の値を取得するために Previous 関数を使用しています。フランスとアメリカのデータには実際には何の関連性もありませんが、アメリカの行の先頭列にフランスの行の最終列の値が返されています。
バージョン XI 3.1 で同様のレポートを実行した場合、Previous 関数はクロステーブルの各行の先頭列には何も値を返しません。このため、2004 年度の前年の値はいずれの行においても Null となります。
なお、この仕様変更は COL キーワードを付加した Previous 関数の使用についても適用され、列の最後の値は次列の最初の値として持ち越されることはありません。
この章では Web Intelligence XI R2 SP3 に含まれている計算エンジンの変更点について説明します。
なお、この仕様変更はバージョン XI 3.1 にも含まれています。
XI R2 SP03 以前のバージョンでは、テーブルのセクションヘッダに無効なディメンションが含まれている場合、メジャーは Null 値を返します。
例えば、互換性のないディメンション [Year] と [Country] を使用した以下のテーブルでは、[Revenue] の値は表示されません。
XI R2 SP03 以降のバージョンで同様のレポートを実行すると、互換性のないディメンションは無視され、有効なディメンションのみを使って計算されたメジャー値が返されます。
例えば、[Year] と [Country] に互換性がない場合でも、 [Country] ごとの [Revenue] が計算されます。
5 バージョン XI R2 SP6 における変更点:結合ディメンション内のディメンションを使用した集計
この章では Web Intelligence XI R2 SP6 に含まれている計算エンジンの変更点について説明します。
なお、この仕様変更はバージョン XI 3.1 SP2 にも含まれています。
XI R2 SP06 以前のバージョンでは、結合ディメンションの元になっているディメンションを使用した集計を行うとき、テーブルボディ上では正しい計算結果を得ることができませんでした(ただし、関連ディメンションがテーブルに含まれる場合や、独立セル上で集計を行う場合は正しい結果が返されます)。
例えば 2 つのクエリーの [Resort] ディメンションを結合したディメンションが定義されているとき、count 関数を使用してクエリー1およびクエリー 2 の各 [Resort] ディメンション値の個数を個別に取得しようとしても、結合ディメンションに関する値の個数しか返されません。
XI R2 SP06 以降のバージョンではこの動作が修正され、結合ディメンションの元となるディメンションを使用した集計結果をテーブルボディ上にも表示することができるようになりました。
6 バージョン 4.1 における変更点
この章では Web Intelligence 4.1 に含まれている計算エンジンの変更点について説明します。
なお、バージョン 4.1 は XI 3.x の各種修正および仕様変更を含んでいます。
以前のバージョンでは、Where 演算子に含まれる条件式にディメンションが使用されている場合、そのディメンションがコンテキストに誤って追加されていました。この動作はバージョン 4.1 で修正され、ディメンションは条件評価にのみ使用されるようになりました。
例えば、ディメンション [Quarter] を含むテーブル内で以下の式を使用する場合、バージョン 4.1 では [Quarter] ディメンションに依存することなく条件式が評価されます([Quarter] の各値について同じ結果が返されます)。
=[Revenue] Where (DataProviderType(DataProvider([Quarter]))="Universe")
仕様変更前の動作を維持するための Tips
4.1 以前のバージョン同様にディメンションコンテキストを使用した集計を行いたい場合は、以下のような式により実装することができます。
=[Revenue] ForAll([Quarter]) Where (DataProviderType(DataProvider([Quarter]))="Universe")
また BI 4.1 SP03 以降では、式自動書き換えソリューションを使用することによって、従来バージョンと同様の動作を実装した式への自動変更が可能となっています。このソリューションにより自動変更された式では、Where演算子のディメンションコンテキストが有効になるよう、アドホックパラメーターが追加されます。
=[Revenue] Where (DataProviderType(DataProvider([Quarter]))="Universe";[Quarter])
なお、BI 4.1 SP03 の式自動書き換えソリューションによる自動変更は、以下のバージョンを使用して作成されたドキュメントに対して適用されます:
メジャーやコンテキスト修飾子を使用する式に対して、Where 演算子を含むディメンションの条件を使用した場合、4.1 以前のバージョンでは、Where 条件式で使用しているディメンションがメジャーのコンテキスト修飾子に誤って追加されていました。
例えば、以下のような式を定義した場合:
=集計関数([メジャー] ForAll([ディメンション1])) Where ([ディメンション2]="条件値")
4.1 以前のバージョンでは、実行時にメジャーのディメンションコンテキストに [ディメンション2] が不必要に追加され、あたかも以下の式を記述したかのように処理されていました。
=集計関数([メジャー] ForAll([ディメンション1];[ディメンション2])) Where ([ディメンション2]="条件値")
バージョン 4.1 ではこの動作が修正され、記述したとおりに式が処理されます。
Where 演算子を使用したディメンション条件式を集計関数の外側に定義した場合、4.1 以前のバージョンでは、集計関数による計算が行われる前に Where 条件が誤って適用されていました。
例えば、以下のような式を定義した場合:
=集計関数([メジャー]) Where ([ディメンション]="条件値")
4.1以前のバージョンでは、集計関数による計算が行われる前にWhere ( [ディメンション]=“条件値“) がメジャーに適用されていました。
バージョン4.1ではこの動作が修正され、集メジャーに適用した後にWhere演算子による条件式が適用されます。
仕様変更前の動作を維持するためのTips
下記のように Where 演算子による条件式を集計関数の()内に含めることにより、バージョン 4.1 以前と同様の動作を実装することができます。
=集計関数([メジャー] Where ([ディメンション]="条件値"))
コンテキスト修飾子を使用したディメンションの式に対して、Where 演算子を含むディメンションの条件を組み合わせた場合、4.1 以前のバージョンでは、Where 条件式で使用しているディメンションが誤ってコンテキスト修飾子に追加されていました。
例えば、以下のような式を定義した場合:
=[ディメンション1] in ([ディメンション2]) Where ([ディメンション1]="条件値”)
4.1 以前のバージョンでは、実行時に [ディメンション1] がコンテキスト修飾子に不必要に追加され、あたかも以下の式を記述したかのように処理されていました。
=[ディメンション1] in ([ディメンション2];[ディメンション1]) Where ([ディメンション1]="条件値”)
バージョン 4.1 ではこの動作が修正され、記述したとおりに式が処理されます。
仕様変更前の動作を維持するためのTips
下記のようにWhere演算子とコンテキスト修飾子の順序を入れ替えることにより、バージョン4.1以前と同様の動作を実装することができます。
=[ディメンション1] Where ([ディメンション1]="条件値") in ([ディメンション2])
6.2 結合オブジェクト
Count、Min、Max といった関数の集計対象として、結合オブジェクトを構成する個別オブジェクト(例えばディメンションオブジェクト [A])を指定した場合、4.1 以前のバージョンでは個別オブジェクト [A] についての集計結果は得られず、結合オブジェクトの値セットを使用した集計処理が行われていました。
バージョン 4.1 ではこの動作が修正され、指定したオブジェクト [A] の値セットについて集計が行われるようになりました。
仕様変更前の動作を維持するためのTips
バージョン 4.1 以前と同様の動作を実装したい場合は、集計関数の対象として結合オブジェクトを明示的に指定します。
またバージョン 4.1 SP03 パッチ 2 以降では、式自動書き換えソリューションを使用することによって、従来バージョンと同様の動作を実装した式への自動変更が可能となっています。このソリューションにより自動変更された式では、
集計関数の引数として結合オブジェクトを強制的に適用するための関数として「UseMerged」が使用されます。
なお、この自動修正機能は XI 3.1 SP3 FP2 以前のバージョンを使用して作成されたドキュメントに対して使用することができます。詳細は「7. 式自動書き換えソリューション」を参照してください。
集計関数の対象として、結合オブジェクトに含まれる個別オブジェクト(例えばディメンションオブジェクト [A])を参照する変数を指定した場合、4.1 以前のバージョンでは個別オブジェクト [A] についての集計結果は得られず、結合オブジェクトの値セットを使用した集計処理が行われていました。
バージョン 4.1 ではこの動作が修正され、指定したオブジェクト[A]の値セットについて集計が行われるようになりました。
仕様変更前の動作を維持するためのTips
バージョン 4.1 以前と同様の動作を実装したい場合は、集計関数の対象として結合オブジェクトを明示的に指定します。
4.1 以前のバージョンでは、クエリー結果セットのデフォルト順序にしたがって積算計算が行われていましたが、バージョン 4.1 ではレポートのテーブルやチャート上の並び順にしたがって計算されます。
クロステーブル上で積算計算を行うとき、デフォルトでは横方向に(各行の列を左から右へ)集計が行われます。
しかしながら、積算計算にリセットディメンションを指定した場合、4.1 以前のバージョンでは誤って縦方向に(各列を先頭行から最終行へ)集計が行われていました。
例えば、以下のような式を定義した場合:
=RunningSum([Sales revenue];([State]))
下図のように積算合計は縦方向に処理されます。
この動作はバージョン 4.1 で修正され、下図のように積算合計は横方向に処理されるようになりました。
仕様変更前の動作を維持するためのTips
BI 4.1 SP03 以降のバージョンにおいて、それ以前のバージョンと同様の動作を実装したい場合、積算計算関数のパラメーターとして COL 演算子を使用してください。
またバージョン 4.1 SP03 パッチ 3 以降では、式自動書き換えソリューションを使用することによって、従来バージョンと同様の動作を実装した式への自動変更が可能となっています。このソリューションにより自動変更された式では、クロステーブル上での積算計算の順序を強制的に縦方向に設定するためのパラメーター「FORCE_COL」が積算計算関数に対して指定されます。
なお、式自動書き換えソリューションによる自動変更は、以下のバージョンを使用して作成されたドキュメントに対して適用されます:
詳細は「7. 式自動書き換えソリューション」を参照してください。
式の中で CurrentDate 関数と日付フィールドが使用されるとき、4.1 以前のバージョンでは、協定世界時(UTC)ではなくサーバーの地域設定にしたがったタイムゾーンにより日付データの評価が行われていました。
バージョン 4.1 以降では、UTC を使用して日付データの評価が行われます。
4.1 以前のバージョンでは、うるう年の最後の日が月曜日の場合、Week 関数は誤った値を返していました(この状況は 28 年ごとに発生します)。
例えば、2012 年 12 月 31 日を引数とした場合、Week 関数は「53」を返します。
バージョン 4.1 ではこの動作が修正され、2012 年 12 月 31 日を引数とした場合、Week 関数は「1」を返します。
この関数は 2 つの日付を比較して月数を求めますが、4.1 以前のバージョンでは、開始日付と終了日付が 2 ヶ月にまたがっている場合、終了日付の「日」を表す数字が開始日付の「日」を表す数字よりも大きければ、月数として「1」を返していました。この仕様は終了日付の「日」が 31 日の場合は問題ありませんが、30 日(または29 日や 28 日)の場合には誤った結果を返します。
例えば、[Day1] が 2008 年 3 月 31 日、[Day2] が 2008 年 4 月 30 日のとき、MonthBetween 関数の実行結果は「0」になってしまいます。
=MonthBetween([Day1];[Day2])
バージョン 4.1 SP1 以降では、開始日付と終了日付が 2 ヶ月にまたがっているケースで MonthBetween 関数が月数を「1」と返すのは、以下のいずれかの条件に該当する場合に限ります:
この修正により、上記の例における MonthBetween 関数の実行結果は「1」となります。
4.1 以前のバージョンでは、以下のように NoFilter 関数と拡張構文キーワード「In Break」を同時に使用すると、NoFilter 関数によって無効化されるべきフィルターが誤って適用されていました。
=NoFilter([Sales revenue]) In Break
バージョン 4.1 以降ではこの動作が修正され、NoFilter 関数によるフィルターの無効化が正しく行われます。
4.0 SP07 までのバージョンでは、レポートブロック上のデータの順位付けを行うとき、「選択項目別の順位」に指定したディメンションは、そのディメンションがレポートブロック上に存在するかどうかに関わらず考慮され、順位が決定されていました。
例えば、メジャー [Quantity sold] についてディメンション [Store name] を基準に上位 2 つのレコードを表示するような順位付けを下図のように定義したとき:
レポート上のテーブルは下図のように表示されます。
このとき、順位付けの基準となっている [Store name] ディメンションをテーブルから削除したとしても、順位付けの結果には影響はありませんでした。
バージョン 4.0 SP07 以降ではこの動作が変わり、順位付けの基準ディメンションである [Store name] がテーブルに含まれていない場合、順位プロパティの「選択項目別の順位」オプションが無視され、従来と異なる順位付けの結果が返されるようになりました。
前ページの例の場合、下図のように [Year] および [State] による集計値の上位 2 つのレコードが表示されます。
この動作変更は以下のバージョンで起こることが確認されています:
なおバージョン 4.1 SP05 では、バージョン 4.0 SP07 以前と同様の動作により順位付けが行われるよう再度修正を行います(「選択項目別の順位」に指定したディメンションは、そのディメンションがレポートブロック上に存在するかどうかに関わらず考慮される)。
4.1 SP05 以降において、4.0 SP07 以降と同様の順位付けを実装したい場合は、順位プロパティの「選択項目別の順位」オプションを非選択にします。
バージョン XI R2 や XI 3.x 環境から 4.1 への Web Intelligence ドキュメント移行を支援するため、バージョン 4.1 SP03 以降では新機能「式自動書き換えソリューション」が追加されています。
このソリューションは、計算エンジンの仕様変更によるドキュメント動作の変化を回避するために、仕様変更以前の動作を維持するように、特定のパターンの式について式の記述を自動的に書き換えます。式の書き換えは、バージョン XI R2 や 3.x 環境から移行したドキュメントを Web Intelligence 4.1 で開いた時に自動的に行われ、ドキュメントの保存により式の変更が完了します。
式自動書き換えソリューションは、以前のバージョンからバージョン 4.1 環境へ移行されたドキュメントのうち、以下のパターンに該当する式を含むものについて、デフォルトで利用可能となっています:
式自動書き換えソリューションは、XMLファイル(Formula_migration_rules.xml)の使用により、有効化、無効化または強制適用することができます。
この XML ファイルは以下のパスに存在しています:
(インストールディレクトリ)\(製品バージョン)\(OS)_(プラットフォーム)\config
例えば Windows プラットフォームにデフォルトのインストール・パスで製品を導入した場合、BI サーバー(64ビット)および Web Intelligence リッチ・クライアント(32 ビット)上のファイル・パスはそれぞれ下記のようになります:
BI サーバー(64 ビット)
C:\Program Files(x86)\SAP BusinessObjects\SAP BusinessObjects Enterprise XI 4.0\win64_x64\config
Web Intelligenceリッチ・クライアント(32ビット)
C:\Program Files(x86)\SAP BusinessObjects\SAP BusinessObjects Enterprise XI 4.0\win64_x64\config
XML ファイルのデフォルトの記述内容は以下のとおりです:
<Rules enable="true" force="false">
<Rule name="ExtractPlainDimFromWhereCond" enable="true" force="false"/>
<Rule name="ResetOnSectionForCumulative" enable="true" force="false"/>
<Rule name="UseMergeDimInAgg" enable="false" force="false"/>
<Rule name="UseColForCumulativeOnXTabBody" enable="true" force="false">
</Rules>
上記の記述における「enable」オプション、「force」オプションの意味はそれぞれ以下のとおりです:
XML ファイル内の設定を変更した場合は、その変更を有効にするために BI サーバーまたはWeb Intelligence リッチ・クライアントを再起動する必要があります。
式自動書き換えソリューションに関する詳細情報はKBA#2011281を参照してください。
本書のいかなる部分も SAP SE の明示的許可なしに、いかなる形式、目的を問わず、複写、または送信することを禁じます。本書に記載された情報は、予告なしに変更されることがあります。
SAP SEがライセンス、またはその頒布業者が頒布するソフトウェア製品には、他のソフトウェア会社の専有ソフトウェアコンポーネントが含まれています。製品仕様は、国ごとに変わる場合があります。
これらの文書は SAP SE およびその関連会社(「SAP グループ」)が情報提供のためにのみ提供するもので、いかなる種類の表明および保証を伴うものではなく、SAP グループは文書に関する錯誤又は脱漏等に対する責任を負うものではありません。SAP グループの製品およびサービスに対する唯一の保証は、当該製品およびサービスに伴う明示的保証がある場合に、これに規定されたものに限られます。本書のいかなる記述も、追加の保証となるものではありません。
SAP、および本書で言及されるその他 SAP の製品およびサービス、ならびにそれらのロゴは、ドイツおよびその他諸国における SAP SE の商標または登録商標です。
商標に関する情報および表示の詳細については、http://www.sap.com/japan/company/legal/copyright/index.epx をご覧ください