处理逻辑
*&---------------------------------------------------------------------*
*& Report ZMMMD004
*&
*&---------------------------------------------------------------------*
*&汇率同步至SRM:SAP->SRM
*&---------------------------------------------------------------------*
REPORT ZMMMD004.
TABLES: EBAN,MARA,TCURR,EKKO.
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
PARAMETER P_DA TYPE EKKO-AEDAT.
*SELECT-OPTIONS: s_rq FOR eban-badat,
* s_wl FOR mara-matnr.
SELECTION-SCREEN END OF BLOCK B1.
SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-F02.
SELECTION-SCREEN COMMENT /2(79) COMM1 . "使用屏幕注释
SELECTION-SCREEN COMMENT /2(79) COMM2 . "使用屏幕注释
SELECTION-SCREEN COMMENT /2(79) COMM3 . "使用屏幕注释
SELECTION-SCREEN COMMENT /2(79) COMM4 . "使用屏幕注释
SELECTION-SCREEN END OF BLOCK B2.
INITIALIZATION.
COMM1 = '1、同步SAP汇率到SRM
COMM2 = '2、当查询条件中“汇率起效日期”为空时,30天内的数据'.
COMM3 = '3、JOB每天凌晨3点执行,传SRM'.
DATA:BEGIN OF LT_TCURR OCCURS 0,
KURST LIKE TCURR-KURST,"汇率类型
FCURR LIKE TCURR-FCURR,"从货币
TCURR LIKE TCURR-TCURR,"最终货币
GDATZ LIKE TCURR-GDATU,"有效起始日期(未转换之前)
UKURS LIKE TCURR-UKURS,"汇率
FRDT LIKE TCURR-GDATU,
GDATU TYPE D, "有效开始日期
END OF LT_TCURR.
DATA:LT_OUT LIKE LT_TCURR OCCURS 0 WITH HEADER LINE.
TYPES:BEGIN OF TYP_TRANS,
KURST LIKE TCURR-KURST,"汇率类型
FCURR LIKE TCURR-FCURR,"从货币
TCURR LIKE TCURR-TCURR,"最终货币
UKURS LIKE TCURR-UKURS,"汇率
GDATU TYPE D, "有效开始日期
END OF TYP_TRANS.
DATA:GT_OUTPUT TYPE STANDARD TABLE OF TYP_TRANS,
GS_OUTPUT TYPE TYP_TRANS.
DATA LV_RQ TYPE D.
DATA: LV_FR TYPE TCURR-GDATU,
LV_DR TYPE TCURR-GDATU.
START-OF-SELECTION.
PERFORM GET_DATA.
PERFORM TO_SRM.
FORM GET_DATA.
IF P_DA IS INITIAL.
P_DA = SY-DATUM - 62.
ENDIF.
"标准日期转换成数字 20190429->79809570
CALL FUNCTION 'CONVERSION_EXIT_INVDT_INPUT'
EXPORTING
INPUT = P_DA
IMPORTING
OUTPUT = LV_FR.
SELECT KURST FCURR TCURR GDATU AS GDATZ UKURS
INTO CORRESPONDING FIELDS OF TABLE LT_TCURR
FROM TCURR
WHERE GDATU <= LV_FR
AND KURST = 'M' .
LOOP AT LT_TCURR.
LT_TCURR-FRDT = '99999999' - LT_TCURR-GDATZ.
TRANSLATE LT_TCURR-FRDT(5) USING ' 0'.
CONDENSE LT_TCURR-FRDT NO-GAPS.
LT_TCURR-GDATU = LT_TCURR-FRDT.
IF LT_TCURR-GDATU > SY-DATUM.
DELETE LT_TCURR.
CONTINUE.
ENDIF.
MODIFY LT_TCURR.
CLEAR LT_TCURR.
ENDLOOP.
LT_OUT[] = LT_TCURR[].
SORT LT_TCURR BY GDATU FCURR TCURR.
"取最新的汇率
LOOP AT LT_TCURR.
LOOP AT LT_OUT WHERE KURST = LT_TCURR-KURST AND
FCURR = LT_TCURR-FCURR AND
TCURR = LT_TCURR-TCURR.
IF LT_OUT-GDATU < LT_TCURR-GDATU.
DELETE LT_OUT.
ENDIF.
ENDLOOP.
ENDLOOP.
LOOP AT LT_OUT.
GS_OUTPUT-KURST = LT_OUT-KURST.
GS_OUTPUT-FCURR = LT_OUT-FCURR.
GS_OUTPUT-TCURR = LT_OUT-TCURR.
GS_OUTPUT-UKURS = LT_OUT-UKURS.
GS_OUTPUT-GDATU = LT_OUT-GDATU.
APPEND GS_OUTPUT TO GT_OUTPUT.
CLEAR:GS_OUTPUT.
ENDLOOP.
IF GT_OUTPUT is INITIAL.
WRITE:/ '无数据传输,请确认查询条件下是否有数据'.
ENDIF.
ENDFORM.
FORM TO_SRM.
DATA:CL_ESB TYPE REF TO ZSRMCO_VXG_174_SRM_EXCHANGE_RA, "ABAP NAME
CL_ESB_INPUT TYPE ZSRMVXG_174_SRM_EXCHANGE_RATE1, "INPUT
CL_ESB_OUTPUT TYPE ZSRMVXG_174_SRM_EXCHANGE_RATE. "OUTPUT
"异常收集参数
DATA: G_SYS_EXCEPTION TYPE REF TO CX_AI_SYSTEM_FAULT,
G_APP_EXCEPTION TYPE REF TO CX_AI_APPLICATION_FAULT,
L_RESULT TYPE STRING,
XML_STRING_INPUT TYPE STRING.
DATA:GT_RETURN TYPE TABLE OF BAPIRET2,
GS_RETURN TYPE BAPIRET2.
DATA:GO_JSON TYPE REF TO CL_SXML_STRING_WRITER.
DATA:GV_JSON_LGORT TYPE STRING.
DATA:GV_JSON_LGORT_ESB TYPE STRING.
DATA:GV_JSON_ESB TYPE STRING.
DATA:GV_LENGTH_LGORT TYPE I.
DATA:GV_TITLE_LGORT TYPE STRING.
DATA:LV_OUTPUT_STR_UTF16 TYPE XSTRING.
DATA:LV_OUTPUT_STR_UTF8 TYPE STRING.
DATA:LS_HEAD TYPE ZOSB_HEAD.
DATA:LS_ERROR TYPE ZOSB_RETURN.
TYPES:BEGIN OF TY_RETURN,
RETURN TYPE STRING,
END OF TY_RETURN.
DATA:LS_RETURN TYPE TY_RETURN.
TYPES:BEGIN OF TY_LINE,
DATAINFO TYPE STRING,
END OF TY_LINE.
DATA:LS_LGORT TYPE TY_LINE."库位
CHECK GT_OUTPUT IS NOT INITIAL.
CLEAR:LS_HEAD,LS_LGORT.
CALL FUNCTION 'ZMM_GETBIZTRANSACTIONID_SRM'
EXPORTING
I_MODULE = 'MM'
I_INTERFACE = 'VXG-174'
IMPORTING
E_BIZTRANSACTIONID = LS_HEAD-BIZTRANSACTIONID.
DESCRIBE TABLE GT_OUTPUT LINES LS_HEAD-COUNT .
LS_HEAD-ACCOUNT = 'userSAP'.
* ls_head-password = 'PassMES1234'.
LS_HEAD-PASSWORD = 'P@ss0rd'.
LS_HEAD-CONSUMER = 'SAP'.
*JSON格式转换
GV_TITLE_LGORT = '{"TYPE":"RATE","iary":'.
TRANSLATE GV_TITLE_LGORT TO UPPER CASE.
"清空数据
CLEAR: GO_JSON,GV_JSON_LGORT.
CLEAR:GV_JSON_LGORT_ESB.
CLEAR:GV_LENGTH_LGORT.
CLEAR: LV_OUTPUT_STR_UTF16.
GO_JSON = CL_SXML_STRING_WRITER=>CREATE( IF_SXML=>CO_XT_JSON ).
CALL TRANSFORMATION ID
SOURCE
DATA = GT_OUTPUT
RESULT XML
GO_JSON.
GV_JSON_LGORT = CL_ABAP_CODEPAGE=>CONVERT_FROM( GO_JSON->GET_OUTPUT( ) ).
*出来的格式是:
*{"DATA":实际数据}
*转换下即可
GV_LENGTH_LGORT = STRLEN( GV_JSON_LGORT ).
GV_LENGTH_LGORT = GV_LENGTH_LGORT - 9.
GV_JSON_LGORT_ESB = GV_JSON_LGORT+8(GV_LENGTH_LGORT).
CONCATENATE GV_TITLE_LGORT GV_JSON_LGORT_ESB '}' INTO GV_JSON_ESB .
LS_LGORT-DATAINFO = GV_JSON_ESB.
IF GT_OUTPUT IS NOT INITIAL.
*XML转换
CALL TRANSFORMATION ZMM_O_SAPTOSRM
SOURCE HEAD = LS_HEAD
ITEM = LS_LGORT
RESULT XML LV_OUTPUT_STR_UTF16.
" 之所以要有这个转换,是因为UTF16的格式ESB那边解析不了
CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
EXPORTING
IM_XSTRING = LV_OUTPUT_STR_UTF16
IM_ENCODING = 'UTF-8'
IMPORTING
EX_STRING = LV_OUTPUT_STR_UTF8.
TRY.
CREATE OBJECT CL_ESB
EXPORTING
LOGICAL_PORT_NAME = 'VXG_174'.
CL_ESB_INPUT-DATA = LV_OUTPUT_STR_UTF8.
CALL METHOD CL_ESB->VXG_174_SRM_EXCHANGE_RATE_SERV
EXPORTING
INPUT = CL_ESB_INPUT
IMPORTING
OUTPUT = CL_ESB_OUTPUT.
IF CL_ESB_OUTPUT-SIGN = 'E' AND CL_ESB_OUTPUT-MESSAGE <> ''.
CALL TRANSFORMATION ZMM_RETURN_ESB
SOURCE XML CL_ESB_OUTPUT-MESSAGE
RESULT
HEAD = LS_ERROR
ITEM = LS_RETURN.
GS_RETURN-TYPE = LS_ERROR-ERRORCODE.
GS_RETURN-MESSAGE = LS_RETURN-RETURN.
APPEND GS_RETURN TO GT_RETURN.
CLEAR GS_RETURN.
ENDIF.
CATCH CX_AI_APPLICATION_FAULT INTO G_APP_EXCEPTION.
IF G_APP_EXCEPTION IS NOT INITIAL.
CALL METHOD G_APP_EXCEPTION->GET_TEXT
RECEIVING
RESULT = GS_RETURN-MESSAGE.
GS_RETURN-TYPE = 'E'.
APPEND GS_RETURN TO GT_RETURN.
CLEAR GS_RETURN.
ENDIF.
CATCH CX_AI_SYSTEM_FAULT INTO G_SYS_EXCEPTION.
IF G_SYS_EXCEPTION IS NOT INITIAL.
CALL METHOD G_SYS_EXCEPTION->GET_TEXT
RECEIVING
RESULT = GS_RETURN-MESSAGE.
GS_RETURN-TYPE = 'E'.
APPEND GS_RETURN TO GT_RETURN.
CLEAR GS_RETURN.
ENDIF.
ENDTRY.
IF CL_ESB_OUTPUT-SIGN = 'S'.
WRITE:/ CL_ESB_OUTPUT-SIGN,SPACE, CL_ESB_OUTPUT-MESSAGE,SPACE, '传输SRM成功!'.
ELSE.
WRITE:/ CL_ESB_OUTPUT-SIGN,SPACE,CL_ESB_OUTPUT-MESSAGE,SPACE, '传输SRM失败!'.
ENDIF.
"输出行数
IF GT_RETURN IS NOT INITIAL.
WRITE:/ SY-ULINE.
WRITE:/ '存在部分异常:'.
LOOP AT GT_RETURN INTO GS_RETURN.
WRITE: / GS_RETURN-TYPE,SPACE,GS_RETURN-NUMBER,SPACE, GS_RETURN-MESSAGE.
CLEAR:GS_RETURN.
ENDLOOP.
ENDIF.
WRITE:/ SY-ULINE.
WRITE:/ '传输jason串:'.
WRITE:/ GV_JSON_ESB.
DATA:N TYPE I.
DESCRIBE TABLE GT_OUTPUT LINES N.
WRITE:/ SY-ULINE.
WRITE:/ '共传输', N,'条,清单如下:'.
WRITE:/ '汇率类型',SPACE,'从货币',SPACE,'最终货币',SPACE,'汇率',SPACE,'有效开始日期'.
LOOP AT GT_OUTPUT INTO GS_OUTPUT.
WRITE:/ GS_OUTPUT-KURST,SPACE,
GS_OUTPUT-FCURR,SPACE,SPACE,
GS_OUTPUT-TCURR,SPACE,SPACE,
GS_OUTPUT-UKURS,SPACE,SPACE,
GS_OUTPUT-GDATU.
ENDLOOP.
ENDIF.
ENDFORM.
(B)传SRM函数调用 ZMM_GETBIZTRANSACTIONID_SRM
FUNCTION ZMM_GETBIZTRANSACTIONID_SRM.
*"--------------------------------------------------------------------
*"*"局部接口:
*" IMPORTING
*" VALUE(I_MODULE) TYPE ZMODULE
*" VALUE(I_INTERFACE) TYPE CHAR20
*" EXPORTING
*" VALUE(E_BIZTRANSACTIONID) TYPE ZOSBMESSAGEID
*"--------------------------------------------------------------------
DATA:gc_time TYPE char23.
DATA:gc_time1 TYPE char8.
DATA:gc_time2 TYPE char2.
DATA:gc_time3 TYPE char4.
DATA:gc_time4 TYPE char3.
DATA tsl TYPE timestampl.
GET TIME STAMP FIELD tsl.
gc_time = tsl.
gc_time1 = gc_time+0(8).
gc_time2 = gc_time+8(2).
gc_time2 = gc_time2 + 8.
IF gc_time2 > 24.
gc_time2 = gc_time2 - 24.
ENDIF.
gc_time3 = gc_time+10(4).
gc_time4 = gc_time+15(3).
CLEAR gc_time.
CONCATENATE gc_time1 gc_time2 gc_time3 gc_time4 INTO gc_time.
CONCATENATE 'SRM' i_module '_' i_interface '_' gc_time INTO e_biztransactionid.
ENDFUNCTION.