Code20090331 - ooxxvv/MySAPnotes GitHub Wiki

Code20090331

Code

************************************************************************
**Program name: REV_PDF_FORM
**Description : Interactive Form - Receive
**Date/Author : 2009.12.16 / Joey Lee
************************************************************************
** M O D I F I C A T I O N  L O G
************************************************************************
** ChangeDate  Programmer  Request     Description
** ==========  ==========  ==========  ==================
** 2009.12.16  Joey Lee                New Program
************************************************************************
REPORT ztestpdf_upload NO STANDARD PAGE HEADING
                       LINE-SIZE 135
                       LINE-COUNT 58(2).
*=======================================================================
*=================================================Global Date declear===
DATA: g_pdf_data TYPE xstring,
      g_xml_xstr TYPE xstring.


PARAMETERS: p_finame TYPE string.



*=======================================================================
*========================================================Initial Data===
*LOAD-OF-PROGRAM
*INITIALIZATION.

*=======================================================================
*=============================================Selection Screen Events===
*AT SELECTION-SCREEN OUTPUT.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_finame.
  PERFORM get_file_name USING 'P_FINAME'
                        CHANGING p_finame.
*AT SELECTION-SCREEN.
*AT SELECTION-SCREEN ON <f>.
*AT SELECTION-SCREEN ON BLOCK <>.

*=======================================================================
*=======================================================Report Events===
START-OF-SELECTION.
*-Get PDF file
  PERFORM get_pdf_file CHANGING g_pdf_data.

*-Get XML data in PDF File
  PERFORM get_ads_xml USING g_pdf_data
                   CHANGING g_xml_xstr.

END-OF-SELECTION.
*-Transformation XML data (XML Library - iXML)
  PERFORM tran_xml_ixml USING g_xml_xstr.

*-Transformation XML data (CALL TRANSFORMATION)
*  PERFORM tran_xml_transformation USING g_xml_xstr.


*=======================================================================
*=========================================================List Events===
*TOP-OF-PAGE.
*END-OF-PAGE.
*AT LINE-SELECTION.
*TOP-OF-PAGE DURING LINE-SELECTION.
*AT USER-COMMAND.



*=======================================================================
*=========================================================Subroutines===
*&---------------------------------------------------------------------*
*&      Form  get_pdf_file
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_pdf_file CHANGING fo_pdf_data.

  TYPES: l_xstr(1024) TYPE x.
  DATA:  lt_rawtab TYPE TABLE OF l_xstr,
         lv_filename TYPE string.

  lv_filename = p_finame.

*-Upload PDF File
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                = lv_filename
      filetype                = 'BIN'
    TABLES
      data_tab                = lt_rawtab
    EXCEPTIONS
      file_open_error         = 1
      file_read_error         = 2
      no_batch                = 3
      gui_refuse_filetransfer = 4
      invalid_type            = 5
      no_authority            = 6
      unknown_error           = 7
      bad_data_format         = 8
      header_not_allowed      = 9
      separator_not_allowed   = 10
      header_too_long         = 11
      unknown_dp_error        = 12
      access_denied           = 13
      dp_out_of_memory        = 14
      disk_full               = 15
      dp_timeout              = 16
      OTHERS                  = 17.

  IF sy-subrc <> 0.
    EXIT.
  ENDIF.

*-Concate all data
  CONCATENATE LINES OF lt_rawtab INTO fo_pdf_data IN BYTE MODE.

ENDFORM.                    " get_pdf_file
*&---------------------------------------------------------------------*
*&      Form  get_ads_xml
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_ads_xml USING fi_pdf_data
              CHANGING fo_xml_xstr.

  DATA: lo_fp              TYPE REF TO if_fp VALUE IS INITIAL,
        lo_pdfobj          TYPE REF TO if_fp_pdf_object VALUE IS INITIAL,
        l_xml_data         TYPE xstring.

*-Get FP reference
  lo_fp = cl_fp=>get_reference( ).

  TRY.
*---Create PDF Object using destination 'ADS' (<-- this is how it is defined in SM59)
    lo_pdfobj = lo_fp->create_pdf_object( connection = 'ADS' ).
*---Set document
    lo_pdfobj->set_document(
      EXPORTING
        pdfdata = fi_pdf_data ).
*---Tell PDF object to extract data
    lo_pdfobj->set_extractdata( ).
*---Execute the call to ADS
    lo_pdfobj->execute( ).
  ENDTRY.

*-Extract the Data
  lo_pdfobj->get_data(
    IMPORTING
      formdata = l_xml_data ).

*-Return data
  fo_xml_xstr = l_xml_data.

ENDFORM.                    " get_ads_xml
*&---------------------------------------------------------------------*
*&      Form  TRAN_XML_TRANSFORMATION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM tran_xml_transformation  USING fi_xml_xstr.

  DATA: lv_xml_data_string TYPE string,
        l_str              TYPE string.

*-Convert XML data from XSTRING format to STRING format
  CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
    EXPORTING
      im_xstring = fi_xml_xstr
    IMPORTING
      ex_string  = lv_xml_data_string.

*-Remove NEW-LINE character from XML data in STRING format
  CLASS cl_abap_char_utilities DEFINITION LOAD.

  REPLACE ALL OCCURENCES OF cl_abap_char_utilities=>newline
    IN lv_xml_data_string WITH ''.

*-Make the XML envelope compliant with identity transform
*  CONCATENATE '<?xml version="1.0" encoding="iso-8859-1"?>'
*              '<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">'
*    INTO l_str.
*
*  REPLACE '<?xml version="1.0" encoding="UTF-8"?>'
*    IN lv_xml_data_string WITH l_str.
*
*  REPLACE '<data>' IN lv_xml_data_string WITH '<asx:values>'.
*
*  REPLACE '</data>'
*    IN  lv_xml_data_string WITH '</asx:values></asx:abap>'.




*-Split XML data
  PERFORM output_xml USING lv_xml_data_string.














*-Transformation
*  CALL TRANSFORMATION id
*    SOURCE XML fo_xml_data
*    RESULT zekpo = it_zekpo.

ENDFORM.                    " TRAN_XML_TRANSFORMATION
*&---------------------------------------------------------------------*
*&      Form  TRAN_XML_IXML
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM tran_xml_ixml USING fi_xml_xstr.

  TYPE-POOLS: ixml.

  DATA: l_ixml          TYPE REF TO if_ixml,
        l_streamfactory TYPE REF TO if_ixml_stream_factory,
        l_parser        TYPE REF TO if_ixml_parser,
        l_istream       TYPE REF TO if_ixml_istream,
        l_document      TYPE REF TO if_ixml_document,
        l_node          TYPE REF TO if_ixml_node,
        l_parseerror    TYPE REF TO if_ixml_parse_error,
        l_xmldata       TYPE string,
        l_str           TYPE string,
        l_int           TYPE i,
        l_count         TYPE i,
        l_index         TYPE i.

*  DATA: l_xml_table      TYPE TABLE OF t_xml_line,
*        l_xml_line       TYPE t_xml_line,
*        l_xml_table_size TYPE i.


*-Creating the main iXML factory
  l_ixml = cl_ixml=>create( ).

*-Creating a stream factory
  l_streamfactory = l_ixml->create_stream_factory( ).

** wrap the table containing the file into a stream
*  l_istream = l_streamfactory->create_istream_itable( table = l_xml_table size = l_xml_table_size ).

*-wrap xstring into a stream
  l_istream = l_streamfactory->create_istream_xstring( string = fi_xml_xstr ).

*-Creating a document
  l_document = l_ixml->create_document( ).

*-Create a Parser
  l_parser = l_ixml->create_parser(
                       stream_factory = l_streamfactory
                       istream        = l_istream
                       document       = l_document ).

*-Parse the stream
  IF l_parser->parse( ) NE 0.

    IF l_parser->num_errors( ) NE 0.
      l_count = l_parser->num_errors( ).

      WRITE: l_count, ' parse errors have occured:'.

      l_index = 0.

      WHILE l_index < l_count.

        l_parseerror = l_parser->get_error( index = l_index ).

        l_int = l_parseerror->get_line( ).
        WRITE: 'line: ', l_int.
        l_int = l_parseerror->get_column( ).
        WRITE: 'column: ', l_int.
        l_str = l_parseerror->get_reason( ).
        WRITE: l_str.
        l_index = l_index + 1.
      ENDWHILE.
    ENDIF.
  ENDIF.

*-Process the document
  IF l_parser->is_dom_generating( ) EQ 'X'.

    PERFORM travel_node_name USING l_document.
*    PERFORM travel_all_node USING l_document.

  ENDIF.

ENDFORM.                    " TRAN_XML_IXML
*&---------------------------------------------------------------------*
*&      Form  GET_FILE_NAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_file_name USING fi_fieldname
                   CHANGING fo_filefield.

  DATA: l_file_name  TYPE ibipparms-path,
        l_field_name TYPE dynpread-fieldname.

  l_field_name = fi_fieldname.

  CALL FUNCTION 'F4_FILENAME'
    EXPORTING
      program_name  = syst-cprog
      dynpro_number = syst-dynnr
      field_name    = fi_fieldname
    IMPORTING
      file_name     = l_file_name.

  fo_filefield = l_file_name.

ENDFORM.                    " GET_FILE_NAME
*&---------------------------------------------------------------------*
*&      Form  TRAVEL_ALL_NODE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM travel_all_node USING fi_document TYPE REF TO if_ixml_document.

  DATA: node     TYPE REF TO if_ixml_node,
        iterator TYPE REF TO if_ixml_node_iterator,
        nodemap  TYPE REF TO if_ixml_named_node_map,
        attr     TYPE REF TO if_ixml_node,
        name     TYPE string,
        prefix   TYPE string,
        value    TYPE string,
        indent   TYPE i,
        count    TYPE i, index TYPE i.


  node ?= fi_document.

  CHECK NOT node IS INITIAL.
  ULINE.
  WRITE: /.
  WRITE: /' DOM-TREE'.
  WRITE: /.
  IF node IS INITIAL.
    EXIT.
  ENDIF.

* create a node iterator
  iterator = node->create_iterator( ).

* get current node
  node = iterator->get_next( ).

* loop over all nodes
  WHILE NOT node IS INITIAL.
    indent = node->get_height( ) * 2.
    indent = indent + 20.

    CASE node->get_type( ).

      WHEN if_ixml_node=>co_node_element.
*-------element node
        name = node->get_name( ).
        nodemap = node->get_attributes( ).
        WRITE: / 'ELEMENT :'.
        WRITE: AT indent name COLOR COL_POSITIVE INVERSE.
        IF NOT nodemap IS INITIAL.
*---------attributes
          count = nodemap->get_length( ).
          DO count TIMES.
            index = sy-index - 1.
            attr = nodemap->get_item( index ).
            name = attr->get_name( ).
            prefix = attr->get_namespace_prefix( ).
            value = attr->get_value( ).
            WRITE: / 'ATTRIBUTE:'.
            WRITE: AT indent name COLOR COL_HEADING INVERSE, '=', value COLOR COL_TOTAL INVERSE.
          ENDDO.
        ENDIF.

      WHEN if_ixml_node=>co_node_text OR if_ixml_node=>co_node_cdata_section.
*-------text node
        value = node->get_value( ).
        WRITE: / 'VALUE :'.
        WRITE: AT indent value COLOR COL_GROUP INVERSE.

    ENDCASE.

* advance to next node
    node = iterator->get_next( ).
  ENDWHILE.

ENDFORM.                    " TRAVEL_ALL_NODE
*&---------------------------------------------------------------------*
*&      Form  TRAVEL_NODE_NAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM travel_node_name USING fi_document TYPE REF TO if_ixml_document.

  DATA: l_node     TYPE REF TO if_ixml_node.

*-Check Document
  l_node ?= fi_document.

  IF l_node IS INITIAL.
    EXIT.
  ENDIF.

  DATA: lt_ekpo     TYPE ztestpdf_ty001,
        lt_listekpo TYPE ztestpdf_ty001,
        lt_teban    TYPE zads001_tt002,
        l_werks     LIKE ekpo-werks,
        l_w_user(20) type c.

*-for internal table
  PERFORM get_it_ekpo TABLES lt_teban
                       USING fi_document
                             'TEBAN'.

*-for structure
  PERFORM get_field USING fi_document
                          'ZWERKS'
                 CHANGING l_werks.

  PERFORM get_field USING fi_document
                          'W_USER'
                 CHANGING l_w_user.

ENDFORM.                    " TRAVEL_NODE_NAME
*&---------------------------------------------------------------------*
*&      Form  OUTPUT_XML
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM output_xml USING fi_xml_data.
  DATA: l_str TYPE string.
  DATA: BEGIN OF lt_output OCCURS 0,
          str(512) TYPE c,
        END OF lt_output.

  l_str = fi_xml_data.

  REPLACE ALL OCCURRENCES OF '><' IN l_str WITH '>|<'.

  SPLIT l_str AT '|' INTO TABLE lt_output.

*-Output
  LOOP AT lt_output.
    WRITE / lt_output.
  ENDLOOP.

ENDFORM.                    " OUTPUT_XML
*&---------------------------------------------------------------------*
*&      Form  GET_IT_EKPO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_it_ekpo  TABLES ft_return   STRUCTURE zads001_s002
                  USING  fi_document TYPE REF TO if_ixml_document
                         fi_elename.

  FIELD-SYMBOLS: <fs_field> TYPE ANY.

  DATA: l_filter    TYPE REF TO if_ixml_node_filter,
        l_filter_p  TYPE REF TO if_ixml_node_filter,
        l_iterator  TYPE REF TO if_ixml_node_iterator,
        l_node      TYPE REF TO if_ixml_node,
        l_node_c    TYPE REF TO if_ixml_node,
        l_name      TYPE string,
        l_value     TYPE string,
        l_fieldname TYPE string,
        lw_return   LIKE LINE OF ft_return.


*-Field node
  l_filter_p = fi_document->create_filter_name( name = fi_elename ).
  l_filter   = fi_document->create_filter_parent( filter_parent = l_filter_p ).

*-create a node iterator
  l_iterator = fi_document->create_iterator_filtered( l_filter ).

*-Travel all node (Line)
  l_node = l_iterator->get_next( ).

  WHILE NOT l_node IS INITIAL.

    l_node_c = l_node->get_first_child( ).

*---Travel all child node (Field)
    WHILE NOT l_node_c IS INITIAL.
      l_name  = l_node_c->get_name( ).
      l_value = l_node_c->get_value( ).

      TRY.
        CONCATENATE 'LW_RETURN-' l_name INTO l_fieldname.
        ASSIGN (l_fieldname) TO <fs_field>.
        <fs_field> = l_value.
      ENDTRY.

      l_node_c = l_node_c->get_next( ).
    ENDWHILE.

    APPEND lw_return TO ft_return.
    CLEAR: lw_return.

    l_node = l_iterator->get_next( ).
  ENDWHILE.

ENDFORM.                    " GET_IT_EKPO
*&---------------------------------------------------------------------*
*&      Form  GET_FIELD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_field  USING fi_document TYPE REF TO if_ixml_document
                      fi_fieldname
             CHANGING fo_fieldvalue.

  DATA: l_filter    TYPE REF TO if_ixml_node_filter,
*        l_filter_p  TYPE REF TO if_ixml_node_filter,
        l_iterator  TYPE REF TO if_ixml_node_iterator,
        l_node      TYPE REF TO if_ixml_node,
*        l_node_c    TYPE REF TO if_ixml_node,
*        l_name      TYPE string,
        l_value     TYPE string.
*        l_fieldname TYPE string,
*        lw_return   LIKE LINE OF ft_return.


*-Field node
*  l_filter_p = fi_document->create_filter_name( name = fi_elename ).
  l_filter   = fi_document->create_filter_name( name = fi_fieldname ).

*-create a node iterator
  l_iterator = fi_document->create_iterator_filtered( l_filter ).

*-get node
  l_node = l_iterator->get_next( ).

*-get value
  l_value = l_node->get_value( ).

*-return value
  fo_fieldvalue = l_value.

ENDFORM.                    " GET_FIELD
⚠️ **GitHub.com Fallback** ⚠️