" controlar até as condições da tabela que você quer selecionar,
" é só colocar o nome de qualquer tabela e executar pra ver um
" ALV dinâmico, depois volte e alimente os outros campos....
" Ahhhh, pode ocorrer alguns erros pois eu não tratei de propósito
" pra ver vocês se virarem com algumas condições como campo inexistente
" na tabela selecionada ou tabela inexistente ou qualquer outro
" não previsto.... vamo pro código.
REPORT z_select_dinamic.
TYPE-POOLS slis.
* Estruturas
DATA :
st_fieldcat TYPE slis_fieldcat_alv,
st_fields TYPE string
.
* Tabela Interna
DATA :
it_table TYPE REF TO data,
it_fieldcat TYPE slis_t_fieldcat_alv,
it_fields TYPE TABLE OF string
.
* Field-simbols
FIELD-SYMBOLS:
* Tela de seleção.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
PARAMETERS :
p_table TYPE dd02l-tabname OBLIGATORY, " Nome da tabela
p_field TYPE string, " Campos separados por espaços
p_rows TYPE i, " Quantidade de linhas à retornar
p_where TYPE string " Condições do Select ( sem ponto no final )
.
SELECTION-SCREEN END OF BLOCK b1.
" Inicio do processo.
START-OF-SELECTION.
BREAK-POINT.
PERFORM : f_select,
f_fieldcat,
f_trata_campos,
f_alv.
*&---------------------------------------------------------------------*
*& Form f_select
*&---------------------------------------------------------------------*
form f_select .
"Criação da tabela dinamica
CREATE DATA it_table TYPE TABLE OF (p_table).
ASSIGN it_table->* TO
"Faz a seleção na tabela transparente informada
SELECT (p_field) " Campos
FROM (p_table) " Tabela Transparente
UP TO p_rows ROWS " Qtde Linhas
INTO CORRESPONDING FIELDS OF TABLE
WHERE (p_where). " Condições informadas
endform. " f_select
*&---------------------------------------------------------------------*
*& Form f_fieldcat
*&---------------------------------------------------------------------*
form f_fieldcat .
BREAK-POINT.
" Cria o catalogo de campos da tabela informada.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = sy-repid
* i_internal_tabname =
i_structure_name = p_table
* I_CLIENT_NEVER_DISPLAY = 'X'
* I_INCLNAME =
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE =
CHANGING
ct_fieldcat = it_fieldcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
endform. " f_fieldcat
*&---------------------------------------------------------------------*
*& Form f_trata_campos
*&---------------------------------------------------------------------*
form f_trata_campos .
BREAK-POINT.
" Coloca dentro de uma tabela todos os campos informados.
IF p_field IS NOT INITIAL.
SPLIT p_field AT space INTO TABLE it_fields.
ENDIF.
" Se foi informado campos ....
IF it_fields IS NOT INITIAL.
LOOP AT it_fieldcat INTO st_fieldcat.
READ TABLE it_fields INTO st_fields
WITH KEY table_line = st_fieldcat-fieldname.
" Se existir o campo do catalogo na tabela de campos informados ....
IF sy-subrc IS NOT INITIAL.
" Se não for chave da tabela ...
IF st_fieldcat-key IS INITIAL.
st_fieldcat-tech = 'X'.
" Atualiza tabela de catalogo de campos.
MODIFY it_fieldcat FROM st_fieldcat.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
endform. " f_trata_campos
*&---------------------------------------------------------------------*
*& Form f_alv
*&---------------------------------------------------------------------*
form f_alv .
" O ALV .. (rsrs)
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
it_fieldcat = it_fieldcat
TABLES
t_outtab =
EXCEPTIONS
program_error = 1
OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
" Como sempre estou a disposição pras dúvidassssss..... Valeu.
endform. " f_alv
Boas tardes eu por acaso tava a precisar de um código algo deste tipo mas quando coloco o nome da tabela e os campos ele apresenta uma alv com a contagens das linhas que introduzi no select.
ResponderExcluirPodes ajudar obrigado
Fala aeeee.... Cara talvez eu não tenha entendido direito, mas se vc quer mostrar a qtde de registros que retorna no seu Select e só usar o Comando 'Describe table', Se for isso olha aee o exemplo.
ResponderExcluir"--------------------------------------------------------------
FORM f_select .
data :
lines TYPE i.
SELECT *
FROM sflight
INTO TABLE it_sflight
* UP TO 2 ROWS
.
DESCRIBE TABLE it_sflight LINES lines.
BREAK-POINT.
ENDFORM. " f_select
"---------------------------------------------------