segunda-feira, 7 de maio de 2012

Select Dinâmico

  "  Eae vou mostrar hoje um select Dinâmico onde você consegue
" 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:
  TYPE STANDARD TABLE.

* 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

2 comentários:

  1. 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.

    Podes ajudar obrigado

    ResponderExcluir
  2. 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.

    "--------------------------------------------------------------
    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

    "---------------------------------------------------

    ResponderExcluir