В первой части приведу пример отчета, который считывает курсы валют на дату с сервера ЦБ РФ, конвертирует трансформацией во внутреннюю таблицу и средствами BAPI актуализирует курсы валют в системе.
Код трансформации
Код отчета
report ztest_forcurr.
types: begin of t_fline,
line(255) type c,
end of t_fline .
types: t_fline_tab type standard table of t_fline .
types: begin of t_valute,
numcode(20),
charcode(20),
nominal type vtb_dfans-cffact,
name(150),
value type vtb_dfans-value,
end of t_valute .
types: t_data type sorted table of t_valute with unique key numcode charcode.
types: t_date_str(10) type c .
start-of-selection.
perform load_cbrf_rates_from_site using sy-datum.
*&---------------------------------------------------------------------*
*& Form LOAD_CBRF_RATES_FROM_SITE
*&---------------------------------------------------------------------*
form load_cbrf_rates_from_site using iv_date type bldat.
data: lr_client type ref to if_http_client,
lr_response type ref to if_http_response,
l_response type string,
l_url type string,
lv_datetext(10) type c,
lv_url_add(100) type c.
data: lv_xml_string type string,
lt_data type t_data,
lv_date type t_date_str.
*Подставление нужной даты (не обязательно)
clear lv_datetext.
if not iv_date is initial.
write iv_date to lv_datetext dd/mm/yyyy.
lv_datetext+2(1) = lv_datetext+5(1) = '/'.
concatenate '?date_req=' lv_datetext into lv_url_add.
endif.
concatenate 'http://www.cbr.ru/scripts/XML_daily.asp' lv_url_add
into l_url.
call method cl_http_client=>create_by_url
exporting
url = l_url " 'http://www.cbr.ru/scripts/XML_daily.asp'
importing
client = lr_client
exceptions
internal_error = 1
argument_not_found = 2
plugin_not_active = 3
others = 4.
if sy-subrc ne 0.
" Ошибка обращения к серверу
" message e002 raising create_url_err.
endif.
* Отправка запроса
call method lr_client->send
* exporting timeout = timeout
exceptions http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
others = 4.
if sy-subrc ne 0.
" Ошибка запроса к серверу
" message e003 raising send_error.
endif.
* Получение ответа сервера
call method lr_client->receive
exceptions
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
others = 4.
if sy-subrc ne 0.
" Ошибка получения ответа от сервера
" message e004 raising receive_error.
endif.
lr_response = lr_client->response .
l_response = lr_response->get_cdata( ).
* Закрытие соединения
call method lr_client->close
exceptions
http_invalid_state = 1
others = 2.
check not l_response is initial .
lv_xml_string = l_response.
try.
perform run_transformation using lv_xml_string
changing lt_data lv_date.
catch cx_root.
* if sy-subrc ne 0.
* "Ошибка преобразования XML
* message e005 raising trans_error.
* endif.
endtry.
perform check_rates changing lt_data.
*
perform create_exchrate using lt_data lv_date.
endform. "load_cbrf_rates_from_site
*&---------------------------------------------------------------------*
*& Form run_transformation
*&---------------------------------------------------------------------*
form run_transformation using iv_xml type string
changing et_data type t_data
ev_date type t_date_str.
data: oref type ref to cx_root,
xslt_message type string.
try .
call transformation zm_cbrf_rates
source xml iv_xml
result valcurs = et_data[]
gdate = ev_date
.
catch cx_xslt_exception into oref.
xslt_message = oref->get_text( ).
message xslt_message type 'E' raising trans_error.
catch cx_st_match_element into oref.
xslt_message = oref->get_text( ).
message xslt_message type 'E' raising trans_error.
catch cx_root into oref.
xslt_message = oref->get_text( ).
message xslt_message type 'E' raising trans_error.
endtry.
endform. "run_transformation
*&---------------------------------------------------------------------*
*& Form check_rates
*&---------------------------------------------------------------------*
form check_rates changing ct_data type t_data.
data: begin of ls_waers,
waers type waers_curc,
end of ls_waers,
lt_waers like standard table of ls_waers,
ls_data like line of ct_data.
select waers from tcurc into table lt_waers.
loop at ct_data into ls_data.
read table lt_waers with key waers = ls_data-charcode transporting no fields.
if sy-subrc is not initial.
delete table ct_data from ls_data.
endif.
endloop.
endform. "check_rates
*&---------------------------------------------------------------------*
*& Form create_exchrate
*&---------------------------------------------------------------------*
form create_exchrate using it_data type t_data
iv_date type t_date_str.
data: ls_data like line of it_data,
ls_rec type bapi1093_0,
ls_rec2 type bapi1093_0,
lt_rec type standard table of bapi1093_0,
lt_return type standard table of bapiret2,
ls_return like line of lt_return,
lv_usd2_kurs type p length 9 decimals 4.
loop at it_data into ls_data.
replace all occurrences of ',' in ls_data-value with '.' .
clear ls_rec.
ls_rec-rate_type = 'M'.
ls_rec-from_curr = ls_data-charcode.
ls_rec-to_currncy = 'RUB'.
ls_rec-valid_from = iv_date+6(4).
ls_rec-valid_from+4(2) = iv_date+3(2).
ls_rec-valid_from+6(2) = iv_date(2).
ls_rec-exch_rate = ls_data-value.
ls_rec-from_factor = ls_data-nominal.
ls_rec-to_factor = '1'.
if ls_data-charcode = 'USD'. "#EC NOTEXT
move ls_rec to ls_rec2.
ls_rec2-from_curr = 'USD2'.
ls_rec2-exch_rate = ls_rec-exch_rate * '1.02'.
lv_usd2_kurs = ls_rec2-exch_rate.
ls_rec2-exch_rate = lv_usd2_kurs.
append ls_rec2 to lt_rec.
endif.
append ls_rec to lt_rec.
endloop.
perform add_new_conversion tables lt_rec.
call function 'BAPI_EXCHRATE_CREATEMULTIPLE'
exporting
upd_allow = 'X'
* CHG_FIXED = ' '
* DEV_ALLOW = '000'
tables
exchrate_list = lt_rec
return = lt_return
.
read table lt_return into ls_return with key type = 'E'.
if sy-subrc = 0.
message id ls_return-id type ls_return-type number ls_return-number
with ls_return-message_v1 ls_return-message_v2 ls_return-message_v3 ls_return-message_v4.
call function 'BAPI_TRANSACTION_ROLLBACK'.
else.
call function 'BAPI_TRANSACTION_COMMIT'.
endif.
endform. "create_exchrate
*&---------------------------------------------------------------------*
*& Form add_new_conversion
*&---------------------------------------------------------------------*
form add_new_conversion tables ct_rec structure bapi1093_0.
data: ls_sap_data like line of ct_rec,
lt_convers type standard table of tcurf,
ls_curf type tcurf.
data: lv_inv_date type gdatu_invv.
loop at ct_rec into ls_sap_data.
" get conversion customizing on date
select * from tcurf up to 1 rows into ls_curf
where kurst = ls_sap_data-rate_type
and fcurr = ls_sap_data-from_curr
and tcurr = ls_sap_data-to_currncy
and gdatu ge lv_inv_date
order by gdatu descending.
exit.
endselect.
lv_inv_date = ls_sap_data-valid_from.
translate lv_inv_date using '09182736455463728190'.
if sy-subrc is not initial
or ls_curf-ffact <> ls_sap_data-from_factor
or ls_curf-tfact <> ls_sap_data-to_factor.
clear ls_curf.
ls_curf-kurst = ls_sap_data-rate_type.
ls_curf-fcurr = ls_sap_data-from_curr.
ls_curf-tcurr = ls_sap_data-to_currncy.
ls_curf-gdatu = lv_inv_date.
ls_curf-ffact = ls_sap_data-from_factor.
ls_curf-tfact = ls_sap_data-to_factor.
insert tcurf from ls_curf.
if sy-subrc is not initial.
modify tcurf from ls_curf.
endif.
endif.
endloop.
endform. "add_new_conversion
Код трансформации
Комментариев нет:
Отправить комментарий