ABAP

[FI] 환율 API 프로그램

셜록누나 2026. 4. 4. 13:28

TCURR 스탠다드 프로그램 참고해서 CBO TABLE 생성

 

 

FORM get_api .

  gv_date = sy-datum.
  " 주말/공휴일 대비 최근 5일 재시도
  DO 5 TIMES.

    CLEAR: gv_json, gt_json.

    gv_url = |https://oapi.koreaexim.go.kr/site/program/financial/exchangeJSON?| &&
             |authkey={ gc_key }&searchdate={ gv_date }&data=AP01|.

    CALL METHOD cl_http_client=>create_by_url
      EXPORTING
        url    = gv_url
      IMPORTING
        client = lo_http.

    lo_http->request->set_method( if_http_request=>co_request_method_get ).
    lo_http->send( ).
    lo_http->receive( ).
    gv_json = lo_http->response->get_cdata( ).
    lo_http->close( ).

    /ui2/cl_json=>deserialize(
      EXPORTING json = gv_json
      CHANGING  data = gt_json ).

    READ TABLE gt_json INTO gs_json INDEX 1.
    IF sy-subrc = 0 AND gs_json-result = 1.
      EXIT.                          " 데이터 있음 → 루프 탈출
    ELSEIF sy-subrc = 0 AND gs_json-result = 3.
      MESSAGE 'API 인증 오류: 키를 확인하세요.' TYPE 'E'.
      STOP.
    ENDIF.

    gv_date = gv_date - 1.           " 하루 전으로 재시도
  ENDDO.

  IF gt_json IS INITIAL OR gs_json-result <> 1.
    MESSAGE '최근 5일 내 유효한 환율 데이터가 없습니다.' TYPE 'E'.
    STOP.
  ENDIF.

ENDFORM.

FORM save_data.

  CLEAR gt_save.

  LOOP AT gt_json INTO gs_json WHERE cur_unit = 'USD'
                                OR cur_unit = 'EUR'
                                OR cur_unit CS 'JPY'.

    REPLACE ALL OCCURRENCES OF ',' IN gs_json-deal_bas_r WITH ''.
    CONDENSE gs_json-deal_bas_r NO-GAPS.

    gv_date = 99999999 - sy-datum.

    CLEAR gs_save.
    gs_save-mandt = sy-mandt.
    gs_save-kurst = 'M'.
    gs_save-tcurr = 'KRW'.
    gs_save-gdatu = gv_date.
    gs_save-erdat = sy-datum.
    gs_save-erzet = sy-uzeit.
    gs_save-ernam = sy-uname.


    IF gs_json-cur_unit CS '(100)'.
      gs_save-fcurr = gs_json-cur_unit+0(3).
      gs_save-ukurs = trunc( gs_json-deal_bas_r ).   " ★ 소수점 제거
      gs_save-ffact = 100.
      gs_save-tfact = 1.
    ELSE.
      gs_save-fcurr = gs_json-cur_unit.
      gs_save-ukurs = trunc( gs_json-deal_bas_r ).   " ★ 소수점 제거
      gs_save-ffact = 1.
      gs_save-tfact = 1.
    ENDIF.

    APPEND gs_save TO gt_save.
  ENDLOOP.

  MODIFY zte3fi0008 FROM TABLE gt_save.

  IF sy-subrc = 0.
    COMMIT WORK.
    MESSAGE |{ gv_date } 환율 { lines( gt_save ) }건 저장 완료| TYPE 'S'.
  ELSE.
    ROLLBACK WORK.
    MESSAGE 'DB 저장 오류' TYPE 'E'.
  ENDIF.

ENDFORM.

 

 

Batch job 으로 실행, selection screen은 생략했다.

 

매일 11시 30분에 환율을 받아 CBO 테이블에 저장

주말에는 금요일 데이터를 받아온다.

 

https://gist.github.com/sherlock0105/4e0930cb146aa9ebcafda5553c82959d