このチュートリアルは、Bonita BPM 7.5.0 以上に適用されます。
Bonita BPM の BDM(ビジネス データモデル)とユーザーインタフェースで日付と時刻を管理するためには、プロセス、API、ユーザーインターフェース(フォーム/ページ)を通じて操作可能な3つのデータ型を用意しています。
本ページでは、これらのデータ型のそれぞれを活用し、日付(時間の有無にかかわらず)を選択・表示するフォームを持つプロセスの作成手順をステップバイステップで説明します。
日付のみを表示
DATE ONLY の型は、時刻を伴わない日付を保持するために使用されます。たとえば、誕生日などに使用します。
これは、 ISO 8601 の書式文字列(たとえば、 “2017-01-13” )でデータベースに保存されます。
Java の型としては、java.time.LocalDate を使用します。
次のセクションでは、従業員の誕生日を持つオブジェクトの作成、更新、および表示する方法を示します。
ビジネスデータを定義します
- Studio のメニューを 開発 > ビジネス データモデル > 管理… の順に選択し、ビジネス データモデルのエディタを開きます。
- DATE ONLY 型の birthdate 属性を持つビジネス オブジェクト Employee を作成します。DATE (NOT RECOMMENDED) 型は、時間情報を含んでいるため操作が難しい旧来の DATE 型 に相当します。DATE ONLY 型はこのDATE (NOT RECOMMENDED) 型を置き換えたもので、時間情報を含んでいません。
- 新しいプロセスを作成します。
- このプロセスの「データ」タブで Employee 型の新しいビジネス変数 employee を作成します。
プロセスレベルでコントラクトを定義し、ビジネス変数を初期化するスクリプトも定義します
- プロセスの「実行」タブ > 「コントラクト」のセクションに移動し、「データから追加… 」ボタンを使用して入力コントラクトを定義します。
- ビジネス変数 employee を選択します。
- ウィザードに従い、DATE ONLY 型の birthdate 属性を含む COMPLEX 型の入力コントラクト employeeInput を生成します(ビジネス変数の初期化スクリプトを自動生成するオプションを持ちます)。
プロセスの起案フォームを生成します
- プロセスの「実行 」タブ、「起案フォーム」のセクションで、「鉛筆」アイコンをクリックして、フォームを生成します。
- コントラクト入力は、DATE ONLY 型の属性を持っているので、DATE PICKER のウィジェットが自動的にフォームに追加され、フォームは既に正しく設定済みになっています。
- 自動生成されたフォームの名前を newForm から「employeeInput」に変更します。
- このフォームを保存します。
タスクレベルでコントラクトを定義し、ビジネス変数を更新するデータ操作を定義します
- 最初のタスク名(タスク1)を「誕生日を更新する」に変更します。
- そのタスクの「実行」タブ > 「コントラクト」のセクションで、「データから追加…」ボタンを使用して入力コントラクトを定義します。
- ビジネス変数 employee を選択します。
- ウィザードに従い、DATE ONLY 型の birthdate 属性を含む COMPLEX型の入力コントラクト employeeInput を生成します(データ操作を自動生成するオプションを持ちます)。
「誕生日を更新する」タスク フォームを生成します
- そのタスクの「実行 」タブ、「フォーム」のセクションで、「鉛筆」アイコンをクリックして、フォームを生成します。
- この自動生成されたフォームの名前を newForm から「employeeUpdate」に変更します。
- その入力コントラクトの birthdate 属性は、DATE ONLY 型を持っているので、DATE PICKER のウィジェットが自動的にフォームに追加されています。
- UI デザイナーで、現在 Employee に保存されている値を取得するために、次に手順で現在のコンテキストを参照する変数を定義します:
- エディタの下部にある「VARIABLES」パネルで「新規変数を作成」をクリックします。
- 新しい変数名として employee を入力します。
- 「タイプ 」に対して、 External API を選択します。
- その変数の「APIのURL」 に ../{{context.employee_ref.link}} を設定します。
捕捉、その誕生日に対し REST API によって返される値は、ISO 8601 で書式化された文字列になります(たとえば、”1983-01-13″)。
- formInput 変数のタイプを「Javascript expression」に変更し、その「値」に次のスクリプトを設定します:
return { "employeeInput" : { "birthdate" : $data.employee.birthdate } };
- このフォームを保存します。
DATE PICKER のウィジェットは、その入力の「値」プロパティに以下のタイプのサポートします:
- ISO 8601 の文字列変数(時間情報の有無に関わらない: 例 “2016-12-31” または “2016-12-31T00:00:00.000Z” )
- Date 型のオブジェクト
- Long の長整数型の数値(ミリ秒)
しかし、古い UI デザイナーのバージョン(7.5.0より前)でデザインされたページをサポートするため、ウィジェットの出力は常に Javascript の Date オブジェクトです。したがって、ユーザーが日付を選択したときにウィジェットの「値」にバインドされている変数の型は Date オブジェクトに変更します。
リクエストの JSON 本体に送信されると、真夜中の UTC に設定された時刻(たとえば、”2016-12-31T00:00:00.000Z” )が ISO 8601 で書式化された文字列変数にシリアル化されます。その時間情報がプロセスインスタンス化時に REST APIによって受信され、java.time.LocalDate に変換された場合は、その時間情報はコントラクトレベルで廃棄されます。
データベースから日付を取得し、それを表示します
もう1つ別のタスクフォーム(または任意の別ページ)で、日付を取得し、それを表示することができます。
そうするためには:
- 既存のタスクの後に「誕生日をレビューする」と命名した新しいタスクを作成します。
- この自動生成されたフォームの名前を newForm から「employeeReview」に変更します。
- そのタスクの「実行 」タブ、「フォーム」のセクションで、「鉛筆」アイコンをクリックして、フォームを生成します。
- UI デザイナーで、現在 Employee に保存されている値をコンテキストを使用して取得するためには、次に手順で変数を定義します。
そのためには、前のステップのフォームに行った同じ方法で進めます:- エディタの下部にある「VARIABLES」パネルで「新規変数を作成」をクリックします。
- 新しい変数名として employee を入力します。
- 「タイプ 」に対して、 External API を選択します。
- その変数の「APIのURL」 に ../{{context.employee_ref.link}} を設定します。
- フォームエディタのパレットから、DATE PICKER のウィジェットをホワイトボードにドロップします。
- 「読み取り専用」のプロパティを「はい」設定します。
- その「値」に employee.birthdateを設定します。
- このフォームを保存します。
テキストでそれを表示することもできます。そうするためには:
- TEXT ウィジェットをホワイトボードにドロップします。
- デフォルトの「Text」プロパティの値を uiDate のフィルターを使った式、たとえば、{{employee.birthdate | uiDate: ‘yyyy年MM月dd日’}} に置き換えて、あなたが望む日付書式で表示できるようにします。利用可能な別の書式の詳細については、Text プロパティのキャプション内にある「フィルター」のリンクをクリックすると解説ドキュメントが表示されます。
さて、このプロセスを保存し実行すると、ビジネスデータのデータベースから取得した日付が前のタスクで選択した日付と一致していることがわかります。
タイムゾーンのない日付と時刻を表示
DATE-TIME (NO TIME ZONE) の型は、ユーザーのタイムゾーンに関わらず同じ日付と時刻を保持するために使用されます。たとえば、営業時間店舗、またはフライトの出発と到着の日付と時刻に使用します。
データベースには、ISO 8601 で書式化された文字列(例えば、”2017-01-13T13:00:00″)として保存されます。
Javaの型としては、java.time.LocalDateTime を使用します。
次のセクションでは、フライトの現地出発日と時刻を持つ Flight オブジェクトの作成・更新・表示方法を示します。つまり、あなたが世界中のどこにいても同じローカル時刻を表示します。
ビジネスデータを定義します
- Studio でメニューの開発 > ビジネスデータモデル > 管理… をクリックし、ビジネス データモデルのエディタを開きます。
- DATE-TIME (NO TIME ZONE) 型の departureTime 属性を持つビジネスオブジェクト Flight を作成します。
- 新しいプロセスを作成します。
- プロセスの「データ」タブで、 Flight 型のビジネス変数 flight を作成します。
プロセスレベルでコントラクトを定義し、ビジネス変数を初期化するスクリプトも定義します
- プロセスの「実行」タブ > 「コントラクト」のセクションに移動し、「データから追加… 」ボタンを使用して入力コントラクトを定義します。
- ビジネス変数 flight を選択します。
- ウィザードに従い、DATE-TIME (NO TIME ZONE) 型の departureTime 属性を含む COMPLEX 型のコントラクト入力 flightInput を生成します(ビジネス変数の初期化スクリプトを自動生成するオプションを持ちます)。
プロセスの起案フォームを生成します
- プロセスの「実行 」タブ、「起案フォーム」のセクションで、「鉛筆」アイコンをクリックして、フォームを生成します。
- コントラクト入力は、DATE-TIME (NO TIME ZONE) 型の属性を持っているので、DATE TIME PICKER のウィジェットが自動的にフォームに追加されています。このウィジェットは、すでにユーザーのタイムゾーンを処理しないように設定されています。
- 自動生成されたフォームの名前を newForm から「flightInput」に変更します。
- このフォームを保存します。
タスクレベルでコントラクトを定義し、ビジネス変数を更新するデータ操作を定義します
- 最初のタスク名(タスク1)を「出発時刻を更新する」に変更します。
- そのタスクの「実行」タブ > 「コントラクト」のセクションで、「データから追加…」ボタンを使用して入力コントラクトを定義します。
- ビジネス変数 flight を選択します。
- ウィザードに従い、DATE-TIME (NO TIME ZONE) 型の departureTime 属性を含む COMPLEX型の入力コントラクト flightInput を生成します(データ操作を自動生成するオプションを持ちます)。
「出発時刻を更新する」タスク フォームを生成します
- そのタスクの「実行 」タブ、「フォーム」のセクションで、「鉛筆」アイコンをクリックして、フォームを生成します。
- この自動生成されたフォームの名前を newForm から「flightUpdate」に変更します。
- その入力コントラクトの departureTime 属性は、DATE-TIME (NO TIME ZONE) 型を持っているので、DATE TIME PICKER のウィジェットが自動的にフォームに追加されています。
- UI デザイナーで、現在 Flight に保存されている値を取得するために、次に手順で現在のコンテキストを参照する変数を定義します:
- エディタの下部にある「VARIABLES」パネルで「新規変数を作成」をクリックします。
- 新しい変数名として flight を入力します。
- 「タイプ 」に対して、 External API を選択します。
- その変数の「APIのURL」 に ../{{context.flight_ref.link}} を設定します。
捕捉、そのフライト出発時刻に対し REST API によって返される値は、ISO 8601 で書式化された文字列になります(たとえば、”2017-01-13T15:00:00″)。
- formInput 変数のタイプを「Javascript expression」に変更し、その「値」に次のスクリプトを設定します:
return { "flightInput" : { "departtureTime" : $data.filight.departureTime } };
- このフォームを保存します。
DATE TIME PICKER のウィジェット出力は、ISO 8601で書式化された文字列(たとえば、”2017-01-13T15:00:00″)です。
コントラクトレベルでは、タスク実行の REST API が受信されたときに java.time.LocalDateTime に変換されます。
データベースから日付を取得し、それを表示します
もう1つ別のタスクフォーム(または任意の別ページ)で、日付を取得し、それを表示することができます。
そうするためには:
- 既存のタスクの後に「出発時刻をレビューする」と命名した新しいタスクを作成します。
- この自動生成されたフォームの名前を newForm から「flightReview」に変更します。
- そのタスクの「実行 」タブ、「フォーム」のセクションで、「鉛筆」アイコンをクリックして、フォームを生成します。
- UI デザイナーで、現在 Flight に保存されている値をコンテキストを使用して取得するためには、次に手順で変数を定義します。
そのためには、前のステップのフォームに行った同じ方法で進めます:- エディタの下部にある「VARIABLES」パネルで「新規変数を作成」をクリックします。
- 新しい変数名として flight を入力します。
- 「タイプ 」に対して、 External API を選択します。
- その変数の「APIのURL」 に ../{{context.flight_ref.link}} を設定します。
- フォームエディタのパレットから、DATE TIME PICKER のウィジェットをホワイトボードにドロップします。
- 「読み取り専用」のプロパティを「はい」設定します。
- その「値」に flight.departureTime を設定します。
- このフォームを保存します。
テキストでそれを表示することもできます。そうするためには:
- TEXT ウィジェットをホワイトボードにドロップします。
- デフォルトの「Text」プロパティの値を uiDate のフィルターを使った式、たとえば、{{flight.departureTime | uiDate: ‘yyyy年MM月dd日 h:mm a’}} に置き換えて、あなたが望む日付書式で表示できるようにします。利用可能な別の書式の詳細については、Text プロパティのキャプション内にある「フィルター」のリンクをクリックすると解説ドキュメントが表示されます。
さて、このプロセスを保存し実行すると、ビジネスデータのデータベースから取得した出発日と時間は前のタスクで選択した出発日と時間と一致していることがわかります。
あなたは、手順を確認しながらシステムのタイムゾーンを変更し、ページをリフレッシュした場合は、表示された時間は同じままであることを確認できます。
ユーザーのタイムゾーンで日付と時刻を表示
DATE-TIME (TIME ZONE) の型は、ユーザーのタイムゾーンに適した日時を表示値(たとえば、複数のタイムゾーンにまたがる出席者の参加する会議日時)を保持するために使用されます。
データベースには、ISO 8601 で書式化された文字列(例えば、”2017-01-13T13:00:00Z” )として保存されます。
Javaの型としては、java.time.OffsetDateTime を使用します。
次のセクションでは、会議開始時刻が表示される際にユーザーのタイムゾーンを反映する開始日時を持つ Meeting オブジェクトの作成・更新・表示方法を示します。
ビジネスデータを定義します
- Studio でメニューの開発 > ビジネスデータモデル > 管理… をクリックし、ビジネス データモデルのエディタを開きます。
- DATE-TIME(TIME ZONE)型の startTime 属性を持つビジネスオブジェクト Meeting を作成します。
- 新しいプロセスを作成します。
- プロセスの「データ」タブで、 Meeting 型のビジネス変数 meeting を作成します。
プロセスレベルでコントラクトを定義し、ビジネス変数を初期化するスクリプトも定義します
- プロセスの「実行」タブ > 「コントラクト」のセクションに移動し、「データから追加… 」ボタンを使用して入力コントラクトを定義します。
- ビジネス変数 meeting を選択します。
- ウィザードに従い、DATE-TIME (TIME ZONE) 型の startTime 属性を含む COMPLEX 型のコントラクト入力 meetingInput を生成します(ビジネス変数の初期化スクリプトを自動生成するオプションを持ちます)。
プロセスの起案フォームを生成します
- プロセスの「実行 」タブ、「起案フォーム」のセクションで、「鉛筆」アイコンをクリックして、フォームを生成します。
- コントラクト入力は、DATE-TIME (TIME ZONE) 型の属性を持っているので、DATE TIME PICKER のウィジェットが自動的にフォームに追加されています。このウィジェットは、すでにユーザーのタイムゾーンを処理しないように設定されています。
- 自動生成されたフォームの名前を newForm から「meetingInput」に変更します。
- このフォームを保存します。
タスクレベルでコントラクトを定義し、ビジネス変数を更新するデータ操作を定義します
- 最初のタスク名(タスク1)を「開始時刻を更新する」に変更します。
- そのタスクの「実行」タブ > 「コントラクト」のセクションで、「データから追加…」ボタンを使用して入力コントラクトを定義します。
- ビジネス変数 meeting を選択します。
- ウィザードに従い、DATE-TIME (TIME ZONE) 型のstartTime 属性を含む COMPLEX型の入力コントラクト meetingInput を生成します(データ操作を自動生成するオプションを持ちます)。
「開始時刻を更新する」タスク フォームを生成します
- そのタスクの「実行 」タブ、「フォーム」のセクションで、「鉛筆」アイコンをクリックして、フォームを生成します。
- この自動生成されたフォームの名前を newForm から「meetingUpdate」に変更します。
- その入力コントラクトの startTime 属性は、DATE-TIME (TIME ZONE) 型を持っているので、DATE TIME PICKER のウィジェットが自動的にフォームに追加されています。
- UI デザイナーで、現在 Meeting に保存されている値を取得するために、次に手順で現在のコンテキストを参照する変数を定義します:
- エディタの下部にある「VARIABLES」パネルで「新規変数を作成」をクリックします。
- 新しい変数名として meeting を入力します。
- 「タイプ 」に対して、 External API を選択します。
- その変数の「APIのURL」 に ../{{context.meeting_ref.link}} を設定します。
捕捉、その会議開始時刻に対し REST API によって返される値は、ISO 8601 で書式化された文字列になります(たとえば、”2017-01-13T15:00:00Z”)。
- formInput 変数のタイプを「Javascript expression」に変更し、その「値」に次のスクリプトを設定します:
return { "meetingInput" : { "startTime" : $data.meeting.startTime } };
- このフォームを保存します。
コントラクトレベルでは、タスク実行の REST API が受信されたときに java.time.OffsetDateTime に変換されます。
ユーザーは GMT タイムゾーンにある場合を除き、彼が選択した時刻とデータベースに格納された時刻の間のオフセットがあるでしょう。
データベースから日付を取得し、それを表示します
もう1つ別のタスクフォーム(または任意の別ページ)で、日付を取得し、それを表示することができます。
そうするためには:
- 既存のタスクの後に「開始時刻をレビューする」と命名した新しいタスクを作成します。
- この自動生成されたフォームの名前を newForm から「meetingReview」に変更します。
- そのタスクの「実行 」タブ、「フォーム」のセクションで、「鉛筆」アイコンをクリックして、フォームを生成します。
- UI デザイナーで、現在 Meeting に保存されている値をコンテキストを使用して取得するためには、次に手順で変数を定義します。
そのためには、前のステップのフォームに行った同じ方法で進めます:- エディタの下部にある「VARIABLES」パネルで「新規変数を作成」をクリックします。
- 新しい変数名として meeting を入力します。
- 「タイプ 」に対して、 External API を選択します。
- その変数の「APIのURL」 に ../{{context.meeting_ref.link}} を設定します。
- フォームエディタのパレットから、DATE TIME PICKER のウィジェットをホワイトボードにドロップします。
- 「読み取り専用」のプロパティを「はい」設定します。
- その「値」に meeting.startTime を設定します。
- このフォームを保存します。
テキストでそれを表示することもできます。そうするためには:
- TEXT ウィジェットをホワイトボードにドロップします。
- デフォルトの「Text」プロパティの値を uiDate のフィルターを使った式、たとえば、{{meeting.startTime | uiDate: ‘yyyy年MM月dd日 h:mm a’}} に置き換えて、あなたが望む日付書式で表示できるようにします。利用可能な別の書式の詳細については、Text プロパティのキャプション内にある「フィルター」のリンクをクリックすると解説ドキュメントが表示されます。
さて、このプロセスを保存し実行すると、ビジネスデータのデータベースから取得した日時は前のタスクで選択した日時と一致していることがわかります。
あなたは、手順を確認しながらシステムのタイムゾーンを変更し、ページをリフレッシュした場合は、表示された時間は新しいタイムゾーンに適応していることがわかります。