Descargar Grupo de Funciones + Includes al PC

*&---------------------------------------------------------------------*
*& Report  Z_TEST
*&
*&---------------------------------------------------------------------*
REPORT z_test.

TABLES: tadir, d010sinf.

TYPES:  line(200) TYPE c.

DATA: total(5)  TYPE n VALUE 0, failed(5) TYPE n VALUE 0.

DATA: iadir    LIKE tadir OCCURS 100 WITH HEADER LINE,
      i010sinf LIKE d010sinf OCCURS 100 WITH HEADER LINE,
      BEGIN OF src_cde OCCURS 100,
        line TYPE line,
      END OF src_cde,
      src_cde2 LIKE src_cde OCCURS 100 WITH HEADER LINE,
      BEGIN OF tot_src_cde OCCURS 1000,
        line TYPE line,
      END OF tot_src_cde,
      message TYPE line,
      lin     TYPE p.

PARAMETERS: obj_name  LIKE tadir-obj_name.
PARAMETERS: devclass LIKE tadir-devclass,
            lcl_file LIKE rlgrap-filename DEFAULT 'C:\TEMP\'.


AT SELECTION-SCREEN.
  PERFORM determinar_programas.

START-OF-SELECTION.
  PERFORM descargar_codigo_fuente.
  PERFORM info_usuario.


*&---------------------------------------------------------------------*
*&      Form  DETERMINAR_PROGRAMAS
*&---------------------------------------------------------------------*
FORM determinar_programas.
  RANGES prog FOR d010sinf-prog.
*---
  SELECT * FROM tadir INTO TABLE iadir WHERE
                      devclass = devclass
                 AND  obj_name EQ obj_name
                 AND  object = 'FUGR'.
  SORT iadir AS TEXT.
  LOOP AT iadir.
    prog-sign = 'I'.
    prog-option = 'CP'.
    CONCATENATE 'L' iadir-obj_name '*' INTO prog-low.
    APPEND prog.
  ENDLOOP.

  DESCRIBE TABLE prog LINES lin.
  IF lin EQ 0.
    MESSAGE ID '5M' TYPE 'E' NUMBER '48'.
  ENDIF.
  SELECT * FROM d010sinf INTO TABLE i010sinf WHERE
                               prog IN prog
                          AND r3state = 'A'.
  SORT i010sinf AS TEXT BY vern DESCENDING.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  DESCARGAR_CODIGO_FUENTE
*&---------------------------------------------------------------------*
FORM descargar_codigo_fuente.
  TABLES : tcp00.
  TYPES : BEGIN OF link,
            fctnam(48)  TYPE c,
            xfctnam(48) TYPE c,
            pronam      LIKE d010sinf-prog,
            vernr       LIKE d010sinf-vern,
          END OF link.
  DATA : ilink TYPE link OCCURS 100 WITH HEADER LINE.
  DATA : ilink2 TYPE link OCCURS 100 WITH HEADER LINE.
  DATA: i TYPE i.
  DATA: string(48) TYPE c.
  DATA: function TYPE c.
  DATA: l_include TYPE c.
  DATA: nform LIKE tcp00-cpcodepage, codep LIKE tcp00-cpcodepage.

  REFRESH tot_src_cde.
  CONCATENATE 'Sistema:'(001) sy-sysid '.'
            INTO tot_src_cde SEPARATED BY space.
  APPEND tot_src_cde.
  CONCATENATE 'Las siguientes Funciones <-> Programas'
              'fueron selecionadas para descargar:'
              INTO tot_src_cde SEPARATED BY space.
  APPEND tot_src_cde.
  CLEAR tot_src_cde.
  APPEND tot_src_cde.
  REFRESH ilink.
*-- crear una tabla ilink que enumere qué programa contiene qué función
  LOOP AT i010sinf.
    REFRESH src_cde.
    READ REPORT i010sinf-prog INTO src_cde.
    IF sy-subrc = 0.
      ilink-pronam = i010sinf-prog.
      CLEAR function.
      CLEAR l_include.
      CLEAR i.
      LOOP AT src_cde.
        i = i + 1.

        SEARCH src_cde FOR 'include' STARTING AT i.
        IF sy-subrc = 0 AND i010sinf-rstat IS INITIAL.
           CONCATENATE 'INCLUDE ' i010sinf-prog
                  INTO ilink-fctnam
          SEPARATED BY space.
          ilink-vernr  = i010sinf-vern.
          l_include = 'X'.
          exit.
*          i = sy-tabix.
*          IF sy-fdpos = 3.
*            l_include = 'X'.
*            READ TABLE src_cde INDEX i.
*            ilink-fctnam = src_cde+3(48).
*            TRANSLATE ilink-fctnam TO UPPER CASE.
*            ilink-vernr = i010sinf-vern.
*          ENDIF.
        ENDIF.

        SEARCH src_cde FOR 'function' STARTING AT i.
        IF sy-subrc = 0.
          i = sy-tabix.
          IF sy-fdpos = 0.
            function = 'X'.
            READ TABLE src_cde INDEX i.
            ilink-fctnam = src_cde(48).
            TRANSLATE ilink-fctnam TO UPPER CASE.
            ilink-vernr = i010sinf-vern.
          ENDIF.
        ENDIF.
        IF function = 'X' OR i GE 10.
          EXIT.
        ENDIF.

      ENDLOOP.
      IF function = 'X' or l_include = 'X'.
        string = ilink-fctnam.
        SEARCH string FOR '$'.
        IF sy-subrc NE 0.
          APPEND ilink.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.

  SORT ilink AS TEXT BY fctnam ASCENDING.

*--refinar tabla ilink, eligir siempre la última versión:
  CLEAR ilink.
  CALL FUNCTION 'SYSTEM_FORMAT'
    IMPORTING
      codep = codep
      nform = nform.
  LOOP AT ilink.
    IF ilink-fctnam = ilink2-fctnam.
      CONTINUE.
    ELSE.
      ilink2 = ilink.
      ilink2-xfctnam = ilink2-fctnam.
      APPEND ilink2.
    ENDIF.
  ENDLOOP.

  SORT ilink2 BY xfctnam.
*--escribir la lista de archivos seleccionados:
  LOOP AT ilink2.
    CLEAR tot_src_cde.
    tot_src_cde(48) = ilink2-fctnam.
    tot_src_cde+56(40) = ilink2-pronam.
*    TOT_SRC_CDE+100(6) = ILINK2-VERNR.
    APPEND tot_src_cde.
  ENDLOOP.

*--escribir el código fuente de las funciones seleccionadas:
  LOOP AT ilink2.
    total = total + 1.
    CLEAR tot_src_cde.
    APPEND tot_src_cde.
    APPEND tot_src_cde.
*    CONCATENATE '========>> Codigo fuente de'(004) ilink2-fctnam ':'
*                  INTO tot_src_cde SEPARATED BY space.
*    APPEND tot_src_cde.
    string = ilink2-fctnam.
    REFRESH src_cde.
    READ TABLE i010sinf WITH KEY prog = ilink2-pronam.
    READ REPORT i010sinf-prog INTO src_cde.
    IF sy-subrc = 0.
      REFRESH src_cde2.
      LOOP AT src_cde.
        src_cde2 = src_cde.
        SHIFT src_cde2 BY 38 PLACES RIGHT.
        string = ilink2-fctnam.
        SHIFT string UP TO space LEFT.
        SHIFT string BY 1 PLACES LEFT.
        src_cde2(38) = string.
        APPEND src_cde2.
      ENDLOOP.
      APPEND LINES OF src_cde2 TO tot_src_cde.
    ELSE.
      failed = failed + 1.
      CONCATENATE 'Error al descargar :' i010sinf-prog
                  INTO message SEPARATED BY space.
      WRITE: / message.
      APPEND message TO tot_src_cde.
    ENDIF.
  ENDLOOP.

  DATA: filename TYPE string.
  filename = lcl_file.
  CALL METHOD cl_gui_frontend_services=>gui_download
    EXPORTING
      filename                = filename
      filetype                = 'DAT'
    CHANGING
      data_tab                = tot_src_cde[]
    EXCEPTIONS
      file_write_error        = 1
      no_batch                = 2
      gui_refuse_filetransfer = 3
      invalid_type            = 4
      no_authority            = 5
      unknown_error           = 6
      header_not_allowed      = 7
      separator_not_allowed   = 8
      filesize_not_allowed    = 9
      header_too_long         = 10
      dp_error_create         = 11
      dp_error_send           = 12
      dp_error_write          = 13
      unknown_dp_error        = 14
      access_denied           = 15
      dp_out_of_memory        = 16
      disk_full               = 17
      dp_timeout              = 18
      file_not_found          = 19
      dataprovider_exception  = 20
      control_flush_error     = 21
      not_supported_by_gui    = 22
      OTHERS                  = 23.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  INFO_USUARIO
*&---------------------------------------------------------------------*
FORM info_usuario.
  ULINE.
  CONCATENATE 'Total de archivos procesados    :' total
   INTO message SEPARATED BY space.
  WRITE: / message.
  CONCATENATE 'No se pudieron leer             :' failed
   INTO message SEPARATED BY space.
  WRITE: / message.
  ULINE.
  CONCATENATE 'Datos almacenados en el archivo :'  lcl_file
   INTO message SEPARATED BY space.
  WRITE: / message.
ENDFORM.