天天看點

ABAP 調用CIS webservice 抓取SRM 資料

ZMLSCP1_FR0013 合肥美菱采購訂單下傳SRM系統(send)

FUNCTION zmlscp1_fr0013.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  TABLES
*"      POHDEAR STRUCTURE  ZSMLPO_HDR OPTIONAL
*"      POITEMS STRUCTURE  ZSMLPO_ITEM OPTIONAL
*"      RET_MSGS STRUCTURE  ZSMLPO_MSG1 OPTIONAL
*"----------------------------------------------------------------------

*data definition
  DATA: error TYPE REF TO cx_ai_system_fault.
  DATA: prxy TYPE REF TO zco_request_handle_mlpurchase."Proxy Name
  DATA: z_in TYPE zrequest8."request in
  DATA: z_out TYPE zresponse8."request out

  DATA: lv_aufnr TYPE aufnr.
  DATA: lv_cy_seqnr TYPE cy_seqnr."生産訂單配置設定标簽上字段螢幕順序号

* 傳回封包内表
  DATA: BEGIN OF basereturnheader OCCURS 0,
        hresv1 TYPE c LENGTH 20,"采購訂單号
        hresv2 TYPE c LENGTH 20,"行項目号
        hresv3 TYPE c LENGTH 20,
        hresv4 TYPE c LENGTH 20,
        hresv5 TYPE c LENGTH 20,
        returnmsg TYPE c LENGTH 200,"消息文本
        status TYPE c LENGTH 20,"消息狀态(S或E)
        uuid TYPE c LENGTH 30,"ID"
      END OF basereturnheader.
  DATA: basereturnitem LIKE basereturnheader OCCURS 0 WITH HEADER LINE.

  DATA: lo_oref TYPE REF TO cx_st_error.

*clear return parameters
  CLEAR ret_msgs.

*delete lines where ebeln is null
  DELETE pohdear WHERE ebeln IS INITIAL.
  DELETE poitems WHERE ebeln IS INITIAL.

*check input data
  IF pohdear[] IS INITIAL OR poitems[] IS INITIAL.
    ret_msgs-msgty = 'E'.
    ret_msgs-msgtx = '傳入參數POHDEAR或POHDEAR不能為空'.
    APPEND ret_msgs.
    EXIT.
  ENDIF.

* Get filed value
  LOOP AT poitems.
*   需求跟蹤号存的值為生産訂單号,根據生産訂單取物料代碼+描述
    IF NOT poitems-bednr IS INITIAL.
      CLEAR lv_aufnr.
*     采購訂單上的需求跟蹤号長度10,而生産訂單長度12
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = poitems-bednr
        IMPORTING
          output = lv_aufnr.
      SELECT SINGLE matnr FROM afpo INTO poitems-co_matnr WHERE aufnr EQ lv_aufnr.
      IF sy-subrc EQ 0.
        SELECT SINGLE maktx FROM makt INTO poitems-co_matxt WHERE matnr EQ poitems-co_matnr
          AND spras EQ sy-langu.
*       物料主資料SCP供應鍊字段擷取
        SELECT SINGLE zcbwl zjit zctwl zzdzd zjmwl zbbwl INTO
          (poitems-zcbwl,poitems-zjit,poitems-zctwl,poitems-zzdzd,poitems-zjmwl,poitems-zbbwl) FROM zmlscpzsj
            WHERE matnr EQ poitems-co_matnr
              AND werks EQ poitems-werks.
*       生産訂單配置設定标簽上的螢幕配置設定号字段
        CLEAR lv_cy_seqnr.
        SELECT SINGLE cy_seqnr INTO lv_cy_seqnr FROM afko WHERE aufnr EQ lv_aufnr.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
          EXPORTING
            input  = lv_cy_seqnr
          IMPORTING
            output = poitems-backup1.
      ENDIF.
    ENDIF.
*   Set canOntime(業務狀态:是否可以按時交貨)
*   Set noR3Receive(R3未收貨數量)
    MODIFY poitems.
    CLEAR poitems.
  ENDLOOP.

  CLEAR: xmlstr,z_in,z_out.
*generate xml string
  CONCATENATE '<?xml version="1.0" encoding="utf-8"?>' xmlstr INTO xmlstr.
  append_data_to_xml 'handleMLPurchaseOrderService'   '' 'B'.
  append_data_to_xml 'in0'   '' 'B'.
  append_data_to_xml 'pos'   '' 'B'.
  LOOP AT pohdear.
    append_data_to_xml 'Po'    '' 'B'.
    append_data_to_xml 'poHeader'   '' 'B'.
    append_data_to_xml 'aedat'    pohdear-aedat    'A'.
    append_data_to_xml 'backup1'  ''   'A'.
    append_data_to_xml 'backup2'  ''   'A'.
    append_data_to_xml 'backup3'  ''   'A'.
    append_data_to_xml 'backup4'  ''   'A'.
    append_data_to_xml 'backup5'  ''   'A'.
    append_data_to_xml 'backup6'  ''   'A'.
    append_data_to_xml 'bedat'    pohdear-bedat    'A'.
    append_data_to_xml 'bsart'    pohdear-bsart    'A'.
    append_data_to_xml 'bukrs'    pohdear-bukrs    'A'.
    append_data_to_xml 'ebeln'    pohdear-ebeln    'A'.
    append_data_to_xml 'ekgrp'    pohdear-ekgrp    'A'.
    append_data_to_xml 'ekorg'    pohdear-ekorg    'A'.
    append_data_to_xml 'elikz'    pohdear-elikz    'A'.
    append_data_to_xml 'ernam'    pohdear-ernam    'A'.
    append_data_to_xml 'frggr'    pohdear-frggr    'A'.
    append_data_to_xml 'frgsx'    pohdear-frgsx    'A'.
    append_data_to_xml 'iresv1'   pohdear-iresv1   'A'.
    append_data_to_xml 'iresv10'  ''               'A'.
    append_data_to_xml 'iresv2'   ''               'A'.
    append_data_to_xml 'iresv3'   ''               'A'.
    append_data_to_xml 'iresv4'   ''               'A'.
    append_data_to_xml 'iresv5'   ''               'A'.
    append_data_to_xml 'iresv6'   ''               'A'.
    append_data_to_xml 'iresv7'   ''               'A'.
    append_data_to_xml 'iresv8'   ''               'A'.
    append_data_to_xml 'iresv9'   ''               'A'.
    append_data_to_xml 'lifnr'    pohdear-lifnr    'A'.
    append_data_to_xml 'loekz'    pohdear-loekz    'A'.
    append_data_to_xml 'waers'    pohdear-waers    'A'.
    append_data_to_xml 'zterm'    pohdear-zterm    'A'.
    append_data_to_xml 'poHeader'   '' 'E'.
    append_data_to_xml 'poItem'     '' 'B'.
    LOOP AT poitems WHERE ebeln EQ pohdear-ebeln.
      append_data_to_xml 'PoItem'      '' 'B'.
      append_data_to_xml 'backup1'     poitems-backup1    'A'.
      append_data_to_xml 'backup2'     poitems-backup2    'A'.
      append_data_to_xml 'backup3'     poitems-backup3    'A'.
      append_data_to_xml 'backup4'     poitems-backup4    'A'.
      append_data_to_xml 'backup5'     poitems-backup5    'A'.
      append_data_to_xml 'backup6'     poitems-backup6    'A'.
      append_data_to_xml 'bednr'       poitems-bednr      'A'.
      append_data_to_xml 'canOntime'   poitems-canontime  'A'.
      append_data_to_xml 'charg'       poitems-charg      'A'.
      append_data_to_xml 'co_matnr'    poitems-co_matnr   'A'.
      append_data_to_xml 'co_matxt'    poitems-co_matxt   'A'.
      append_data_to_xml 'ebeln'       poitems-ebeln      'A'.
      append_data_to_xml 'ebelp'       poitems-ebelp      'A'.
      append_data_to_xml 'eindt'       poitems-eindt      'A'.
      append_data_to_xml 'ekgrp'       poitems-ekgrp      'A'.
      append_data_to_xml 'elikz'       poitems-elikz      'A'.
      append_data_to_xml 'isShouHuo'   ''                 'A'.
      append_data_to_xml 'knttp'       poitems-knttp      'A'.
      append_data_to_xml 'lgort'       poitems-lgort      'A'.
      append_data_to_xml 'loekz'       poitems-loekz      'A'.
      append_data_to_xml 'matkl'       poitems-matkl      'A'.
      append_data_to_xml 'matnr'       poitems-matnr      'A'.
      append_data_to_xml 'meins'       poitems-meins      'A'.
      append_data_to_xml 'menge'       poitems-menge      'A'.
      append_data_to_xml 'mfrnr'       poitems-mfrnr      'A'.
      append_data_to_xml 'mwskz'       poitems-mwskz      'A'.
      append_data_to_xml 'noR3Receive' poitems-nor3receive 'A'.
      append_data_to_xml 'pstyp'       poitems-pstyp      'A'.
      append_data_to_xml 'repos'       poitems-repos      'A'.
      append_data_to_xml 'susr1'       poitems-susr1      'A'.
      append_data_to_xml 'susr10'      poitems-susr10     'A'.
      append_data_to_xml 'susr11'      poitems-susr11     'A'.
      append_data_to_xml 'susr12'      poitems-susr12     'A'.
      append_data_to_xml 'susr13'      poitems-susr13     'A'.
      append_data_to_xml 'susr14'      poitems-susr14     'A'.
      append_data_to_xml 'susr15'      poitems-susr15     'A'.
      append_data_to_xml 'susr2'       poitems-susr2      'A'.
      append_data_to_xml 'susr3'       poitems-susr3      'A'.
      append_data_to_xml 'susr4'       poitems-susr4      'A'.
      append_data_to_xml 'susr5'       poitems-susr5      'A'.
      append_data_to_xml 'susr6'       poitems-susr6      'A'.
      append_data_to_xml 'susr7'       poitems-susr7      'A'.
      append_data_to_xml 'susr8'       poitems-susr8      'A'.
      append_data_to_xml 'susr9'       poitems-susr9      'A'.
      append_data_to_xml 'uebto'       poitems-uebto      'A'.
      append_data_to_xml 'untto'       poitems-untto      'A'.
      append_data_to_xml 'webre'       poitems-webre      'A'.
      append_data_to_xml 'werks'       poitems-webre      'A'.
      append_data_to_xml 'xersy'       poitems-xersy      'A'.
      append_data_to_xml 'zbbwl'       poitems-zbbwl      'A'.
      append_data_to_xml 'zcbwl'       poitems-zcbwl      'A'.
      append_data_to_xml 'zctwl'       poitems-zctwl      'A'.
      append_data_to_xml 'zjit'        poitems-zjit       'A'.
      append_data_to_xml 'zjmwl'       poitems-zjmwl      'A'.
      append_data_to_xml 'zzdzd'       poitems-zzdzd      'A'.
      append_data_to_xml 'PoItem'      '' 'E'.
      CLEAR poitems.
    ENDLOOP.
    append_data_to_xml 'poItem'     '' 'E'.
    append_data_to_xml 'Po'    '' 'E'.
    CLEAR pohdear.
  ENDLOOP.
  append_data_to_xml 'pos'   '' 'E'.
  append_data_to_xml 'in0'   '' 'E'.
  append_data_to_xml 'handleMLPurchaseOrderService'   '' 'E'.

  z_in-request_data = xmlstr.
* 發送前記錄發送的訂單資料,狀态Y
  DATA: itab_zmlscp_log01 TYPE zmlscp_log01 OCCURS 0 WITH HEADER LINE.
  DATA: lv_ztime LIKE zmlscp_log01-ztime.

  lv_ztime = sy-datum && sy-uzeit.

  LOOP AT pohdear.
    CLEAR itab_zmlscp_log01.
    itab_zmlscp_log01-ebeln = pohdear-ebeln.
    itab_zmlscp_log01-msgty = 'Y'.
    itab_zmlscp_log01-msgtx = '已發送,等待SRM傳回處理結果'.
    itab_zmlscp_log01-ztime = lv_ztime.
    itab_zmlscp_log01-uname = sy-uname.
    APPEND itab_zmlscp_log01.
    CLEAR pohdear.
  ENDLOOP.

  INSERT zmlscp_log01 FROM TABLE itab_zmlscp_log01.
*  COMMIT WORK AND WAIT.

*send data to srm via cis(soa)
  CLEAR error.
  TRY.
      CREATE OBJECT prxy
        EXPORTING
          logical_port_name = 'ZMLSCP_SEND_PO'.

      CALL METHOD prxy->request
        EXPORTING
          input  = z_in
        IMPORTING
          output = z_out.
    CATCH cx_ai_system_fault INTO error.
      ret_msgs-msgty = 'E'.
      ret_msgs-msgtx = error->errortext.
      APPEND ret_msgs.
      EXIT.
  ENDTRY.

* 傳回封包解析(XML字元串解析)
  IF z_out-return_code EQ 'S'."CIS轉發成功
    IF z_out-return_data IS NOT INITIAL."業務系統傳回封包不為空
      TRY .
          BREAK-POINT.
          REFRESH: basereturnheader,basereturnheader.
          CALL TRANSFORMATION zml_xml_trans01
          SOURCE XML z_out-return_data
          RESULT basereturnheader =  basereturnheader[]
                 basereturnitem = basereturnitem[].
        CATCH cx_st_error INTO lo_oref .
          ret_msgs-msgty = 'E'.
          ret_msgs-msgtx = lo_oref->get_text( ) .
          APPEND ret_msgs.
      ENDTRY.
*     deal with logs only headers
      LOOP AT basereturnheader.
        CLEAR ret_msgs.
        ret_msgs-eblen = basereturnheader-hresv1.
        IF basereturnheader-status EQ 'S'.
          ret_msgs-msgty = 'S'.
        ELSE.
          ret_msgs-msgty = 'E'.
        ENDIF.
        ret_msgs-msgtx = basereturnheader-returnmsg.
        ret_msgs-msgid = lv_ztime.
        APPEND ret_msgs.
*       SRM傳回結果更新日志表
        CLEAR itab_zmlscp_log01.
        itab_zmlscp_log01-ebeln = ret_msgs-eblen.
        itab_zmlscp_log01-ztime = ret_msgs-msgid.
        itab_zmlscp_log01-uname = sy-uname.
        itab_zmlscp_log01-msgty = ret_msgs-msgty.
        itab_zmlscp_log01-msgtx = ret_msgs-msgtx.
        APPEND itab_zmlscp_log01.
        CLEAR basereturnheader.
      ENDLOOP.
      IF NOT itab_zmlscp_log01[] IS INITIAL.
        UPDATE zmlscp_log01 FROM TABLE itab_zmlscp_log01.
      ENDIF.
    ELSE.
      ret_msgs-msgty = 'E'.
      ret_msgs-msgtx = 'CIS傳回字段return_data為空'.
      APPEND ret_msgs.
    ENDIF.
  ELSE.
    ret_msgs-msgty = 'E'.
    ret_msgs-msgtx = 'CIS傳回字段return_code不等于S'.
    APPEND ret_msgs.
  ENDIF.

ENDFUNCTION.