You are on page 1of 3

REPORT zstkoes_dynamic_tab_download.

TYPES:
* Feldtyp
BEGIN OF t_fld.
INCLUDE STRUCTURE dd03p AS dd03p. "Dictionary-Struktur
" weitere Attribute für die Pflege
TYPES:
mark LIKE rsdxx-mark, "Eintrag markiert
type_icon TYPE dd02d-datatype, "Typ-Ikone
shlporigin_text LIKE dd07t-ddtext, "Text zur SHLPORIGIN
fkexi(1), "Flag für Existenz der FS.prüfung
mod(1), "Modifikations-Id für Erweiterungen §CLM
" MOD=Space/M/C (Original/Modifiziert/Kunden-Teilobjekt)
actf(1), "Flag: X-Feld der aktiven Version im Modus F_ADDFMODE=X
f_display,
switch_id TYPE sfw_switch_id,
END OF t_fld.

DATA:
gt_fld_copy TYPE TABLE OF t_fld,
gt_dd03p TYPE TABLE OF dd03p.

DATA:
go_data TYPE REF TO data.

DATA:
get_state TYPE dctablget,
got_state TYPE dctablget,
got_state_d TYPE dctabdget.

PARAMETERS:
p_tab TYPE tabname OBLIGATORY,
p_file TYPE localfile OBLIGATORY.

TYPES:
BEGIN OF ty_str_hdr,
field_name TYPE char20,
END OF ty_str_hdr.

DATA:
lv_file TYPE string,
lit_hdr TYPE STANDARD TABLE OF ty_str_hdr,
lwa_hdr TYPE ty_str_hdr,
lvo_ref TYPE REF TO data,
lvo_ref_line TYPE REF TO data.

FIELD-SYMBOLS:
<lfs_tab> TYPE ANY TABLE.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.


CALL FUNCTION 'F4_FILENAME'
EXPORTING
field_name = 'p_file'
IMPORTING
file_name = p_file.
START-OF-SELECTION.

get_state-tabd = get_state-tabt = 'A'.

CALL FUNCTION 'DD_TABL_GET'


EXPORTING
get_state = get_state
prid = -2
tabl_name = p_tab
withtext = 'X'
add_typeinfo = 'X'
TABLES
dd03p_tab_a = gt_dd03p
EXCEPTIONS
OTHERS = 2.

DELETE gt_dd03p WHERE fieldname CP '.*'.


gt_fld_copy = gt_dd03p.

CALL FUNCTION 'DD_LIST_TABFIELDS'


EXPORTING
eutype = 'V'
p_with_type = 'X'
TABLES
fieldtab = gt_fld_copy
EXCEPTIONS
not_executed = 1
OTHERS = 2.

END-OF-SELECTION.

IF NOT line_exists( gt_fld_copy[ mark = 'X' ] ).


MESSAGE 'No fields selected' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.

DATA(gt_components) = CAST
cl_abap_structdescr( cl_abap_typedescr=>describe_by_name( p_tab ) )-
>get_components( ).
LOOP AT gt_components REFERENCE INTO DATA(gr_component).
IF gr_component->as_include NE 'X'.
CONTINUE.
ENDIF.
DATA(gv_tabix) = sy-tabix.
DATA(gt_components_include) = CAST cl_abap_structdescr( gr_component->type )-
>get_components( ).
DELETE gt_components INDEX gv_tabix.
INSERT LINES OF gt_components_include INTO gt_components INDEX gv_tabix.
ENDLOOP.

DATA(gr_fields) = VALUE pph_field_range( FOR ls_fld_copy IN gt_fld_copy


WHERE ( mark EQ 'X' )
sign = 'I' option = 'EQ' ( low =
ls_fld_copy-fieldname ) ).

DELETE gt_components WHERE name NOT IN gr_fields.


TRY.
DATA(go_structdescr) = cl_abap_structdescr=>create( gt_components ).
DATA(go_tabledescr) = cl_abap_tabledescr=>create( go_structdescr ).
CATCH cx_sy_table_creation. "
CATCH cx_sy_struct_creation. "
ENDTRY.

CREATE DATA go_data TYPE HANDLE go_tabledescr.

ASSIGN go_data->* TO <lfs_tab>.

DATA(lv_fields) = REDUCE #( INIT lv_field = || lv_count = 0


FOR ls_fld_copy IN gt_fld_copy
WHERE ( mark EQ 'X' )
NEXT lv_field = |{ lv_field }{ COND #( WHEN lv_count
GT 0 THEN |, | ) }{ ls_fld_copy-fieldname }| lv_count = lv_count + 1 ).
SELECT (lv_fields) FROM (p_tab) INTO TABLE @<lfs_tab>.

lv_file = p_file.

CALL METHOD cl_gui_frontend_services=>gui_download


EXPORTING
filename = lv_file
filetype = 'ASC'
write_field_separator = 'X'
fieldnames = lit_hdr
CHANGING
data_tab = <lfs_tab>
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.
IF sy-subrc = 0.
WRITE:/ 'File downloaded successfully' COLOR COL_POSITIVE.
ENDIF.

You might also like