*&---------------------------------------------------------------------*
*& 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.