Вот что удалось придумать самому:
Code:
FUNCTION Z_BC402_CREATE_SEP_STRING .
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" REFERENCE(IM_NUMBER) TYPE I DEFAULT 1
*" REFERENCE(IM_SEPARATOR) TYPE C DEFAULT '#'
*" REFERENCE(IM_UNIQUE) TYPE C DEFAULT 'X'
*" REFERENCE(IM_TABLE_NAME) TYPE STRING DEFAULT 'SFLIGHT'
*" EXPORTING
*" REFERENCE(EX_STRING) TYPE STRING
*" EXCEPTIONS
*" NO_DATA
*"----------------------------------------------------------------------
PERFORM get_structure USING im_table_name.
PERFORM create_dynamic_itab.
PERFORM get_data USING im_table_name im_unique im_number.
PERFORM sep_string USING im_separator CHANGING ex_string.
ENDFUNCTION.
TYPE-POOLS: abap, slis.
FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
<dyn_wa>,
<dyn_field>.
DATA: dy_table TYPE REF TO data,
dy_line TYPE REF TO data,
xfc TYPE lvc_s_fcat,
ifc TYPE lvc_t_fcat.
FORM get_structure USING im_table_name TYPE string.
DATA: idetails TYPE abap_compdescr_tab,
xdetails TYPE abap_compdescr,
ref_table_des TYPE REF TO cl_abap_structdescr.
ref_table_des ?= cl_abap_typedescr=>describe_by_name( im_table_name ).
idetails[] = ref_table_des->components[].
LOOP AT idetails INTO xdetails.
CLEAR xfc.
xfc-fieldname = xdetails-name.
xfc-datatype = xdetails-type_kind.
xfc-inttype = xdetails-type_kind.
xfc-intlen = xdetails-length.
xfc-decimals = xdetails-decimals.
APPEND xfc TO ifc.
ENDLOOP.
ENDFORM.
FORM create_dynamic_itab.
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = ifc
IMPORTING
ep_table = dy_table.
ASSIGN dy_table->* TO <dyn_table>.
CREATE DATA dy_line LIKE LINE OF <dyn_table>.
ASSIGN dy_line->* TO <dyn_wa>.
ENDFORM.
FORM get_data USING im_table_name TYPE string im_unique TYPE C im_number TYPE I.
DATA: others_rows_count TYPE I.
IF im_unique = 'X'.
SELECT DISTINCT * INTO CORRESPONDING FIELDS OF TABLE <dyn_table> FROM (im_table_name) UP TO im_number ROWS.
ELSE.
SELECT * INTO CORRESPONDING FIELDS OF TABLE <dyn_table> FROM (im_table_name) UP TO im_number ROWS.
others_rows_count = im_number - lines( <dyn_table> ).
WHILE others_rows_count > 0.
SELECT * APPENDING CORRESPONDING FIELDS OF TABLE <dyn_table> FROM (im_table_name) UP TO others_rows_count ROWS.
others_rows_count = im_number - lines( <dyn_table> ).
ENDWHILE.
ENDIF.
IF sy-subrc <> 0.
RAISE NO_DATA.
ENDIF.
ENDFORM.
FORM sep_string USING im_separator TYPE C CHANGING ex_string TYPE string.
DATA: temp_str TYPE string.
LOOP AT <dyn_table> INTO <dyn_wa>.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE <dyn_wa> TO <dyn_field>.
IF sy-subrc <> 0.
EXIT.
ENDIF.
temp_str = <dyn_field>.
IF temp_str = ''.
temp_str = '0'.
ENDIF.
IF sy-index = 1.
CONCATENATE ex_string im_separator im_separator temp_str INTO ex_string.
ELSE.
CONCATENATE ex_string im_separator temp_str INTO ex_string.
ENDIF.
ENDDO.
ENDLOOP.
CONCATENATE ex_string im_separator im_separator INTO ex_string.
ENDFORM.