次の例を使用して、ワークフローについて説明します。
例: 航空券を予約する場合について考えてみます。次のような処理を行います。まず、オペレーターが予約データを入力します。顧客が登録されていない場合は、システムが自動的に登録します。次に空席確認を行い、確認の結果、空席があればプロセスは完了です。空席がない場合は、コントロールは最初のアイテムに戻り、そこで詳細を変更できます。
この例は、簡単なため手順の数が少ないものの、十分な通信が行われ、図形的で一貫性があります。ここにワークフローの重要な点があります: つまり、プログラマーによる介入を最小限にしつつ、自動化可能なコントロールを自動化することです。簡単な手順によって、開発者は
GeneXus で堅牢なワークフローアプリケーションをビルドできます。。
要するに、ワークフロープロセスの背景にある考え方は、使用可能なツール (この場合は
GeneXus ツール) を緊密に統合することで、会社の情報システムすべてをシームレスに連携させることが可能になり、その結果、管理プロセスを高速化し、ビジネスを大幅に向上させるというものです。
ここでは、必要な手順を示す簡単で実用的な例を紹介します:
- プロセスオブジェクトを作成する
- プロセスをモデリングするアクティビティダイアグラムを作成する
- オブジェクトをダイアグラムに関連付ける
- プロセスを実行する
ここでは、IDE 内で GXflow を使用する方法を示す簡単な例を紹介します。これは航空券予約のプロセスを単純化したものです。予約の詳細情報をシステムに入力し、登録されていない顧客は随時オペレーターが登録していきます。顧客が既に登録されている場合、コントロールはそのまま予約照会に進みます。予約可能な場合はプロセスが終了し、不可能な場合は、データを更新できるように、予約を入力したところまでフローが戻ります。
次の 2 つのトランザクションが必要です: Reservation (予約) と Customer (顧客)。
注: また、CustomerId 項目属性は null 値を許可するように定義されていることにも留意してください。これは、この例を正しく動作させるために必要です。また、ReservationId はオートナンバー(自動採番)です。
ルール
ReservationAvailable 項目属性を非表示にするためのルールです。この項目属性は、予約が入力済みの場合に、予約が可能かどうかを表示するために使用します。
ReservationAvailable.Visible = False If Insert;
CustomerId (オートナンバー)
プロシージャーを考慮します: 予約とユーザーを入力すると、そのユーザーに予約が割り当てられます。
ルール
Parm(in:&ReservationId, in:&CustomerId);
変数
ReservationId (ReservationId 項目属性に基づく)
CustomerId (CustomerId 項目属性に基づく)
コード
For each Reservation
Where ReservationId = &ReservationId
CustomerId = &CustomerId
Endfor
アクティビティダイアグラムを追加する際には、ほかのオブジェクトと同様に、
ビジネス プロセス ダイアグラム オブジェクトを追加するだけです。
手順 3: オブジェクトをダイアグラムに関連付ける
プロセスの開始点をマークするには、
開始イベント/トリガーなしの記号をドラッグします。
最初に関連付けられるオブジェクトは Reservation トランザクションになります。関連付けるには、オブジェクトを KB エクスプローラーからドラッグして、ダイアグラム内の開始コネクターと終了コネクターで結ぶ線上に移動させます。
または、
ユーザータスクを
ツールボックスからプロパティウィンドウにドラッグし、
[ Application ] プロパティ内でボタンをクリックします。
プロジェクトが追加されるとすぐに、トランザクションの主キーと同じ名前およびデータタイプを持つ関連データが作成されます。このデータは、その他の関連情報と同様に、フロー全体で既知となります。
次に、顧客が登録済みで Reservation トランザクションに関連付けられているかどうかを定義する条件を追加します。これを行うには、下の図に示すように、ダイアグラムのツールバー (既定では画面の右側に表示されます) から排他的ゲートウェイの記号を追加します。
ゲートウェイを挿入したら、この条件を定義して、フローに通常のコースを採らせるか、代替コースで顧客を登録するか決定します。まず、Customer トランザクションをダイアグラムに追加し、次に示すように、条件の代替ルートに接続する必要があります:
注: ゲートウェイを Customer タスクと接続するには、条件の右側をクリックして、矢印をタスクの左側までドラッグします。タイプはルートのプロパティ内に定義されています。
条件を完成させるには、あるルートをフローが採るか、別のルートを採るかを決定するように条件を定義する必要があります。このため、IDE には、項目属性および関連データに基づいて条件を表すことができる条件エディターが備わっています。顧客情報に接続されている端をダブルクリックして、次のエクスプレッションを入力します:
この条件を定義することによって、未登録の顧客 (customerId = 0) が登録されます。
次に、通常のフローで、Reservation トランザクションを再び追加します。このタスクでは予約が可能かどうかを評価します。F2 ボタンを押して、タスクの名前を変更します。
ReservationAvailability へと向かうコネクターを選択し、 [ Condition type ] プロパティで「Default」を選択します。
ゲートウェイの記号をダブルクリックすると、条件の概要が下の図のように表示されます:
予約が可能であるかどうかが判明したら、条件を評価するため、次のように別のゲートウェイを定義します:
予約が可能な場合、プロセスは終了します。予約が不可能な場合、予約の詳細を変更するため、フローが最初のタスクまで戻ります。
フローを完成させるには、顧客が未登録の場合に採る代替コースを定義します。したがって、顧客の登録が終わったら、この顧客を予約に関連付けて、予約可能かどうかを確認する必要があります。これを行うには、これまでに作成したプロシージャー (AssignToCustomer) と接続ルートを次のように追加する必要があります:
プロシージャーがダイアグラムに追加されると、パラメータールール (parm) が自動的に評価されます。関連データと同じ名前とタイプを持つ項目属性または変数が見つかった場合、これらは自身の値によってインスタンス化されます。ここでは、変数
&ReservationId と変数
&CustomerId が、対応する関連データの値と関連付けられます。
最後にプロセスを実行します。プロセスを最初に実行する前に、 [
すべてビルド ] (Build コマンド メニュー オプション) を実行します。KB エクスプローラーに表示されたダイアグラムを右クリックし、 [ 実行 ] を選択します。
続いて、GeneXus がこのダイアグラムを実行するのに必要なアクションを実行し、変更内容を表示します。この後の手順は次のとおりです:
- ワークフローオブジェクトの更新
- オブジェクトの指定
- オブジェクトの生成
- ワークフローオブジェクトのコンパイル
- データベースへのダイアグラムの反映
これら手順すべてが実行されるかどうかは、変更内容によって異なります。つまり、ダイアグラムが変更されるとオブジェクトすべてが指定、生成、コンパイルされるため、ダイアグラムが影響を受けます。
下の図のように、ブラウザーがアプリケーションとともに自動的に開きます:
プロトタイパーが実行されると、プロトタイプ化されるプロセスの新しいインスタンスが生成されます。これにより、開発者は、ロールを定義したり、プロトタイプを実行しているユーザーにロールを割り当てたりすることなく、すべての手順を実行できます。
両方のケースのプロセスフローを次に示します: 最初のケースは登録する必要がある顧客の場合、2 番目のケースは既にシステムに登録されている顧客の場合です。
予約の詳細は入力済みですが、 [ CustomerId ] フィールドは空白です (顧客はまだ登録されていません)。
次に顧客を登録する必要があります。
予約と顧客を登録すると、顧客を予約に割り当てるプロシージャーが自動的に実行されます。
プロセスを終了するには、この予約が可能かどうかを定義する必要があります。
下の図に示すように新しいタスクを作成し、顧客 (このケースではシステムに登録済み) を含む予約の詳細を入力します。
次に、予約が "not available" に設定されてフローが最初に戻り、、ここで予約データを変更できるようになります。
TicketReservation.xpz をダウンロードします。
構造エディター