Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- REPORT ztm_weather_temp.
- TYPES:
- BEGIN OF ts_temp,
- day TYPE p DECIMALS 2,
- min TYPE p DECIMALS 2,
- max TYPE p DECIMALS 2,
- night TYPE p DECIMALS 2,
- eve TYPE p DECIMALS 2,
- morn TYPE p DECIMALS 2,
- END OF ts_temp.
- TYPES:
- BEGIN OF ts_feels_like,
- day TYPE p DECIMALS 2,
- night TYPE p DECIMALS 2,
- eve TYPE p DECIMALS 2,
- morn TYPE p DECIMALS 2,
- END OF ts_feels_like.
- TYPES:
- BEGIN OF ts_weather,
- id TYPE i,
- main TYPE string,
- description TYPE string,
- icon TYPE string,
- END OF ts_weather.
- DATA tt_weather TYPE STANDARD TABLE OF ts_weather.
- TYPES:
- BEGIN OF ts_daily,
- dt(20) TYPE n,
- sunrise TYPE i,
- sunset TYPE i,
- moonrise TYPE i,
- moonset TYPE i,
- moon_phase TYPE p DECIMALS 2,
- temp TYPE ts_temp,
- feels_like TYPE ts_feels_like,
- pressure TYPE i,
- humidity TYPE i,
- dew_point TYPE p DECIMALS 2,
- wind_speed TYPE p DECIMALS 2,
- wind_deg TYPE p DECIMALS 2,
- wind_gust TYPE p DECIMALS 2,
- weather LIKE tt_weather,
- clouds TYPE i,
- pop TYPE i,
- uvi TYPE p DECIMALS 2,
- END OF ts_daily.
- DATA tt_daily TYPE STANDARD TABLE OF ts_daily.
- TYPES:
- BEGIN OF ts_result,
- lat TYPE p DECIMALS 10,
- lon TYPE p DECIMALS 10,
- timezone TYPE string,
- timezone_offset TYPE i,
- daily LIKE tt_daily,
- END OF ts_result.
- TYPES:
- BEGIN OF ts_day_and_temp,
- day(20) TYPE n,
- temp_diff TYPE p DECIMALS 2,
- END OF ts_day_and_temp.
- TYPES:
- BEGIN OF ts_temp_answer,
- day TYPE sy-datum,
- temp_diff TYPE p DECIMALS 2,
- END OF ts_temp_answer.
- TYPES:
- BEGIN OF ts_daylight,
- day(20) TYPE n,
- daylight_hours TYPE p DECIMALS 2,
- END OF ts_daylight.
- TYPES:
- BEGIN OF ts_daylight_answer,
- day TYPE sy-datum,
- daylight_hours TYPE p DECIMALS 2,
- END OF ts_daylight_answer.
- TYPES:
- BEGIN OF ts_answer,
- temp TYPE ts_temp_answer,
- daylight TYPE ts_daylight_answer,
- END OF ts_answer.
- DATA: lv_url TYPE string,
- lo_http_client TYPE REF TO if_http_client,
- ls_response_result TYPE ts_result,
- lt_daily LIKE tt_daily,
- ls_daily TYPE ts_daily,
- lt_temp TYPE TABLE OF ts_day_and_temp,
- ls_temp TYPE ts_day_and_temp,
- ls_temp_answer TYPE ts_temp_answer,
- lv_unix_date_start TYPE sy-datum,
- lt_daylight TYPE TABLE OF ts_daylight,
- ls_daylight TYPE ts_daylight,
- ls_daylight_answer TYPE ts_daylight_answer,
- ls_answer TYPE ts_answer.
- **********************************************************************
- *Далее парсинг данных
- **********************************************************************
- lv_url = 'https://api.openweathermap.org/data/2.5/onecall?lat=56.1307195&lon=47.2449597&cnt=5&exclude=current,minutely,hourly,alerts,pressure,weather,clouds,sunset,max,,feels_like,pressure,wind_deg&appid=e8094039fab99bc8dcadd55f25702a8f&units=metric'.
- cl_http_client=>create_by_url(
- EXPORTING
- url = lv_url
- ssl_id = 'ANONYM'
- IMPORTING
- client = lo_http_client
- EXCEPTIONS
- OTHERS = 1 ).
- IF sy-subrc <> 0.
- lo_http_client->get_last_error(
- IMPORTING
- message = DATA(lv_error) ).
- ENDIF.
- lo_http_client->send(
- EXCEPTIONS
- http_communication_failure = 1
- http_invalid_state = 2
- http_invalid_timeout = 3
- http_processing_failed = 4 ).
- IF sy-subrc <> 0.
- lo_http_client->get_last_error(
- IMPORTING
- message = lv_error ).
- ENDIF.
- lo_http_client->receive(
- EXCEPTIONS
- http_communication_failure = 1
- http_invalid_state = 2
- http_processing_failed = 3 ).
- IF sy-subrc <> 0.
- lo_http_client->get_last_error(
- IMPORTING
- message = lv_error ).
- ENDIF.
- DATA(lv_raw_json) = lo_http_client->response->get_cdata( ).
- lo_http_client->close( ).
- /ui2/cl_json=>deserialize(
- EXPORTING
- json = lv_raw_json
- pretty_name = /ui2/cl_json=>pretty_mode-camel_case
- CHANGING
- data = ls_response_result ).
- **********************************************************************
- *Далее обработка полученных данных
- **********************************************************************
- lt_daily = ls_response_result-daily.
- LOOP AT lt_daily INTO ls_daily.
- ls_temp-day = ls_daily-dt.
- ls_temp-temp_diff = ls_daily-temp-night - ls_daily-feels_like-night.
- IF ls_temp-temp_diff < 0.
- ls_temp-temp_diff = ls_temp-temp_diff * ( -1 ).
- ENDIF.
- APPEND ls_temp TO lt_temp.
- ls_daylight-day = ls_daily-dt.
- ls_daylight-daylight_hours = ( ls_daily-sunset - ls_daily-sunrise ) / 3600.
- APPEND ls_daylight TO lt_daylight.
- CLEAR: ls_daily,
- ls_temp,
- ls_daylight.
- ENDLOOP.
- SORT lt_temp BY temp_diff.
- DELETE lt_temp WHERE temp_diff = 0.
- READ TABLE lt_temp INTO ls_temp INDEX 1.
- lv_unix_date_start = '19700101'.
- ls_temp_answer-day = lv_unix_date_start + ls_temp-day DIV 86400.
- ls_temp_answer-temp_diff = ls_temp-temp_diff.
- SORT lt_daylight BY daylight_hours DESCENDING.
- READ TABLE lt_daylight INTO ls_daylight INDEX 1.
- ls_daylight_answer-day = lv_unix_date_start + ls_daylight-day DIV 86400.
- ls_daylight_answer-daylight_hours = ls_daylight-daylight_hours.
- **********************************************************************
- *Ответ на задачу 3a
- ls_answer-temp = ls_temp_answer.
- ls_answer-daylight = ls_daylight_answer.
- **********************************************************************
- BREAK-POINT.
Add Comment
Please, Sign In to add comment