- REPORT z_sapcrawler.
- * 1.0.1 - Anyadida descarga de pantallas
- * 1.0.2 - Anyadida rutina de cambio de parmetros y ttulo
- * 1.0.3 - Anyadimos ms parmetros a la seleccin
- * 1.0.4 - Anyadimos las descargas de las clases
- * 1.0.5 - Anyadimos estructura jerarquica de directorios
- * 1.0.6 - Evitamos descargar los includes ya descargados y las vistas VIEWFRAME y VIEWPROC.
- * Anyadirmos Busqueda por autor.
- * Arreglado bug de SE11
- * 1.0.7 - Descarga las tablas como PDF
- * - Descarga SmartForms en XML ** Problemas de dilogo.
- * - Descarga SapScripts
- * 1.0.8 - Buscamos la impresora SAPWIN para simular LOCL
- * - Eliminamos los spools que hemos creado.
- * 1.0.9 - Anydimos los mensajes (SE91)
- * 1.0.10 - Arreglado error de descarga de las pantallas
- * 2.0 - Migracion a clases
- * - Anyadida descarga de vistas
- * - Anyadido descarga de TTYP
- * 2.1 - Arreglado BUG de bucle infinito, hay que revisar la clase abap_obj_finder, se enbucla y explota
- * 2.2 - Areglado el bucle infinito de abap_obj_finder.
- * 2.3 - Mejoras en el rendimiento y en la salida de datos
- CONSTANTS version(10) VALUE 'v2.3'.
- TABLES: tadir.
- SELECT-OPTIONS: s_pack FOR tadir-devclass,
- s_obj FOR tadir-object,
- s_objn FOR tadir-obj_name,
- s_author FOR tadir-author.
- SELECTION-SCREEN SKIP 1.
- PARAMETERS dest(80) DEFAULT 'M:\ABAP'.
- CLASS lcl_frontend DEFINITION FINAL.
- PUBLIC SECTION.
- TYPES: BEGIN OF ty_download,
- prog TYPE string,
- programa TYPE programm,
- path TYPE string,
- END OF ty_download.
- DATA: i_download TYPE SORTED TABLE OF ty_download WITH UNIQUE KEY prog.
- METHODS: dir_create IMPORTING p_dir TYPE string
- RETURNING VALUE(r_rc) TYPE i,
- is_downloaded IMPORTING p_prg TYPE any
- RETURNING VALUE(r_found) TYPE xfeld,
- file_download IMPORTING p_prg TYPE string "<- Programa descargado
- p_destino TYPE string "<- Donde descargarlo
- p_data TYPE stringtab. "<- El programa en si.
- ENDCLASS.
- CLASS lcl_frontend IMPLEMENTATION.
- METHOD is_downloaded.
- READ TABLE i_download TRANSPORTING NO FIELDS WITH KEY prog = p_prg.
- r_found = COND #( WHEN sy-subrc EQ 0 THEN 'X' ELSE '' ).
- ENDMETHOD.
- METHOD file_download.
- DATA: local_data TYPE stringtab.
- CHECK is_downloaded( p_prg = p_prg ) IS INITIAL AND lines( p_data ) > 0. " Evitamos descargar dos veces el mismo programa
- DATA(l_destino) = p_destino.
- TRANSLATE l_destino USING '/_~\'.
- local_data = p_data[].
- i_download = VALUE #( BASE i_download ( prog = p_prg programa = p_prg path = l_destino ) ).
- CALL METHOD cl_gui_frontend_services=>gui_download
- EXPORTING
- filename = l_destino
- filetype = 'ASC'
- confirm_overwrite = space
- CHANGING
- data_tab = local_data
- 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
- error_no_gui = 23
- OTHERS = 24.
- ENDMETHOD.
- METHOD dir_create.
- CLEAR r_rc.
- IF p_dir IS INITIAL.
- r_rc = 8.
- ELSE.
- cl_gui_frontend_services=>directory_exist(
- EXPORTING
- directory = p_dir " Directory name
- RECEIVING
- result = r_rc " Result
- EXCEPTIONS
- cntl_error = 1 " Control error
- error_no_gui = 2 " No GUI available
- wrong_parameter = 3 " Incorrect parameter
- not_supported_by_gui = 4 " GUI does not support this
- OTHERS = 5
- ).
- IF sy-subrc <> 0.
- cl_gui_frontend_services=>directory_create(
- EXPORTING
- directory = p_dir " Directory name
- CHANGING
- rc = r_rc " Return Code
- EXCEPTIONS
- directory_create_failed = 1 " Could not create directory
- cntl_error = 2 " A Control Error Occurred
- error_no_gui = 3 " No GUI available
- directory_access_denied = 4 " Access denied
- directory_already_exists = 5 " Directory already exists
- path_not_found = 6 " Path does not exist
- unknown_error = 7 " Unknown error
- not_supported_by_gui = 8 " GUI does not support this
- wrong_parameter = 9 " Wrong parameter
- OTHERS = 10
- ).
- IF sy-subrc <> 0.
- r_rc = sy-subrc.
- ENDIF.
- ELSE.
- r_rc = 0.
- ENDIF.
- ENDIF.
- ENDMETHOD.
- ENDCLASS.
- CLASS lcl_abap_obj_finder DEFINITION.
- PUBLIC SECTION.
- TYPES: BEGIN OF ty_result,
- functions TYPE stringtab,
- transactions TYPE stringtab,
- programs TYPE stringtab,
- tables TYPE stringtab,
- END OF ty_result.
- METHODS:
- constructor
- IMPORTING
- it_source TYPE stringtab,
- find_objects
- RETURNING VALUE(rs_result) TYPE ty_result.
- PRIVATE SECTION.
- DATA: mt_source TYPE stringtab.
- METHODS:
- find_by_regex
- IMPORTING
- iv_regex TYPE string
- RETURNING VALUE(rt_found) TYPE stringtab.
- ENDCLASS.
- CLASS lcl_abap_obj_finder IMPLEMENTATION.
- METHOD constructor.
- mt_source = it_source.
- ENDMETHOD.
- METHOD find_by_regex.
- DATA: lv_regex TYPE string,
- lv_line TYPE string,
- lv_rest TYPE string,
- lv_word TYPE string,
- lv_off TYPE i,
- lv_len TYPE i.
- " iv_regex ya viene con los '|' entre frases
- " Ej: (INTO CORRESPONDING FIELDS OF TABLE|INTO DATA|FROM)
- lv_regex = |({ iv_regex })\\s+@?(DATA\\()?([A-Z0-9_]+)|.
- DATA(lt_src) = mt_source[].
- DELETE lt_src WHERE table_line CP '#**' OR
- table_line IS INITIAL OR
- table_line CP '"*'. " Evitamos comentarios
- LOOP AT lt_src INTO lv_line WHERE table_line IS NOT INITIAL.
- * CHECK lv_line+0(1) NE '*'. " <-- Evitamos comentarios
- lv_rest = lv_line.
- WHILE abap_true = abap_true.
- CLEAR: lv_word, lv_off, lv_len.
- FIND REGEX lv_regex
- IN lv_rest
- IGNORING CASE
- MATCH OFFSET lv_off
- MATCH LENGTH lv_len
- SUBMATCHES DATA(lv_phrase) DATA(lv_dummy) lv_word.
- IF sy-subrc <> 0.
- EXIT.
- ENDIF.
- IF lv_word IS NOT INITIAL. " <-- Solo nos interesan objetos personalizados
- APPEND to_upper( lv_word ) TO rt_found.
- ENDIF.
- " Avanzar en la cadena para buscar más ocurrencias en la misma línea
- SHIFT lv_rest BY lv_off + lv_len PLACES LEFT.
- ENDWHILE.
- ENDLOOP.
- SORT rt_found.
- DELETE ADJACENT DUPLICATES FROM rt_found.
- ENDMETHOD.
- METHOD find_objects.
- rs_result = VALUE ty_result( ).
- " Buscar funciones: CALL FUNCTION 'FUNCNAME'
- rs_result-functions = find_by_regex( `CALL\s+FUNCTION` ). "s+'([A-Z0-9_]+)'` ).
- " Buscar transacciones: CALL TRANSACTION 'TCD'
- rs_result-transactions = find_by_regex( `CALL\s+TRANSACTION` ). "s+'([A-Z0-9_]+)'` ).
- " Buscar programas: SUBMIT progname
- rs_result-programs = find_by_regex( `SUBMIT` ). "\s+([A-Z0-9_]+)` ).
- " Buscar tablas: FROM/INTO/UPDATE/INSERT/DELETE <tabla>
- DATA(l_regex) = 'APPENDING CORRESPONDING FIELDS OF TABLE|' &&
- 'INTO CORRESPONDING FIELDS OF TABLE|' &&
- 'INTO CORRESPONDING FIELDS OF|' &&
- 'INTO DATA|' &&
- 'INTO TABLE|' &&
- 'UPDATE|' &&
- 'INSERT INTO|' &&
- 'DELETE FROM|' &&
- 'FROM'.
- * replace all occurrences of '~' in l_regex with '\s+'.
- rs_result-tables = find_by_regex( CONV #( l_regex ) ).
- ENDMETHOD.
- ENDCLASS.
- CLASS lcl_main DEFINITION FINAL.
- PUBLIC SECTION.
- CONSTANTS: c_ext_abap TYPE c LENGTH 5 VALUE '.abap',
- c_ext_csv TYPE c LENGTH 5 VALUE '.csv',
- c_ext_mensages TYPE c LENGTH 5 VALUE '.msg',
- c_ext_md TYPE c LENGTH 5 VALUE '.md',
- c_sep TYPE c LENGTH 1 VALUE '|'.
- DATA: r_pack TYPE RANGE OF tadir-devclass,
- r_obj TYPE RANGE OF tadir-object,
- r_objn TYPE RANGE OF tadir-obj_name,
- r_author TYPE RANGE OF tadir-author,
- dest TYPE string,
- raiz TYPE string,
- i_list TYPE stringtab,
- i_includes TYPE stringtab,
- i_tadir TYPE STANDARD TABLE OF tadir.
- METHODS:
- constructor IMPORTING i_cl_front TYPE REF TO lcl_frontend OPTIONAL,
- data_load IMPORTING p_pack TYPE ANY TABLE
- p_obj TYPE ANY TABLE
- p_objn TYPE ANY TABLE
- p_author TYPE ANY TABLE
- p_dest TYPE string,
- data_work_sapscript IMPORTING p_tadir TYPE tadir,
- data_work_doma IMPORTING p_tadir TYPE tadir
- CHANGING c_list TYPE stringtab,
- data_work_tcode IMPORTING p_tadir TYPE tadir
- CHANGING c_list TYPE stringtab,
- data_work_dtel IMPORTING p_tadir TYPE tadir
- CHANGING c_list TYPE stringtab,
- data_work_msag IMPORTING p_tadir TYPE tadir
- CHANGING c_list TYPE stringtab,
- data_work_ttyp IMPORTING p_tadir TYPE tadir
- CHANGING c_list TYPE stringtab,
- data_work_tabl IMPORTING p_tadir TYPE tadir
- CHANGING c_list TYPE stringtab,
- data_work_view IMPORTING p_tadir TYPE tadir
- CHANGING c_list TYPE stringtab,
- data_work_fugr IMPORTING p_tadir TYPE tadir
- CHANGING c_list TYPE stringtab,
- data_work_func IMPORTING p_tadir TYPE tadir
- CHANGING c_list TYPE stringtab,
- data_work_prog IMPORTING p_tadir TYPE tadir
- CHANGING c_list TYPE stringtab,
- data_work_finder IMPORTING it_src TYPE stringtab,
- data_work_finder_detail IMPORTING p_tadir TYPE tadir
- CHANGING i_list TYPE stringtab,
- data_work_clas IMPORTING p_tadir TYPE tadir
- CHANGING c_list TYPE stringtab,
- data_work_prog_dynpro IMPORTING p_tadir TYPE tadir
- CHANGING c_list TYPE stringtab,
- data_work_prog_dynpro_download IMPORTING p_filename TYPE string
- p_h TYPE d020s,
- data_work_prog_includes IMPORTING p_tadir TYPE tadir
- CHANGING c_list TYPE stringtab,
- data_work_smartforms IMPORTING p_tadir TYPE tadir,
- data_work_read_report IMPORTING i_name TYPE string
- RETURNING VALUE(rt_src) TYPE stringtab,
- data_work,
- data_work_list.
- PRIVATE SECTION.
- DATA: cl_front TYPE REF TO lcl_frontend.
- ENDCLASS.
- CLASS lcl_main IMPLEMENTATION.
- METHOD constructor.
- IF i_cl_front IS BOUND.
- cl_front = i_cl_front.
- ELSE.
- cl_front = NEW lcl_frontend( ).
- ENDIF.
- ENDMETHOD.
- METHOD data_load.
- r_pack = CORRESPONDING #( p_pack[] ).
- r_obj = CORRESPONDING #( p_obj ).
- r_objn = CORRESPONDING #( p_objn ).
- r_author = CORRESPONDING #( p_author ).
- dest = p_dest.
- SELECT * FROM tadir INTO TABLE i_tadir
- WHERE devclass IN r_pack AND
- object IN r_obj AND
- obj_name IN r_objn AND
- author IN r_author
- ORDER BY obj_name.
- ENDMETHOD.
- METHOD data_work_dtel.
- DATA l_str TYPE string.
- CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
- SELECT SINGLE domname, datatype, leng FROM dd04l INTO @DATA(l_dd40l) WHERE rollname = @p_tadir-obj_name.
- 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 }|.
- APPEND l_str TO c_list.
- SELECT ddlanguage, scrtext_s, scrtext_m, scrtext_l FROM dd04t INTO @DATA(l_dd04t) WHERE rollname = @p_tadir-obj_name.
- 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 }|.
- APPEND l_str TO c_list.
- ENDSELECT.
- ENDMETHOD.
- METHOD data_work_sapscript.
- DATA(ss) = CONV string( |{ dest }SAPSCRIPTS\\| ).
- CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
- IF cl_front->dir_create( p_dir = ss ) IS INITIAL.
- ss = |{ ss }{ p_tadir-obj_name }{ c_ext_abap }|.
- SUBMIT rstxscrp WITH localfile = 'X'
- WITH dataset = ss
- WITH obj_name = p_tadir-obj_name
- AND RETURN.
- ENDIF.
- ENDMETHOD.
- METHOD data_work_doma.
- DATA: l_str TYPE string.
- CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
- SELECT SINGLE datatype, leng, decimals FROM dd01l INTO @DATA(l_dd01l) WHERE domname = @p_tadir-obj_name.
- 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 }|.
- APPEND l_str TO c_list.
- SELECT domvalue_l, domvalue_h FROM dd07l INTO @DATA(l_dd07l) WHERE domname = @p_tadir-obj_name.
- 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 }|.
- APPEND l_str TO c_list.
- ENDSELECT.
- SELECT ddlanguage, scrtext_l, scrtext_s, scrtext_m FROM dd04t INTO @DATA(l_dd04t) WHERE rollname = @p_tadir-obj_name.
- 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 }|.
- APPEND l_str TO c_list.
- ENDSELECT.
- ENDMETHOD.
- METHOD data_work_tcode.
- DATA l_str TYPE string.
- CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
- SELECT a~tcode,
- a~pgmna,
- a~dypno,
- b~sprsl,
- b~ttext
- FROM tstc AS a
- LEFT OUTER JOIN tstct AS b
- ON a~tcode = b~tcode
- WHERE a~tcode = @p_tadir-obj_name
- INTO TABLE @DATA(lt_tcodes).
- LOOP AT lt_tcodes INTO DATA(l_tstc).
- 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 }|.
- APPEND l_str TO c_list.
- ENDLOOP.
- ENDMETHOD.
- METHOD data_work_smartforms.
- CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
- DATA(formname) = CONV tdsfname( p_tadir-obj_name ).
- CALL FUNCTION 'FB_DOWNLOAD_FORM'
- EXPORTING
- i_formname = formname
- i_with_dialog = ' '
- * IMPORTING
- * O_FORMNAME =
- EXCEPTIONS
- no_name = 1
- no_form = 2
- no_access_permission = 3
- illegal_language = 4
- illegal_formtype = 5
- OTHERS = 6.
- ENDMETHOD.
- METHOD data_work_msag.
- DATA: i_prog_tmp TYPE stringtab.
- CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
- SELECT sprsl, arbgb, msgnr, text FROM t100 INTO @DATA(l_t100) WHERE arbgb = @p_tadir-obj_name.
- CONCATENATE '|"' l_t100-sprsl '"|"'
- l_t100-arbgb '"|"'
- l_t100-msgnr '"|"'
- l_t100-text'"|' INTO DATA(l_str).
- APPEND l_str TO i_prog_tmp.
- ENDSELECT.
- DATA(l_raiz) = CONV string( |{ dest }MSG~{ p_tadir-obj_name }{ c_ext_mensages }{ c_ext_md }| ).
- cl_front->file_download(
- EXPORTING
- p_prg = CONV #( p_tadir-obj_name )
- p_destino = CONV #( l_raiz )
- p_data = i_prog_tmp
- ).
- ENDMETHOD.
- METHOD data_work_view.
- DATA: t_data TYPE stringtab.
- CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
- SELECT viewfield,
- tabname,
- fieldname,
- objpos,
- keyflag,
- rollname
- FROM dd27s INTO TABLE @DATA(l_dd03l) WHERE viewname = @p_tadir-obj_name
- AND fieldname NOT LIKE '.%' " Evitamos los campos técnicos de las vistas
- ORDER BY objpos.
- IF lines( l_dd03l ) > 0.
- APPEND '|viewfield|tabname|fieldname|position|keyflag|rollname|' TO t_data.
- APPEND '|---|---|---|---|---|---|' TO t_data.
- LOOP AT l_dd03l INTO DATA(l_dd03l_wa).
- if l_dd03l_wa-keyflag is INITIAL. l_dd03l_wa-keyflag = '-'. endif.
- 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 }\||.
- APPEND l_str TO t_data.
- ENDLOOP.
- cl_front->file_download(
- EXPORTING
- p_prg = CONV #( p_tadir-obj_name )
- p_destino = CONV #( |{ dest }~SE11~{ p_tadir-obj_name }{ c_ext_md }| )
- p_data = t_data
- ).
- ENDIF.
- ENDMETHOD.
- METHOD data_work_tabl.
- DATA: t_data TYPE stringtab.
- CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
- SELECT fieldname,
- position,
- keyflag,
- rollname,
- datatype,
- leng,
- decimals,
- domname
- FROM dd03l INTO TABLE @DATA(l_dd03l) WHERE tabname = @p_tadir-obj_name AND rollname IS NOT NULL AND
- fieldname NOT LIKE '.%' " Evitamos los campos técnicos de las tablas
- ORDER BY position.
- IF lines( l_dd03l ) > 0.
- APPEND '|fieldname|position|keyflag|rollname|datatype|leng|decimals|domname|' TO t_data.
- APPEND '|---|---|---|---|---|---|---|---|' TO t_data.
- LOOP AT l_dd03l INTO DATA(l_dd03l_wa).
- if l_dd03l_wa-keyflag is INITIAL. l_dd03l_wa-keyflag = '-'. endif.
- 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 }\||.
- APPEND l_str TO t_data.
- ENDLOOP.
- cl_front->file_download(
- EXPORTING
- p_prg = CONV #( p_tadir-obj_name )
- p_destino = CONV #( |{ dest }~SE11~{ p_tadir-obj_name }{ c_ext_md }| )
- p_data = t_data
- ).
- ENDIF.
- ENDMETHOD.
- METHOD data_work_ttyp.
- CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
- DATA l_str type string.
- DATA: t_data TYPE stringtab.
- SELECT
- rowtype ,
- rowkind ,
- datatype ,
- leng ,
- decimals ,
- keykind ,
- keyfdcount ,
- generic ,
- typelen
- FROM dd40l INTO TABLE @DATA(ax) WHERE typename = @p_tadir-obj_name.
- LOOP AT ax INTO DATA(ah).
- l_str = |{ c_sep }TTYP{ c_sep }{ p_tadir-obj_name }{ c_sep }{ ah-rowtype }{ c_sep }{ ah-rowkind }{ c_sep }|.
- l_str = |{ l_str }{ ah-datatype }{ c_sep }{ ah-leng }{ c_sep }{ ah-decimals }{ c_sep }{ ah-keykind }{ c_sep }|.
- l_str = |{ l_str }{ ah-keyfdcount }{ c_sep }{ ah-generic }{ c_sep }{ ah-typelen }{ c_sep }|.
- APPEND l_str TO c_list.
- ENDLOOP.
- LOOP AT ax INTO ah WHERE rowtype CP 'Z*'.
- DATA(l_tadir) = VALUE tadir( object = 'TTYP' obj_name = ah-rowtype ).
- data_work_tabl( EXPORTING p_tadir = l_tadir CHANGING c_list = c_list ).
- ENDLOOP.
- ENDMETHOD.
- METHOD data_work_read_report.
- DATA: l_src TYPE stringtab.
- DATA(i_prog) = CONV char255( i_name ).
- READ REPORT i_prog INTO rt_src.
- CHECK lines( rt_src ) > 0.
- * exit. "<-- Pay Per Use
- data_work_finder( EXPORTING it_src = rt_src ).
- ENDMETHOD.
- METHOD data_work_prog_dynpro.
- SELECT prog, dnum FROM d020s INTO TABLE @DATA(t_d020s) WHERE prog = @p_tadir-obj_name.
- LOOP AT t_d020s INTO DATA(i_d020s).
- DATA: _file TYPE string,
- ss TYPE string.
- ss = CONV string( |{ dest }~DYNP~{ i_d020s-prog }~{ i_d020s-dnum }.dyn| ).
- DATA(l_lin) = strlen( ss ).
- * IF l_lin > 126.
- * CONCATENATE dest programa '~DYNP~' i_d020s-dnum '.dyn' INTO ss.
- * ENDIF.
- _file = ss.
- DATA(h) = VALUE d020s( dnum = i_d020s-dnum prog = i_d020s-prog ).
- data_work_prog_dynpro_download( p_filename = CONV #( ss ) p_h = h ).
- ENDLOOP.
- ENDMETHOD.
- METHOD data_work_prog_dynpro_download. " Esto está ripeado del estándar
- CONSTANTS:
- stars(64) VALUE
- '****************************************************************',
- "#EC NOTEXT
- comment1(64) VALUE
- '* THIS FILE IS GENERATED BY THE SCREEN PAINTER. *',
- "#EC NOTEXT
- comment2(64) VALUE
- '* NEVER CHANGE IT MANUALLY, PLEASE ! *',
- "#EC NOTEXT
- dynpro_text(8) VALUE '%_DYNPRO', "#EC NOTEXT
- header_text(8) VALUE '%_HEADER', "#EC NOTEXT
- params_text(8) VALUE '%_PARAMS', "#EC NOTEXT
- descript_text(13) VALUE '%_DESCRIPTION', "#EC NOTEXT
- fields_text(8) VALUE '%_FIELDS', "#EC NOTEXT
- kreuz(1) VALUE 'x', "#EC NOTEXT
- flowlogic_text(11) VALUE '%_FLOWLOGIC'. "#EC NOTEXT
- DATA: filename TYPE string,
- path TYPE string,
- fullpath TYPE string,
- user_action TYPE i,
- filter TYPE string,
- encoding(20),
- filelength TYPE i,
- header_char TYPE scr_chhead,
- dynp_char TYPE STANDARD TABLE OF scr_chfld,
- fields TYPE STANDARD TABLE OF d021s,
- flowlogic TYPE dyn_flowlist,
- c_flowlogic TYPE d022s,
- t_m TYPE STANDARD TABLE OF d023s,
- prog_len TYPE p,
- fields_char TYPE STANDARD TABLE OF scr_chfld.
- *--[ Preparamos la pantalla
- CALL FUNCTION 'RS_SCRP_PREPARE_START'
- EXPORTING
- i_progname = p_h-prog
- i_dynnr = p_h-dnum
- TABLES
- t_f = fields
- t_e = flowlogic
- t_m = t_m.
- *--[
- CALL FUNCTION 'RS_SCRP_HEADER_RAW_TO_CHAR'
- EXPORTING
- header_int = p_h
- IMPORTING
- header_char = header_char
- EXCEPTIONS
- OTHERS = 1.
- DATA(l_prog) = CONV d020t-prog( '' ).
- DESCRIBE FIELD l_prog LENGTH prog_len IN CHARACTER MODE.
- *--[ * Comment
- CLEAR dynp_char[].
- dynp_char = VALUE #( BASE dynp_char ( CONV #( stars ) )
- ( CONV #( comment1 ) )
- ( CONV #( comment2 ) )
- ( CONV #( stars ) )
- *--[ Identificationconv #(
- ( CONV #( dynpro_text ) )
- ( CONV #( header_char-prog ) )
- ( CONV #( header_char-dnum ) )
- ( CONV #( sy-saprl ) )
- ( CONV #( prog_len ) )
- *--[ Headerconv #(
- ( CONV #( header_text ) )
- ( CONV #( header_char ) )
- ( CONV #( fields_text ) )
- ).
- CALL FUNCTION 'RS_SCRP_FIELDS_RAW_TO_CHAR'
- TABLES
- fields_int = fields
- fields_char = fields_char
- EXCEPTIONS
- OTHERS = 1.
- LOOP AT fields_char INTO DATA(ax).
- APPEND ax TO dynp_char.
- ENDLOOP.
- *--[ Flowlogic
- APPEND flowlogic_text TO dynp_char.
- LOOP AT flowlogic INTO c_flowlogic .
- APPEND c_flowlogic TO dynp_char.
- ENDLOOP.
- DATA: down_file TYPE STANDARD TABLE OF string.
- LOOP AT dynp_char INTO DATA(bx).
- filter = bx.
- APPEND filter TO down_file.
- ENDLOOP.
- cl_front->file_download(
- EXPORTING
- p_prg = CONV #( |{ p_h-prog }.{ p_h-dnum }| )
- p_destino = CONV #( p_filename )
- p_data = down_file
- ).
- ENDMETHOD.
- METHOD data_work_prog_includes.
- DATA: buscar(255),
- sx TYPE string,
- lt_tmp TYPE STANDARD TABLE OF char255.
- LOOP AT i_includes INTO DATA(l_includes).
- DATA(sytabix) = sy-tabix.
- buscar = l_includes.
- CALL FUNCTION 'GET_INCLUDETAB'
- EXPORTING
- progname = buscar
- TABLES
- incltab = lt_tmp[].
- LOOP AT lt_tmp INTO DATA(l_tmp).
- READ TABLE i_includes TRANSPORTING NO FIELDS
- WITH KEY table_line = l_tmp.
- IF sy-subrc <> 0.
- APPEND l_tmp TO i_includes.
- ENDIF.
- ENDLOOP.
- *--[ Descargamos actual
- IF sytabix = 1.
- DATA(l_raiz) = buscar.
- CONTINUE.
- ENDIF.
- *--[ Evitamos descargar los includes ya descargados
- READ TABLE cl_front->i_download TRANSPORTING NO FIELDS WITH KEY prog = buscar.
- IF sy-subrc EQ 0.
- DELETE i_includes INDEX sy-tabix.
- CONTINUE.
- ENDIF.
- check cl_front->is_downloaded( p_prg = buscar ) is INITIAL. " Evitamos descargar dos veces el mismo objeto
- DATA(p_data) = data_work_read_report( CONV #( buscar ) ).
- cl_front->file_download(
- EXPORTING
- p_prg = CONV #( buscar )
- p_destino = CONV #( |{ dest }~INCLUDES~{ l_raiz }~{ buscar }{ c_ext_abap }| )
- p_data = p_data
- ).
- data_work_prog_dynpro( EXPORTING p_tadir = p_tadir CHANGING c_list = c_list ).
- ENDLOOP.
- ENDMETHOD.
- METHOD data_work_finder_detail.
- READ TABLE cl_front->i_download TRANSPORTING NO FIELDS WITH KEY prog = p_tadir-obj_name.
- CHECK sy-subrc NE 0.
- DATA(l_new) = NEW lcl_main( i_cl_front = cl_front ).
- l_new->dest = dest.
- CASE p_tadir-object.
- WHEN 'PROG'.
- l_new->data_work_prog( EXPORTING p_tadir = p_tadir CHANGING c_list = i_list ).
- WHEN 'FUNC'.
- l_new->data_work_func( EXPORTING p_tadir = p_tadir CHANGING c_list = i_list ).
- WHEN 'TABL'.
- l_new->data_work_tabl( EXPORTING p_tadir = p_tadir CHANGING c_list = i_list ).
- WHEN 'TRAN'.
- l_new->data_work_tcode( EXPORTING p_tadir = p_tadir CHANGING c_list = i_list ).
- WHEN OTHERS. EXIT.
- ENDCASE.
- ENDMETHOD.
- METHOD data_work_finder.
- DATA(cl_finder) = NEW lcl_abap_obj_finder( it_source = it_src ).
- DATA(l_result) = cl_finder->find_objects( ).
- DATA(l_tadir) = VALUE tadir( ).
- l_tadir-object = 'FUNC'.
- LOOP AT l_result-functions INTO DATA(func) WHERE table_line CP 'Z*'.
- l_tadir-obj_name = func.
- data_work_finder_detail( EXPORTING p_tadir = l_tadir CHANGING i_list = i_list ).
- ENDLOOP.
- l_tadir-object = 'TRAN'.
- LOOP AT l_result-transactions INTO func WHERE table_line CP 'Z*'.
- l_tadir-obj_name = func.
- data_work_finder_detail( EXPORTING p_tadir = l_tadir CHANGING i_list = i_list ).
- ENDLOOP.
- l_tadir-object = 'PROG'.
- LOOP AT l_result-programs INTO func WHERE table_line CP 'Z*'.
- l_tadir-obj_name = func.
- data_work_finder_detail( EXPORTING p_tadir = l_tadir CHANGING i_list = i_list ).
- ENDLOOP.
- l_tadir-object = 'TABL'.
- LOOP AT l_result-tables INTO func WHERE table_line CP 'Z*'.
- l_tadir-obj_name = func.
- data_work_finder_detail( EXPORTING p_tadir = l_tadir CHANGING i_list = i_list ).
- ENDLOOP.
- ENDMETHOD.
- METHOD data_work_prog.
- DATA: l_src TYPE stringtab.
- CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
- DATA(t_src) = data_work_read_report( CONV #( p_tadir-obj_name ) ).
- cl_front->file_download(
- EXPORTING
- p_prg = CONV #( p_tadir-obj_name )
- p_destino = CONV #( |{ dest }~PROGRAMAS~{ p_tadir-obj_name }{ c_ext_abap }| )
- p_data = t_src
- ).
- data_work_prog_dynpro( EXPORTING p_tadir = p_tadir CHANGING c_list = c_list ).
- APPEND p_tadir-obj_name TO i_includes.
- data_work_prog_includes( EXPORTING p_tadir = p_tadir CHANGING c_list = c_list ).
- ENDMETHOD.
- METHOD data_work_func.
- DATA: l_src TYPE stringtab.
- * break-POINT.
- SELECT SINGLE * FROM tfdir INTO @DATA(l_tfdir) WHERE funcname = @p_tadir-obj_name.
- DATA(l_new) = |{ l_tfdir-pname+3 }U{ l_tfdir-include }|.
- DATA(t_src) = data_work_read_report( CONV #( l_new ) ).
- cl_front->file_download(
- EXPORTING
- p_prg = CONV #( p_tadir-obj_name )
- p_destino = CONV #( |{ dest }~FUNCIONES~{ p_tadir-obj_name }{ c_ext_abap }| )
- p_data = t_src
- ).
- ENDMETHOD.
- METHOD data_work_fugr.
- CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
- SELECT funcname FROM v_fdir INTO TABLE @DATA(i_v_fdir) WHERE area = @p_tadir-obj_name.
- LOOP AT i_v_fdir INTO DATA(v_fdir) WHERE funcname NP 'TABLEFRAME*' AND "<-- Evitamos SM30
- funcname NP 'TABLEPROC*' AND
- funcname NP 'VIEWFRAME*' AND
- funcname NP 'VIEWPROC*'.
- SELECT SINGLE pname FROM tfdir INTO @DATA(l_tfdir) WHERE funcname = @v_fdir-funcname.
- DATA(t_data) = data_work_read_report( CONV #( l_tfdir ) ). "-pname ) ).
- DATA(ss) = CONV string( |{ dest }FUGR.{ p_tadir-obj_name }.PRG.{ l_tfdir }.abap| ).
- cl_front->file_download(
- EXPORTING
- p_prg = CONV #( l_tfdir )
- p_destino = CONV #( ss )
- p_data = t_data
- ).
- data_work_prog_dynpro( EXPORTING p_tadir = p_tadir CHANGING c_list = c_list ).
- CLEAR i_includes[].
- APPEND l_tfdir TO i_includes.
- data_work_prog_includes( EXPORTING p_tadir = p_tadir CHANGING c_list = c_list ).
- ENDLOOP.
- ENDMETHOD.
- METHOD data_work_clas.
- CHECK cl_front->is_downloaded( p_prg = p_tadir-obj_name ) IS INITIAL. " Evitamos descargar dos veces el mismo objeto
- DATA(t_metodos) = cl_oo_classname_service=>get_all_method_includes( clsname = CONV #( p_tadir-obj_name ) ).
- DATA(t_all) = cl_oo_classname_service=>get_all_class_includes( class_name = CONV #( p_tadir-obj_name ) ).
- LOOP AT t_metodos INTO DATA(l_metodos).
- DATA(t_data) = data_work_read_report( CONV #( l_metodos-incname ) ).
- DATA(ss) = CONV string( |{ dest }~CLASS~{ p_tadir-obj_name }~{ l_metodos-cpdkey-cpdname }.{ l_metodos-incname }{ c_ext_abap }| ).
- DELETE t_all WHERE table_line = l_metodos-incname.
- cl_front->file_download(
- EXPORTING
- p_prg = CONV #( l_metodos )
- p_destino = CONV #( ss )
- p_data = t_data
- ).
- ENDLOOP.
- *--[ Descargamos el resto de includes que no son metodos
- LOOP AT t_all INTO DATA(l_all).
- DATA(t_datax) = data_work_read_report( CONV #( l_all ) ).
- DATA(sss) = CONV string( |{ dest }~CLASS~{ p_tadir-obj_name }~{ l_all }{ c_ext_abap }| ).
- cl_front->file_download(
- EXPORTING
- p_prg = CONV #( l_all )
- p_destino = CONV #( sss )
- p_data = t_datax
- ).
- ENDLOOP.
- ENDMETHOD.
- METHOD data_work.
- LOOP AT i_tadir INTO DATA(l_tadir).
- CASE l_tadir-object.
- WHEN 'DTEL'. data_work_dtel( EXPORTING p_tadir = l_tadir CHANGING c_list = i_list ).
- WHEN 'DOMA'. data_work_doma( EXPORTING p_tadir = l_tadir CHANGING c_list = i_list ).
- WHEN 'MSAG'. data_work_msag( EXPORTING p_tadir = l_tadir CHANGING c_list = i_list ).
- WHEN 'VIEW'. data_work_view( EXPORTING p_tadir = l_tadir CHANGING c_list = i_list ).
- WHEN 'TABL'. data_work_tabl( EXPORTING p_tadir = l_tadir CHANGING c_list = i_list ).
- WHEN 'TTYP'. data_work_ttyp( EXPORTING p_tadir = l_tadir CHANGING c_list = i_list ).
- WHEN 'PROG'. data_work_prog( EXPORTING p_tadir = l_tadir CHANGING c_list = i_list ).
- WHEN 'FUGR'. data_work_fugr( EXPORTING p_tadir = l_tadir CHANGING c_list = i_list ).
- WHEN 'CLAS'. data_work_clas( EXPORTING p_tadir = l_tadir CHANGING c_list = i_list ).
- WHEN 'TRAN'. data_work_tcode( EXPORTING p_tadir = l_tadir CHANGING c_list = i_list ).
- WHEN 'FORM'. data_work_sapscript( EXPORTING p_tadir = l_tadir ).
- WHEN 'SSFO'. data_work_smartforms( EXPORTING p_tadir = l_tadir ).
- ENDCASE.
- CLEAR i_includes[].
- AT LAST.
- data_work_list( ).
- ENDAT.
- ENDLOOP.
- ENDMETHOD.
- METHOD data_work_list.
- IF lines( i_list ) > 0.
- SORT i_list.
- DELETE ADJACENT DUPLICATES FROM i_list.
- data(o_list) = i_list[].
- clear o_list[].
- data(l_ini) = abap_true.
- loop at i_list into data(l_list) where table_line CP '|TRAN|*'.
- if l_ini = abap_true.
- APPEND '' to o_list.
- append '# Transacciones' to o_list.
- APPEND '' to o_list.
- append '|Tipo|TCODE|Programa|Dynpro|Idioma|Descripción|' to o_list.
- APPEND '|---|---|---|---|---|---|' to o_list.
- l_ini = abap_false.
- endif.
- append l_list to o_list.
- endloop.
- l_ini = abap_true.
- loop at i_list into l_list where table_line CP '|DOMA|*'.
- if l_ini = abap_true.
- APPEND '' to o_list.
- append '# Dominios' to o_list.
- APPEND '' to o_list.
- APPEND '|Tipo|Nombre|Idioma/Técnico|Idioma / Tipo|Texto|Texto|Texto|' to o_list.
- APPEND '|---|---|---|---|---|---|---|' to o_list.
- l_ini = abap_false.
- endif.
- append l_list to o_list.
- endloop.
- l_ini = abap_true.
- loop at i_list into l_list where table_line CP '|DTEL|*'.
- if l_ini = abap_true.
- APPEND '' to o_list.
- append '# Elemento de Datos' to o_list.
- APPEND '' to o_list.
- APPEND '|Tipo|Nombre|Tipo|Idioma / Dominio|Texto / Tipo |Texto / Longitud|Texto|' to o_list.
- APPEND '|---|---|---|---|---|---|---|' to o_list.
- l_ini = abap_false.
- endif.
- append l_list to o_list.
- endloop.
- l_ini = abap_true.
- loop at i_list into l_list where table_line CP '|TTYP|*'.
- if l_ini = abap_true.
- APPEND '' to o_list.
- append '# Tipo de tabla' to o_list.
- APPEND '' to o_list.
- APPEND '|Tipo|Nombre|Estructura|Tipo|Formato |Longitud|Decimales|' to o_list.
- APPEND '|---|---|---|---|---|---|---|' to o_list.
- l_ini = abap_false.
- endif.
- append l_list to o_list.
- endloop.
- cl_front->file_download(
- EXPORTING
- p_prg = 'LISTADO'
- p_destino = CONV #( |{ dest }~SE11~basicos{ c_ext_md }| )
- p_data = o_list
- ).
- ENDIF.
- IF lines( cl_front->i_download ) > 0.
- CLEAR i_list[].
- LOOP AT cl_front->i_download INTO DATA(l_down).
- AT FIRST.
- SELECT name, sprsl, text
- FROM trdirt
- FOR ALL ENTRIES IN @cl_front->i_download
- WHERE name = @cl_front->i_download-programa INTO TABLE @DATA(lt_trdir).
- i_list = VALUE #( BASE i_list ( |# LOG de Programas Descargaso en { sy-datum } { sy-uzeit }| )
- ( 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.' ) )
- ( CONV string( '' ) )
- ( CONV string('| Objeto | Descripción|Ruta del objeto |' ) )
- ( CONV string('|---|---|---|' ) )
- ).
- ENDAT.
- READ TABLE lt_trdir INTO DATA(l_trdir) WITH KEY name = l_down-programa sprsl = sy-langu.
- IF sy-subrc NE 0 OR l_trdir-text IS INITIAL.
- READ TABLE lt_trdir INTO l_trdir WITH KEY name = l_down-programa sprsl = 'S'.
- IF sy-subrc NE 0 OR l_trdir-text IS INITIAL.
- READ TABLE lt_trdir INTO l_trdir WITH KEY name = l_down-programa sprsl = 'E'.
- IF sy-subrc NE 0 OR l_trdir-text IS INITIAL.
- READ TABLE lt_trdir INTO l_trdir WITH KEY name = l_down-programa sprsl = 'D'.
- ELSE.
- CLEAR l_trdir .
- ENDIF.
- ENDIF.
- ENDIF.
- APPEND |\|{ l_down-prog }\|{ l_trdir-text }\|{ l_down-path }\|| TO i_list.
- ENDLOOP.
- cl_front->file_download(
- EXPORTING
- p_prg = 'LISTADO_DESCARGAS'
- p_destino = CONV #( |{ dest }~{ sy-datum }{ sy-uzeit }_resultado.md| )
- p_data = i_list[]
- ).
- ENDIF.
- ENDMETHOD.
- ENDCLASS.
- END-OF-SELECTION.
- DATA(cl_main) = NEW lcl_main( ).
- cl_main->data_load( p_pack = s_pack[]
- p_obj = s_obj[]
- p_objn = s_objn[]
- p_author = s_author[]
- p_dest = CONV #( dest )
- ).
- cl_main->data_work( ).
Última modificación de la página el 02 May 2026 a las 20h06
Powered by
PmWiki