xtt->MERGE( IV_BLOCK_NAME = ‘R’ IS_BLOCK =
{"FIRST_NAME"=>"FirstName", "LAST_NAME"=>"LastName", "MIDDLE_NAME"=>"MiddleName", "T"=>[{"CITYFROM"=>"FRANKFURT", "LANDXFROM"=>"Germany", "CITYTO"=>"BERLIN", "LANDXTO"=>"Germany", "CARRNAME"=>"Lufthansa", "CONNID"=>"2402", "FLDATE"=>"2023-11-03", "DEPTIME"=>"10:30:00", "ARRTIME"=>"11:35:00", "PRICE"=>242.0, "CURRENCY"=>"EUR", "SEATSMAX"=>475, "SEATSOCC"=>451, "_GROUP1"=>"FRANKFURT-Germany-BERLIN-Germany", "T_COLOR"=>[]}, {"CITYFROM"=>"FRANKFURT", "LANDXFROM"=>"Germany", "CITYTO"=>"BERLIN", "LANDXTO"=>"Germany", "CARRNAME"=>"Lufthansa", "CONNID"=>"2402", "FLDATE"=>"2024-01-22", "DEPTIME"=>"10:30:00", "ARRTIME"=>"11:35:00", "PRICE"=>242.0, "CURRENCY"=>"EUR", "SEATSMAX"=>475, "SEATSOCC"=>452, "_GROUP1"=>"FRANKFURT-Germany-BERLIN-Germany", "T_COLOR"=>[]}, {"CITYFROM"=>"FRANKFURT", "LANDXFROM"=>"Germany", "CITYTO"=>"BERLIN", "LANDXTO"=>"Germany", "CARRNAME"=>"Lufthansa", "CONNID"=>"2402", "FLDATE"=>"2024-04-11", "DEPTIME"=>"10:30:00", "ARRTIME"=>"11:35:00", "PRICE"=>242.0, "CURRENCY"=>"EUR", "SEATSMAX"=>475, "SEATSOCC"=>461, "_GROUP1"=>"FRANKFURT-Germany-BERLIN-Germany", "T_COLOR"=>[]}, {"CITYFROM"=>"FRANKFURT", "LANDXFROM"=>"Germany", "CITYTO"=>"BERLIN", "LANDXTO"=>"Germany", "CARRNAME"=>"Lufthansa", "CONNID"=>"2402", "FLDATE"=>"2024-04-28", "DEPTIME"=>"10:30:00", "ARRTIME"=>"11:35:00", "PRICE"=>242.0, "CURRENCY"=>"EUR", "SEATSMAX"=>475, "SEATSOCC"=>461, "_GROUP1"=>"FRANKFURT-Germany-BERLIN-Germany", "T_COLOR"=>[]}, {"CITYFROM"=>"FRANKFURT", "LANDXFROM"=>"Germany", "CITYTO"=>"BERLIN", "LANDXTO"=>"Germany", "CARRNAME"=>"Lufthansa", "CONNID"=>"2402", "FLDATE"=>"2024-05-28", "DEPTIME"=>"10:30:00", "ARRTIME"=>"11:35:00", "PRICE"=>242.0, "CURRENCY"=>"EUR", "SEATSMAX"=>475, "SEATSOCC"=>460, "_GROUP1"=>"FRANKFURT-Germany-BERLIN-Germany", "T_COLOR"=>[]}, {"CITYFROM"=>"FRANKFURT", "LANDXFROM"=>"Germany", "CITYTO"=>"BERLIN", "LANDXTO"=>"Germany", "CARRNAME"=>"Lufthansa", "CONNID"=>"2402", "FLDATE"=>"2024-06-30", "DEPTIME"=>"10:30:00", "ARRTIME"=>"11:35:00", "PRICE"=>242.0, "CURRENCY"=>"EUR", "SEATSMAX"=>475, "SEATSOCC"=>459, "_GROUP1"=>"FRANKFURT-Germany-BERLIN-Germany", "T_COLOR"=>[]}, {"CITYFROM"=>"FRANKFURT", "LANDXFROM"=>"Germany", "CITYTO"=>"BERLIN", "LANDXTO"=>"Germany", "CARRNAME"=>"Lufthansa", "CONNID"=>"2402", "FLDATE"=>"2024-09-18", "DEPTIME"=>"10:30:00", "ARRTIME"=>"11:35:00", "PRICE"=>242.0, "CURRENCY"=>"EUR", "SEATSMAX"=>475, "SEATSOCC"=>189, "_GROUP1"=>"FRANKFURT-Germany-BERLIN-Germany", "T_COLOR"=>[]}, {"CITYFROM"=>"FRANKFURT", "LANDXFROM"=>"Germany", "CITYTO"=>"BERLIN", "LANDXTO"=>"Germany", "CARRNAME"=>"Lufthansa", "CONNID"=>"2402", "FLDATE"=>"2024-12-07", "DEPTIME"=>"10:30:00", "ARRTIME"=>"11:35:00", "PRICE"=>242.0, "CURRENCY"=>"EUR", "SEATSMAX"=>475, "SEATSOCC"=>32, "_GROUP1"=>"FRANKFURT-Germany-BERLIN-Germany", "T_COLOR"=>[]}, {"CITYFROM"=>"FRANKFURT", "LANDXFROM"=>"Germany", "CITYTO"=>"TOKYO", "LANDXTO"=>"Japan", "CARRNAME"=>"Japan Airlines", "CONNID"=>"0408", "FLDATE"=>"2023-11-03", "DEPTIME"=>"20:25:00", "ARRTIME"=>"15:40:00", "PRICE"=>1061.36, "CURRENCY"=>"JPY", "SEATSMAX"=>385, "SEATSOCC"=>367, "_GROUP1"=>"FRANKFURT-Germany-TOKYO-Japan", "T_COLOR"=>[]}, {"CITYFROM"=>"FRANKFURT", "LANDXFROM"=>"Germany", "CITYTO"=>"TOKYO", "LANDXTO"=>"Japan", "CARRNAME"=>"Japan Airlines", "CONNID"=>"0408", "FLDATE"=>"2024-01-22", "DEPTIME"=>"20:25:00", "ARRTIME"=>"15:40:00", "PRICE"=>1061.36, "CURRENCY"=>"JPY", "SEATSMAX"=>385, "SEATSOCC"=>373, "_GROUP1"=>"FRANKFURT-Germany-TOKYO-Japan", "T_COLOR"=>[]}, {"CITYFROM"=>"FRANKFURT", "LANDXFROM"=>"Germany", "CITYTO"=>"TOKYO", "LANDXTO"=>"Japan", "CARRNAME"=>"Japan Airlines", "CONNID"=>"0408", "FLDATE"=>"2024-04-11", "DEPTIME"=>"20:25:00", "ARRTIME"=>"15:40:00", "PRICE"=>1061.36, "CURRENCY"=>"JPY", "SEATSMAX"=>385, "SEATSOCC"=>373, "_GROUP1"=>"FRANKFURT-Germany-TOKYO-Japan", "T_COLOR"=>[]}, {"CITYFROM"=>"FRANKFURT", "LANDXFROM"=>"Germany", "CITYTO"=>"TOKYO", "LANDXTO"=>"Japan", "CARRNAME"=>"Japan Airlines", "CONNID"=>"0408", "FLDATE"=>"2024-06-30", "DEPTIME"=>"20:25:00", "ARRTIME"=>"15:40:00", "PRICE"=>1061.36, "CURRENCY"=>"JPY", "SEATSMAX"=>385, "SEATSOCC"=>364, "_GROUP1"=>"FRANKFURT-Germany-TOKYO-Japan", "T_COLOR"=>[]}, {"CITYFROM"=>"FRANKFURT", "LANDXFROM"=>"Germany", "CITYTO"=>"TOKYO", "LANDXTO"=>"Japan", "CARRNAME"=>"Japan Airlines", "CONNID"=>"0408", "FLDATE"=>"2024-09-18", "DEPTIME"=>"20:25:00", "ARRTIME"=>"15:40:00", "PRICE"=>1061.36, "CURRENCY"=>"JPY", "SEATSMAX"=>385, "SEATSOCC"=>51, "_GROUP1"=>"FRANKFURT-Germany-TOKYO-Japan", "T_COLOR"=>[]}, {"CITYFROM"=>"FRANKFURT", "LANDXFROM"=>"Germany", "CITYTO"=>"TOKYO", "LANDXTO"=>"Japan", "CARRNAME"=>"Japan Airlines", "CONNID"=>"0408", "FLDATE"=>"2024-12-07", "DEPTIME"=>"20:25:00", "ARRTIME"=>"15:40:00", "PRICE"=>1061.36, "CURRENCY"=>"JPY", "SEATSMAX"=>385, "SEATSOCC"=>15, "_GROUP1"=>"FRANKFURT-Germany-TOKYO-Japan", "T_COLOR"=>[]}, {"CITYFROM"=>"FRANKFURT", "LANDXFROM"=>"Germany", "CITYTO"=>"NEW YORK", "LANDXTO"=>"USA", "CARRNAME"=>"Lufthansa", "CONNID"=>"0400", "FLDATE"=>"2023-11-03", "DEPTIME"=>"10:10:00", "ARRTIME"=>"11:34:00", "PRICE"=>666.0, "CURRENCY"=>"EUR", "SEATSMAX"=>330, "SEATSOCC"=>321, "_GROUP1"=>"FRANKFURT-Germany-NEW YORK-USA", "T_COLOR"=>[]}]}
).
Предыстория
Ранее абсолютно все передаваемые данные должны были быть сформированы заранее и переданы в метод xtt->merge( ). И таких данных подчас довольно много. Дабы сократить объем передаваемых данных в примере No130 введено дополнение ;cond= которое позволяет писать простые ABAP выражения COND #( ). К примеру если надо вывести максимальное из полей A
и B
в структуре R
можно написать в шаблоне {R;cond=WHEN value-A gt value-B THEN value-A ELSE value-B}
без создания 3-го поля в R
. Для краткости выражение можно написать вот так {R:WHEN v-A gt value-B THEN v-A ELSE v-B}
.
Но что если выражение содержит очень много пар WHEN-THEN или же его проблематично записать в одну строку? Чтобы улучшить чтения шаблона введена возможность вызова метода с передачей в него, в случае необходимости, параметров.
Неявная передача параметра
Для вызова метода в шаблоне можно использовать дополнение ;call=, сам объект чьи методы будем вызывать передается в методе merge
В шаблоне нет необходимости указывать передачу структуры R
Она передается неявно, по имени IS_ROOT
get_fullname
IMPORTING
is_root TYPE ts_root " <--- is passed implicitly
RETURNING VALUE(rv_text) TYPE string,
...
METHOD get_fullname.
rv_text = to_upper( |{ is_root-first_name } { is_root-last_name } { is_root-middle_name }| ).
ENDMETHOD.
Краткая форма
Чтобы как и в случае с заменой ;cond=
на :
, ;call=
можно заменить на один символ @
Явная передача параметров
Если передавать всю структуру не нужно, можно передать параметр явно через value-FIELD
(для ;call=) или же v-FIELD
(для @)
Метод имеет следующую сигнатуру
date_text
IMPORTING
" is_root TYPE ts_flight_info <-- no need. Pass v-FLDATE explicitly
iv_date TYPE d
iv_lang TYPE sylangu DEFAULT sy-langu
RETURNING VALUE(rv_text) TYPE string.
Обратите внимание что тип (пу STRING) в отличии от ;cond= ячейка {R-T:sy-tabix;type=integer}
указывать не надо. Так как тип для rv_text
определяется динамически
Результат на двух языках:
PS
Вывод дат через функцию носит демонстративный характер. При использовании Excel лучше использовать тип ABAP D
date, и задавать формат в самой ячейке (Сtrl+1)
Для универсального вывода дат в Pdf & Word зачастую можно обойтись ;cond=
с дополнением COUNTRY