この演習問題では、フライト期間の計算と通貨換算をデータベースにプッシュダウンします。
タスク 1: テンプレートのコピー (オプション)
テンプレートクラス /LRN/CL_S4D401_DBS_PUSH_DOWN をコピーします。前の演習問題を完了した場合は、このタスクをスキップし、クラス ZCL_##_SOLUTION の編集を続行することができます。
ステップ
クラス /LRN/CL_S4D401_DBS_PUSH_DOWN を各自のパッケージのクラスにコピーします (推奨名: ZCL_##_SOLUTION、## はグループ番号)。
Project Explorer で、クラス /LRN/CL_S4D401_DBS_PUSH_DOWN を右クリックしてコンテキストメニューを開きます。
コンテキストメニューから Duplicate.... を選択します。
Package 項目にパッケージの名称を入力します。Name 項目に、ZCL_##_SOLUTION (## はグループ番号) と入力します。
Next を選択します。
移送依頼を確認し、Finish を選択します。
コピーを有効化します。
Ctrl + F3 を押してクラスを有効化します。
タスク 2: タイムスタンプによる計算
ローカルクラス LCL_PASSENGER_FLIGHT で、メソッド CLASS_CONSTRUCTOR の実装を調整します。フライト期間の計算を SELECT 文の項目一覧に移動し、内部テーブル connections_bufferの duration 列に結果を保存します。
ステップ
ローカルクラス LCL_PASSENGER_FLIGHT で、メソッド CLASS_CONSTRUCTOR の実装にナビゲートします。
前と同じ方法でこのステップを実行します。
SELECT 文の項目一覧の最後に、2 つのタイムスタンプ間の差異 (秒) を計算する適切な SQL 関数への呼出を追加します。
コードを以下のように調整します。
12345678910111213
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 timezone_from,
t~timzone AS timezone_to,
tstmp_seconds_between( )
INTO TABLE @connections_buffer.
最初の引数 (パラメータ tstmp1) として、現在日付、出発空港の出発時刻およびタイムゾーンに基づいてタイムスタンプを計算する適切な SQL 関数を呼び出します。
ヒント
SELECT 命令で現在日付にアクセスできるように、SELECT 命令の前に関数メソッド cl_abap_context_info=>get_system_date への呼出を移動する必要があります。
コードを以下のように調整します。
1234567891011121314151617181920
DATA(today) = cl_abap_context_info=>get_system_date( ).
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 timezone_from,
t~timzone AS timezone_to,
tstmp_seconds_between(
tstmp1 = dats_tims_to_tstmp(
date = @today,
time = c~departure_time,
tzone = f~timzone ),
)
INTO TABLE @connections_buffer.
2 番目の引数 (パラメータ tstmp2) と同じ到着タイムスタンプを計算するために、同じ SQL 関数を呼び出します。
コードを以下のように調整します。
123456789101112131415161718192021222324
DATA(today) = cl_abap_context_info=>get_system_date( ).
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 timezone_from,
t~timzone AS timezone_to,
tstmp_seconds_between(
tstmp1 = dats_tims_to_tstmp(
date = @today,
time = c~departure_time,
tzone = f~timzone ),
tstmp2 = dats_tims_to_tstmp(
date = @today,
time = c~arrival_time,
tzone = t~timzone )
)
INTO TABLE @connections_buffer.
秒単位ではなく分単位で期間を設定する必要があるため、秒数を 60 で割ります。
ヒント
除算の結果を整数として返す適切な算術 SQL 関数を使用します。
コードを以下のように調整します。
1234567891011121314151617181920212223242526
DATA(today) = cl_abap_context_info=>get_system_date( ).
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 timezone_from,
t~timzone AS timezone_to,
div(
tstmp_seconds_between(
tstmp1 = dats_tims_to_tstmp(
date = @today,
time = c~departure_time,
tzone = f~timzone ),
tstmp2 = dats_tims_to_tstmp(
date = @today,
time = c~arrival_time,
tzone = t~timzone )
),
60 )
INTO TABLE @connections_buffer.
最後に、完全な式のエイリアス名を指定します (推奨名: duration)。
コードを以下のように調整します。
1234567891011121314151617181920212223242526
DATA(today) = cl_abap_context_info=>get_system_date( ).
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 timezone_from,
t~timzone AS timezone_to,
div(
tstmp_seconds_between(
tstmp1 = dats_tims_to_tstmp(
date = @today,
time = c~departure_time,
tzone = f~timzone ),
tstmp2 = dats_tims_to_tstmp(
date = @today,
time = c~arrival_time,
tzone = t~timzone )
),
60 ) AS duration
INTO TABLE @connections_buffer.
計算を SELECT 文に正常に移動したので、内部テーブル connections_buffer に対するループ全体を削除するか、コメントします。
LOOP 命令、ENDLOOP 命令、およびその間のすべてのコード行をマークし、Ctrl + < を押してコードの各行の前にコメント文字を挿入します。
タスク 3: 通貨換算
ローカルクラス LCL_PASSENGER_FLIGHT で、メソッド CONSTRUCTOR および GET_FLIGHTS_BY_CARRIER の実装を調整します。通貨換算を SELECT 文の項目一覧に移動します。
ステップ
ローカルクラス LCL_PASSENGER_FLIGHT で、CONSTRUCTOR メソッドの実装にナビゲートします。
前と同じ方法でこのステップを実行します。
フライト価格を属性 currency に保存されている通貨コードに変換するメソッドコールを見つけます。これを分析してから、コード行の先頭にコメント記号を追加します。
通貨換算は、グローバルクラス cl_exchange_rates のメソッド convert_to_local_currency を呼び出すことで実行されます。
メソッドの呼出をコメント化するには、TRY 命令、ENDTRY 命令、およびその間のすべてのコード行にマークを付け、Ctrl + < を押します。
cl_exchange_rates=>convert_to_local_currency メソッドコールによって価格属性が入力されなくなったため、flight_raw 構造の価格要素の値を価格属性に直接割り当てます。この割当は、コメントアウトしたメソッドコールの直後に追加します。
注記
以下のステップでは、flight_raw-price に変換されたフライト価格が含まれていることを確認します。
コードを以下のように調整します。
1234567891011121314
price = flight_raw-price.
SELECT SINGLE 命令まで上にスクロールします。項目一覧で、テーブル項目 PRICE を通貨換算の SQL 関数の呼出に置き換えます。
コードを以下のように調整します。
123456789101112
SELECT SINGLE
FROM /lrn/passflight
FIELDS plane_type_id,
seats_max, seats_occupied,
seats_max - seats_occupied AS seats_free,
currency_conversion( ) AS 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.
SQL 関数の 4 つの必須パラメータを指定します。換算レート決定日として、フライト日付 (テーブル項目 flight_date) を使用し、金額および元通貨としてテーブル項目 price および currency を使用し、目標通貨として属性 currency を使用します。
コードを以下のように調整します。
1234567891011121314151617
SELECT SINGLE
FROM /lrn/passflight
FIELDS plane_type_id,
seats_max, seats_occupied,
seats_max - seats_occupied AS seats_free,
currency_conversion(
amount = price,
source_currency = currency_code,
target_currency = @currency,
exchange_rate_date = flight_date
) AS 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.
オプションパラメータ on_error に適切な値を指定して、以前と同じ動作を取得します。
ヒント
パラメータに使用可能な値とその意味については、SQL 関数の文書を参照してください。
グローバルクラス SQL_CURRENCY_CONVERSION で、構造化定数 c_on_error のコンポーネントとして使用可能な値を確認できます。
コードを以下のように調整します。
12345678910111213141516171819
SELECT SINGLE
FROM /lrn/passflight
FIELDS plane_type_id,
seats_max, seats_occupied,
seats_max - seats_occupied AS seats_free,
currency_conversion(
amount = price,
source_currency = currency_code,
target_currency = @currency,
exchange_rate_date = flight_date,
on_error =
@sql_currency_conversion=>c_on_error-set_to_null
) AS 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.
項目一覧で、テーブル項目 currency_code を currency 属性に置き換えます。
コードが以下のように調整されました。
1234567891011121314151617181920
SELECT SINGLE
FROM /lrn/passflight
FIELDS plane_type_id,
seats_max, seats_occupied,
seats_max - seats_occupied AS seats_free,
currency_conversion(
amount = price,
source_currency = currency_code,
target_currency = @currency,
exchange_rate_date = flight_date,
on_error =
@sql_currency_conversion=>c_on_error-set_to_null
) AS price,
@currency AS 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.
メソッド GET_FLIGHTS_BY_CARRIER の実装に移動し、そこで SELECT 命令を同じ方法で調整します。
項目一覧の最後の 2 つの要素 (価格および通貨コード) をクリップボードにコピーします。
メソッド GET_FLIGHTS_BY_CARRIER の実装に移動します。
SELECT 命令の項目一覧で、最後の 2 つの項目 (price および currency_code) をクリップボードの内容に置き換えます。
コードを以下のように調整します。
12345678910111213141516
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,
currency_conversion(
amount = price,
source_currency = currency_code,
target_currency = @currency,
exchange_rate_date = flight_date,
on_error =
@sql_currency_conversion=>c_on_error-set_to_null
) AS price,
@currency AS currency_code
WHERE carrier_id = @i_carrier_id
INTO TABLE @flights_buffer.
グローバルクラスをコンソールアプリとして有効化してテストします。
Ctrl + F3 を押します。
F9 を押します。