hxxxrz

Questionnaire ABAP - парсинг https://openweathermap.org/ - Федоров К. Г. - Разработчик К1.2

Mar 10th, 2022 (edited)
382
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ABAP 5.76 KB | None | 0 0
  1. REPORT ztm_weather_temp.
  2.  
  3. TYPES:
  4.   BEGIN OF ts_temp,
  5.     day   TYPE p DECIMALS 2,
  6.     min   TYPE p DECIMALS 2,
  7.     max   TYPE p DECIMALS 2,
  8.     night TYPE p DECIMALS 2,
  9.     eve   TYPE p DECIMALS 2,
  10.     morn  TYPE p DECIMALS 2,
  11.   END OF ts_temp.
  12.  
  13. TYPES:
  14.   BEGIN OF ts_feels_like,
  15.     day   TYPE p DECIMALS 2,
  16.     night TYPE p DECIMALS 2,
  17.     eve   TYPE p DECIMALS 2,
  18.     morn  TYPE p DECIMALS 2,
  19.   END OF ts_feels_like.
  20.  
  21. TYPES:
  22.   BEGIN OF ts_weather,
  23.     id          TYPE i,
  24.     main        TYPE string,
  25.     description TYPE string,
  26.     icon        TYPE string,
  27.   END OF ts_weather.
  28.  
  29. DATA tt_weather TYPE STANDARD TABLE OF ts_weather.
  30.  
  31. TYPES:
  32.   BEGIN OF ts_daily,
  33.     dt(20)     TYPE n,
  34.     sunrise    TYPE i,
  35.     sunset     TYPE i,
  36.     moonrise   TYPE i,
  37.     moonset    TYPE i,
  38.     moon_phase TYPE p DECIMALS 2,
  39.     temp       TYPE ts_temp,
  40.     feels_like TYPE ts_feels_like,
  41.     pressure   TYPE i,
  42.     humidity   TYPE i,
  43.     dew_point  TYPE p DECIMALS 2,
  44.     wind_speed TYPE p DECIMALS 2,
  45.     wind_deg   TYPE p DECIMALS 2,
  46.     wind_gust  TYPE p DECIMALS 2,
  47.     weather    LIKE tt_weather,
  48.     clouds     TYPE i,
  49.     pop        TYPE i,
  50.     uvi        TYPE p DECIMALS 2,
  51.   END OF ts_daily.
  52.  
  53. DATA tt_daily TYPE STANDARD TABLE OF ts_daily.
  54.  
  55. TYPES:
  56.   BEGIN OF ts_result,
  57.     lat             TYPE p DECIMALS 10,
  58.     lon             TYPE p DECIMALS 10,
  59.     timezone        TYPE string,
  60.     timezone_offset TYPE i,
  61.     daily           LIKE tt_daily,
  62.   END OF ts_result.
  63.  
  64. TYPES:
  65.   BEGIN OF ts_day_and_temp,
  66.     day(20)   TYPE n,
  67.     temp_diff TYPE p DECIMALS 2,
  68.   END OF ts_day_and_temp.
  69.  
  70. TYPES:
  71.   BEGIN OF ts_temp_answer,
  72.     day       TYPE sy-datum,
  73.     temp_diff TYPE p DECIMALS 2,
  74.   END OF ts_temp_answer.
  75.  
  76. TYPES:
  77.   BEGIN OF ts_daylight,
  78.     day(20)        TYPE n,
  79.     daylight_hours TYPE p DECIMALS 2,
  80.   END OF ts_daylight.
  81.  
  82. TYPES:
  83.   BEGIN OF ts_daylight_answer,
  84.     day            TYPE sy-datum,
  85.     daylight_hours TYPE p DECIMALS 2,
  86.   END OF ts_daylight_answer.
  87.  
  88. TYPES:
  89.   BEGIN OF ts_answer,
  90.     temp     TYPE ts_temp_answer,
  91.     daylight TYPE ts_daylight_answer,
  92.   END OF ts_answer.
  93.  
  94. DATA: lv_url             TYPE string,
  95.       lo_http_client     TYPE REF TO if_http_client,
  96.       ls_response_result TYPE ts_result,
  97.       lt_daily           LIKE tt_daily,
  98.       ls_daily           TYPE ts_daily,
  99.       lt_temp            TYPE TABLE OF ts_day_and_temp,
  100.       ls_temp            TYPE ts_day_and_temp,
  101.       ls_temp_answer     TYPE ts_temp_answer,
  102.       lv_unix_date_start TYPE sy-datum,
  103.       lt_daylight        TYPE TABLE OF ts_daylight,
  104.       ls_daylight        TYPE ts_daylight,
  105.       ls_daylight_answer TYPE ts_daylight_answer,
  106.       ls_answer          TYPE ts_answer.
  107.  
  108. **********************************************************************
  109. *Далее парсинг данных
  110. **********************************************************************
  111.  
  112. 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'.
  113.  
  114. cl_http_client=>create_by_url(
  115.      EXPORTING
  116.        url         = lv_url
  117.        ssl_id      = 'ANONYM'
  118.      IMPORTING
  119.        client      = lo_http_client
  120.      EXCEPTIONS
  121.        OTHERS      = 1 ).
  122.  
  123. IF sy-subrc <> 0.
  124.   lo_http_client->get_last_error(
  125.     IMPORTING
  126.       message = DATA(lv_error) ).
  127. ENDIF.
  128.  
  129. lo_http_client->send(
  130.  EXCEPTIONS
  131.      http_communication_failure = 1
  132.      http_invalid_state         = 2
  133.      http_invalid_timeout       = 3
  134.      http_processing_failed     = 4 ).
  135.  
  136. IF sy-subrc <> 0.
  137.   lo_http_client->get_last_error(
  138.     IMPORTING
  139.       message = lv_error ).
  140. ENDIF.
  141.  
  142. lo_http_client->receive(
  143.   EXCEPTIONS
  144.     http_communication_failure = 1
  145.     http_invalid_state         = 2
  146.     http_processing_failed     = 3 ).
  147.  
  148. IF sy-subrc <> 0.
  149.   lo_http_client->get_last_error(
  150.     IMPORTING
  151.       message = lv_error ).
  152. ENDIF.
  153.  
  154. DATA(lv_raw_json) = lo_http_client->response->get_cdata( ).
  155.  
  156. lo_http_client->close( ).
  157.  
  158. /ui2/cl_json=>deserialize(
  159.   EXPORTING
  160.     json        = lv_raw_json
  161.     pretty_name = /ui2/cl_json=>pretty_mode-camel_case
  162.   CHANGING
  163.     data        = ls_response_result ).
  164.  
  165. **********************************************************************
  166. *Далее обработка полученных данных
  167. **********************************************************************
  168.  
  169. lt_daily = ls_response_result-daily.
  170.  
  171. LOOP AT lt_daily INTO ls_daily.
  172.   ls_temp-day = ls_daily-dt.
  173.   ls_temp-temp_diff = ls_daily-temp-night - ls_daily-feels_like-night.
  174.  
  175.   IF ls_temp-temp_diff < 0.
  176.     ls_temp-temp_diff = ls_temp-temp_diff * ( -1 ).
  177.   ENDIF.
  178.  
  179.   APPEND ls_temp TO lt_temp.
  180.  
  181.   ls_daylight-day = ls_daily-dt.
  182.   ls_daylight-daylight_hours = ( ls_daily-sunset - ls_daily-sunrise ) / 3600.
  183.  
  184.   APPEND ls_daylight TO lt_daylight.
  185.  
  186.   CLEAR: ls_daily,
  187.          ls_temp,
  188.          ls_daylight.
  189. ENDLOOP.
  190.  
  191. SORT lt_temp BY temp_diff.
  192.  
  193. DELETE lt_temp WHERE temp_diff = 0.
  194.  
  195. READ TABLE lt_temp INTO ls_temp INDEX 1.
  196.  
  197. lv_unix_date_start = '19700101'.
  198.  
  199. ls_temp_answer-day = lv_unix_date_start + ls_temp-day DIV 86400.
  200. ls_temp_answer-temp_diff = ls_temp-temp_diff.
  201.  
  202. SORT lt_daylight BY daylight_hours DESCENDING.
  203.  
  204. READ TABLE lt_daylight INTO ls_daylight INDEX 1.
  205.  
  206. ls_daylight_answer-day = lv_unix_date_start + ls_daylight-day DIV 86400.
  207. ls_daylight_answer-daylight_hours = ls_daylight-daylight_hours.
  208.  
  209. **********************************************************************
  210. *Ответ на задачу 3a
  211. ls_answer-temp = ls_temp_answer.
  212. ls_answer-daylight = ls_daylight_answer.
  213. **********************************************************************
  214.  
  215. BREAK-POINT.
Add Comment
Please, Sign In to add comment