业务背景:
其他系统需要从SAP取OB08汇率
我们知道,SAP可以仅维护3月和5月两条汇率,如果4月没有维护,则会取3月的汇率。
但接口要求,3月那条生效日期为3月1日,失效日期为4月30号,SAP本身是没有的,需要程序里面处理下。
输入参数为可以为空,返回所有。
(对于顾问亦可以作为FS开发说明书,懂基础ABAP的,右上角可以找我免费领取源码)


FUNCTION ZRFC_OA_004.
*”———————————————————————-
*”*”本地接口:
*” IMPORTING
*” REFERENCE(IN_DATE) TYPE GDATU_INV
*” TABLES
*” T_OUT STRUCTURE ZBAPI1093_0
*”———————————————————————-
DATA: BEGIN OF gs_tcurr,
fcurr LIKE tcurr-fcurr,
gdatu LIKE tcurr-gdatu,
END OF gs_tcurr .
DATA: gt_tcurr LIKE TABLE OF gs_tcurr .
DATA: ls_out2 LIKE zbapi1093_0 .
DATA: lt_out2 LIKE TABLE OF zbapi1093_0 .
DATA: HILF1(9) TYPE C,
OUTDATUM TYPE D.
DATA: ls_exch_rate LIKE bapi1093_0 .
DATA: ls_out LIKE zbapi1093_0 .
DATA: lv_date TYPE c LENGTH 10 .
DATA: lv_date2 TYPE bapi1093_2-trans_date .
SELECT DISTINCT fcurr gdatu
INTO TABLE gt_tcurr
FROM tcurr
WHERE kurst EQ ‘M’
and GDATU >= IN_DATE .
.
LOOP AT gt_tcurr INTO gs_tcurr .
* CALL FUNCTION ‘CONVERSION_EXIT_INVDT_OUTPUT’
* EXPORTING
* input = gs_tcurr-gdatu
* IMPORTING
* output = lv_date.
*
* CALL FUNCTION ‘CONVERT_DATE_TO_INTERNAL’
* EXPORTING
* date_external = lv_date
* accept_initial_date = ‘X’
* IMPORTING
* date_internal = lv_date2
* EXCEPTIONS
* date_external_is_invalid = 1
* OTHERS = 2.
* IF sy-subrc <> 0.
** Implement suitable error handling here
* ENDIF.
IF gs_tcurr-gdatu <> SPACE.
HILF1 = ‘99999999’ – gs_tcurr-gdatu.
TRANSLATE HILF1(5) USING ‘ 0’. “bspw. Eingabe von Jahr = ‘0001’
CONDENSE HILF1 NO-GAPS.
OUTDATUM = HILF1.
WRITE OUTDATUM TO lv_date2 .
ELSE.
gs_tcurr-gdatu = SPACE. ” damit bei ‘Springen->Anderer Eintrag’ nicht
ENDIF.
CALL FUNCTION ‘BAPI_EXCHANGERATE_GETDETAIL’
EXPORTING
rate_type = ‘M’
from_curr = gs_tcurr-fcurr
to_currncy = ‘CNY’
date = lv_date2
IMPORTING
exch_rate = ls_exch_rate
* RETURN =
.
MOVE-CORRESPONDING ls_exch_rate TO ls_out .
ls_out-exch_rate2 = ls_out-exch_rate / ls_out-from_factor .
APPEND ls_out TO t_out .
APPEND ls_out TO lt_out2 .
ENDLOOP .
SORT lt_out2 BY from_curr valid_from .
SORT t_out BY from_curr valid_from .
DATA lv_tabix TYPE sy-tabix .
LOOP AT t_out INTO ls_out .
READ TABLE lt_out2 WITH KEY from_curr = ls_out-from_curr
valid_from = ls_out-valid_from
TRANSPORTING NO FIELDS .
IF sy-subrc EQ 0 .
lv_tabix = sy-tabix .
READ TABLE lt_out2 INTO ls_out2 INDEX lv_tabix + 1 .
ls_out-invalid = ls_out2-valid_from – 1 .
ENDIF .
MODIFY t_out FROM ls_out .
CLEAR : ls_out ,ls_out2 .
ENDLOOP .
ENDFUNCTION.