REPORT ZDINAMIC_TAB_UP_DOWN.
SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME TITLE text-001.
PARAMETERS: p_table LIKE dd02l-tabname.
PARAMETER: filez TYPE string LOWER CASE.
SELECTION-SCREEN BEGIN OF BLOCK b03 WITH FRAME TITLE text-002.
PARAMETERS: p_down RADIOBUTTON GROUP mod DEFAULT 'X', "<-- Download
p_up RADIOBUTTON GROUP mod. "<-- Upload
SELECTION-SCREEN END OF BLOCK b03.
SELECTION-SCREEN BEGIN OF BLOCK b04 WITH FRAME TITLE text-003.
PARAMETERS: p_pc RADIOBUTTON GROUP lcl DEFAULT 'X', "<-- A/Desde PC
p_srv RADIOBUTTON GROUP lcl. "<-- A/Desde Servidor
SELECTION-SCREEN END OF BLOCK b04.
SELECTION-SCREEN END OF BLOCK b02.
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE text-004.
*[@~@INI - Dynamic Generation - KEEP HANDS OFF]
TABLES: T001 .
CONSTANTS: c_name(30) VALUE 'T001'.
SELECT-OPTIONS: s_BUKRS for T001-BUKRS.
*[@~@FIN - Dynamic Generation - KEEP HANDS OFF]
SELECTION-SCREEN END OF BLOCK b01.
CLASS z_cl_filez DEFINITION.
PUBLIC SECTION.
DATA: to_from_pc TYPE xfeld,
to_from_host TYPE xfeld,
my_tab TYPE STANDARD TABLE OF string,
filename TYPE string,
filesize TYPE i,
filetype TYPE char10.
METHODS: load CHANGING p_table TYPE table,
save CHANGING p_table TYPE table,
constructor IMPORTING i_filez TYPE string.
PRIVATE SECTION.
METHODS: load_from_pc CHANGING p_table TYPE table,
load_from_host CHANGING p_table TYPE table,
save_to_pc CHANGING p_table TYPE table,
save_to_host CHANGING p_table TYPE table,
open_dialog.
ENDCLASS.
CLASS z_cl_filez IMPLEMENTATION.
METHOD constructor.
IF NOT i_filez IS INITIAL.
me->filename = i_filez.
ENDIF.
me->filetype = 'ASC'. "<- Por defecto siempre en ASCII
me->to_from_pc = 'X'. "<- Por Defecto en local
ENDMETHOD.
METHOD load.
CASE 'X'.
WHEN me->to_from_pc. me->load_from_pc( CHANGING p_table = p_table ).
WHEN me->to_from_host. me->load_from_host( CHANGING p_table = p_table ).
ENDCASE.
ENDMETHOD.
METHOD save.
CASE 'X'.
WHEN me->to_from_pc. me->save_to_pc( CHANGING p_table = p_table ).
WHEN me->to_from_host. me->save_to_host( CHANGING p_table = p_table ).
ENDCASE.
ENDMETHOD.
METHOD open_dialog.
DATA: lv_file_table TYPE filetable,
lv_rc TYPE i.
IF me->filename IS INITIAL.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
* EXPORTING
* WINDOW_TITLE =
* DEFAULT_EXTENSION =
* DEFAULT_FILENAME =
* FILE_FILTER =
* WITH_ENCODING =
* INITIAL_DIRECTORY =
* MULTISELECTION =
CHANGING
file_table = lv_file_table
rc = lv_rc
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5.
READ TABLE lv_file_table INTO me->filename INDEX 1.
ENDIF.
ENDMETHOD.
METHOD: load_from_pc.
me->open_dialog( ).
CHECK sy-subrc EQ 0.
CALL METHOD cl_gui_frontend_services=>gui_upload
EXPORTING
filename = me->filename
filetype = me->filetype
IMPORTING
filelength = me->filesize
* HEADER =
CHANGING
data_tab = p_table
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
not_supported_by_gui = 17
error_no_gui = 18
OTHERS = 19.
ENDMETHOD.
METHOD: save_to_pc.
me->open_dialog( ).
CHECK sy-subrc EQ 0.
IF me->filetype NE 'BIN'.
CLEAR me->filesize.
ENDIF.
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
bin_filesize = me->filesize
filename = me->filename
filetype = me->filetype
IMPORTING
filelength = me->filesize
CHANGING
data_tab = p_table
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 load_from_host.
DATA: lv_s TYPE REF TO data.
FIELD-SYMBOLS: <lv_s> TYPE any.
CREATE DATA lv_s LIKE LINE OF p_table.
ASSIGN lv_s->* TO <lv_s>.
CHECK NOT me->filename IS INITIAL.
IF me->filetype = 'BIN'.
OPEN DATASET me->filename FOR INPUT IN BINARY MODE.
ELSE.
OPEN DATASET me->filename FOR INPUT IN TEXT MODE ENCODING DEFAULT.
ENDIF.
CHECK sy-subrc EQ 0.
DO.
READ DATASET me->filename INTO <lv_s>.
IF sy-subrc NE 0. EXIT. ENDIF.
APPEND <lv_s> TO p_table.
ENDDO.
CLOSE DATASET me->filename.
ENDMETHOD.
METHOD save_to_host.
DATA: lv_s TYPE REF TO data.
FIELD-SYMBOLS: <lv_s> TYPE any.
CREATE DATA lv_s LIKE LINE OF p_table.
ASSIGN lv_s->* TO <lv_s>.
CHECK NOT me->filename IS INITIAL.
IF me->filetype = 'BIN'.
OPEN DATASET me->filename FOR OUTPUT IN BINARY MODE.
ELSE.
OPEN DATASET me->filename FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
ENDIF.
LOOP AT p_table INTO <lv_s>.
TRANSFER <lv_s> TO me->filename.
ENDLOOP.
CLOSE DATASET me->filename.
ENDMETHOD.
ENDCLASS.
DATA: l_filez TYPE REF TO z_cl_filez.
DATA: t_tab TYPE REF TO data,
l_tab TYPE REF TO data,
s_where TYPE string.
FIELD-SYMBOLS: <fs_t_tab> TYPE ANY TABLE,
<fs_l_tab> TYPE any.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR filez.
PERFORM help_me CHANGING filez.
INITIALIZATION.
p_table = c_name.
END-OF-SELECTION.
PERFORM regenerate.
PERFORM load_data.
CASE 'X'.
WHEN p_down.
l_filez->save( CHANGING p_table = <fs_t_tab> ).
WHEN p_up.
l_filez->load( CHANGING p_table = <fs_t_tab> ).
ENDCASE.
PERFORM save_data.
FORM save_data.
CHECK NOT p_up IS INITIAL.
MODIFY (c_name) FROM TABLE <fs_t_tab>.
ENDFORM.
FORM load_data.
CREATE OBJECT l_filez
EXPORTING
i_filez = filez.
l_filez->to_from_pc = p_pc.
l_filez->to_from_host = p_srv.
l_filez->filetype = 'BIN'.
CREATE DATA t_tab TYPE TABLE OF (c_name).
CREATE DATA l_tab TYPE (c_name).
ASSIGN t_tab->* TO <fs_t_tab>.
ASSIGN l_tab->* TO <fs_l_tab>.
CHECK p_down = 'X'.
SELECT * FROM (c_name) INTO TABLE <fs_t_tab>.
ENDFORM.
FORM regenerate.
DEFINE add_line.
condense l_src.
append l_src to t_src.
END-OF-DEFINITION.
DEFINE add_param.
delete t_texttab where id = 'S' and key = &1.
c_texttab-id = 'S'.
c_texttab-key = &1.
concatenate '!!!!!!!!' &2 into c_texttab-entry. "Blancos necesarios al principio
translate c_texttab-entry using '! '.
c_texttab-length = strlen( c_texttab-entry ).
append c_texttab to t_texttab.
END-OF-DEFINITION.
DATA: t_src TYPE STANDARD TABLE OF string,
x_src TYPE STANDARD TABLE OF string,
l_src TYPE string,
l_dd03l TYPE dd03l,
s_where TYPE string,
s_num(3) TYPE n.
DATA: t_texttab TYPE STANDARD TABLE OF textpool,
c_texttab TYPE textpool.
CHECK NOT p_table IS INITIAL.
CHECK p_table NE c_name.
READ REPORT sy-repid INTO t_src.
CLEAR sy-curow.
LOOP AT t_src INTO l_src.
IF l_src CP '+[@~@*'.
IF sy-curow IS INITIAL.
sy-cucol = sy-tabix + 1. "<- Posicionamiento
APPEND l_src TO x_src.
ADD 1 TO sy-curow.
ELSE.
CLEAR sy-curow.
ENDIF.
ENDIF.
CHECK sy-curow IS INITIAL.
APPEND l_src TO x_src.
ENDLOOP.
REFRESH t_src.
*--[ Añadimos nueva tabla
CLEAR l_src. add_line. "<- Blank line
CONCATENATE 'TABLES: ' p_table '.' INTO l_src RESPECTING BLANKS.
add_line.
CONCATENATE 'CONSTANTS: c_name(30) VALUE ''' p_table '''.' INTO l_src.
add_line.
CLEAR s_where.
READ TEXTPOOL sy-repid INTO t_texttab LANGUAGE sy-langu.
SELECT * FROM dd03l INTO l_dd03l
WHERE tabname = p_table
AND fieldname NE 'MANDT'
AND keyflag = 'X'
ORDER BY position.
CONCATENATE 'S_' l_dd03l-fieldname+0(6) INTO sy-msgv1.
CONCATENATE 'SELECT-OPTIONS:~s_' l_dd03l-fieldname+0(6) '~for~' p_table '-' l_dd03l-fieldname '.' INTO l_src.
CONDENSE l_src NO-GAPS.
TRANSLATE l_src USING '~ '.
add_line.
SELECT SINGLE ddtext INTO sy-msgv2 FROM dd04t
WHERE rollname = l_dd03l-rollname
AND ddlanguage = sy-langu.
add_param sy-msgv1 sy-msgv2.
CONCATENATE s_where 'AND~' l_dd03l-fieldname 'IN~s_' l_dd03l-fieldname+0(6) INTO s_where.
ENDSELECT.
DELETE t_texttab WHERE entry = 'FILE' OR
entry CP 'P_*' OR
id = 'R' OR "<- Título
id = 'I'. "<- Textos
add_param 'P_TABLE' 'Tabla'.
add_param 'FILEZ' 'Fichero'.
add_param 'P_DOWN' 'Descargar a fichero'.
add_param 'P_UP' 'Cargar a tabla'.
add_param 'P_PC' 'A/Desde PC Local'.
add_param 'P_SRV' 'A/Desde Servidor'.
*--[ Título
c_texttab-id = 'S'.
c_texttab-entry = 'Cargar/Descargar tabla a/desde fichero'.
c_texttab-length = strlen( c_texttab-entry ).
APPEND c_texttab TO t_texttab.
*--[ Elementos de texto
c_texttab-id = 'I'.
c_texttab-entry = 'Datos de proceso'.
c_texttab-length = strlen( c_texttab-entry ).
c_texttab-key = '001'.
APPEND c_texttab TO t_texttab.
c_texttab-entry = 'Tipo de ejecución'.
c_texttab-key = '002'.
c_texttab-length = strlen( c_texttab-entry ).
APPEND c_texttab TO t_texttab.
c_texttab-entry = 'Destino/Origen de datos'.
c_texttab-key = '003'.
c_texttab-length = strlen( c_texttab-entry ).
APPEND c_texttab TO t_texttab.
c_texttab-entry = 'Campos para selección'.
c_texttab-key = '004'.
c_texttab-length = strlen( c_texttab-entry ).
APPEND c_texttab TO t_texttab.
INSERT TEXTPOOL sy-repid FROM t_texttab LANGUAGE sy-langu STATE 'A'.
CONDENSE s_where NO-GAPS.
TRANSLATE s_where USING '~ '.
SHIFT s_where LEFT BY 4 PLACES.
s_num = strlen( s_where ).
CONCATENATE 'CONSTANTS: c_where(' s_num ') VALUE ''' s_where+0(s_num) '''.' INTO l_src.
CLEAR l_src. add_line. "<- Blank line
INSERT LINES OF t_src INTO x_src INDEX sy-cucol.
INSERT REPORT sy-repid FROM x_src.
LEAVE PROGRAM.
ENDFORM.
FORM help_me CHANGING p_filez TYPE string.
DATA: lv_file LIKE rlgrap-filename.
lv_file = p_filez.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
def_filename = lv_file
mask = ',all files,*.*,data files,*.dat,text files,*.txt.'
mode = 'o'
title = 'Selecciona un fichero...'
IMPORTING
filename = lv_file
EXCEPTIONS
inv_winsys = 04
no_batch = 04
selection_cancel = 04
selection_error = 04.
p_filez = lv_file.
ENDFORM.