Вы находитесь на странице: 1из 4

REPORT zstkoes_dynamic_tab_download3.

TYPES:
BEGIN OF gtys_value,
value LIKE tsprim-field,
text LIKE tsapplt-txt,
END OF gtys_value,
gtyt_gt_values TYPE TABLE OF gtys_value WITH EMPTY KEY.

DATA:
gv_retfield TYPE fieldname VALUE 'VALUE',
gv_objtype TYPE ddeutype.

DATA:
go_data TYPE REF TO data.

DATA:
gt_return TYPE TABLE OF ddshretval,
gt_dfies TYPE dfies_tab.

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

TYPES:
BEGIN OF gtys_fields,
* fieldname TYPE fieldname,
fieldname TYPE ddtext,
END OF gtys_fields,
gtyt_fields TYPE TABLE OF gtys_fields WITH EMPTY KEY.

DATA:
lv_file TYPE string,
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.

" First check if table exists and has the right type

CALL FUNCTION 'INTERN_DD_TABL_TYPE'


EXPORTING
objname = p_tab
IMPORTING
objtype = gv_objtype
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0.
IF gv_objtype <> 'T' AND gv_objtype <> 'V'.
* if gv_objtype <> 'T'.
MESSAGE s001(wusl) WITH p_tab gv_objtype DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
ELSE.
*.....table does not exist in Dictionary
MESSAGE s007(e2) WITH p_tab DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.

CALL FUNCTION 'DDIF_FIELDINFO_GET'


EXPORTING
tabname = p_tab
TABLES
dfies_tab = gt_dfies
EXCEPTIONS
not_found = 1
OTHERS = 2.

CHECK sy-subrc = 0.

DATA(gt_values) = VALUE gtyt_gt_values( FOR ls_dfies IN gt_dfies


( value = ls_dfies-fieldname
text = ls_dfies-scrtext_m ) ).

CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'


EXPORTING
retfield = gv_retfield
value_org = 'S'
multiple_choice = 'X'
TABLES
value_tab = gt_values
return_tab = gt_return
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.

START-OF-SELECTION.

IF gt_return IS INITIAL.
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_return IN gt_return


sign = 'I' option = 'EQ' ( low =
ls_return-fieldval ) ).

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_return IN gt_return
NEXT lv_field = |{ lv_field }{ COND #( WHEN lv_count
GT 0 THEN |, | ) }{ ls_return-fieldval }| lv_count = lv_count + 1 ).
TRY.
SELECT (lv_fields) FROM (p_tab) INTO TABLE @<lfs_tab>.
CATCH cx_sy_dynamic_osql_semantics INTO DATA(gx_sy_dynamic_osql_semantics).
DATA(gv_message) = gx_sy_dynamic_osql_semantics->get_text( ).
MESSAGE gv_message TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDTRY.

END-OF-SELECTION.

lv_file = p_file.

CALL METHOD cl_gui_frontend_services=>gui_download


EXPORTING
filename = lv_file
filetype = 'ASC'
write_field_separator = 'X'
fieldnames = VALUE gtyt_fields( FOR ls_return IN gt_return
( fieldname = ls_return-fieldval ) )
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.

Вам также может понравиться