Tuesday 7 June 2011

ABAP Forum contributions 07062011

Thread: How do I subtract a number of days from a date in SAP ABAP?

Ans: HR_SEN_CALE_DAYS_DATE can be used to subtract days from a date.

----------------------------------------------------------------------------------
How do I present data in AVL grid in ABAP?  If I have a list of table results from a SQL query, how do I show this data in AVL?

To display ALV LISTS the function module used are :

REUSE_ALV_LIST_DISPLAY "For Normal LIST
REUSE_ALV_HIERARCHICAL_LIST_DISPLAY "For Hierarchical LIST

To display ALV GRID the function module used are :
REUSE_ALV_GRID_DISPLAY . "For GRID display

The most important component of the ALV is the FIELDCATALOG which is of
TYPE SLIS_T_FIEDLCAT_ALV

----------------------------------------------------------------------------------
 Thread: How do I name or title SAP ABAP PARAMETERS?

Transaction "SE38" ABAP Editor, enter the program name and choose "Text Elements" radio button option and there you can name or change the parameter names.
----------------------------------------------------------------------------------
Thread: How to resend an IDOC in SAP?

use transaction "BD87"
----------------------------------------------------------------------------------

Thursday 2 June 2011

SAP SPOOL to PDF file

**&---------------------------------------------------------------------*
**& Report  ZSPOOLTOPDF
**&
**&---------------------------------------------------------------------*
**&
**&
**&---------------------------------------------------------------------*
*
 REPORT  zspooltopdf.
*---Data Declarations
*Tables
 TABLES: tsp01, rststype.
* Internal table
 DATA: it_tsp01  TYPE STANDARD TABLE OF tsp01 WITH HEADER LINE,
       it_table  TYPE STANDARD TABLE OF soli  WITH HEADER LINE,
       it_table1 TYPE STANDARD TABLE OF soli  WITH HEADER LINE,
       it_otf    TYPE STANDARD TABLE OF itcoo WITH HEADER LINE,
       it_doc    LIKE TABLE OF docs,
       it_pdf    LIKE TABLE OF tline,
       it_pdf1   LIKE TABLE OF tline WITH HEADER LINE.
* Work area
 DATA: wa_tsp01 LIKE LINE OF it_tsp01,
       wa_pdf   LIKE LINE OF it_pdf1.
* Varialbles
 DATA: v_string(11) TYPE c VALUE '%',
       v_lines      TYPE i,
       v_size       TYPE i,
       v_client     LIKE tst01-dclient,
       v_name       LIKE tst01-dname,
       v_objtype    LIKE rststype-type,
       v_type       TYPE rststype-type,
       v_otf        TYPE c.
* Constants
 CONSTANTS: c_eof    TYPE soli VALUE '//'.
**&---------------------------------------------------------------------*
 INITIALIZATION.
*---Selection Screen
   SELECT-OPTIONS: s_spool FOR tsp01-rqident.            "Spool id
   PARAMETERS: p_date LIKE sy-datum DEFAULT sy-datum,    "Today's date
               p_dept LIKE tsp01-rqdivision,             "Department
               p_file TYPE string DEFAULT 'C:\temp\test1.pdf'.
*---Start of selection
 START-OF-SELECTION.
   CONCATENATE p_date v_string INTO v_string.
*---get the list of spool nummbers
   SELECT *
     INTO TABLE it_tsp01
     FROM tsp01
     WHERE   rqident    IN   s_spool
       AND   rqdivision EQ   p_dept
       AND   rqcretime  LIKE v_string.
   IF sy-subrc <> 0.
     PERFORM bd_textbox_err(rstxpdft) USING 80
      'Spoolauftrag existiert nicht'(003).
     EXIT.
   ENDIF.
   IF NOT it_tsp01[] IS INITIAL.
     LOOP AT it_tsp01 INTO wa_tsp01.
       CLEAR: v_client, v_name, v_type, v_otf, v_objtype.
       v_client = wa_tsp01-rqclient.
       v_name   = wa_tsp01-rqo1name.
       CALL FUNCTION 'RSTS_GET_ATTRIBUTES'
         EXPORTING
           authority     = 'SP01'
           client        = v_client
           name          = v_name
           part          = 1
         IMPORTING
           type          = v_type
           objtype       = v_objtype
         EXCEPTIONS
           fb_error      = 1
           fb_rsts_other = 2
           no_object     = 3
           no_permission = 4.
       IF v_objtype(3) = 'OTF'.
         v_otf = 'X'.
       ELSE.
         v_otf = space.
       ENDIF.
       IF v_otf = 'X'.
*---convert the spool to an internal table
         REFRESH it_table.
         CALL FUNCTION 'RSPO_RETURN_SPOOLJOB'
           EXPORTING
             rqident              = wa_tsp01-rqident
             first_line           = 1
             last_line            = 0
           TABLES
             buffer               = it_table
           EXCEPTIONS
             no_such_job          = 1
             job_contains_no_data = 2
             selection_empty      = 3
             no_permission        = 4
             can_not_access       = 5
             read_error           = 6
             type_no_match        = 7
             OTHERS               = 8.
         IF sy-subrc <> 0.
           MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
         ENDIF.
         CLEAR v_lines.
         DESCRIBE TABLE it_table LINES v_lines.
         DELETE it_table  INDEX v_lines.
* merge the spools to one big table
         LOOP AT it_table.
           APPEND  it_table TO it_table1.
         ENDLOOP.
         AT LAST.
           APPEND c_eof TO it_table1.
         ENDAT.
       ENDIF.
     ENDLOOP.
     LOOP AT it_table1.
       CLEAR it_otf.
       it_otf = it_table1.
       APPEND  it_otf.
     ENDLOOP.
*---Convert OTF into PDF
     CALL FUNCTION 'CONVERT_OTF_2_PDF'
       EXPORTING
         use_otf_mc_cmd         = 'X'
       IMPORTING
         bin_filesize           = v_size
       TABLES
         otf                    = it_otf
         doctab_archive         = it_doc
         lines                  = it_pdf
       EXCEPTIONS
         err_conv_not_possible  = 1
         err_otf_mc_noendmarker = 2
         OTHERS                 = 3.
     IF sy-subrc <> 0.
       MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                  WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
     ENDIF.
*---Dowload to file
     IF sy-batch NE 'X'.
       CALL METHOD cl_gui_frontend_services=>gui_download
         EXPORTING
           filename = p_file
           filetype = 'BIN'
         CHANGING
           data_tab = it_pdf.
       IF sy-subrc <> 0.
         MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
       ENDIF.

     ELSE.
       DATA: BEGIN OF it_mess_att OCCURS 0,
             i_buffer TYPE string,
       END OF it_mess_att.
       DATA : gd_buffer TYPE string.
       DATA: wa_mess_att LIKE gd_buffer.
       CLEAR it_mess_att.
       REFRESH it_mess_att[].

       LOOP AT it_pdf INTO wa_pdf.
         APPEND wa_pdf TO it_pdf1.
         CLEAR wa_pdf.
       ENDLOOP.
* Transfer the 132-long strings to 255-long strings
       LOOP AT it_pdf1.
         TRANSLATE it_pdf1 USING ' ~'.
         CONCATENATE gd_buffer it_pdf1 INTO gd_buffer.
       ENDLOOP.
       TRANSLATE gd_buffer USING '~ '.
       DO.
         wa_mess_att = gd_buffer.
         APPEND it_mess_att.
         SHIFT gd_buffer LEFT BY 255 PLACES.
         IF gd_buffer IS INITIAL.
           EXIT.
         ENDIF.
       ENDDO.
       OPEN DATASET p_file FOR OUTPUT IN TEXT MODE  ENCODING DEFAULT.
       IF sy-subrc NE 0.
         EXIT.
       ELSE.
*       LOOP AT it_pdf1.
*         TRANSFER it_pdf1 TO p_file.
*       ENDLOOP.
         CLOSE DATASET p_file.
       ENDIF.
     ENDIF.
   ENDIF.

Sunday 29 May 2011

XML File upload to SAP

& Report  z_xit_xml_check
*&---------------------------------------------------------------------*
  REPORT  z_xit_xml_check.
    DATA: BEGIN OF itab OCCURS 0,
          updatetype TYPE string,
          usrn(10) TYPE c,
          uprn(10) TYPE c,
          saon(10) TYPE c,
          paonnumbersuffix(10) TYPE c,
          paontext(10) TYPE c,
          description(10) TYPE c,
          location(10) TYPE c,
          town(10) TYPE c,
          posttown(10) TYPE c,
          postcode(10) TYPE c,
          county(10) TYPE c,
          x(10) TYPE c,
          y(10) TYPE c,
    END OF itab.
  TYPE-POOLS: ixml.
  TYPES: BEGIN OF t_xml_line,
          data(256) TYPE x,
        END OF t_xml_line.
  DATA: flag TYPE c.
  DATA: idx TYPE i VALUE 0.
  DATA: w_count TYPE i VALUE 0.
  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_xmldata         TYPE string.
  DATA: l_elem            TYPE REF TO if_ixml_element,
        l_root_node       TYPE REF TO if_ixml_node,
        l_next_node       TYPE REF TO if_ixml_node,
        l_name            TYPE string,
        l_iterator        TYPE REF TO if_ixml_node_iterator.
  DATA: l_xml_table       TYPE TABLE OF t_xml_line,
        l_xml_line        TYPE t_xml_line,
        l_xml_table_size  TYPE i.
  DATA: l_filename        TYPE string.

  PARAMETERS: pa_file TYPE char1024 DEFAULT
  'H:\My_Documents\example2.xml'.
* Validation of XML file: Only DTD included in xml document is
*supported
  PARAMETERS: pa_val  TYPE char1 AS CHECKBOX.
  START-OF-SELECTION.
*   Creating the main iXML factory
    l_ixml = cl_ixml=>create( ).
*   Creating a stream factory
    l_streamfactory = l_ixml->create_stream_factory( ).
    PERFORM get_xml_table CHANGING l_xml_table_size l_xml_table.

*   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 ).
*   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 ).
*   Validate a document
    IF pa_val EQ 'X'.
      l_parser->set_validating( mode = if_ixml_parser=>co_validate ).
    ENDIF.
*   Parse the stream
    IF l_parser->parse( ) NE 0.
      IF l_parser->num_errors( ) NE 0.
        DATA: parseerror TYPE REF TO if_ixml_parse_error,
              str        TYPE string,
              i          TYPE i,
              count      TYPE i,
              index      TYPE i.
        count = l_parser->num_errors( ).
        WRITE: count, ' parse errors have occured:'.
        index = 0.
        WHILE index < count.
          parseerror = l_parser->get_error( index = index ).
          i = parseerror->get_line( ).
          WRITE: 'line: ', i.
          i = parseerror->get_column( ).
          WRITE: 'column: ', i.
          str = parseerror->get_reason( ).
          WRITE: str.
          index = index + 1.
        ENDWHILE.
      ENDIF.
    ENDIF.
*   Process the document
    IF l_parser->is_dom_generating( ) EQ 'X'.
      PERFORM process_dom USING l_document.
    ENDIF.
LOOP AT ITAB.
WRITE:/ ITAB-USRN.
ENDLOOP.
*&--------------------------------------------------------------------*
*&      Form  get_xml_table
*&--------------------------------------------------------------------*
  FORM get_xml_table CHANGING l_xml_table_size TYPE i
                              l_xml_table      TYPE STANDARD TABLE.
*   Local variable declaration
    DATA: l_len      TYPE i,
          l_len2     TYPE i,
          l_tab      TYPE tsfixml,
          l_content  TYPE string,
          l_str1     TYPE string,
          c_conv     TYPE REF TO cl_abap_conv_in_ce,
          l_itab     TYPE TABLE OF string.

    l_filename = pa_file.
*   upload a file from the client's workstation
    CALL METHOD cl_gui_frontend_services=>gui_upload
      EXPORTING
        filename   = l_filename
        filetype   = 'BIN'
      IMPORTING
        filelength = l_xml_table_size
      CHANGING
        data_tab   = l_xml_table
      EXCEPTIONS
        OTHERS     = 19.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
*   Writing the XML document to the screen
    CLEAR l_str1.
    LOOP AT l_xml_table INTO l_xml_line.
      c_conv = cl_abap_conv_in_ce=>create( input = l_xml_line-data
      replacement = space  ).
      c_conv->read( IMPORTING data = l_content len = l_len ).
      CONCATENATE l_str1 l_content INTO l_str1.
    ENDLOOP.
    l_str1 = l_str1+0(l_xml_table_size).
    SPLIT l_str1 AT cl_abap_char_utilities=>cr_lf INTO TABLE l_itab.
    WRITE: /.
    WRITE: /' XML File'.
    WRITE: /.
    LOOP AT l_itab INTO l_str1.
      REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>horizontal_tab
      IN
        l_str1 WITH space.
      WRITE: / l_str1.
    ENDLOOP.
    WRITE: /.
  ENDFORM.                    "get_xml_table
*&--------------------------------------------------------------------*
*&      Form  process_dom
*&--------------------------------------------------------------------*
  FORM process_dom USING 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 ?= 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.
*          CONCATENATE 'itab-' name INTO <pt>.

          DATA: wa LIKE LINE OF itab.
          FIELD-SYMBOLS <pt> TYPE ANY.
          TRANSLATE name TO UPPER CASE.
          ASSIGN COMPONENT name OF STRUCTURE wa TO <pt>.
          MOVE value TO <pt>.

          IF flag NE space.
            MODIFY itab FROM wa INDEX idx.
            IF name = 'Y'.
              CLEAR flag.
            ENDIF.
          ELSE.
            APPEND wa TO itab.
            MOVE 'X' TO flag.
            ADD 1 TO idx.
          ENDIF.


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

    ENDWHILE.

  ENDFORM.                    "process_dom