静的属性 flights_buffer へのアクセスをさらに改善する必要があります。キーが 1 つしかないソートテーブルの代わりに、追加のソート二次キーを持つハッシュテーブルとして定義し、carrier_id 項目のみが指定されている場合のアクセスを最適化します。
タスク 1: テンプレートのコピー (オプション)
テンプレートクラス /LRN/CL_S4D401_ITS_TABLE_KIND をコピーします。前の演習問題を完了した場合は、このタスクをスキップし、クラス ZCL_##_SOLUTION の編集を続行することができます。
ステップ
クラス /LRN/CL_S4D401_ITS_TABLE_KIND を各自のパッケージのクラスにコピーします (推奨名: ZCL_##_SOLUTION、## はグループ番号)。
Project Explorer で、クラス /LRN/CL_S4D401_ITS_TABLE_KIND を右クリックしてコンテキストメニューを開きます。
コンテキストメニューから Duplicate.... を選択します。
Package 項目にパッケージの名称を入力します。Name 項目に、ZCL_##_SOLUTION (## はグループ番号) と入力します。
Next を選択します。
移送依頼を確認し、Finish を選択します。
コピーを有効化します。
Ctrl + F3 を押してクラスを有効化します。
タスク 2: 定義: 二次キー
ローカルクラス LCL_PASSENGER_FLIGHTS で、flights_buffer 属性をハッシュテーブルに変換します。次に、carrier_id 項目のみが指定されている場合に、アクセスを最適化する二次キーを定義します。
ステップ
ローカルクラス LCL_PASSENGER_FLIGHT の静的属性 flights_buffer の定義にナビゲートします。
たとえば、アウトラインビューでノード LCL_PASSENGER_FLIGHT を展開し、FLIGHTS_BUFFER を選択します。
flights_buffer 属性の定義を調整します。テーブルの種類を HASHED TABLE に設定し、一次キー定義を適宜調整します。
コードを以下のように調整します。
注記
ハッシュテーブルのキーは一意である必要があることに注意してください。
1234567
CLASS-DATA: flights_buffer
TYPE HASHED TABLE OF st_flights_buffer
WITH UNIQUE KEY carrier_id connection_id flight_date.
キー項目 carrier_id を使用して二次キー (推奨名: sk_carrier) を定義します。
コードを以下のように調整します。
1234
CLASS-DATA: flights_buffer
TYPE HASHED TABLE OF st_flights_buffer
WITH UNIQUE KEY carrier_id connection_id flight_date
WITH NON-UNIQUE SORTED KEY sk_carrier COMPONENTS carrier_id.
Problems ビューでエントリを分析します。
エディタの下にある Problems ビューを分析します。
判定をダブルクリックして、対応するコードにアクセスします。
タスク 3: 二次キーを使用
carrier_id 項目のみが指定されているローカルクラス LCL_PASSENGER_FLIGHT の静的属性 flights_buffer へのアクセスを調整します。新しい二次キーがこれらのアクセスで使用されていることを確認してください。
ステップ
関数 line_exists の呼出にナビゲートします。命令で二次キーが使用されるようにします。
コードを以下のように調整します。
1234
IF NOT line_exists( flights_buffer[
KEY sk_carrier
COMPONENTS carrier_id = i_carrier_id ]
).
注記
COMPONENTS オプションはオプションであり、省略できます。ここでは説明のためにこれを使用します。
テーブル理解にナビゲートし、二次キーが使用されていることを確認します。
コードを以下のように調整します。
12345678910
r_result = VALUE #(
FOR <flight> IN flights_buffer
USING KEY sk_carrier
WHERE ( carrier_id = i_carrier_id ) (
NEW lcl_passenger_flight(
i_carrier_id = <flight>-carrier_id
i_connection_id = <flight>-connection_id
i_flight_date = <flight>-flight_date )
)
).
グローバルクラスをコンソールアプリとして有効化してテストします。
Ctrl + F3 を押します。
F9 を押します。