この演習問題では、ネストした結合を実装して、フライト接続と空港詳細を同じ SELECT 命令で読み込みます。
タスク 1: テンプレートのコピー (オプション)
テンプレートクラス /LRN/CL_S4D401_TCS_STRING_PROC をコピーします。前の演習問題を完了した場合は、このタスクをスキップし、クラス ZCL_##_SOLUTION の編集を続行することができます。
ステップ
クラス /LRN/CL_S4D401_TCS_STRING_PROC を独自のパッケージのクラスにコピーします (推奨名: ZCL_##_SOLUTION、## はグループ番号)。
Project Explorer で、クラス /LRN/CL_S4D401_TCS_STRING_PROC を右クリックしてコンテキストメニューを開きます。
コンテキストメニューから Duplicate.... を選択します。
Package 項目にパッケージの名称を入力します。Name 項目に、ZCL_##_SOLUTION (## はグループ番号) と入力します。
Next を選択します。
移送依頼を確認し、Finish を選択します。
コピーを有効化します。
Ctrl + F3 を押してクラスを有効化します。
タスク 2: 結合の実装
ローカルクラス LCL_PASSENGER_FLIGHT のメソッド CLASS_CONSTRUCTOR の実装を調整します。データベーステーブル /LRN/CONNECTION から読み込む SELECT 文を拡張します。2 つの結合を追加して、出発空港と到着空港のタイムゾーンを読み込みます。
ステップ
ローカルクラス LCL_PASSENGER_FLIGHT のメソッド CLASS_CONSTRUCTOR の実装にナビゲートします。
たとえば、エディタで Local Types タブを開き、METHOD class_constructor を検索することができます。
または、左側のアウトラインビューで ZCL_##_SOLUTION→LCL_PASSENGER_FLIGHT を展開し、CLASS_CONSTRUCTOR を選択することもできます。
データベーステーブル /LRN/CONNECTION から読み込む SELECT 文を見つけて、データソースのエイリアスを追加します (推奨エイリアス名: c)。
コードを以下のように調整します。
12345
SELECT
FROM /lrn/connection AS c
FIELDS carrier_id, connection_id,
airport_from_id, airport_to_id, departure_time, arrival_time
INTO TABLE @connections_buffer.
データベーステーブル /LRN/AIRPORT から出発空港の詳細を読み込む適切な JOIN タイプの結合を追加します。2 番目のデータソースのエイリアスを追加します (推奨エイリアス名: f)。
コードを以下のように調整します。
123456
SELECT
FROM lrn/connection AS c
LEFT OUTER JOIN /lrn/airport AS f
FIELDS carrier_id, connection_id,
airport_from_id, airport_to_id, departure_time, arrival_time
INTO TABLE @connections_buffer.
結合条件を追加します。
コードを以下のように調整します。
1234567
SELECT
FROM /lrn/connection AS c
LEFT OUTER JOIN /lrn/airport AS f
ON c~airport_from_id = f~airport_id
FIELDS carrier_id, connection_id,
airport_from_id, airport_to_id, departure_time, arrival_time
INTO TABLE @connections_buffer.
到着空港の詳細を読み込む類似の結合を追加し、3 番目のデータソースに別のエイリアスを追加します (推奨エイリアス名: t)。
コードを以下のように調整します。
123456789
SELECT
FROM /lrn/connection AS c
LEFT OUTER JOIN /lrn/airport AS f
ON c~airport_from_id = f~airport_id
LEFT OUTER JOIN /lrn/airport AS t
ON c~airport_to_id = t~airport_id
FIELDS carrier_id, connection_id,
airport_from_id, airport_to_id, departure_time, arrival_time
INTO TABLE @connections_buffer.
出発空港のタイムゾーンおよび到着空港のタイムゾーンを項目一覧に追加します。適切なエイリアスを指定します (推奨エイリアス名: timzone_from および timzone_to)。
コードを以下のように調整します。
1234567891011
SELECT
FROM /lrn/connection AS c
LEFT OUTER JOIN /lrn/airport AS f
ON c~airport_from_id = f~airport_id
LEFT OUTER JOIN /lrn/airport AS t
ON c~airport_to_id = t~airport_id
FIELDS carrier_id, connection_id,
airport_from_id, airport_to_id, departure_time, arrival_time,
f~timzone AS timzone_from,
t~timzone AS timzone_to
INTO TABLE @connections_buffer.
内部テーブル connections_buffer の行データ型にナビゲートし、タイムゾーンに 2 つのコンポーネントを追加します。SELECT 命令の項目一覧でエイリアス名として使用したものと同じ名称を使用します。
注意
構成品目期間の前に新規構成品目を追加してください。期間コンポーネントが SELECT 文に入力されていないため、これは重要です。または、SELECT 命令の INTO 句で CORRESPONDING FIELDS OF オプションを使用します。
構造データ型 st_connections_buffer の定義を見つけます。
コードを以下のように調整します。
123456789101112
TYPES:
BEGIN OF st_connections_buffer,
carrier_id TYPE /dmo/carrier_id,
connection_id TYPE /dmo/connection_id,
airport_from_id TYPE /dmo/airport_from_id,
airport_to_id TYPE /dmo/airport_to_id,
departure_time TYPE /dmo/flight_departure_time,
arrival_time TYPE /dmo/flight_departure_time,
timzone_from TYPE timezone,
timzone_to TYPE timezone,
duration TYPE i,
END OF st_connections_buffer.
タスク 3: 冗長な SELECT の削除
ローカルクラス LCL_PASSENGER_FLIGHT のメソッド CLASS_CONSTRUCTOR の実装で、フライト期間の計算で内部テーブル connections_buffer のタイムゾーン情報を使用します。次に、データベーステーブル /LRN/AIRPORT への冗長読込アクセスを削除します。
ステップ
ローカルクラス LCL_PASSENGER_FLIGHT のメソッド CLASS_CONSTRUCTOR の実装に戻ります。
前と同じ方法でこのステップを実行します。
最初の CONVERT 命令の TIME ZONE オプションで、ローカル内部テーブル apairts への読込アクセスを構造接続のコンポーネント timzone_from へのアクセスに置き換えます。
最初の CONVERT 命令を以下のように調整します。
12345
CONVERT DATE today
TIME connection-departure_time
TIME ZONE connection-timzone_from
INTO UTCLONG DATA(departure_utclong).
コンポーネント timzone_to を使用して、2 番目の CONVERT 命令を同様の方法で調整します。
2 番目の CONVERT 命令を以下のように調整します。
12345
CONVERT DATE today
TIME connection-arrival_time
TIME ZONE connection-timzone_to
INTO UTCLONG DATA(arrival_utclong).
上にスクロールし、データベーステーブル /LRN/AIRPORT から読み込む SELECT 命令のすべてのコード行の前にコメント記号を追加します。
メソッド CLASS_CONSTRUCTOR の実装の先頭まで上にスクロールします。
データベーステーブル /LRN/AIRPORT から読み込む完全な SELECT 文を選択し、Ctrl + < を押します。
コードは以下のようになります。
グローバルクラスをコンソールアプリとして有効化してテストします。
Ctrl + F3 を押します。
F9 を押します。