SAP Crawler

  1. REPORT  z_sapcrawler.
  2.  
  3. * 1.0.1  - Anyadida descarga de pantallas
  4. * 1.0.2  - Anyadida rutina de cambio de parmetros y ttulo
  5. * 1.0.3  - Anyadimos ms parmetros a la seleccin
  6. * 1.0.4  - Anyadimos las descargas de las clases
  7. * 1.0.5  - Anyadimos estructura jerarquica de directorios
  8. * 1.0.6  - Evitamos descargar los includes ya descargados y las vistas VIEWFRAME y VIEWPROC.
  9. *          Anyadirmos Busqueda por autor.
  10. *          Arreglado bug de SE11
  11. * 1.0.7  - Descarga las tablas como PDF
  12. *        - Descarga SmartForms en XML ** Problemas de dilogo.
  13. *        - Descarga SapScripts
  14. * 1.0.8  - Buscamos la impresora SAPWIN para simular LOCL
  15. *        - Eliminamos los spools que hemos creado.
  16. * 1.0.9  - Anydimos los mensajes (SE91)
  17. * 1.0.10 - Arreglado error de descarga de las pantallas
  18. * 2.0    - Migracion a clases
  19. *        - Anyadida descarga de vistas
  20. *        - Anyadido descarga de TTYP
  21. * 2.1    - Arreglado BUG de bucle infinito, hay que revisar la clase abap_obj_finder, se enbucla y explota
  22. * 2.2    - Areglado el bucle infinito de abap_obj_finder.
  23. * 2.3    - Mejoras en el rendimiento y en la salida de datos
  24.  
  25. CONSTANTS version(10) VALUE 'v2.3'.
  26.  
  27. TABLES: tadir.
  28.  
  29. SELECT-OPTIONS: s_pack FOR tadir-devclass,
  30.                 s_obj  FOR tadir-object,
  31.                 s_objn  FOR tadir-obj_name,
  32.                 s_author FOR tadir-author.
  33.  
  34. SELECTION-SCREEN SKIP 1.
  35. PARAMETERS dest(80) DEFAULT 'M:\ABAP'.
  36.  
  37. CLASS lcl_frontend DEFINITION FINAL.
  38.   PUBLIC SECTION.
  39.  
  40.     TYPES: BEGIN OF ty_download,
  41.              prog     TYPE string,
  42.              programa TYPE programm,
  43.              path     TYPE string,
  44.            END OF ty_download.
  45.     DATA: i_download TYPE SORTED TABLE OF ty_download WITH UNIQUE KEY prog.
  46.  
  47.     METHODS: dir_create IMPORTING p_dir       TYPE string
  48.                         RETURNING VALUE(r_rc) TYPE i,
  49.  
  50.       is_downloaded IMPORTING p_prg          TYPE any
  51.                     RETURNING VALUE(r_found) TYPE xfeld,
  52.       file_download IMPORTING p_prg     TYPE string "<- Programa descargado
  53.                               p_destino TYPE string "<- Donde descargarlo
  54.                               p_data    TYPE stringtab. "<- El programa en si.
  55.  
  56. ENDCLASS.
  57.  
  58.  
  59. CLASS lcl_frontend IMPLEMENTATION.
  60.  
  61.   METHOD is_downloaded.
  62.     READ TABLE i_download TRANSPORTING NO FIELDS WITH KEY prog = p_prg.
  63.     r_found = COND #( WHEN sy-subrc EQ 0 THEN 'X' ELSE '' ).
  64.   ENDMETHOD.
  65.  
  66.   METHOD file_download.
  67.     DATA: local_data TYPE stringtab.
  68.  
  69.     CHECK is_downloaded( p_prg = p_prg ) IS INITIAL AND lines( p_data ) > 0. " Evitamos descargar dos veces el mismo programa
  70.  
  71.     DATA(l_destino) = p_destino.
  72.  
  73.     TRANSLATE l_destino USING '/_~\'.
  74.  
  75.     local_data = p_data[].
  76.  
  77.     i_download = VALUE #( BASE i_download ( prog = p_prg programa = p_prg path = l_destino ) ).
  78.  
  79.     CALL METHOD cl_gui_frontend_services=>gui_download
  80.       EXPORTING
  81.         filename                = l_destino
  82.         filetype                = 'ASC'
  83.         confirm_overwrite       = space
  84.       CHANGING
  85.         data_tab                = local_data
  86.       EXCEPTIONS
  87.         file_write_error        = 1
  88.         no_batch                = 2
  89.         gui_refuse_filetransfer = 3
  90.         invalid_type            = 4
  91.         no_authority            = 5
  92.         unknown_error           = 6
  93.         header_not_allowed      = 7
  94.         separator_not_allowed   = 8
  95.         filesize_not_allowed    = 9
  96.         header_too_long         = 10
  97.         dp_error_create         = 11
  98.         dp_error_send           = 12
  99.         dp_error_write          = 13
  100.         unknown_dp_error        = 14
  101.         access_denied           = 15
  102.         dp_out_of_memory        = 16
  103.         disk_full               = 17
  104.         dp_timeout              = 18
  105.         file_not_found          = 19
  106.         dataprovider_exception  = 20
  107.         control_flush_error     = 21
  108.         not_supported_by_gui    = 22
  109.         error_no_gui            = 23
  110.         OTHERS                  = 24.
  111.   ENDMETHOD.
  112.  
  113.   METHOD dir_create.
  114.     CLEAR r_rc.
  115.  
  116.     IF p_dir IS INITIAL.
  117.       r_rc = 8.
  118.     ELSE.
  119.       cl_gui_frontend_services=>directory_exist(
  120.         EXPORTING
  121.           directory            = p_dir                 " Directory name
  122.         RECEIVING
  123.           result               = r_rc                 " Result
  124.         EXCEPTIONS
  125.           cntl_error           = 1                " Control error
  126.           error_no_gui         = 2                " No GUI available
  127.           wrong_parameter      = 3                " Incorrect parameter
  128.           not_supported_by_gui = 4                " GUI does not support this
  129.           OTHERS               = 5
  130.       ).
  131.       IF sy-subrc <> 0.
  132.         cl_gui_frontend_services=>directory_create(
  133.           EXPORTING
  134.             directory                = p_dir                 " Directory name
  135.           CHANGING
  136.             rc                       = r_rc                 " Return Code
  137.           EXCEPTIONS
  138.             directory_create_failed  = 1                " Could not create directory
  139.             cntl_error               = 2                " A Control Error Occurred
  140.             error_no_gui             = 3                " No GUI available
  141.             directory_access_denied  = 4                " Access denied
  142.             directory_already_exists = 5                " Directory already exists
  143.             path_not_found           = 6                " Path does not exist
  144.             unknown_error            = 7                " Unknown error
  145.             not_supported_by_gui     = 8                " GUI does not support this
  146.             wrong_parameter          = 9                " Wrong parameter
  147.             OTHERS                   = 10
  148.         ).
  149.         IF sy-subrc <> 0.
  150.           r_rc = sy-subrc.
  151.  
  152.         ENDIF.
  153.       ELSE.
  154.         r_rc = 0.
  155.       ENDIF.
  156.     ENDIF.
  157.  
  158.   ENDMETHOD.
  159.  
  160. ENDCLASS.
  161.  
  162. CLASS lcl_abap_obj_finder DEFINITION.
  163.   PUBLIC SECTION.
  164.     TYPES: BEGIN OF ty_result,
  165.              functions    TYPE stringtab,
  166.              transactions TYPE stringtab,
  167.              programs     TYPE stringtab,
  168.              tables       TYPE stringtab,
  169.            END OF ty_result.
  170.  
  171.     METHODS:
  172.       constructor
  173.         IMPORTING
  174.           it_source TYPE stringtab,
  175.       find_objects
  176.         RETURNING VALUE(rs_result) TYPE ty_result.
  177.   PRIVATE SECTION.
  178.     DATA: mt_source TYPE stringtab.
  179.  
  180.     METHODS:
  181.       find_by_regex
  182.         IMPORTING
  183.                   iv_regex        TYPE string
  184.         RETURNING VALUE(rt_found) TYPE stringtab.
  185. ENDCLASS.
  186.  
  187. CLASS lcl_abap_obj_finder IMPLEMENTATION.
  188.  
  189.   METHOD constructor.
  190.     mt_source = it_source.
  191.   ENDMETHOD.
  192.  
  193.   METHOD find_by_regex.
  194.  
  195.     DATA: lv_regex TYPE string,
  196.           lv_line  TYPE string,
  197.           lv_rest  TYPE string,
  198.           lv_word  TYPE string,
  199.           lv_off   TYPE i,
  200.           lv_len   TYPE i.
  201.  
  202.     " iv_regex ya viene con los '|' entre frases
  203.     " Ej: (INTO CORRESPONDING FIELDS OF TABLE|INTO DATA|FROM)
  204.     lv_regex = |({ iv_regex })\\s+@?(DATA\\()?([A-Z0-9_]+)|.
  205.     DATA(lt_src) = mt_source[].
  206.     DELETE lt_src WHERE table_line CP '#**' OR
  207.                         table_line IS INITIAL OR
  208.                         table_line CP '"*'. " Evitamos comentarios
  209.     LOOP AT lt_src INTO lv_line WHERE table_line IS NOT INITIAL.
  210.  
  211. *      CHECK lv_line+0(1) NE '*'. " <-- Evitamos comentarios
  212.       lv_rest = lv_line.
  213.  
  214.       WHILE abap_true = abap_true.
  215.  
  216.         CLEAR: lv_word, lv_off, lv_len.
  217.  
  218.         FIND REGEX lv_regex
  219.              IN lv_rest
  220.              IGNORING CASE
  221.              MATCH OFFSET lv_off
  222.              MATCH LENGTH lv_len
  223.              SUBMATCHES DATA(lv_phrase) DATA(lv_dummy) lv_word.
  224.  
  225.         IF sy-subrc <> 0.
  226.           EXIT.
  227.         ENDIF.
  228.  
  229.         IF lv_word IS NOT INITIAL. " <-- Solo nos interesan objetos personalizados
  230.           APPEND to_upper( lv_word ) TO rt_found.
  231.         ENDIF.
  232.  
  233.         " Avanzar en la cadena para buscar más ocurrencias en la misma línea
  234.         SHIFT lv_rest BY lv_off + lv_len PLACES LEFT.
  235.  
  236.       ENDWHILE.
  237.  
  238.     ENDLOOP.
  239.     SORT rt_found.
  240.     DELETE ADJACENT DUPLICATES FROM rt_found.
  241.  
  242.   ENDMETHOD.
  243.  
  244.  
  245.  
  246.   METHOD find_objects.
  247.     rs_result = VALUE ty_result( ).
  248.  
  249.     " Buscar funciones: CALL FUNCTION 'FUNCNAME'
  250.     rs_result-functions = find_by_regex( `CALL\s+FUNCTION` ). "s+'([A-Z0-9_]+)'` ).
  251.  
  252.     " Buscar transacciones: CALL TRANSACTION 'TCD'
  253.     rs_result-transactions = find_by_regex( `CALL\s+TRANSACTION` ). "s+'([A-Z0-9_]+)'` ).
  254.  
  255.     " Buscar programas: SUBMIT progname
  256.     rs_result-programs = find_by_regex( `SUBMIT` ). "\s+([A-Z0-9_]+)` ).
  257.  
  258.     " Buscar tablas: FROM/INTO/UPDATE/INSERT/DELETE <tabla>
  259.     DATA(l_regex) = 'APPENDING CORRESPONDING FIELDS OF TABLE|' &&
  260.                     'INTO CORRESPONDING FIELDS OF TABLE|'  &&
  261.                     'INTO CORRESPONDING FIELDS OF|' &&
  262.                     'INTO DATA|' &&
  263.                     'INTO TABLE|' &&
  264.                     'UPDATE|' &&
  265.                     'INSERT INTO|' &&
  266.                     'DELETE FROM|' &&
  267.                     'FROM'.
  268. *                    replace all occurrences of '~' in l_regex with '\s+'.
  269.     rs_result-tables = find_by_regex( CONV #( l_regex ) ).
  270.  
  271.   ENDMETHOD.
  272.  
  273. ENDCLASS.
  274.  
  275.  
  276. CLASS lcl_main DEFINITION FINAL.
  277.   PUBLIC SECTION.
  278.  
  279.     CONSTANTS: c_ext_abap     TYPE c LENGTH 5 VALUE '.abap',
  280.                c_ext_csv      TYPE c LENGTH 5 VALUE '.csv',
  281.                c_ext_mensages TYPE c LENGTH 5 VALUE '.msg',
  282.                c_ext_md       TYPE c LENGTH 5 VALUE '.md',
  283.                c_sep          TYPE c LENGTH 1 VALUE '|'.
  284.  
  285.  
  286.     DATA: r_pack     TYPE RANGE OF tadir-devclass,
  287.           r_obj      TYPE RANGE OF tadir-object,
  288.           r_objn     TYPE RANGE OF tadir-obj_name,
  289.           r_author   TYPE RANGE OF tadir-author,
  290.  
  291.           dest       TYPE string,
  292.           raiz       TYPE string,
  293.  
  294.           i_list     TYPE stringtab,
  295.           i_includes TYPE stringtab,
  296.           i_tadir    TYPE STANDARD TABLE OF tadir.
  297.  
  298.     METHODS:
  299.       constructor IMPORTING i_cl_front TYPE REF TO lcl_frontend OPTIONAL,
  300.  
  301.       data_load IMPORTING p_pack   TYPE ANY TABLE
  302.                           p_obj    TYPE ANY TABLE
  303.                           p_objn   TYPE ANY TABLE
  304.                           p_author TYPE ANY TABLE
  305.                           p_dest   TYPE string,
  306.  
  307.       data_work_sapscript IMPORTING p_tadir TYPE tadir,
  308.  
  309.       data_work_doma IMPORTING p_tadir TYPE tadir
  310.                      CHANGING  c_list  TYPE stringtab,
  311.  
  312.       data_work_tcode IMPORTING p_tadir TYPE tadir
  313.                       CHANGING  c_list  TYPE stringtab,
  314.  
  315.       data_work_dtel IMPORTING p_tadir TYPE tadir
  316.                      CHANGING  c_list  TYPE stringtab,
  317.  
  318.       data_work_msag IMPORTING p_tadir TYPE tadir
  319.                      CHANGING  c_list  TYPE stringtab,
  320.  
  321.       data_work_ttyp IMPORTING p_tadir TYPE tadir
  322.                      CHANGING  c_list  TYPE stringtab,
  323.  
  324.       data_work_tabl IMPORTING p_tadir TYPE tadir
  325.                      CHANGING  c_list  TYPE stringtab,
  326.  
  327.       data_work_view IMPORTING p_tadir TYPE tadir
  328.                      CHANGING  c_list  TYPE stringtab,
  329.  
  330.       data_work_fugr IMPORTING p_tadir TYPE tadir
  331.                      CHANGING  c_list  TYPE stringtab,
  332.  
  333.       data_work_func IMPORTING p_tadir TYPE tadir
  334.                      CHANGING  c_list  TYPE stringtab,
  335.  
  336.       data_work_prog IMPORTING p_tadir TYPE tadir
  337.                      CHANGING  c_list  TYPE stringtab,
  338.  
  339.       data_work_finder IMPORTING it_src TYPE stringtab,
  340.  
  341.       data_work_finder_detail IMPORTING p_tadir TYPE tadir
  342.                               CHANGING  i_list  TYPE stringtab,
  343.  
  344.       data_work_clas IMPORTING p_tadir TYPE tadir
  345.                      CHANGING  c_list  TYPE stringtab,
  346.  
  347.       data_work_prog_dynpro IMPORTING p_tadir TYPE tadir
  348.                             CHANGING  c_list  TYPE stringtab,
  349.  
  350.       data_work_prog_dynpro_download IMPORTING p_filename TYPE string
  351.                                                p_h        TYPE d020s,
  352.  
  353.       data_work_prog_includes IMPORTING p_tadir TYPE tadir
  354.                               CHANGING  c_list  TYPE stringtab,
  355.  
  356.       data_work_smartforms IMPORTING p_tadir TYPE tadir,
  357.  
  358.       data_work_read_report IMPORTING i_name        TYPE string
  359.                             RETURNING VALUE(rt_src) TYPE stringtab,
  360.  
  361.       data_work,
  362.  
  363.       data_work_list.
  364.  
  365.   PRIVATE SECTION.
  366.  
  367.     DATA: cl_front TYPE REF TO lcl_frontend.
  368.  
  369. ENDCLASS.
  370.  
  371. CLASS lcl_main IMPLEMENTATION.
  372.  
  373.   METHOD constructor.
  374.     IF i_cl_front IS BOUND.
  375.       cl_front = i_cl_front.
  376.     ELSE.
  377.       cl_front = NEW lcl_frontend(  ).
  378.     ENDIF.
  379.   ENDMETHOD.
  380.  
  381.   METHOD data_load.
  382.     r_pack = CORRESPONDING #( p_pack[] ).
  383.     r_obj = CORRESPONDING #( p_obj ).
  384.     r_objn = CORRESPONDING #( p_objn ).
  385.     r_author = CORRESPONDING #( p_author ).
  386.     dest = p_dest.
  387.  
  388.     SELECT * FROM  tadir INTO TABLE i_tadir
  389.            WHERE  devclass  IN r_pack  AND
  390.                   object    IN r_obj   AND
  391.                   obj_name  IN r_objn  AND
  392.                   author    IN r_author
  393.                   ORDER BY obj_name.
  394.   ENDMETHOD.
  395.  
  396.   METHOD data_work_dtel.
  397.     DATA l_str TYPE string.
  398.  
  399.     CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
  400.     SELECT SINGLE domname, datatype, leng FROM  dd04l INTO @DATA(l_dd40l) WHERE rollname = @p_tadir-obj_name.
  401.  
  402.     l_str = |{ c_sep }DTEL{ c_sep }{ p_tadir-obj_name }{ c_sep }TECH{ c_sep }{ l_dd40l-domname }{ c_sep }{ l_dd40l-datatype }{ c_sep }{ l_dd40l-leng }{ c_sep }|.
  403.  
  404.     APPEND l_str TO c_list.
  405.  
  406.  
  407.     SELECT ddlanguage, scrtext_s, scrtext_m, scrtext_l FROM dd04t INTO @DATA(l_dd04t) WHERE rollname = @p_tadir-obj_name.
  408.  
  409.       l_str = |{ c_sep }DTEL{ c_sep }{ p_tadir-obj_name }{ c_sep }LANG{ c_sep }{ l_dd04t-ddlanguage }{ c_sep }{ l_dd04t-scrtext_s }{ c_sep }{ l_dd04t-scrtext_m }{ c_sep }{ l_dd04t-scrtext_l }{ c_sep }|.
  410.       APPEND l_str TO c_list.
  411.     ENDSELECT.
  412.   ENDMETHOD.
  413.  
  414.  
  415.   METHOD data_work_sapscript.
  416.     DATA(ss) = CONV string( |{ dest }SAPSCRIPTS\\| ).
  417.     CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
  418.     IF cl_front->dir_create( p_dir = ss  ) IS INITIAL.
  419.  
  420.       ss = |{ ss }{ p_tadir-obj_name }{ c_ext_abap }|.
  421.  
  422.       SUBMIT rstxscrp WITH localfile = 'X'
  423.                   WITH dataset = ss
  424.                       WITH obj_name = p_tadir-obj_name
  425.                       AND RETURN.
  426.     ENDIF.
  427.   ENDMETHOD.
  428.  
  429.   METHOD data_work_doma.
  430.     DATA: l_str TYPE string.
  431.     CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
  432.     SELECT SINGLE datatype, leng, decimals FROM dd01l INTO @DATA(l_dd01l) WHERE domname = @p_tadir-obj_name.
  433.  
  434.  
  435.     l_str = |{ c_sep }DOMA{ c_sep }{ p_tadir-obj_name }{ c_sep }TECH{ c_sep }{ l_dd01l-datatype }{ c_sep }{ l_dd01l-leng }{ c_sep }{ l_dd01l-decimals }{ c_sep }|.
  436.     APPEND l_str TO c_list.
  437.  
  438.     SELECT domvalue_l, domvalue_h  FROM  dd07l INTO @DATA(l_dd07l) WHERE domname = @p_tadir-obj_name.
  439.  
  440.       l_str = |{ c_sep }DOMA{ c_sep }{ p_tadir-obj_name }{ c_sep }VALUE{ c_sep }L{ c_sep }{ l_dd07l-domvalue_l }{ c_sep }H{ c_sep }{ l_dd07l-domvalue_h }{ c_sep }|.
  441.       APPEND l_str TO c_list.
  442.  
  443.     ENDSELECT.
  444.     SELECT ddlanguage, scrtext_l, scrtext_s, scrtext_m FROM dd04t INTO @DATA(l_dd04t) WHERE rollname = @p_tadir-obj_name.
  445.  
  446.       l_str = |{ c_sep }DOMA{ c_sep }{ p_tadir-obj_name }{ c_sep }LANG{ c_sep }{ l_dd04t-ddlanguage }{ c_sep }{ l_dd04t-scrtext_s }{ c_sep }{ l_dd04t-scrtext_m }{ c_sep }{ l_dd04t-scrtext_l }{ c_sep }|.
  447.       APPEND l_str TO c_list.
  448.     ENDSELECT.
  449.   ENDMETHOD.
  450.  
  451.   METHOD data_work_tcode.
  452.     DATA l_str TYPE string.
  453.     CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
  454.     SELECT a~tcode,
  455.            a~pgmna,
  456.            a~dypno,
  457.            b~sprsl,
  458.            b~ttext
  459.       FROM tstc AS a
  460.       LEFT OUTER JOIN tstct AS b
  461.         ON a~tcode = b~tcode
  462.      WHERE a~tcode = @p_tadir-obj_name
  463.       INTO TABLE @DATA(lt_tcodes).
  464.  
  465.     LOOP AT lt_tcodes INTO DATA(l_tstc).
  466.       l_str = |{ c_sep }TRAN{ c_sep }{ l_tstc-tcode }{ c_sep }{ l_tstc-pgmna }{ c_sep }{ l_tstc-dypno }{ c_sep }{ l_tstc-sprsl }{ c_sep }{ l_tstc-ttext }{ c_sep }|.
  467.       APPEND l_str TO c_list.
  468.     ENDLOOP.
  469.   ENDMETHOD.
  470.  
  471.   METHOD data_work_smartforms.
  472.     CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
  473.     DATA(formname) = CONV tdsfname( p_tadir-obj_name ).
  474.     CALL FUNCTION 'FB_DOWNLOAD_FORM'
  475.       EXPORTING
  476.         i_formname           = formname
  477.         i_with_dialog        = ' '
  478. *           IMPORTING
  479. *       O_FORMNAME           =
  480.       EXCEPTIONS
  481.         no_name              = 1
  482.         no_form              = 2
  483.         no_access_permission = 3
  484.         illegal_language     = 4
  485.         illegal_formtype     = 5
  486.         OTHERS               = 6.
  487.   ENDMETHOD.
  488.  
  489.   METHOD data_work_msag.
  490.  
  491.     DATA: i_prog_tmp TYPE stringtab.
  492.     CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
  493.     SELECT sprsl, arbgb, msgnr, text FROM  t100 INTO @DATA(l_t100) WHERE  arbgb  = @p_tadir-obj_name.
  494.  
  495.       CONCATENATE '|"' l_t100-sprsl '"|"'
  496.                       l_t100-arbgb '"|"'
  497.                       l_t100-msgnr '"|"'
  498.                       l_t100-text'"|' INTO DATA(l_str).
  499.       APPEND l_str TO i_prog_tmp.
  500.     ENDSELECT.
  501.  
  502.     DATA(l_raiz) = CONV string( |{ dest }MSG~{ p_tadir-obj_name }{ c_ext_mensages }{ c_ext_md }| ).
  503.  
  504.     cl_front->file_download(
  505.       EXPORTING
  506.         p_prg     = CONV #( p_tadir-obj_name )
  507.         p_destino = CONV #( l_raiz )
  508.         p_data    = i_prog_tmp
  509.     ).
  510.  
  511.   ENDMETHOD.
  512.  
  513.   METHOD data_work_view.
  514.  
  515.     DATA: t_data TYPE stringtab.
  516.     CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
  517.     SELECT viewfield,
  518.            tabname,
  519.            fieldname,
  520.            objpos,
  521.            keyflag,
  522.            rollname
  523.  
  524.      FROM dd27s INTO TABLE @DATA(l_dd03l) WHERE viewname = @p_tadir-obj_name
  525.                                                  AND fieldname NOT LIKE '.%' " Evitamos los campos técnicos de las vistas
  526.      ORDER BY objpos.
  527.  
  528.     IF  lines( l_dd03l ) > 0.
  529.       APPEND '|viewfield|tabname|fieldname|position|keyflag|rollname|' TO t_data.
  530.       APPEND '|---|---|---|---|---|---|' TO t_data.
  531.  
  532.       LOOP AT l_dd03l INTO DATA(l_dd03l_wa).
  533. if l_dd03l_wa-keyflag is INITIAL. l_dd03l_wa-keyflag = '-'. endif.
  534.         DATA(l_str) = |\|{ l_dd03l_wa-viewfield }\|{ l_dd03l_wa-tabname }\|{ l_dd03l_wa-fieldname }\|{ l_dd03l_wa-objpos }\|{ l_dd03l_wa-keyflag }\|{ l_dd03l_wa-rollname }\||.
  535.         APPEND l_str TO t_data.
  536.       ENDLOOP.
  537.  
  538.       cl_front->file_download(
  539.         EXPORTING
  540.           p_prg     = CONV #( p_tadir-obj_name )
  541.           p_destino = CONV #( |{ dest }~SE11~{ p_tadir-obj_name }{ c_ext_md }| )
  542.           p_data    = t_data
  543.       ).
  544.     ENDIF.
  545.   ENDMETHOD.
  546.  
  547.   METHOD data_work_tabl.
  548.  
  549.     DATA: t_data TYPE stringtab.
  550.     CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
  551.     SELECT fieldname,
  552.            position,
  553.            keyflag,
  554.            rollname,
  555.            datatype,
  556.            leng,
  557.            decimals,
  558.            domname
  559.  
  560.      FROM dd03l INTO TABLE @DATA(l_dd03l) WHERE tabname = @p_tadir-obj_name AND rollname IS NOT NULL AND
  561.      fieldname NOT LIKE '.%' " Evitamos los campos técnicos de las tablas
  562.      ORDER BY position.
  563.  
  564.     IF  lines( l_dd03l ) > 0.
  565.       APPEND '|fieldname|position|keyflag|rollname|datatype|leng|decimals|domname|' TO t_data.
  566.       APPEND '|---|---|---|---|---|---|---|---|' TO t_data.
  567.  
  568.       LOOP AT l_dd03l INTO DATA(l_dd03l_wa).
  569.         if l_dd03l_wa-keyflag is INITIAL. l_dd03l_wa-keyflag = '-'. endif.
  570.         DATA(l_str) = |\|{ l_dd03l_wa-fieldname }\|{ l_dd03l_wa-position }\|{ l_dd03l_wa-keyflag }\|{ l_dd03l_wa-rollname }\|{ l_dd03l_wa-datatype }\|{ l_dd03l_wa-leng }\|{ l_dd03l_wa-decimals }\|{ l_dd03l_wa-domname }\||.
  571.         APPEND l_str TO t_data.
  572.       ENDLOOP.
  573.  
  574.       cl_front->file_download(
  575.         EXPORTING
  576.           p_prg     = CONV #( p_tadir-obj_name )
  577.           p_destino = CONV #( |{ dest }~SE11~{ p_tadir-obj_name }{ c_ext_md }| )
  578.           p_data    = t_data
  579.       ).
  580.     ENDIF.
  581.  
  582.   ENDMETHOD.
  583.  
  584.   METHOD data_work_ttyp.
  585.     CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
  586.     DATA l_str type string.
  587.     DATA: t_data TYPE stringtab.
  588.  
  589.     SELECT
  590. rowtype    ,
  591. rowkind    ,
  592. datatype   ,
  593. leng       ,
  594. decimals   ,
  595. keykind    ,
  596. keyfdcount ,
  597. generic    ,
  598. typelen
  599.  
  600.      FROM dd40l INTO TABLE @DATA(ax) WHERE typename = @p_tadir-obj_name.
  601.  
  602.     LOOP AT ax INTO DATA(ah).
  603.  
  604.        l_str = |{ c_sep }TTYP{ c_sep }{ p_tadir-obj_name }{ c_sep }{ ah-rowtype }{ c_sep }{ ah-rowkind }{ c_sep }|.
  605.        l_str = |{ l_str }{ ah-datatype }{ c_sep }{ ah-leng }{ c_sep }{ ah-decimals }{ c_sep }{ ah-keykind }{ c_sep }|.
  606.        l_str = |{ l_str }{ ah-keyfdcount }{ c_sep }{ ah-generic }{ c_sep }{ ah-typelen }{ c_sep }|.
  607.       APPEND l_str TO c_list.
  608.     ENDLOOP.
  609.  
  610.     LOOP AT ax INTO ah WHERE rowtype CP 'Z*'.
  611.       DATA(l_tadir) = VALUE tadir( object = 'TTYP' obj_name = ah-rowtype ).
  612.       data_work_tabl( EXPORTING p_tadir = l_tadir CHANGING c_list = c_list ).
  613.     ENDLOOP.
  614.  
  615.   ENDMETHOD.
  616.  
  617.   METHOD data_work_read_report.
  618.     DATA: l_src TYPE stringtab.
  619.     DATA(i_prog) = CONV char255( i_name ).
  620.     READ REPORT i_prog INTO rt_src.
  621.  
  622.     CHECK lines( rt_src ) > 0.
  623. *    exit. "<-- Pay Per Use
  624.     data_work_finder( EXPORTING it_src = rt_src ).
  625.   ENDMETHOD.
  626.  
  627.   METHOD data_work_prog_dynpro.
  628.  
  629.     SELECT prog, dnum FROM  d020s INTO TABLE @DATA(t_d020s) WHERE  prog  = @p_tadir-obj_name.
  630.  
  631.  
  632.     LOOP AT t_d020s INTO DATA(i_d020s).
  633.       DATA: _file TYPE string,
  634.             ss    TYPE string.
  635.  
  636.       ss = CONV string( |{ dest }~DYNP~{ i_d020s-prog }~{ i_d020s-dnum }.dyn| ).
  637.       DATA(l_lin) = strlen( ss ).
  638. *    IF l_lin > 126.
  639. *      CONCATENATE dest programa '~DYNP~' i_d020s-dnum '.dyn' INTO ss.
  640. *    ENDIF.
  641.       _file = ss.
  642.       DATA(h) = VALUE d020s(  dnum = i_d020s-dnum prog = i_d020s-prog ).
  643.  
  644.       data_work_prog_dynpro_download( p_filename = CONV #( ss ) p_h = h ).
  645.  
  646.     ENDLOOP.
  647.  
  648.   ENDMETHOD.
  649.  
  650.   METHOD data_work_prog_dynpro_download. " Esto está ripeado del estándar
  651.  
  652.     CONSTANTS:
  653.       stars(64)          VALUE
  654.                            '****************************************************************',
  655.                                                             "#EC NOTEXT
  656.       comment1(64)       VALUE
  657.                            '*   THIS FILE IS GENERATED BY THE SCREEN PAINTER.              *',
  658.                                                             "#EC NOTEXT
  659.       comment2(64)       VALUE
  660.                            '*   NEVER CHANGE IT MANUALLY, PLEASE !                         *',
  661.                                                             "#EC NOTEXT
  662.       dynpro_text(8)     VALUE '%_DYNPRO',                  "#EC NOTEXT
  663.       header_text(8)     VALUE '%_HEADER',                  "#EC NOTEXT
  664.       params_text(8)     VALUE '%_PARAMS',                  "#EC NOTEXT
  665.       descript_text(13)  VALUE '%_DESCRIPTION',             "#EC NOTEXT
  666.       fields_text(8)     VALUE '%_FIELDS',                  "#EC NOTEXT
  667.       kreuz(1)           VALUE 'x',                         "#EC NOTEXT
  668.       flowlogic_text(11) VALUE '%_FLOWLOGIC'.               "#EC NOTEXT
  669.  
  670.     DATA: filename     TYPE string,
  671.           path         TYPE string,
  672.           fullpath     TYPE string,
  673.           user_action  TYPE i,
  674.           filter       TYPE string,
  675.           encoding(20),
  676.           filelength   TYPE i,
  677.           header_char  TYPE scr_chhead,
  678.           dynp_char    TYPE STANDARD TABLE OF scr_chfld,
  679.  
  680.           fields       TYPE STANDARD TABLE OF d021s,
  681.           flowlogic    TYPE dyn_flowlist,
  682.           c_flowlogic  TYPE d022s,
  683.           t_m          TYPE STANDARD TABLE OF d023s,
  684.  
  685.           prog_len     TYPE p,
  686.           fields_char  TYPE STANDARD TABLE OF scr_chfld.
  687.  
  688.  
  689. *--[ Preparamos la pantalla
  690.     CALL FUNCTION 'RS_SCRP_PREPARE_START'
  691.       EXPORTING
  692.         i_progname = p_h-prog
  693.         i_dynnr    = p_h-dnum
  694.       TABLES
  695.         t_f        = fields
  696.         t_e        = flowlogic
  697.         t_m        = t_m.
  698. *--[
  699.  
  700.     CALL FUNCTION 'RS_SCRP_HEADER_RAW_TO_CHAR'
  701.       EXPORTING
  702.         header_int  = p_h
  703.       IMPORTING
  704.         header_char = header_char
  705.       EXCEPTIONS
  706.         OTHERS      = 1.
  707.     DATA(l_prog) = CONV d020t-prog( '' ).
  708.     DESCRIBE FIELD l_prog LENGTH prog_len IN CHARACTER MODE.
  709.  
  710. *--[ * Comment
  711.     CLEAR dynp_char[].
  712.     dynp_char = VALUE #( BASE dynp_char ( CONV #( stars ) )
  713.                                         ( CONV #( comment1 ) )
  714.                                         ( CONV #( comment2 ) )
  715.                                         ( CONV #( stars ) )
  716. *--[ Identificationconv #(
  717.                                         ( CONV #( dynpro_text ) )
  718.                                         ( CONV #( header_char-prog ) )
  719.                                         ( CONV #( header_char-dnum ) )
  720.                                         ( CONV #( sy-saprl ) )
  721.                                         ( CONV #( prog_len ) )
  722. *--[ Headerconv #(
  723.                                         ( CONV #( header_text ) )
  724.                                         ( CONV #( header_char ) )
  725.                                         ( CONV #( fields_text ) )
  726.                                         ).
  727.  
  728.     CALL FUNCTION 'RS_SCRP_FIELDS_RAW_TO_CHAR'
  729.       TABLES
  730.         fields_int  = fields
  731.         fields_char = fields_char
  732.       EXCEPTIONS
  733.         OTHERS      = 1.
  734.  
  735.     LOOP AT fields_char INTO DATA(ax).
  736.       APPEND ax TO dynp_char.
  737.     ENDLOOP.
  738.  
  739. *--[ Flowlogic
  740.     APPEND flowlogic_text TO dynp_char.
  741.  
  742.     LOOP AT flowlogic INTO c_flowlogic .
  743.       APPEND c_flowlogic TO dynp_char.
  744.     ENDLOOP.
  745.  
  746.     DATA: down_file TYPE STANDARD TABLE OF string.
  747.     LOOP AT dynp_char INTO DATA(bx).
  748.       filter = bx.
  749.       APPEND filter TO down_file.
  750.     ENDLOOP.
  751.     cl_front->file_download(
  752.       EXPORTING
  753.         p_prg     = CONV #( |{ p_h-prog }.{ p_h-dnum }| )
  754.         p_destino = CONV #( p_filename )
  755.         p_data    = down_file
  756.     ).
  757.  
  758.   ENDMETHOD.
  759.  
  760.   METHOD data_work_prog_includes.
  761.     DATA: buscar(255),
  762.           sx          TYPE string,
  763.           lt_tmp      TYPE STANDARD TABLE OF char255.
  764.  
  765.     LOOP AT i_includes INTO DATA(l_includes).
  766.       DATA(sytabix) = sy-tabix.
  767.  
  768.       buscar = l_includes.
  769.       CALL FUNCTION 'GET_INCLUDETAB'
  770.         EXPORTING
  771.           progname = buscar
  772.         TABLES
  773.           incltab  = lt_tmp[].
  774.  
  775.  
  776.       LOOP AT lt_tmp INTO DATA(l_tmp).
  777.         READ TABLE i_includes TRANSPORTING NO FIELDS
  778.           WITH KEY table_line = l_tmp.
  779.         IF sy-subrc <> 0.
  780.           APPEND l_tmp TO i_includes.
  781.         ENDIF.
  782.       ENDLOOP.
  783.  
  784. *--[ Descargamos actual
  785.       IF sytabix = 1.
  786.         DATA(l_raiz) = buscar.
  787.         CONTINUE.
  788.       ENDIF.
  789.  
  790. *--[ Evitamos descargar los includes ya descargados
  791.       READ TABLE cl_front->i_download TRANSPORTING NO FIELDS WITH KEY prog = buscar.
  792.       IF sy-subrc EQ 0.
  793.         DELETE i_includes INDEX sy-tabix.
  794.         CONTINUE.
  795.       ENDIF.
  796.       check cl_front->is_downloaded( p_prg = buscar ) is INITIAL. " Evitamos descargar dos veces el mismo objeto
  797.  
  798.       DATA(p_data) = data_work_read_report( CONV #( buscar )  ).
  799.  
  800.       cl_front->file_download(
  801.        EXPORTING
  802.          p_prg     = CONV #( buscar )
  803.          p_destino = CONV #( |{ dest }~INCLUDES~{ l_raiz }~{ buscar }{ c_ext_abap }| )
  804.          p_data    = p_data
  805.      ).
  806.       data_work_prog_dynpro( EXPORTING p_tadir = p_tadir CHANGING c_list = c_list ).
  807.     ENDLOOP.
  808.   ENDMETHOD.
  809.  
  810.   METHOD data_work_finder_detail.
  811.     READ TABLE cl_front->i_download TRANSPORTING NO FIELDS WITH KEY prog = p_tadir-obj_name.
  812.     CHECK sy-subrc NE 0.
  813.     DATA(l_new) = NEW lcl_main( i_cl_front = cl_front ).
  814.     l_new->dest = dest.
  815.  
  816.     CASE p_tadir-object.
  817.       WHEN 'PROG'.
  818.         l_new->data_work_prog( EXPORTING p_tadir = p_tadir CHANGING c_list = i_list ).
  819.       WHEN 'FUNC'.
  820.         l_new->data_work_func( EXPORTING p_tadir = p_tadir CHANGING c_list = i_list ).
  821.       WHEN 'TABL'.
  822.         l_new->data_work_tabl( EXPORTING p_tadir = p_tadir CHANGING c_list = i_list ).
  823.       WHEN 'TRAN'.
  824.         l_new->data_work_tcode( EXPORTING p_tadir = p_tadir CHANGING c_list = i_list ).
  825.       WHEN OTHERS. EXIT.
  826.     ENDCASE.
  827.  
  828.   ENDMETHOD.
  829.  
  830.   METHOD data_work_finder.
  831.     DATA(cl_finder) = NEW lcl_abap_obj_finder( it_source = it_src ).
  832.     DATA(l_result) = cl_finder->find_objects(  ).
  833.     DATA(l_tadir) = VALUE tadir(  ).
  834.  
  835.     l_tadir-object = 'FUNC'.
  836.     LOOP AT l_result-functions INTO DATA(func) WHERE table_line CP 'Z*'.
  837.       l_tadir-obj_name = func.
  838.       data_work_finder_detail( EXPORTING p_tadir = l_tadir CHANGING i_list = i_list ).
  839.     ENDLOOP.
  840.  
  841.     l_tadir-object = 'TRAN'.
  842.     LOOP AT l_result-transactions INTO func WHERE table_line CP 'Z*'.
  843.       l_tadir-obj_name = func.
  844.       data_work_finder_detail( EXPORTING p_tadir = l_tadir CHANGING i_list = i_list ).
  845.     ENDLOOP.
  846.  
  847.     l_tadir-object = 'PROG'.
  848.     LOOP AT l_result-programs INTO func WHERE table_line CP 'Z*'.
  849.       l_tadir-obj_name = func.
  850.       data_work_finder_detail( EXPORTING p_tadir = l_tadir CHANGING i_list = i_list ).
  851.     ENDLOOP.
  852.  
  853.     l_tadir-object = 'TABL'.
  854.     LOOP AT l_result-tables INTO func WHERE table_line CP 'Z*'.
  855.       l_tadir-obj_name = func.
  856.       data_work_finder_detail( EXPORTING p_tadir = l_tadir CHANGING i_list = i_list ).
  857.     ENDLOOP.
  858.  
  859.   ENDMETHOD.
  860.  
  861.   METHOD data_work_prog.
  862.     DATA: l_src TYPE stringtab.
  863.  
  864.     CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
  865.  
  866.     DATA(t_src) = data_work_read_report( CONV #( p_tadir-obj_name )  ).
  867.  
  868.     cl_front->file_download(
  869.       EXPORTING
  870.         p_prg     = CONV #( p_tadir-obj_name )
  871.         p_destino = CONV #( |{ dest }~PROGRAMAS~{ p_tadir-obj_name }{ c_ext_abap }| )
  872.         p_data    = t_src
  873.     ).
  874.  
  875.     data_work_prog_dynpro( EXPORTING p_tadir = p_tadir CHANGING c_list = c_list ).
  876.     APPEND p_tadir-obj_name TO i_includes.
  877.  
  878.     data_work_prog_includes( EXPORTING p_tadir = p_tadir CHANGING c_list = c_list ).
  879.  
  880.   ENDMETHOD.
  881.  
  882.  
  883.   METHOD data_work_func.
  884.     DATA: l_src TYPE stringtab.
  885. *    break-POINT.
  886.     SELECT SINGLE * FROM tfdir INTO @DATA(l_tfdir) WHERE funcname = @p_tadir-obj_name.
  887.  
  888.     DATA(l_new) = |{ l_tfdir-pname+3 }U{ l_tfdir-include }|.
  889.  
  890.  
  891.     DATA(t_src) = data_work_read_report( CONV #( l_new )  ).
  892.  
  893.     cl_front->file_download(
  894.       EXPORTING
  895.         p_prg     = CONV #( p_tadir-obj_name )
  896.         p_destino = CONV #( |{ dest }~FUNCIONES~{ p_tadir-obj_name }{ c_ext_abap }| )
  897.         p_data    = t_src
  898.     ).
  899.   ENDMETHOD.
  900.  
  901.   METHOD data_work_fugr.
  902.  
  903.     CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
  904.  
  905.     SELECT funcname FROM v_fdir INTO TABLE @DATA(i_v_fdir) WHERE area = @p_tadir-obj_name.
  906.     LOOP AT i_v_fdir INTO DATA(v_fdir) WHERE funcname NP 'TABLEFRAME*' AND "<-- Evitamos SM30
  907.                             funcname NP 'TABLEPROC*' AND
  908.                             funcname NP 'VIEWFRAME*' AND
  909.                             funcname NP 'VIEWPROC*'.
  910.  
  911.       SELECT SINGLE pname FROM tfdir INTO @DATA(l_tfdir) WHERE funcname = @v_fdir-funcname.
  912.  
  913.       DATA(t_data) = data_work_read_report( CONV #( l_tfdir ) ). "-pname )  ).
  914.  
  915.       DATA(ss) = CONV string( |{ dest }FUGR.{ p_tadir-obj_name }.PRG.{ l_tfdir }.abap| ).
  916.  
  917.       cl_front->file_download(
  918.         EXPORTING
  919.           p_prg     = CONV #( l_tfdir )
  920.           p_destino = CONV #( ss )
  921.           p_data    = t_data
  922.       ).
  923.       data_work_prog_dynpro( EXPORTING p_tadir = p_tadir CHANGING c_list = c_list ).
  924.       CLEAR i_includes[].
  925.       APPEND l_tfdir TO i_includes.
  926.  
  927.       data_work_prog_includes( EXPORTING p_tadir = p_tadir CHANGING c_list = c_list ).
  928.  
  929.     ENDLOOP.
  930.   ENDMETHOD.
  931.  
  932.   METHOD data_work_clas.
  933.     CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
  934.     DATA(t_metodos) = cl_oo_classname_service=>get_all_method_includes( clsname =  CONV #( p_tadir-obj_name ) ).
  935.     DATA(t_all) = cl_oo_classname_service=>get_all_class_includes( class_name = CONV #( p_tadir-obj_name ) ).
  936.     LOOP AT t_metodos INTO DATA(l_metodos).
  937.       DATA(t_data) = data_work_read_report( CONV #( l_metodos-incname )  ).
  938.  
  939.       DATA(ss) = CONV string( |{ dest }~CLASS~{ p_tadir-obj_name }~{ l_metodos-cpdkey-cpdname }.{ l_metodos-incname }{ c_ext_abap }| ).
  940.       DELETE t_all WHERE table_line = l_metodos-incname.
  941.       cl_front->file_download(
  942.       EXPORTING
  943.           p_prg     = CONV #( l_metodos )
  944.           p_destino = CONV #( ss )
  945.           p_data    = t_data
  946.       ).
  947.     ENDLOOP.
  948. *--[ Descargamos el resto de includes que no son metodos
  949.     LOOP AT t_all INTO DATA(l_all).
  950.       DATA(t_datax) = data_work_read_report( CONV #( l_all )  ).
  951.  
  952.       DATA(sss) = CONV string( |{ dest }~CLASS~{ p_tadir-obj_name }~{ l_all }{ c_ext_abap }| ).
  953.  
  954.       cl_front->file_download(
  955.       EXPORTING
  956.           p_prg     = CONV #( l_all )
  957.           p_destino = CONV #( sss )
  958.           p_data    = t_datax
  959.       ).
  960.     ENDLOOP.
  961.  
  962.   ENDMETHOD.
  963.  
  964.   METHOD data_work.
  965.     LOOP AT i_tadir INTO DATA(l_tadir).
  966.  
  967.       CASE l_tadir-object.
  968.  
  969.         WHEN 'DTEL'. data_work_dtel( EXPORTING p_tadir = l_tadir CHANGING c_list = i_list ).
  970.         WHEN 'DOMA'. data_work_doma( EXPORTING p_tadir = l_tadir CHANGING c_list = i_list ).
  971.         WHEN 'MSAG'. data_work_msag( EXPORTING p_tadir = l_tadir CHANGING c_list = i_list ).
  972.         WHEN 'VIEW'. data_work_view( EXPORTING p_tadir = l_tadir CHANGING c_list = i_list ).
  973.         WHEN 'TABL'. data_work_tabl( EXPORTING p_tadir = l_tadir CHANGING c_list = i_list ).
  974.         WHEN 'TTYP'. data_work_ttyp( EXPORTING p_tadir = l_tadir CHANGING c_list = i_list ).
  975.         WHEN 'PROG'. data_work_prog( EXPORTING p_tadir = l_tadir CHANGING c_list = i_list ).
  976.         WHEN 'FUGR'. data_work_fugr( EXPORTING p_tadir = l_tadir CHANGING c_list = i_list ).
  977.         WHEN 'CLAS'. data_work_clas( EXPORTING p_tadir = l_tadir CHANGING c_list = i_list ).
  978.         WHEN 'TRAN'. data_work_tcode( EXPORTING p_tadir = l_tadir CHANGING c_list = i_list ).
  979.         WHEN 'FORM'. data_work_sapscript( EXPORTING p_tadir = l_tadir ).
  980.         WHEN 'SSFO'. data_work_smartforms( EXPORTING p_tadir = l_tadir ).
  981.       ENDCASE.
  982.       CLEAR i_includes[].
  983.       AT LAST.
  984.         data_work_list(  ).
  985.       ENDAT.
  986.     ENDLOOP.
  987.  
  988.   ENDMETHOD.
  989.  
  990.   METHOD data_work_list.
  991.     IF  lines( i_list ) > 0.
  992.       SORT i_list.
  993.       DELETE ADJACENT DUPLICATES FROM i_list.
  994.  
  995.       data(o_list) = i_list[].
  996.       clear o_list[].
  997.       data(l_ini) = abap_true.
  998.       loop at i_list into data(l_list) where table_line CP '|TRAN|*'.
  999.         if l_ini = abap_true.
  1000.            APPEND '' to o_list.
  1001.            append '# Transacciones' to o_list.
  1002.            APPEND '' to o_list.
  1003.            append '|Tipo|TCODE|Programa|Dynpro|Idioma|Descripción|' to o_list.
  1004.            APPEND '|---|---|---|---|---|---|' to o_list.
  1005.            l_ini = abap_false.
  1006.         endif.
  1007.         append l_list to o_list.
  1008.       endloop.
  1009.       l_ini = abap_true.
  1010.       loop at i_list into l_list where table_line CP '|DOMA|*'.
  1011.                 if l_ini = abap_true.
  1012.            APPEND '' to o_list.
  1013.            append '# Dominios' to o_list.
  1014.            APPEND '' to o_list.
  1015.            APPEND '|Tipo|Nombre|Idioma/Técnico|Idioma / Tipo|Texto|Texto|Texto|' to o_list.
  1016.            APPEND '|---|---|---|---|---|---|---|' to o_list.
  1017.            l_ini = abap_false.
  1018.         endif.
  1019.         append l_list to o_list.
  1020.       endloop.
  1021. l_ini = abap_true.
  1022.       loop at i_list into l_list where table_line CP '|DTEL|*'.
  1023.                 if l_ini = abap_true.
  1024.            APPEND '' to o_list.
  1025.            append '# Elemento de Datos' to o_list.
  1026.            APPEND '' to o_list.
  1027.            APPEND '|Tipo|Nombre|Tipo|Idioma / Dominio|Texto / Tipo |Texto / Longitud|Texto|' to o_list.
  1028.            APPEND '|---|---|---|---|---|---|---|' to o_list.
  1029.                    l_ini = abap_false.
  1030.         endif.
  1031.         append l_list to o_list.
  1032.       endloop.
  1033. l_ini = abap_true.
  1034.       loop at i_list into l_list where table_line CP '|TTYP|*'.
  1035.                 if l_ini = abap_true.
  1036.            APPEND '' to o_list.
  1037.            append '# Tipo de tabla' to o_list.
  1038.            APPEND '' to o_list.
  1039.            APPEND '|Tipo|Nombre|Estructura|Tipo|Formato |Longitud|Decimales|' to o_list.
  1040.            APPEND '|---|---|---|---|---|---|---|' to o_list.
  1041.                    l_ini = abap_false.
  1042.         endif.
  1043.         append l_list to o_list.
  1044.       endloop.
  1045.  
  1046.       cl_front->file_download(
  1047.         EXPORTING
  1048.           p_prg     = 'LISTADO'
  1049.           p_destino = CONV #( |{ dest }~SE11~basicos{ c_ext_md }| )
  1050.           p_data    = o_list
  1051.       ).
  1052.     ENDIF.
  1053.  
  1054.     IF lines( cl_front->i_download ) > 0.
  1055.  
  1056.       CLEAR i_list[].
  1057.       LOOP AT cl_front->i_download INTO DATA(l_down).
  1058.         AT FIRST.
  1059.  
  1060.           SELECT name, sprsl, text
  1061.             FROM trdirt
  1062.             FOR ALL ENTRIES IN @cl_front->i_download
  1063.             WHERE name =  @cl_front->i_download-programa INTO TABLE @DATA(lt_trdir).
  1064.  
  1065.           i_list = VALUE #( BASE i_list ( |# LOG de Programas Descargaso en { sy-datum } { sy-uzeit }| )
  1066.                                       ( CONV string( 'El listado generado muestra cada objeto procesado junto con su ruta de almacenamiento, facilitando la trazabilidad y verificación de la descarga o exportación realizada en el sistema.' ) )
  1067.                                       (  CONV string( '' ) )
  1068.                                       ( CONV string('| Objeto | Descripción|Ruta del objeto |' ) )
  1069.                                       ( CONV string('|---|---|---|' ) )
  1070.         ).
  1071.         ENDAT.
  1072.         READ TABLE lt_trdir INTO DATA(l_trdir) WITH KEY name = l_down-programa sprsl = sy-langu.
  1073.         IF sy-subrc NE 0 OR l_trdir-text IS INITIAL.
  1074.  
  1075.           READ TABLE lt_trdir INTO l_trdir WITH KEY name = l_down-programa sprsl = 'S'.
  1076.           IF sy-subrc NE 0 OR l_trdir-text IS INITIAL.
  1077.             READ TABLE lt_trdir INTO l_trdir WITH KEY name = l_down-programa sprsl = 'E'.
  1078.             IF sy-subrc NE 0 OR l_trdir-text IS INITIAL.
  1079.               READ TABLE lt_trdir INTO l_trdir WITH KEY name = l_down-programa sprsl = 'D'.
  1080.             ELSE.
  1081.               CLEAR l_trdir .
  1082.             ENDIF.
  1083.           ENDIF.
  1084.         ENDIF.
  1085.  
  1086.         APPEND |\|{ l_down-prog }\|{ l_trdir-text }\|{ l_down-path }\|| TO i_list.
  1087.       ENDLOOP.
  1088.  
  1089.       cl_front->file_download(
  1090.         EXPORTING
  1091.           p_prg     = 'LISTADO_DESCARGAS'
  1092.           p_destino = CONV #( |{ dest }~{ sy-datum }{ sy-uzeit }_resultado.md| )
  1093.           p_data    = i_list[]
  1094.       ).
  1095.  
  1096.     ENDIF.
  1097.   ENDMETHOD.
  1098.  
  1099. ENDCLASS.
  1100.  
  1101. END-OF-SELECTION.
  1102.  
  1103.   DATA(cl_main) = NEW lcl_main(  ).
  1104.  
  1105.   cl_main->data_load( p_pack = s_pack[]
  1106.                             p_obj = s_obj[]
  1107.                             p_objn = s_objn[]
  1108.                             p_author = s_author[]
  1109.                             p_dest = CONV #( dest )
  1110.                             ).
  1111.   cl_main->data_work(  ).
Última modificación de la página el 02 May 2026 a las 20h06
Powered by PmWiki