2014 Sep 03 2:10 PM
Hi guys,
I have an issue and I'd like some suggestions... I'm using cl_alv_table_create=>create_dynamic_table but I have a problem with 36 subroutine pool generation limit... (ECC 6.0 / SAP_ABA 700 SAPKA70022)
I found some posts but, nothing worked yet:
http://scn.sap.com/thread/20834
Does anyone know if exist some way to refresh this subroutines after use that method?
Thanks!
METHOD converter_csv_al11_itab.
*--> IM_T_CSV TYPE TEXTLINE_T
*--> EX_W_SAP TYPE ANY
*<-- EX_T_SAP TYPE STANDARD TABLE
DATA:
obj_csv_table_struct TYPE REF TO data ,
obj_tl_csv_table_desc TYPE REF TO cl_abap_tabledescr ,
obj_wl_csv_table_desc TYPE REF TO cl_abap_structdescr,
obj_tl_dinamica TYPE REF TO data ,
obj_wl_dinamica TYPE REF TO data .
DATA:
tl_csv_campos TYPE abap_compdescr_tab,
tl_csv_em_coluna TYPE table_of_strings ,
tl_fieldcatalog TYPE lvc_t_fcat .
DATA:
wl_csv_campos TYPE abap_compdescr ,
wl_csv_em_coluna TYPE LINE OF table_of_strings,
wl_fieldcatalog TYPE lvc_s_fcat ,
wl_csv TYPE LINE OF textline_t .
DATA:
vl_indice TYPE i ,
vl_qtd_linhas TYPE i ,
vl_nome_campo TYPE char30 ,
vl_pular_linha TYPE abap_bool.
FIELD-SYMBOLS:
<fs_csv_table_struct> TYPE STANDARD TABLE,
<fs_tl_dinamica> TYPE STANDARD TABLE,
<fs_wl_dinamica> TYPE ANY ,
<fs_campo_dinamico> TYPE ANY .
CONSTANTS:
c_csv_separador TYPE char1 VALUE ';' ,
c_csv_esc_char TYPE char1 VALUE '"' ,
c_csv_num_cols TYPE i VALUE 999999,
c_csv_skip_header TYPE abap_bool VALUE ' ' .
* Determina a estrutura da tabela de destino
GET REFERENCE OF ex_t_sap INTO obj_csv_table_struct.
ASSIGN obj_csv_table_struct->* TO <fs_csv_table_struct>.
obj_tl_csv_table_desc ?= cl_abap_structdescr=>describe_by_data_ref( obj_csv_table_struct ).
obj_wl_csv_table_desc ?= obj_tl_csv_table_desc->get_table_line_type( ).
tl_csv_campos = obj_wl_csv_table_desc->components.
LOOP AT tl_csv_campos INTO wl_csv_campos .
wl_fieldcatalog-fieldname = wl_csv_campos-name .
wl_fieldcatalog-inttype = wl_csv_campos-type_kind.
wl_fieldcatalog-intlen = wl_csv_campos-length .
wl_fieldcatalog-decimals = wl_csv_campos-decimals .
APPEND wl_fieldcatalog TO tl_fieldcatalog .
ENDLOOP.
* Cria uma tabela dinâmica
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = tl_fieldcatalog
IMPORTING
ep_table = obj_tl_dinamica
EXCEPTIONS
generate_subpool_dir_full = 1
OTHERS = 2.
CHECK obj_tl_dinamica IS NOT INITIAL.
ASSIGN obj_tl_dinamica->* TO <fs_tl_dinamica>.
CREATE DATA obj_wl_dinamica LIKE LINE OF <fs_tl_dinamica>.
ASSIGN obj_wl_dinamica->* TO <fs_wl_dinamica>.
LOOP AT im_t_csv INTO wl_csv.
* Converte as linhas do arquivo CSV em colunas
CALL FUNCTION 'RSDS_CONVERT_CSV'
EXPORTING
i_data_sep = c_csv_separador
i_esc_char = c_csv_esc_char
i_record = wl_csv
i_field_count = c_csv_num_cols
IMPORTING
e_t_data = tl_csv_em_coluna
EXCEPTIONS
escape_no_close = 1
escape_improper = 2
conversion_error = 3
OTHERS = 4.
vl_indice = 1.
DESCRIBE TABLE tl_csv_em_coluna LINES vl_qtd_linhas.
* Armazena os campos da tabela CSV na tabela dinâmica
LOOP AT tl_csv_campos INTO wl_csv_campos.
MOVE wl_csv_campos-name TO vl_nome_campo.
ASSIGN COMPONENT vl_nome_campo
OF STRUCTURE <fs_wl_dinamica>
TO <fs_campo_dinamico>.
READ TABLE tl_csv_em_coluna
INDEX vl_indice
INTO wl_csv_em_coluna.
IF vl_indice <= vl_qtd_linhas.
<fs_campo_dinamico> = wl_csv_em_coluna.
ELSE.
<fs_campo_dinamico> = space.
ENDIF.
vl_indice = vl_indice + 1.
ENDLOOP.
* Move as linhas da tabela dinâmica para a tabela final
MOVE-CORRESPONDING <fs_wl_dinamica> TO ex_w_sap.
APPEND ex_w_sap TO ex_t_sap.
ENDLOOP.
ENDMETHOD.
2014 Sep 03 3:01 PM
Hi
cl_alv_table_create=>create_dynamic_table is an old "method" to create an internal table dynamically:
this class generates a subroutine and as you've seen there's a limit,
but you're using classes like cl_abap_tabledescr, so you can use them in order to generate the table, you don't need to use that method:
You need to insert the components of your table in variable like:
FIELD-SYMBOLS: <FS_WA> TYPE ANY.
FIELD-SYMBOLS: <FS_ITAB> TYPE TABLE.
DATA: MY_DYN_WA TYPE REF TO DATA.
DATA: MY_DYN_STRUCT TYPE REF TO CL_ABAP_STRUCTDESCR,
DATA: MY_DYN_TAB TYPE REF TO CL_ABAP_TABLEDESCR
DATA: LT_COMPONENTS TYPE CL_ABAP_STRUCTDESCR=>COMPONENT_TABLE.
instead of to use ALV catalog
So you can create a structure;
MY_DYN_STRUCT = CL_ABAP_STRUCTDESCR=>CREATE( P_COMPONENTS = LT_COMPONENTS
P_STRICT = 'X' )..
CREATE DATA MY_DYN_WA TYPE HANDLE MY_DYN_STRUCT
ASSIGN MY_DYN_WA ->* TO <FS_WA>.
or a table:
MY_DYN_TAB = CL_ABAP_TABLEDESCR=>CREATE( P_LINE_TYPE = MY_DYN_STRUCT ).
CREATE DATA MY_DYN_TAB TYPE HANDLE MY_DYN_TAB.
ASSIGN MY_DYN_TAB->* TO <FS_ITAB>.
2014 Sep 03 3:01 PM
Hi
cl_alv_table_create=>create_dynamic_table is an old "method" to create an internal table dynamically:
this class generates a subroutine and as you've seen there's a limit,
but you're using classes like cl_abap_tabledescr, so you can use them in order to generate the table, you don't need to use that method:
You need to insert the components of your table in variable like:
FIELD-SYMBOLS: <FS_WA> TYPE ANY.
FIELD-SYMBOLS: <FS_ITAB> TYPE TABLE.
DATA: MY_DYN_WA TYPE REF TO DATA.
DATA: MY_DYN_STRUCT TYPE REF TO CL_ABAP_STRUCTDESCR,
DATA: MY_DYN_TAB TYPE REF TO CL_ABAP_TABLEDESCR
DATA: LT_COMPONENTS TYPE CL_ABAP_STRUCTDESCR=>COMPONENT_TABLE.
instead of to use ALV catalog
So you can create a structure;
MY_DYN_STRUCT = CL_ABAP_STRUCTDESCR=>CREATE( P_COMPONENTS = LT_COMPONENTS
P_STRICT = 'X' )..
CREATE DATA MY_DYN_WA TYPE HANDLE MY_DYN_STRUCT
ASSIGN MY_DYN_WA ->* TO <FS_WA>.
or a table:
MY_DYN_TAB = CL_ABAP_TABLEDESCR=>CREATE( P_LINE_TYPE = MY_DYN_STRUCT ).
CREATE DATA MY_DYN_TAB TYPE HANDLE MY_DYN_TAB.
ASSIGN MY_DYN_TAB->* TO <FS_ITAB>.
2014 Sep 03 4:04 PM
Thank you very much! I did it one time but I have no idea why I choose cl_alv_table_create
METHOD converter_csv_al11_itab.
*--> IM_T_CSV TYPE TEXTLINE_T
*--> EX_W_SAP TYPE ANY
*<-- EX_T_SAP TYPE STANDARD TABLE
*----------------------------------------------------------------------
* Tabelas Internas
*----------------------------------------------------------------------
DATA:
tl_csv_campos TYPE abap_compdescr_tab,
tl_csv_em_coluna TYPE table_of_strings .
*----------------------------------------------------------------------
* Field-Symbols / Work-Areas
*----------------------------------------------------------------------
FIELD-SYMBOLS:
<fs_csv_table_struct> TYPE STANDARD TABLE,
<fs_wl_dinamica> TYPE ANY ,
<fs_campo_dinamico> TYPE ANY .
DATA:
wl_csv_campos TYPE abap_compdescr ,
wl_csv_em_coluna TYPE LINE OF table_of_strings,
wl_csv TYPE LINE OF textline_t .
*----------------------------------------------------------------------
* Objetos
*----------------------------------------------------------------------
DATA:
obj_tl_csv_table_desc TYPE REF TO cl_abap_tabledescr ,
obj_wl_csv_table_desc TYPE REF TO cl_abap_structdescr,
obj_csv_table_struct TYPE REF TO data ,
obj_wl_dinamica TYPE REF TO data ,
obj_excp TYPE REF TO cx_root .
*----------------------------------------------------------------------
* Variáveis
*----------------------------------------------------------------------
DATA:
vl_indice TYPE i ,
vl_qtd_linhas TYPE i ,
vl_nome_campo TYPE char30,
vl_erro TYPE string.
*----------------------------------------------------------------------
* Constantes
*----------------------------------------------------------------------
CONSTANTS:
c_csv_separador TYPE char1 VALUE ';' ,
c_csv_esc_char TYPE char1 VALUE '"' ,
c_csv_num_cols TYPE i VALUE 999999.
*----------------------------------------------------------------------
* Início
*----------------------------------------------------------------------
TRY.
* Determina a estrutura da tabela de destino
GET REFERENCE OF ex_t_sap INTO obj_csv_table_struct.
ASSIGN obj_csv_table_struct->* TO <fs_csv_table_struct>.
obj_tl_csv_table_desc ?= cl_abap_structdescr=>describe_by_data_ref( obj_csv_table_struct ).
obj_wl_csv_table_desc ?= obj_tl_csv_table_desc->get_table_line_type( ).
tl_csv_campos = obj_wl_csv_table_desc->components.
obj_tl_csv_table_desc = cl_abap_tabledescr=>create( p_line_type = obj_wl_csv_table_desc
p_table_kind = cl_abap_tabledescr=>tablekind_std
p_unique = abap_false ) .
CREATE DATA obj_wl_dinamica TYPE HANDLE obj_wl_csv_table_desc.
ASSIGN obj_wl_dinamica->* TO <fs_wl_dinamica>.
CATCH cx_sy_table_creation INTO obj_excp.
vl_erro = obj_excp->get_text( ).
ENDTRY.
LOOP AT im_t_csv INTO wl_csv.
* Converte as linhas do arquivo CSV em colunas
CALL FUNCTION 'RSDS_CONVERT_CSV'
EXPORTING
i_data_sep = c_csv_separador
i_esc_char = c_csv_esc_char
i_record = wl_csv
i_field_count = c_csv_num_cols
IMPORTING
e_t_data = tl_csv_em_coluna
EXCEPTIONS
escape_no_close = 1
escape_improper = 2
conversion_error = 3
OTHERS = 4.
vl_indice = 1.
DESCRIBE TABLE tl_csv_em_coluna LINES vl_qtd_linhas.
* Armazena os campos da tabela CSV na tabela dinâmica
LOOP AT tl_csv_campos INTO wl_csv_campos.
MOVE wl_csv_campos-name TO vl_nome_campo.
ASSIGN COMPONENT vl_nome_campo
OF STRUCTURE <fs_wl_dinamica>
TO <fs_campo_dinamico>.
READ TABLE tl_csv_em_coluna
INDEX vl_indice
INTO wl_csv_em_coluna.
IF vl_indice <= vl_qtd_linhas.
<fs_campo_dinamico> = wl_csv_em_coluna.
ELSE.
<fs_campo_dinamico> = space.
ENDIF.
vl_indice = vl_indice + 1.
ENDLOOP.
* Move as linhas da tabela dinâmica para a tabela final
MOVE-CORRESPONDING <fs_wl_dinamica> TO ex_w_sap.
APPEND ex_w_sap TO ex_t_sap.
ENDLOOP.
ENDMETHOD.
2014 Sep 03 4:10 PM
Yes
I suppose so too,
infact I couldn't undestand why your code was a mix between two different ways to create a table dynamically
Max
2021 Jun 11 12:06 PM
Hi,
I resolved my same issue using below code .Might be it will be helpful for some one.
IF lv_query_table IS NOT INITIAL.
DATA(comp_tab1) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_name(
lv_query_table ) )->get_components( ).
DATA(struct_type) = cl_abap_structdescr=>create( comp_tab1 ).
DATA(table_type) = cl_abap_tabledescr=>create( struct_type ).
CREATE DATA lt_dataref TYPE HANDLE table_type.
IF lt_dataref IS NOT INITIAL.
ASSIGN lt_dataref->* TO <lfs_dyn_table>.
CREATE DATA lt_new_line LIKE LINE OF <lfs_dyn_table>.
ASSIGN lt_new_line->* TO <lfs_dyn_wa>.
ENDIF.
endif.