Skip to main content

ホテルへのお問い合わせ

5 タスク

30 分

Visible to: All users
上級 Pega Platform 8.6 日本語

シナリオ

FSGは、ブックルームでのイベント開催に合意している各ホテルが、可能な限り平等に扱われるようにしたいと考えています。 FSGでは、直近1ヶ月以内にイベント会場から5マイル(8キロ)以内のホテルで、イベントのために客室の予約を依頼されていないホテルを確認したいと思います。 FSGでは、この情報を各ホテルにメールで送信し、FSGができるだけ早く客室リクエストを優先するよう周知することを計画しています。

以下の表は、チャレンジに必要なログイン情報をまとめたものです。

ロール ユーザー名 パスワード
Admin admin@booking rules

ホテルの連絡先を出力するクエリを、ビジネス要件に合わせて設計します。 現在公開されていないプロパティで、このレポートで出力されているものは、結合を実行する際に公開する必要があります。

このチャレンジを完了するには、Pegaインスタンスを起動する必要があります。

起動には5分ほどかかることがありますので、しばらくお待ちください。

詳細なタスク

1 設計オプションの特定

ブルートフォースのアプローチで、過去1カ月に開催されたすべてのイベントを特定し、そのリストを作成することができます。 イベント前に、接触したホテルのpyGUIDを取得します。 次に、D_AddressesWithinDistanceデータページで、イベントが開催される会場から5マイル以内にある「IsFor=Hotel」レコードを検索させます。 D_AddressesWithinDistanceの結果セットの参照値が取得されます。 FSG-Data-Hotel pyGUIDのリストにない参照値は保持され、FSG-Data-Hotel pyGUIDと一致しない参照値は無視されます。 残りの参照値はすべてFSG-Data-Hotelのレコードを検索するために使用されます。 参照される各FSG-Data-Contactから連絡先情報(pyFirstName、pyLastName、pyEmail1)を取得します。

この反復アプローチの問題点は、1ヶ月の間に複数のイベントを同じ会場で開催する可能性があることです。 また、2つの会場が10マイル(16キロメートル)以内にある場合もあり、それぞれの会場の半径5マイル(8キロメートル)で重複が発生することになります。 同じホテルで過去1ヶ月間にさまざまなイベントが開催された可能性もあるため、そのホテルを除外するには、1回の問い合わせで十分です。 目標は、問い合わせのないホテルを見つけることです。

Hotels in/out of range of venues

D_AddressesWithinDistanceデータページは、Connect-SQLルールを呼び出すアクティビティをソースとします。 このルールには、Haversine式をもとに算出された数値が含まれています。 2つ目のテーブルサブセレクトは、Haversine式では "p "と呼ばれているもので、現在1つの場所の座標を要求しています。

あるいは、テーブルサブセレクトで、過去1ヶ月に開催されたすべてのイベントの会場の緯度と経度をリストアップすることも可能です。 現在のように1つの行に結合するのではなく、複数の会場の住所座標にまたがって結合することができます。

"p" テーブルサブセレクトの現在の定義

JOIN ( 

SELECT {AddressPage.Latitude Decimal } AS latpoint,

{AddressPage.Longitude Decimal } AS longpoint,

{AddressPage.Distance Decimal } AS radius,

{AddressPage.pyNote Decimal } AS distanceunit,

{AddressPage.IsFor } AS isfor

) AS p ON p.isfor = z.isfor

"p" テーブルサブセレクトの可能な定義

JOIN (

SELECT VenueAddress.latitude AS latpoint,  VenueAddress.longitude AS longpoint

FROM pegadata.p_fsg_data_address AS VenueAddress

INNER JOIN pegadata.pc_fsg_booking_work AS BookEvent

ON BookEvent.{exposedVenueGUID}= VenueAddress.reference

AND BookEvent.pxobclass = 'FSG-Booking-Work-BookEvent

WHERE BookEvent.{exposedEventStartDt}  -- is within the past month

) AS p ON 1 = 1'

補足: Radius、distanceunit、およびisforは、別の場所で定義できるため、削除されています。

Haversine式の変更により、過去1ヶ月間に問い合わせのあったホテルの住所はフィルタリングされません。 この変更は、クエリ内の別の場所で行う必要があります。

このソリューションには、次のような式の実装が必要です。

HotelAddressesNotContacted ::= AllAddressesWithinDistance EXCEPT HotelAddressesContacted

オプションは次のとおりです。

  • (A) CustomerDataスキーマに会場と問い合わせしたホテルの履歴を格納する。
  • (B) PegaDataschemaからpyGUIDのリストを取得し、Connect-SQLクエリに会場とホテルキーのリスト (pyGUID)を "挿入"する方法を見つける。

PegaPlatform™の将来のリリースでは、PegaPlatform 固有の列(px、py、または pzで始まる列)が存在する PegaDataスキーマテーブルに対して Connect-SQL ルールクエリを許可しない可能性があります。FSG-Data-Addres テーブルは CustomerDataスキーマで定義されており、Pega Platform 固有の列はありません。 その結果、そのテーブルはConnect-SQLのルールクエリで参照することができます。 しかし、Bookingアプリケーションのケースタイプのワークプールテーブルは、Connect-SQLルールを使用して照会してはいけません。なぜなら、そのテーブルには、pzInsKeypzPvStreamなどの列が含まれているからです。

アプローチ(A)の課題は、過去のpyGUIDと日時をCustomerDataスキーマに格納することは、一時テーブルを使用することと同等であるため、余分な作業が必要となることです。 アプローチ(A)では、同じ情報が複数の場所に格納されるため、データの整合性が損なわれる可能性があります。

一方、アプローチ(B)では、{Asis: property-name}のような構文でSQLを挿入することが可能です。 以下の例は、HotelAddressesNotContactedの式を修正したものです。

HotelAddressesNotContacted ::= AllAddressesWithinDistance WHERE Reference NOT IN ({Asis:D_HotelsContacted.AsisExpression })

AsisExpression プロパティ値の例を以下に示します。

'5de1376c-aa4d-41dc-acd2-c5cd44eb3f61','d45d7130-471b-4138-87f2-efb689983ee2','6584d826-06e6-4c47-b4ee-2a9c6cd62e7d','f7620988-c687-474f-8b3d-27bb0371680e','6681b769-f2de-45cb-aa7a-e89526765f34','44eb05f1-9c16-48e7-b363-7eaeb63e08e2'

Hoteel pyGUIDの数は、SQLステートメント全体がデータベースの最大許容長を超えない程度に小さくする必要があります。 先の例のような長さは、GUIDの32ヘキサ文字の長さにも見えるため、SQLステートメントの最大許容長を超えることは困難です。 例えば、PostgresSQL の SQL 文の最大長は 2,147,483,648 文字であり、2GB に相当する。

FSG-Data-Addressに適用されるD_HotelsContactedデータページは、D_AddressWithinDistanceをモデル化したものにすることが可能です。 そうするには、Connect_SQL_pr_fsg_data_addressアクティビティは、まずConnect_SQL_HotelsNotContactedにコピーします。

Connect_SQL_HotelsNotContactedアクティビティは、まず、過去1ヶ月以内に問い合わせしたホテルのGUIDのリストを取得するレポートディフィニションを呼び出すD_HotelsContactedデータページを使用します。 その後、D_HotelsContactedデータページでは、pxResults() PageList を事後処理して、AsisExpressionというプロパティの値を構築しています。

(各イベント会場につき)AllAddressesWithinDistance を導き出すためのソリューションも、同様の処理を必要とします。 目標は、次の式の右辺を解くことです。 ここでは、"NOT IN"ではなく"IN"を使用します。

AllAddressesWithinDistance ::= SELECT latitude AS latpoint, longitude AS longpoint FROM pegadata.p_fsg_data_address WHERE Reference IN ({D_VenuesUsed.AsIsExpression})

このAsIsExpression値は、過去1ヶ月間に開催されたFSGEイベントに関連するVenue Address pyGUID値のシーケンスです。 以下の値は、D_VenuesUsed.AsisExpressionプロパティ値の一例です。D_VenuesUsed.AsisExpressionは、一つのイベントにつき複数のホテルに問い合わせできるため、D_HotelsContacted.AsisExpressionよりも短いです。

'7e99dbc3-4e54-4419-a15f-f2ca1f0be265','b7206d9a-36d9-45c2-9849-c5fcd995dadb','d8825749-e2fb-46b3-97aa-3ead12b89584'

2 プロパティの公開

 

Event.StartDT

前述のように、会場住所pyGUIDとホテル住所pyGUIDのAsIsExpression値を導出するデータページは、レポートディフィニションをソースとしています。 これらのレポートディフィニション(VenueAddressLatLongおよびHotelAddressLatLong)は、前月に開始されたイベントのみを確認する必要があります。BookEventケースの.Event.StartDTプロパティをケースレベルのプロパティとして公開することは、レポーティングのためのOptimizeの簡単な使用法です。  BookEventケースの .Event.StartDT プロパティをケースレベルのプロパティとして公開することは、Optimize for reportingの簡単な使用法です。 その結果は以下の通りです。

Book Event Join

各レポートディフィニション内のフィルタの一部は、次のとおりです:  EVENT.Event.StartDT  Greater Than Previous Month

.RoomsRequest.HotelGUID

現在、コンタクトした各ホテルのGUIDは、各RoomsRequestケースのRoomsRequest抽象フィールドグループ内に存在します。 このフィールドグループは、コンポーネントによってHotelアプリケーションとHotelProxyアプリケーションの間で共有されていることを思い出してください。 公開されたVenueGUIDプロパティを持つBookEventケースとは異なり、RoomsRequestケースには、公開されたケースレベルの.HotelGUIDプロパティがありません。

公開されたHotelGUIDプロパティは、ビルトオンのHotelアプリケーションの FSG-Hotel-Work-RoomsRequest クラスではなく、FSG-Booking-Work-RoomsRequest クラス内に存在する必要があります。 FSG-Booking-Work-RoomsRequestに対してHotelGUIDプロパティを定義するのは簡単なことです。 そのプロパティ値は、.HotelGUID = .RoomsRequest.HotelGUID と定義された Rule-Declare-Expression を使用して設定することができます。

3 データページの作成

前のタスクでは、VenueAddressLatLong および HotelAddressLatLong のレポートディフィニションについて説明しました。 これらのレポートディフィニションがどのように定義されているかは、提供されたソリューションで確認することができます。 当然のことながら、Queryタブでのフィルタ条件は同一です。

RoomsRequestケースはBookEvent子ケースなので、EVENTエイリアスの定義は2つのレポートディフィニションで異なることになります。  FSG-Data-Addressは、ケースではなく、FSG-Data-Locationを参照することを思い出しましょう。

Report Definition Alias クラス Definition
VenueAddressLatLong EVENT FSG-Booking-Work-BookEvent Reference = EVENT.VenueGUID
HotelAddressLatLong ROOMS FSG-Booking-Work-RoomsRequest .Reference = ROOMS.RoomsRequest.HotelGUID
  EVENT FSG-Booking-Work-BookEvent ROOMS.pxCoverInsKey = EVENT.pzInsKey

ソリューションの残りの部分はは、以下の表にまとめてあります。Responseデータトランスフォーム「GenerateAsisExpressionFromAddressReference」は、spyNoteを設定することに注意してください。

Data Page Report Definition Response Data Transform
D_HotelsContacts HotelAddressLatLong GenerateAsisExpressionFromAddressReference
D_VenueUsed VenueAddressLatLong GenerateAsisExpressionFromAddressReference

4 Connect-SQLルールの作成

最後に仕上げの要素は、HotelsNotContacted Connect-SQLルールを定義することです。 以下にBrowseタブの内容を示します。

AdddressPageのpyNoteプロパティは、(param.dist_unit = "km" ? "111.045" : "69.407") という3項式で決定されていることに注意してください。

  • SELECT
    pyGUID AS "pyGUID",
    Reference AS "Reference", IsFor AS "IsFor", Street AS "Street", City AS "City", State AS "State", PostalCode AS "PostalCode", Country AS "Country", Latitude AS "Latitude", Longitude AS "Longitude", Distance AS "Distance"
    FROM (
    SELECT z.pyguid AS pyGUID,
    z.reference AS Reference,
    z.isfor AS IsFor,
    z.street AS Street,
    z.city AS City,
    z.state AS State,
    z.postalcode AS PostalCode,
    z.country AS Country,
    z.latitude AS Latitude,
    z.longitude AS Longitude, {AddressPage.pyNote Decimal }
    * DEGREES(ACOS(COS(RADIANS(p.latpoint))
    * COS(RADIANS(z.latitude))
    * COS(RADIANS(p.longpoint - z.longitude))
    + SIN(RADIANS(p.latpoint))
    * SIN(RADIANS(z.latitude)))) AS Distance
    FROM {Class:FSG-Data-Address} AS z
    JOIN (
    SELECT latitude AS latpoint, longitude AS longpoint
    FROM {Class:FSG-Data-Address}
    WHERE reference IN ({Asis:D_VenuesUsed.pyNote}) ) AS p ON 1 = 1 ) AS d
    WHERE distance <= {AddressPage.Distance Decimal }
    AND reference NOT IN ({Asis:D_HotelsContacted.pyNote})
    AND isFor = 'Hotel'
    ORDER BY distance
    LIMIT 15

5 作業の確認

このソリューションが有効であることを証明するには、会場から指定された半径内に少なくとも2つのホテルがあることが必要です。 1軒目のホテルは、部屋の提供が求められます。2軒目のホテルは、部屋の提供が求められません。 クエリを実行すると、2軒目のホテルが結果セットで返されます。

  1. Code-Pega-List Connect_SQL_HotelsNotContacted Activityを見つけます。
  2. Click Actions > Trace
  3. Click Actions > Run
  4. 距離として「5」、dist_unit として「mi」と入力します。
  5. オプション:距離として「8」、dist_unit として「km」と入力します。

D_Hotelsの各ページについて、pyGUIDパラメータとして"reference"を使用してD_Hotel Lookupデータページを呼び出します。このクエリは、問い合わせのなかったホテルの住所を返します。 ホテルとホテルの連絡先を特定するには、pyTempListPage.pxResults()ページリストを繰り返し表示する必要があります。



このモジュールは、下記のミッションにも含まれています。

If you are having problems with your training, please review the Pega Academy Support FAQs.

このコンテンツは役に立ちましたか?

改善できるところはありますか?

We'd prefer it if you saw us at our best.

Pega Academy has detected you are using a browser which may prevent you from experiencing the site as intended. To improve your experience, please update your browser.

Close Deprecation Notice