/* POPUP INI */
/* POPUP FIM */

Conteúdo

Download XML a partir de STRING e importar para o SAP usando eDocument

Basicamente você tem um XML em formato string e quer baixar ele. Além da opção de enviar este XML para o SAP, assim como faz a EDOC_BR_UPLOAD / EDOC_COCKPIT.

Este é um tipo de conteúdo que se tem pouco na web, então se for copiar, lembre de nos mencionar ok.

REPORT SAPeiros.

TYPES ty_x_line(256) TYPE x.

DATA:
  gt_xtab           TYPE TABLE OF ty_x_line,
  gt_return         TYPE TABLE OF bapiret2,
  gv_xtab_size      TYPE          i,
  gv_folder         TYPE          string,
  gv_filename       TYPE          string,
  gv_xml_string     TYPE          string,
  gv_xml_xstring    TYPE          xstring,
  gcl_ixml          TYPE REF TO   if_ixml,
  gcl_document      TYPE REF TO   if_ixml_document,
  gcl_streamfactory TYPE REF TO   if_ixml_stream_factory,
  gcl_parser        TYPE REF TO   if_ixml_parser,
  gcl_istream       TYPE REF TO   if_ixml_istream,
  gcl_renderer      TYPE REF TO   if_ixml_renderer.

PARAMETERS p_edoc TYPE flag_x.
PARAMETERS p_down TYPE flag_x.
PARAMETERS p_dir  TYPE rlgrap-filename.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_dir.
  CALL METHOD cl_gui_frontend_services=>directory_browse
    CHANGING
      selected_folder = gv_folder.

  p_dir = gv_folder.

INITIALIZATION.
  %_p_edoc_%_app_%-text = 'Carregar XML para entro do SAP'.
  %_p_down_%_app_%-text = 'Download do XML'.
  %_p_dir_%_app_%-text  = 'Pasta de destino'.

END-OF-SELECTION.
  gv_xml_string = '<SAP><bestblog>SAPeiros</bestblog><bestdeveloper>Coelho</bestdeveloper></SAP>'.

* Converter para XString
  CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
    EXPORTING
      text     = gv_xml_string
      encoding = '4110'
    IMPORTING
      buffer   = gv_xml_xstring
    EXCEPTIONS
      failed   = 1
      OTHERS   = 2.

* Download para arquivo local
  IF p_down IS NOT INITIAL.

    DATA(lv_size_dir) = strlen( p_dir ).
    lv_size_dir = lv_size_dir - 1.

    IF p_dir+lv_size_dir(1) NE '\'.
      p_dir = p_dir && '\'.
    ENDIF.

    CLEAR: gv_xtab_size, gv_filename, gt_xtab[].

    gv_filename       = p_dir && sy-datum && sy-uzeit && '.XML'.

    gcl_ixml          = cl_ixml=>create( ).

    gcl_streamfactory = gcl_ixml->create_stream_factory( ).

    gcl_istream       = gcl_streamfactory->create_istream_xstring( string = gv_xml_xstring ).

    gcl_document      = gcl_ixml->create_document( ).

    gcl_parser        = gcl_ixml->create_parser( stream_factory = gcl_streamfactory
                                                 istream        = gcl_istream
                                                 document       = gcl_document ).
    gcl_parser->parse( ).

    IF sy-subrc IS INITIAL.

      CALL METHOD cl_ixml_80_20=>render_to_table_of_x
        EXPORTING
          document          = gcl_document
          pretty_print      = 1
        IMPORTING
          stream_table      = gt_xtab
          stream_table_size = gv_xtab_size.

      CALL FUNCTION 'GUI_DOWNLOAD'
        EXPORTING
          bin_filesize = gv_xtab_size
          filename     = gv_filename
          filetype     = 'BIN'
        TABLES
          data_tab     = gt_xtab
        EXCEPTIONS
          OTHERS       = 1.

    ENDIF.

  ENDIF.

* eDocument Brasil: Carregar XML
  IF p_edoc IS NOT INITIAL.

    DATA(lcl_xml)    = NEW cl_xml_document( ).

    DATA(lv_retcode) = lcl_xml->parse_xstring( EXPORTING stream = gv_xml_xstring ).

    IF lv_retcode NE 0.

      CALL METHOD lcl_xml->render_2_xstring
        IMPORTING
          retcode = lv_retcode
          stream  = gv_xml_xstring
          size    = DATA(lv_size).

      IF lv_retcode EQ 0.

        CALL FUNCTION 'EDOC_BR_RECEIVE_XML'
          EXPORTING
            iv_xml      = gv_xml_xstring
          IMPORTING
            et_bapiret2 = gt_return.

      ENDIF.

    ENDIF.

  ENDIF.
/* POPUP INI */ /* POPUP FIM */