SAP-SRM同步获取汇率

处理逻辑
*&---------------------------------------------------------------------*
*& 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.

 

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小啊曼

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值