业务背景:
其他系统需要从SAP取OB08汇率
我们知道,SAP可以仅维护3月和5月两条汇率,如果4月没有维护,则会取3月的汇率。
但接口要求,3月那条生效日期为3月1日, 失效日期为4月30号 ,SAP本身是没有的,需要程序里面处理下。
输入参数为可以为空,返回所有 。
(对于顾问亦可以作为FS开发说明书,懂基础ABAP的,可以找我免费领取源码)
FUNCTION ZRFC_OA_004 .*"----------------------------------------------------------------------
*"*"本地接口:
*" 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 gdatuINTO TABLE gt_tcurr
FROM tcurr
WHERE kurst EQ 'M' .
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_dateaccept_initial_date = 'X'
IMPORTING
date_internal = lv_date2EXCEPTIONS
date_external_is_invalid = 1
OTHERS = 2 .
IF sy \- subrc <> 0 .• Implement suitable error handling here
ENDIF .if lv_date2 >= '20230101' .
CALL FUNCTION 'BAPI_EXCHANGERATE_GETDETAIL'EXPORTING
rate_type = 'M'
from_curr = gs_tcurr \- fcurr
to_currncy = 'CNY'
date = lv_date2IMPORTING
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 .endif .
ENDLOOP .SORT t_out BY FROM_CURR TO_CURRNCY VALID_FROM .
SORT lt_out2 BY FROM_CURR TO_CURRNCY VALID_FROM .
DELETE ADJACENT DUPLICATES FROM t_out COMPARING FROM_CURR TO_CURRNCY
VALID_FROM .
DELETE ADJACENT DUPLICATES FROM lt_out2 COMPARING FROM_CURR TO_CURRNCY
VALID_FROM .
SORT t_out BY from_curr valid_from .
SORT lt_out2 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_fromTRANSPORTING 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 .