2022年2月28日月曜日

分析ビューの日本語対応

 分析ビュー(Analytic View)を活用する際に、レベル名やメンバー名を日本語で表示したいという要望はあるかと思います。最初からレベル名やメンバ名に日本語を使用するというのもひとつの方法ですが、今回はLiveSQL.oracle.comの以下のスクリプトを参考にして、前回の記事で作成したAPEXアプリケーションの日本語対応を行います。

Adding Multiple Language Support to Analytic Views

日付レベルレベル名マネージャー・レベルレベル名日付ディメンションメンバー名を日本語で表示します。



日付ディメンジョンの日本語名の登録


最初に日付ディメンジョンのメンバー名の日本語表記を、表AVT_CALENDARに追加します。

SQLワークショップSQLコマンドより作業を行います。最初に作成済みの表AVT_CALENDARの内容を確認します。以下のSELECT文を実行します。

select * from avt_calendar;


ROW_WIDWEEK_NUMMONTH_NAMEQTR_NAMEYEAR_NAMEが定義されています。この中で、MONTH_NAME、QTR_NAMEおよびYEAR_NAMEについて、日本語表記を登録します。追加する列はそれぞれMONTH_NAME_JAQTR_NAME_JAYEAR_NAME_JAとします。

SQLコマンドより、以下のSQLを一行ずつ実行します。

最初に列MONTH_NAME_JAを追加し、日本語表記を登録します。

alter table avt_calendar add (month_name_ja varchar2(16));
update avt_calendar set month_name_ja = year_name || '年' || month_name || '月';

QTR_NAME_JAを追加し、日本語表記を登録します。

alter table avt_calendar add (qtr_name_ja varchar2(30));
update avt_calendar set qtr_name_ja = year_name || '年第' || qtr_name || '四半期';

YEAR_NAME_JAを追加し、日本語表記を登録します。

alter table avt_calendar add (year_name_ja varchar2(8));
update avt_calendar set year_name_ja = year_name || '年';

表AVT_CALENDARを検索し、追加した列の内容を確認します。



属性ディメンジョンの更新


日付レベルを定義している属性ディメンジョンAVT_DATE_DIMを更新します。

LEVELにそれぞれCLASSIFICATIONとしてCAPTIONを定義し、日本語のレベル名を登録しています。また、MEMBER_NAMEはセッション言語に依存して、英語と日本語を切り替えています。

create or replace attribute dimension avt_date_dim
using avt_calendar
attributes(
year_name
, year_name_ja -- 追加する
, qtr_name
, qtr_name_ja -- 追加する
, month_name
, month_name_ja -- 追加する
, row_wid
)
level cal_day
classification caption value 'Day Level'
classification caption value '日レベル' language 'JAPANESE'
key row_wid member name row_wid order by row_wid determines(month_name)
level cal_month
classification caption value 'Month Level'
classification caption value '月レベル' language 'JAPANESE'
key month_name
member name
case
when SYS_CONTEXT('USERENV','LANG') = 'JA' then
month_name_ja
else
month_name
end
order by month_name determines(qtr_name)
level cal_qtr
classification caption value 'Quater Level'
classification caption value '四半期レベル' language 'JAPANESE'
key qtr_name
member name
case
when SYS_CONTEXT('USERENV','LANG') = 'JA' then
qtr_name_ja
else
qtr_name
end
order by qtr_name determines(year_name)
level cal_year
classification caption value 'Year Level'
classification caption value '年レベル' language 'JAPANESE'
key year_name
member name
case
when SYS_CONTEXT('USERENV','LANG') = 'JA' then
year_name_ja
else
year_name
end
order by year_name
/*
* マニュアルによると ALL MEMBER NAME に続いて expression となっているが、
* CASE文にすると属性ディメンジョンは作成できるが、分析ビューの検索でエラーが発生する。
*/
all member name 'Total'
;

マネージャー・レベルを定義している属性ディメンジョンAVT_EMP_DIMを更新します。

create or replace attribute dimension avt_emp_dim
using avt_employees
attributes(
row_wid
, empno
, lvl1_mgr
, lvl2_mgr
, lvl3_mgr
)
level emp
classification caption value 'Employee Level'
classification caption value '従業員レベル' language 'JAPANESE'
key row_wid member name to_char(empno) order by empno determines(lvl3_mgr)
level lvl3_mgr
classification caption value 'Level 3 Manager Level'
classification caption value '課長レベル' language 'JAPANESE'
key lvl3_mgr member name lvl3_mgr order by lvl3_mgr determines(lvl2_mgr)
level lvl2_mgr
classification caption value 'Level 2 Manager Level'
classification caption value '部長ベル' language 'JAPANESE'
key lvl2_mgr member name lvl2_mgr order by lvl2_mgr determines(lvl1_mgr)
level lvl1_mgr
classification caption value 'Level 1 Manager Level'
classification caption value '社長レベル' language 'JAPANESE'
key lvl1_mgr member name lvl1_mgr order by lvl1_mgr
all member name 'Total'
;

例えば日レベルでは、以下の記述にて英語と日本語のキャプションを設定しています。

level cal_day
classification caption value 'Day Level'
classification caption value '日レベル' language 'JAPANESE'

CLASSIFICATIONとして設定できるのは、CAPTIONDESCRIPTIONになります。それぞれ、LANGUAGE句によって言語を指定できます。

属性ディメンジョンのレベルに設定されたCAPTIONDESCRIPTIONは、ビューUSER_ATTRIBUTE_DIM_LVL_CLASSより確認できます。

select * from user_attribute_dim_lvl_class;



APEXアプリケーションの更新


日付レベル選択リストが、日本語で表示されるようにします。LOVSQL問合せを以下に置き換えます。属性ディメンジョンに定義したキャプションはビューUSER_ANALYTIC_VIEW_LEVEL_CLASSより参照しています。

select value d, depth r
from
(
select to_char(c.value) value, (l.order_num + 1) depth
from user_analytic_view_levels l join user_analytic_view_level_class c
on l.analytic_view_name = c.analytic_view_name
and l.dimension_alias = c.dimension_alias
and l.level_name = c.level_name
where 1=1
and l.analytic_view_name = 'AVT_EMP_SALES_AV'
and l.dimension_alias = 'AVT_DATE_DIM'
and l.hier_alias = 'AVT_CALENDAR_HIER'
and c.classification = 'CAPTION'
and coalesce(c.language,'AMERICAN') =
substr(SYS_CONTEXT('USERENV','LANGUAGE'),1,(instr(SYS_CONTEXT('USERENV','LANGUAGE'),'_')-1))
union
select
case
when SYS_CONTEXT('USERENV','LANG') = 'JA' then
'全体'
else
'Total'
end value
, 0 depth from dual
)
order by depth asc

ページ・デザイナにてホーム・ページを開き、ページ・アイテムP1_CAL_DEPTHを選択します。

LOVSQL問合せを入れ替えます。


ページ・アイテムP1_EMP_DEPTHを選択し、LOVSQL問合せを、以下に置き換えます。

select value d, depth r
from
(
select to_char(c.value) value, (l.order_num + 1) depth
from user_analytic_view_levels l join user_analytic_view_level_class c
on l.analytic_view_name = c.analytic_view_name
and l.dimension_alias = c.dimension_alias
and l.level_name = c.level_name
where 1=1
and l.analytic_view_name = 'AVT_EMP_SALES_AV'
and l.dimension_alias = 'AVT_EMP_DIM'
and l.hier_alias = 'AVT_EMPLOYEE_HIER'
and c.classification = 'CAPTION'
and coalesce(c.language,'AMERICAN') =
substr(SYS_CONTEXT('USERENV','LANGUAGE'),1,(instr(SYS_CONTEXT('USERENV','LANGUAGE'),'_')-1))
union
select
case
when SYS_CONTEXT('USERENV','LANG') = 'JA' then
'全体'
else
'Total'
end value
, 0 depth from dual
)
order by depth asc


以上で、分析ビューを使ったAPEXアプリケーションの日本語対応は完了です。

APEXアプリケーションのプライマリ言語を日本語から英語に変更すると、日付レベルやマネージャー・レベルおよび日付レベルのメンバーの表記が英語になります。


アプリケーションの表示を確認します。


属性ディメンジョンのレベル名の他に、以下のオブジェクトに対して、CLASSIFICATIONとしてCAPTIONおよびDESCRIPTIONを設定することができます。
  1. 属性ディメンジョン(Attribute Dimension)自体
  2. 属性ディメンジョンの属性(Attribute)
  3. 属性ディメンジョンのレベル(Level)
  4. 階層(Hierarchy)自体
  5. 階層の属性(Hierarchical Attribute)
  6. 分析ビュー(Analytic View)自体
  7. 分析ビューのディメンジョン(Dimension)
  8. 分析ビューのメジャー(Measures)
設定済みのCLASSIFICATIONを参照するために使用するビューは以下になります。

 ディクショナリ・ビュー分析ビューのディクショナリ
属性ディメンジョンALL_ATTRIBUTE_DIM_CLASS 
属性ディメンジョンの属性ALL_ATTRIBUTE_DIM_ATTR_CLASSALL_ANALYTIC_VIEW_ATTR_CLASS
属性ディメンジョンのレベルALL_ATTRIBUTE_DIM_LVL_CLASSALL_ANALYTIC_VIEW_LEVEL_CLASS
階層ALL_HIER_CLASS 
階層の属性ALL_HIER_HIER_ATTR_CLASS 
分析ビュー ALL_ANALYTIC_VIEW_CLASS
分析ビューのディメンジョン ALL_ANALYTIC_VIEW_DIM_CLASS
分析ビューのメジャー ALL_ANALYTIC_VIEW_MEAS_CLASS

定義された情報を使ってアプリケーションを多言語に対応させるには、あくまでアプリケーション側でのコーディングが必要になります。今回の例では、ページ・アイテムのLOVのSQL問合せに記述しています。

設定可能なCLASSIFICATIONのCAPTIONを定義したDDLの例になります。
  1. 属性ディメンジョンAVT_EMP_DIM
  2. 属性ディメンジョンAVT_DATE_DIM
  3. 階層AVT_EMPLOYEE_HIER
  4. 階層AVT_CALENDAR_HIER
  5. 分析ビューAVT_EMP_SALES_AV
分析ビューの日本語対応の紹介は以上になります。

LOVのSQL問合せ以外変更はありませんが、今回のAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/analyticviewsample_lang.sql

Oracle APEXのアプリケーション作成の参考になれば幸いです。