この演習問題では、空席の計算と、航空会社 ID と航空会社名の連結をデータベースにプッシュダウンします。
タスク 1: テンプレートのコピー (オプション)
テンプレートクラス /LRN/CL_S4D401_DBS_NESTED_JOIN をコピーします。前の演習問題を完了した場合は、このタスクをスキップし、クラス ZCL_##_SOLUTION の編集を続行することができます。
ステップ
クラス /LRN/CL_S4D401_DBS_NESTED_JOIN を各自のパッケージのクラスにコピーします (推奨名: ZCL_##_SOLUTION、## はグループ番号)。
Project Explorer で、クラス /LRN/CL_S4D401_DBS_NESTED_JOIN を右クリックしてコンテキストメニューを開きます。
コンテキストメニューから Duplicate.... を選択します。
Package 項目にパッケージの名称を入力します。Name 項目に、ZCL_##_SOLUTION (## はグループ番号) と入力します。
Next を選択します。
移送依頼を確認し、Finish を選択します。
コピーを有効化します。
Ctrl + F3 を押してクラスを有効化します。
タスク 2: プッシュダウン計算
ローカルクラス LCL_PASSENGER_FLIGHT で、静的属性 flights_buffer の行データ型をコンポーネント seats_free で拡張します。メソッド GET_FLIGHTS_BY_CARRIER の実装を調整し、SELECT 命令に空席の計算を追加します。次に、CONSTRUCTOR メソッドの実装を調整します。SELECT SINGLE 文に計算を追加し、計算結果を使用してインスタンス属性 seats_free を入力します。
ステップ
ローカルクラス LCL_PASSENGER_FLIGHT で、構造タイプ ST_FLIGHTS_BUFFER の定義にナビゲートします。
たとえば、エディタでローカルタイプタブを開き、BEGIN OF st_flights_buffer を検索することができます。
または、左側のアウトラインビューで ZCL_##_SOLUTION→LCL_PASSENGER_FLIGHT を展開し、ST_FLIGHTS_BUFFER を選択することもできます。
コンポーネント seats_uscuped の後に、インスタンス属性 seats_free と同じタイプの新規コンポーネント seats_free を追加します。
コードを以下のように調整します。
1234567891011
TYPES: BEGIN OF st_flights_buffer,
carrier_id TYPE /lrn/passflight-carrier_id,
connection_id TYPE /lrn/passflight-connection_id,
flight_date TYPE /lrn/passflight-flight_date,
plane_type_id TYPE /lrn/passflight-plane_type_id,
seats_max TYPE /lrn/passflight-seats_max,
seats_occupied TYPE /lrn/passflight-seats_occupied,
seats_free TYPE i,
price TYPE /lrn/passflight-price,
currency_code TYPE /lrn/passflight-currency_code,
END OF st_flights_buffer.
メソッド GET_FLIGHTS_BY_CARRIER の実装にナビゲートし、SELECT 命令の項目一覧に空席の計算を追加します。
注意
計算が構造タイプ ST_FLIGHTS_BUFFER の新規コンポーネントと同じ位置にあることを確認します。または、INTO 句でオプション CORRESPONDING FIELDS OF を使用することもできます。
コードを以下のように調整します。
12345678
SELECT
FROM /lrn/passflight
FIELDS carrier_id, connection_id, flight_date,
plane_type_id, seats_max, seats_occupied,
seats_max - seats_occupied AS seats_free,
price, currency_code
WHERE carrier_id = @i_carrier_id
INTO TABLE @flights_buffer.
メソッド CONSTRUCTOR の実装にナビゲートし、SELECT SINGLE 命令の項目一覧に空席の計算を追加します。
コードを以下のように調整します。
12345678910
SELECT SINGLE
FROM /lrn/passflight
FIELDS plane_type_id,
seats_max, seats_occupied,
seats_max - seats_occupied AS seats_free,
price, currency_code
WHERE carrier_id = @i_carrier_id
AND connection_id = @i_connection_id
AND flight_date = @i_flight_date
INTO CORRESPONDING FIELDS OF @flight_raw.
インスタンス属性 seats_free への値割当まで下にスクロールします。代入演算子の右側にある算術式を fligh_raw-seats_free の内容に置き換えます。
コードを以下のように調整します。
12345
planetype = flight_raw-plane_type_id.
seats_max = flight_raw-seats_max.
seats_occ = flight_raw-seats_occupied.
seats_free = flight_raw-seats_free.
タスク 3: プッシュダウン文字列連結
ローカルクラス LCL_CARRIER で、CONSTRUCTOR メソッドの実装を調整します。航空会社 ID と航空会社名の連結を SELECT SINGLE 命令の項目一覧に移動し、結果をインスタンス属性名に保存します。
ステップ
ローカルクラス LCL_CARRIER で、CONSTRUCTOR メソッドの実装にナビゲートします。
前と同じ方法でこのステップを実行します。
name 属性の値割当を見つけます。これを分析してから、コード行の先頭にコメント記号を追加します。
ステートメントまで下にスクロールします name = carrier_id && ` ` && name.
このコード行の任意の場所にカーソルを置き、Ctrl + < を押します。
SELECT SINGLE 命令の項目一覧で、データベーステーブル項目 NAME を適切な文字列処理機能の呼出に置き換えて、1 つのスペースで区切られた ID と航空会社の名称を連結します。
注記
または、SELECT SINGLE 命令の項目一覧で carrier_id && ' ' && name を使用することもできます。
コードを以下のように調整します。
123456
SELECT SINGLE
FROM /lrn/carrier
FIELDS concat_with_space( carrier_id, name, 1 ), currency_code
WHERE carrier_id = @i_carrier_id
INTO ( @me->name, @me->currency_code ).
グローバルクラスをコンソールアプリとして有効化してテストします。
Ctrl + F3 を押します。
F9 を押します。