Upgrade to Pro — share decks privately, control downloads, hide ads and more …

世界食堂 - Oracle APEXアプリケーションを複数言語、複数タイムゾーンに対応させる

世界食堂 - Oracle APEXアプリケーションを複数言語、複数タイムゾーンに対応させる

英語、日本語、中国語、韓国語で食堂のメニューを表示する簡単なアプリケーション "世界食堂" を作成します。このアプリケーションの開発を通じて、アプリケーションのグローバル化について解説をします。
アジェンダ
1. 世界食堂 – 作成するアプリケーション
2. 母国語によるアプリケーションの作成
3. Oracle APEXアプリケーションの翻訳
4. 複数言語に対応したスキーマ定義
5. APEX_LANG.LANG関数を使った動的翻訳
6. テキスト・メッセージによる翻訳
7. 日時データ型とタイムゾーンの扱い
8. 夏時間の注意点

Oracle Groundbreakers APAC Virtual Tour 2020
でのセミナー資料です。

Yuji Nakakoshi

October 23, 2020
Tweet

More Decks by Yuji Nakakoshi

Other Decks in Programming

Transcript

  1. Copyright © 2020, Oracle and/or its affiliates 2 Our mission

    is to help people see data in new ways, discover insights, unlock endless possibilities. 人々が、新たな方法でデータを捉え、 知見を導き出し、そして、無限の可能 性を得ること。それがオラクルのミッ ションです。 我们的使命是帮助人们以新的方法认识 数据,发现洞察,开启无限可能。 오라클의 사명은 사람들이 새로운 방식 으로 데이터를 보면서 분석 정보를 찾아 내어 무궁한 가능성을 실현할 수 있도록 지원하는 것입니다.
  2. 4 Copyright © 2020, Oracle and/or its affiliates 1. 世界食堂

    – 作成するアプリケーション 2. 母国語によるアプリケーションの作成 3. Oracle APEXアプリケーションの翻訳 4. 複数言語に対応したスキーマ定義 5. APEX_LANG.LANG関数を使った動的翻訳 6. テキスト・メッセージによる翻訳 7. 日時データ型とタイムゾーンの扱い 8. 夏時間の注意点 アジェンダ
  3. 6 Copyright © 2020, Oracle and/or its affiliates 世界食堂 言葉

    店名 (発音) 英語 en World Diner 中国語(簡体) zh-cn 世界餐厅 (shìjiè canting) 韓国語 ko 식당세계 (sigdang segye) 日本語 ja 世界食堂 (sekai shokudou) • 今回作成するアプリケーションの名前です。 • 食堂で提供するメニューを、以下のそれぞれ 四カ国語で記載します。
  4. 7 Copyright © 2020, Oracle and/or its affiliates 提供する品目 品目

    日本語 中国語(簡体) 韓国語 英語 1 牛丼 牛肉碗 (niúròu wǎn) 소고기덮밥 (sogogi deopbab) beef bowl 2 ジャージャー麺 炸醬麵 (Zha Jiang Mian) 짜장면 (jjajangmyeon) Fried Source Noodles 3 ハンバーガー 汉堡包 (Hànbǎobāo) 햄버거 (haembeogeo) hamburger *) ジャージャー麺には種類が色々あるようです。
  5. 8 Copyright © 2020, Oracle and/or its affiliates 提供するサイズ 日本語

    英語 中国語(簡体) 韓国語 ミニ盛 Mini 小碗 미니사이즈 並盛 Regular 平碗 보통사이즈 大盛 Large 大碗 곱빼기
  6. 9 Copyright © 2020, Oracle and/or its affiliates 世界食堂のメニュー 品目

    サイズ 価格 (日本円) 牛丼 ミニ盛 350 ジャージャー麺 並盛 650 ハンバーガー 大盛 700 *) ハンバーガーのサイズ表記は適切ではありませんが、例題の簡素化のためそのままとします。
  7. 10 Copyright © 2020, Oracle and/or its affiliates 挨拶文 名前

    言語 テキスト T_GREETING 英語 Welcome, %0 T_GREETING 日本語 ようこそ, %0 T_GREETING 中国語(簡体) 欢迎光临, %0 T_GREETING 韓国語 어서오세요, %0
  8. 12 Copyright © 2020, Oracle and/or its affiliates メニューを保持する表の作成 •

    メニューを保持する表WR_MENUSを作成します。 • メニューは日本語で投入します。 create table WR_MENUS ( ID number primary key, MENU_NAME varchar2(80) not null, VOLUME varchar2(16) not null, PRICE number not null ) / insert into wr_menus(id, menu_name, volume, price) values(1,'牛丼','ミニ盛',350); insert into wr_menus(id, menu_name, volume, price) values(2,'ジャージャー麺','並盛',650); insert into wr_menus(id, menu_name, volume, price) values(3,'ハンバーガー','大盛',700); commit;
  9. 13 Copyright © 2020, Oracle and/or its affiliates Oracle APEXアプリケーションの作成

    • アプリケーションは国際化を意識せず、母国語で 作成します。 • 名前は世界食堂を指定します。 • 設定の言語は日本語を選択します。 • アプリケーションの作成を実行します。 • 1ページだけのアプリケーションが作成されま す。
  10. 14 Copyright © 2020, Oracle and/or its affiliates メニューを表示するレポートをホーム・ページに作成 •

    ホーム・ページ(ページ番号1)に新し いリージョンを作成します。 • リージョンのタイトルは日本語メ ニューと指定します。 • リージョンのタイプを、クラシッ ク・レポートに設定します。 • ソースのタイプに表/ビュー、表名 にWR_MENUSを設定します。 • 列のヘッダーを変更します。 • Menu Name -> メニュー名 • Volume -> サイズ • Price -> 値段
  11. 15 Copyright © 2020, Oracle and/or its affiliates アプリケーションの完成 •

    アプリケーション作成の時点では、国際化を意識しません。 • いまのところ、一般的なOracle APEXのアプリケーションです。 • このアプリケーションをグローバライズしていきます。
  12. 17 Copyright © 2020, Oracle and/or its affiliates アプリケーションの翻訳 •

    共有コンポーネントのグローバリゼーション に含まれる、アプリケーションの翻訳を開き ます。 • 翻訳方法を上から下へ実施します。 • テキストの翻訳は、翻訳リポジトリの手動編 集とXLIFF翻訳ファイルを介した編集の二通 りの方法があります。 • 翻訳可能なテキストのシード、テキストの翻 訳、翻訳済みアプリケーションの適用は繰り 返しの作業です。
  13. 18 Copyright © 2020, Oracle and/or its affiliates アプリケーション言語の定義 •

    翻訳対象の言語に翻訳アプリケーションとし て、アプリケーションIDを割り当てます。 • メインのアプリケーションとは別に、翻訳を 保持するアプリケーションを内部的に作成し ます。 • 言語に英語(en)、中国語(中国)(zh-cn)、韓国 語(ko)をそれぞれ指定し、3つのアプリケー ション言語マッピングを作成します。 • 元となるアプリケーションで使用されている 言語(今回は日本語)のマッピングは不要で す。
  14. 19 Copyright © 2020, Oracle and/or its affiliates 翻訳可能なテキストのシード •

    翻訳をシードすると、翻訳可能なすべてのテキストが翻訳テキスト・リポジトリにコピーされます。 • 翻訳可能なテキストをシードした後に、テキスト文字列の翻訳プロセスを開始できます。 • メインのアプリケーションは日本語なので、最初のシード直後は、翻訳済みのテキストとして日本語 が設定されます。 • メインのアプリケーションが変更された場合、シードは再度、実施する必要があります。すでに翻訳 済みのテキストが上書きされることはありません。
  15. 20 Copyright © 2020, Oracle and/or its affiliates テキストの翻訳 •

    翻訳リポジトリはフォーム、または、 対話グリッドを使って手動で編集でき ます。 • 言語の指定どおりに翻訳先のテキスト を更新します。 • 言語がzh-cnであれば、翻訳先を中 国語(簡体)に更新します。 • 言語がenであれば、翻訳先を英語 に更新します。 • 言語がkoであれば、翻訳先を韓国 語に更新します。
  16. 21 Copyright © 2020, Oracle and/or its affiliates XLIFF翻訳ファイルのダウンロード •

    翻訳リポジトリの内容を、それぞれの言語毎にXLIFF ファイルとしてエクスポートします。 <?xml version="1.0" encoding="UTF-8"?> <!-- ****************** ** Source : 110706 ** Source Lang: ja ** Target : 23113533 ** Target Lang: en ** Filename: f110706_23113533_ja_en.xlf ** Generated By: [email protected] ** Date: 25-9月 -2020 06:36:14 ****************** --> <xliff version="1.0"> <file original="f110706_23113533_ja_en.xlf" source-language="ja" target-language="en" datatype="html"> <header></header> <body> <trans-unit id="S-5-0-110706"> <source>グローバル・ページ - デスクトップ</source> <target>グローバル・ページ - デスクトップ</target> </trans-unit> <trans-unit id="S-5-1-110706"> <source>ホーム</source> <target>ホーム</target> </trans-unit> <trans-unit id="S-5-9999-110706"> <source>ログイン・ページ</source> <target>ログイン・ページ</target> </trans-unit> <trans-unit id="S-6-0-110706"> <source>グローバル・ページ - デスクトップ</source> <target>グローバル・ページ - デスクトップ</target> </trans-unit> <trans-unit id="S-6-1-110706"> <source>世界食堂</source> <target>世界食堂</target> </trans-unit> <trans-unit id="S-6-9999-110706"> <source>世界食堂 - サインイン</source> <target>世界食堂 - サインイン</target> </trans-unit> <?xml version="1.0" encoding="UTF-8"?> <!-- ****************** ** Source : 110706 ** Source Lang: ja ** Target : 23113533 ** Target Lang: en ** Filename: f110706_23113533_ja_en.xlf ** Generated By: [email protected] ** Date: 25-9月 -2020 06:36:14 ****************** --> <xliff version="1.0"> <file original="f110706_23113533_ja_en.xlf" source-language="ja" target-language="en" datatype="html"> <header/> <body> <trans-unit id="S-5-0-110706"> <source>グローバル・ページ - デスクトップ</source> <target>Global Page - Desktop</target> </trans-unit> <trans-unit id="S-5-1-110706"> <source>ホーム</source> <target>Home</target> </trans-unit> <trans-unit id="S-5-9999-110706"> <source>ログイン・ページ</source> <target>Login Page</target> </trans-unit> <trans-unit id="S-6-0-110706"> <source>グローバル・ページ - デスクトップ</source> <target>Global Page - Desktop</target> </trans-unit> <trans-unit id="S-6-1-110706"> <source>世界食堂</source> <target>World Diner</target> </trans-unit> <trans-unit id="S-6-9999-110706"> <source>世界食堂 - サインイン</source> <target>World Diner - Sign In</target> </trans-unit> ダウンロード したXLIFFファ イルは未翻訳 XLIFFファイル を翻訳して アップロード 英語への翻訳例
  17. 22 Copyright © 2020, Oracle and/or its affiliates XLIFF翻訳ファイルの適用 •

    翻訳済みのXLIFF翻訳ファイルをXLIFFリポジトリにアップロードします。 • 翻訳済アプリケーションを選択して、XLIFF翻訳ファイルを適用します。
  18. 23 Copyright © 2020, Oracle and/or its affiliates 翻訳済アプリケーションのパブリッシュ •

    翻訳済アプリケーションを選択し、パブリッシュを実行します。 • パブリッシュが完了すると、同期化が必要がいいえになります。 • 元となるアプリケーションを変更すると同期化が必要がはいになります。 • アプリケーションを変更すると、再度シードからパブリッシュまでの手順を繰り返します。
  19. 24 Copyright © 2020, Oracle and/or its affiliates アプリケーション言語の導出元の変更 •

    アプリケーション言語の導出元をセッションに 変更します。 • アプリケーション言語の導出元として、以下が 選択可能です。 • NLSなし(アプリケーションは翻訳されない) • アプリケーションのプライマリ言語 • ブラウザ(ブラウザの言語プリファレンスを使用) • アプリケーション・プリファレンス (FSP_LANGUAGE_PREFERENCEを使用) • アイテム・プリファレンスを使用(プリファレンス を含むアイテムを使用) • セッション
  20. 25 Copyright © 2020, Oracle and/or its affiliates アプリケーションの実行 •

    アプリケーション言語の導出元をセッションとしたので、ログイン画面にて言語の選択が可能になり ます。 日本語 英語 中国語 韓国語
  21. 26 Copyright © 2020, Oracle and/or its affiliates 翻訳されたアプリケーション •

    アプリケーションのラベルが翻訳されていることを確認します。 • データは翻訳されていません。 日本語 英語 中国語 韓国語
  22. 28 Copyright © 2020, Oracle and/or its affiliates 各国語のデータの用意 •

    それぞれの言語に翻訳した品目名を保存する表WR_MENUS_TLを作成します。 create table WR_MENUS_TL ( ID number primary key, MENU_ID number not null, LOCAL_MENU_NAME varchar2(80) not null, LANGUAGE varchar2(3) not null ); insert into wr_menus_tl(id, menu_id, local_menu_name, language) values(1,1,'牛丼','JA'); insert into wr_menus_tl(id, menu_id, local_menu_name, language) values(2,1,'beef bowl','US'); insert into wr_menus_tl(id, menu_id, local_menu_name, language) values(3,1,'牛肉碗','ZHS'); insert into wr_menus_tl(id, menu_id, local_menu_name, language) values(4,1,'소고기덮밥','KO'); insert into wr_menus_tl(id, menu_id, local_menu_name, language) values(5,2,'ジャージャー麺','JA'); insert into wr_menus_tl(id, menu_id, local_menu_name, language) values(6,2,'Fried Source Noodles','US'); insert into wr_menus_tl(id, menu_id, local_menu_name, language) values(7,2,'炸醬麵','ZHS'); insert into wr_menus_tl(id, menu_id, local_menu_name, language) values(8,2,'짜장면','KO'); insert into wr_menus_tl(id, menu_id, local_menu_name, language) values(9,3,'ハンバーガー','JA'); insert into wr_menus_tl(id, menu_id, local_menu_name, language) values(10,3,'hamburger','US'); insert into wr_menus_tl(id, menu_id, local_menu_name, language) values(11,3,'汉堡包','ZHS'); insert into wr_menus_tl(id, menu_id, local_menu_name, language) values(12,3,'햄버거','KO'); commit;
  23. 29 Copyright © 2020, Oracle and/or its affiliates ビューの定義 •

    言語設定に従ってメニューを取り出すビューWR_MENUS_VLを定義します。 • Oracle APEXのセッションに設定された言語設定は、データベースのセッションにも反映されます。 CREATE OR REPLACE FORCE VIEW "WR_MENUS_VL" ("ID", "MENU_NAME", "VOLUME", "PRICE") AS SELECT O.ID, L.LOCAL_MENU_NAME as MENU_NAME, O.VOLUME, O.PRICE FROM WR_MENUS O JOIN WR_MENUS_TL L ON O.ID = L.MENU_ID WHERE L.LANGUAGE = SYS_CONTEXT('USERENV', 'LANG') / APEXのセッション言語 DBのセッション言語 en US ja JA ko KO zh-cn ZHS
  24. 30 Copyright © 2020, Oracle and/or its affiliates レポート・ソースの変更 •

    レポート日本語メニューの表WR_MENUSをビューWR_MENUS_VLへ変更します。
  25. 31 Copyright © 2020, Oracle and/or its affiliates シード、パブリッシュの再実行 •

    アプリケーションの改変が行われたので、シードからパブリッシュまでを再実行します。 • ラベル等の変更がないので、翻訳データの適用はスキップできます。
  26. 32 Copyright © 2020, Oracle and/or its affiliates 改変後のアプリケーション •

    データも翻訳されています。 • サイズが未翻訳です。 日本語 英語 中国語 韓国語
  27. 34 Copyright © 2020, Oracle and/or its affiliates 動的翻訳 •

    サイズを動的翻訳できるように構成します。 • 言語、翻訳元テキスト、翻訳先テキストを設定します。
  28. 35 Copyright © 2020, Oracle and/or its affiliates 動的翻訳の適用 •

    サイズ(VOLUME)の情報にAPEX_LANG.LANGファンクションによる動的翻訳を適用します。 • アプリケーション自体には改変がないので、そのまま実行して動作を確認します。 CREATE OR REPLACE FORCE VIEW "WR_MENUS_VL" ("ID", "MENU_NAME", "VOLUME", "PRICE") AS SELECT O.ID, L.LOCAL_MENU_NAME as MENU_NAME, APEX_LANG.LANG(O.VOLUME) as VOLUME, O.PRICE FROM WR_MENUS O JOIN WR_MENUS_TL L ON O.ID = L.MENU_ID WHERE L.LANGUAGE = SYS_CONTEXT('USERENV', 'LANG') /
  29. 36 Copyright © 2020, Oracle and/or its affiliates 改変後のアプリケーション •

    サイズも翻訳されました。 日本語 英語 中国語 韓国語
  30. 38 Copyright © 2020, Oracle and/or its affiliates テキスト・メッセージの登録 •

    ページに埋め込むPL/SQLコードまたはJavaScript中に含まれるテキストを翻訳する際に使用します。 • PL/SQLの場合はAPEX_LANG.MESSAGE APIによって翻訳します。 • JavaScriptの場合はapex.lang API (getMessage, formatMessage)によって翻訳します。 • キーとなる名前と言語、その言語によるテキストを登録します。 コード内で使用する キーとなる名前 テキストの言語指定 指定した言語のテキスト 主言語(日本語)のテキストも 登録が必要 JavaScriptから使用する際に はON
  31. 39 Copyright © 2020, Oracle and/or its affiliates ページ・アイテムの作成 •

    挨拶を表示するページ・アイテムP1_GREETINGを作成します。 • 名前:P1_GREETING • タイプ:表示のみ • ラベル:挨拶 • ページの送信時に送信:OFF • 基準:Output of PL/SQL Code • テンプレート:Hidden • ラベル列スパン:0 • PL/SQLコード begin htp.prn(apex_lang.message('T_GREETING',:APP_USER)); end;
  32. 40 Copyright © 2020, Oracle and/or its affiliates 改変後のアプリケーション •

    挨拶文が追加されました。 日本語 英語 中国語 韓国語
  33. 41 Copyright © 2020, Oracle and/or its affiliates コードも翻訳対象 •

    コードも翻訳リポジトリに含まれます。 • コードの変更時も、シードからパブリッシュを行う一連の作業が必要です。
  34. 43 Copyright © 2020, Oracle and/or its affiliates Oracle Databaseが提供する日時データ型

    タイム・ゾーンを認識するにはTIMESTAMP WITH TIME ZONE型またはTIMESTAMP WITH LOCAL TIME ZONE型の使用が必須です。 日時データ型 説明 タイム・ ゾーン 少数秒 DATE 次の世紀、年、月、日、時間、分および秒の情報が格納されます。 なし なし TIMESTAMP DATEデータ型の拡張機能です。DATEデータ型では格納されない 小数秒も格納されます。 なし あり TIMESTAMP WITH TIME ZONE TIMESTAMPのバリアントで、値にはタイム・ゾーン・リージョン 名またはタイム・ゾーン・オフセットが含まれます。 あり あり TIMESTAMP WITH LOCAL TIME ZONE TIMESTAMPのもう1つのバリアントです。TIMESTAMP WITH TIME ZONEとは異なり、データベースに格納されるデータはデー タベース・タイムゾーンに対して正規化され、タイムゾーン・オ フセットは列データの一部として格納されません。 あり あり https://docs.oracle.com/cd/F19136_01/nlspg/datetime-data-types-and-time-zone-support.html
  35. 44 Copyright © 2020, Oracle and/or its affiliates 現在時刻を表すリテラル リテラル

    説明 SYSDATE データベースが稼働しているオペレーティング・システムから得られる時刻をDATE型で返します。タ イムゾーンを含まないので、Oracle APEXのアプリケーションでは、サーバー同じタイムゾーンからア クセスしていることが前提でなければ、現在時刻として扱うことはできません。 SYSTIMESTAMP データベースが稼働しているオペレーティング・システムから得られる時刻をTSTZ型(TIMESTAMP WITH TIME ZONE型)で返します。時刻のみではなくタイムゾーンも含みますが、オペレーティング・ システムから得られるタイムゾーンになります。 ユーザーのタイムゾーンでの時刻で表示するにはSYSTIMESTAMP AT LOCALとして、AT LOCAL演算 子を適用する必要があります。SYSTIMESTAMP AT LOCALの結果はCURRENT_TIMESTAMPになるた め、そのような場合はCURRENT_TIMESTAMPを使用すべきでしょう。 ユーザーのタイムゾーンで扱う必要のない場合、例えばプロシージャやトリガー内で使用できます。 CURRENT_DATE セッションのタイムゾーン・オフセットを適用した現在時刻をDATE型で返します。Oracle APEXアプ リケーションを使用しているユーザーのタイムゾーンでの現在時刻になります。 CURRENT_TIMESTAMP セッションのタイムゾーン・オフセットを適用した現在時刻をTSTZ型(TIMESTAMP WITH TIME ZONE 型)で返します。ユーザーのタイムゾーンでの時刻表示になり、かつ、タイムゾーンの情報も含まれま す。 LOCALTIMESTAMP セッションのタイムゾーン・オフセットを適用した現在時刻をTIMESTAMP型で返します。ユーザーの タイムゾーンでの時刻表示になります。タイムゾーンの情報は含みません。
  36. 45 Copyright © 2020, Oracle and/or its affiliates 日時データ型のデフォルト書式の設定 •

    表示を見て日時データ型がわかるよう、日付書式、日時書式を設定します。 DATE型 YYYY/MM/DD HH24:MI TIMESTAMP型 TIMESTAMP WITH LOCAL TIME ZONE型 YYYY/MM/DD HH24:MI:SS.FF3 TIMESTAMP WITH TIME ZONE型 YYYY/MM/DD HH24:MI:SS.FF3 TZR
  37. 46 Copyright © 2020, Oracle and/or its affiliates 注文表の作成 •

    注文情報を保持する表WR_ORDERSを作成します。 • DATE、TIMESTAMP、TIMESTAMP WITH LOCAL TIME ZONE、TIMESTAMP WITH TIME ZONEの4種 類のデータ型で発注時刻を保持します。 create table wr_orders ( id number generated by default on null as identity constraint wr_orders_id_pk primary key, menu_id number constraint wr_orders_menu_id_fk references wr_menus on delete cascade, order_by varchar2(80), order_date date, order_ts timestamp, order_tsltz timestamp with local time zone, order_tstz timestamp with time zone ) ;
  38. 47 Copyright © 2020, Oracle and/or its affiliates 表WR_ORDERSのフォーム付きレポートを作成 •

    ページ作成ウィザードを起動し、表WR_ORDERSのフォーム付きレポートを作成します。 • レポート・ページ名を注文一覧、フォーム・ページ名を注文、モーダル・ダイアログとします。 • ナビゲーション・メニュー・エントリを新規に作成します。 • 表/ビューとしてWR_ORDERSを指定します。 • 主キー列としてID (Number)を選択します。
  39. 48 Copyright © 2020, Oracle and/or its affiliates メニューを選択するLOVの作成 •

    共有コンポーネントにLOVメニューを作成します。 • 名前をメニューとします。タイプはDynamicを選択します。 • 表/ビューとしてWR_MENUS_VLを指定します。 • 戻り列をID、表示列をMENU_NAMEとします。
  40. 49 Copyright © 2020, Oracle and/or its affiliates レポートとフォームにLOVを設定 列MENU_IDのタイプにプレーン・テキスト

    (LOVに基づく)を指定し、LOVとしてメ ニューを設定します。 ページ・アイテムP3_MENU_IDのタイプに 選択リストを指定し、LOVのタイプを共有 コンポーネント、LOVとしてメニューを設 定します。
  41. 50 Copyright © 2020, Oracle and/or its affiliates 現在時刻のレポートを追加 •

    各種現在時刻を表示するレポートを追加します。 • タイトルは現在時刻、タイプはクラシック・レポートとし、以下のSQL問合せを設定します。 select sysdate, systimestamp, current_date, current_timestamp, localtimestamp, dbtimezone, tz_offset(sessiontimezone) from dual
  42. 51 Copyright © 2020, Oracle and/or its affiliates デフォルトでの日時データの扱い •

    デフォルトではすべてサーバー側のタイムゾーンとして解釈されます。 2020/10/25 15:00 を入力 セッションにタイムゾーン (時差)が設定されていない 現在時刻の表示はすべて同じ 入力した日時の扱いも同じ
  43. 52 Copyright © 2020, Oracle and/or its affiliates 自動タイムゾーンの指定 •

    自動タイムゾーンをONにすると、ブラウザが検出するタイムゾーンが反映されます。
  44. 53 Copyright © 2020, Oracle and/or its affiliates 自動タイムゾーンがONの場合 •

    先ほどと同じデータをフォームから投入します。 • タイムゾーンを認識する日時データは、現地時間で取り扱われます。 東京のタイムゾーン(GMT+9:00)の 2020/10/25 15:00と認識されている 元のデータがGMT(+0:00)と認識されて、東京との時差に合わ せて9時間進み2020/10/26 00:00となっている GMTとの時差が+9:00と 認識されている 時差が適用された現地時刻
  45. 55 Copyright © 2020, Oracle and/or its affiliates ページ・アイテムの作成 •

    タイムゾーンを指定するページ・アイ テムを追加します。 • リージョン現在時刻にページ・アイテ ムを作成します。 • 名前をP2_TIMEZONEと設定します。 • タイプは選択リストです。 • ラベルはタイムゾーンとします。 • LOVのタイプをSQL 問合せとし、以 下のSQLを設定します。 select tzname as d, tzname as r from v$timezone_names group by tzname order by tzname
  46. 56 Copyright © 2020, Oracle and/or its affiliates 動的アクションの作成 •

    ページ・アイテムP2_TIMEZONEの変更時に実行される動的アクションの作成を行います。 • 名前はタイムゾーン設定とします。
  47. 57 Copyright © 2020, Oracle and/or its affiliates APIの呼び出し •

    Trueアクションの設定を行います。 • アクション:PL/SQLコードの実行 • PL/SQLコード:apex_util.set_session_time_zone(:P2_TIMEZONE); • 送信するアイテム:P2_TIMEZONE
  48. 58 Copyright © 2020, Oracle and/or its affiliates レポートのリフレッシュ •

    Trueアクションを2つ追加します。 • アクション:リフレッシュ • 選択タイプ:リージョン • リージョン:現在時刻、レポート1 現在時刻 レポート1 それぞれ別にアクショ ン(リフレッシュ)を作成 します
  49. 60 Copyright © 2020, Oracle and/or its affiliates 例えばニューヨーク •

    米国東海岸の夏時間 GMT-4:00 • 米国東海岸の標準時間 GMT-5:00 • 2020年:開始 2020/03/08(日) 03:00 – 終了 2020/11/01(日) 01:00 • 2021年:開始 2021/03/14(日) 03:00 – 終了 2021/11/07(日) 01:00
  50. ニューヨークを例にとります • ブラウザが夏時間を認識している期間に、標準時間帯のデータを入力します。 夏時間での標準時間帯の日時入力 Copyright © 2020, Oracle and/or its

    affiliates 61 2021/01/01 00:00 を入力 夏時間中なので、時差が -4:00と認識されている 標準時となる期間の日時データが-4:00で入力 されてしまっている(本来は-5:00)
  51. 62 Copyright © 2020, Oracle and/or its affiliates タイムゾーンを明示的に設定 •

    自動タイムゾーンをOFFにします。 • タイムゾーンにAmerica/New_Yorkに指定します。
  52. 63 Copyright © 2020, Oracle and/or its affiliates 夏時間に対応したタイムゾーンの設定 •

    夏時間に対応しているタイムゾーン(例えばAmerica/New_York)を設定します。 • 再度、2021/01/01 00:00の注文を登録します。 • 夏時間に対応するには、夏時間に対応したタイムゾーンをセッションに設定します。 2021/01/01 00:00:00 -4:00 はAmerica/New_Yorkの標準時間 のオフセット -5:00では 2020/12/31 23:00 タイムゾーンが America/New_York として認識され 標準時で扱われている セッションのタイムゾーンは America/New_York