quarta-feira, 6 de março de 2013

ALV - Criação de variante de layout do ALV

  *  Um abaper Junior Bom, antes de pedir qualquer aumento pro chefe, tem
* que se garantir quando o assunto é ALV, e estamos aqui pra isso,
* para auxiliá-los nos seus programas, portanto abaixo estou dando um exemplo
* de como criar uma variante de layout de tela do seu ALV, sabe quando o
* KeyUser chega em você e fala que quer que o ALV venha somando algumas colunas,
* e faça subtotal, e coloque em ordem decrescente um monte de coisa, pra você
* não estressar com o ele, é só incluir dois parametros dentro da função
* que cria o alv, esses parametros são o 'i_save' e o 'is_variant', de
* brinde segue uma função que busca as variantes de layout do programa, segue
* código aihhhh minhaaa geeeennnntteeeeeee (Ritmo de carnaval ainda).
*  Qualquer dúvida estou a disposição.
REPORT z_criar_variante_layout_alv.

* Conjunto de tipos
TYPE-POOLS :
  slis.

* Tabelas
TABLES :
  scarr.

*Tipos
TYPES:
  BEGIN OF ty_spfli,
    carrid    TYPE spfli-carrid,
    connid    TYPE spfli-connid,
    countryfr TYPE spfli-countryfr,
    countryto TYPE spfli-countryto,
  END OF   ty_spfli,

  BEGIN OF ty_sflight,
     carrid    TYPE sflight-carrid,
     connid    TYPE sflight-connid,
     fldate    TYPE sflight-fldate,
     price     TYPE sflight-price,
     currency  TYPE sflight-currency,
     planetype TYPE sflight-planetype,
  END OF   ty_sflight,

  BEGIN OF ty_saplane,
    plantype TYPE saplane-planetype,
    consum   TYPE saplane-consum,
    producer TYPE saplane-producer,
  END OF   ty_saplane,

  BEGIN OF ty_outtab,
    carrid    TYPE scarr-carrid,
    connid    TYPE spfli-connid,
    fldate    TYPE sflight-fldate,
    price     TYPE sflight-price,
    currency  TYPE sflight-currency,
    planetype TYPE sflight-planetype,
    consum    TYPE saplane-consum,
    producer  TYPE saplane-producer,
    countryfr TYPE spfli-countryfr,
    countryto TYPE spfli-countryto,
    carrname  TYPE scarr-carrname,
    url       TYPE scarr-url,
  END OF ty_outtab
  .

* Tabelas Internas
DATA :
  it_scarr    TYPE TABLE OF scarr,
  it_spfli    TYPE TABLE OF ty_spfli,
  it_sflight  TYPE TABLE OF ty_sflight,
  it_saplane  TYPE TABLE OF ty_saplane,
  it_outtab   TYPE TABLE OF ty_outtab,
  it_fieldcat TYPE TABLE OF slis_fieldcat_alv
.

* Estruturas
DATA :
  st_scarr    TYPE scarr,
  st_spfli    TYPE ty_spfli,
  st_sflight  TYPE ty_sflight,
  st_saplane  TYPE ty_saplane,
  st_outtab   TYPE ty_outtab,
  st_fieldcat TYPE slis_fieldcat_alv,
  st_layout   TYPE slis_layout_alv,
  st_varia    TYPE disvariant
  .

* Tela de seleção
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
SELECT-OPTIONS :
  s_carrid FOR scarr-carrid.
PARAMETERS :
  p_vari TYPE disvariant-variant.
SELECTION-SCREEN END OF BLOCK   b1.

*  Aqui tá parte do segredo, caso o programa já tenha alguma variável de
* de layout, na hora que clicar no matchcode do campo 'Layout' será
* criado um Pop-up com essas informações e assim você seleciona o que
* desejar.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_vari.
  PERFORM z_select_variavel_alv.

* Inicio do processo
START-OF-SELECTION.

  PERFORM : f_seleciona_dados.

  IF it_sflight IS NOT INITIAL.
    PERFORM : f_trata_dados,
              f_cria_alv
              .
  ENDIF.

* Fim do processo.
END-OF-SELECTION.



*&---------------------------------------------------------------------*
*&      Form  F_SELECIONA_DADOS
*&---------------------------------------------------------------------*
FORM f_seleciona_dados .

  SELECT *
    FROM scarr
    INTO TABLE it_scarr
    WHERE carrid IN s_carrid.

  IF sy-subrc IS INITIAL.

    SELECT carrid
           connid
           countryfr
           countryto
      FROM spfli
      INTO TABLE it_spfli
      FOR ALL ENTRIES IN it_scarr
      WHERE carrid it_scarr-carrid.

    IF sy-subrc IS INITIAL.

      SELECT carrid
             connid
             fldate
             price
             currency
             planetype
        FROM sflight
        INTO TABLE it_sflight
        FOR ALL ENTRIES IN it_spfli
        WHERE carrid it_spfli-carrid
          AND connid it_spfli-connid
          .

      IF sy-subrc IS INITIAL.

        SELECT planetype
               consum
               producer
          FROM saplane
          INTO TABLE it_saplane
          FOR ALL ENTRIES IN it_sflight
          WHERE planetype it_sflight-planetype.

      ELSE.
        MESSAGE 'Não foi encontrado dados sobre o voô da companhia informada.'
          TYPE 'I'.
      ENDIF.

    ELSE.
      MESSAGE 'Não foi encontrado dados sobre o voô da companhia informada.'
        TYPE 'I'.
    ENDIF.

  ELSE.
    MESSAGE 'Não foi encontrado a companhia informada.'
      TYPE 'I'.
  ENDIF.
ENDFORM.                   " F_SELECIONA_DADOS

*&---------------------------------------------------------------------*
*&      Form  F_TRATA_DADOS
*&---------------------------------------------------------------------*
FORM f_trata_dados .

  LOOP AT it_sflight INTO st_sflight.

    st_outtab-fldate    st_sflight-fldate.
    st_outtab-price     st_sflight-price.
    st_outtab-currency  st_sflight-currency.
    st_outtab-planetype st_sflight-planetype.

    READ TABLE it_spfli INTO st_spfli
      WITH KEY carrid st_sflight-carrid
               connid st_sflight-connid
               .
    st_outtab-connid    st_spfli-connid.
    st_outtab-countryfr st_spfli-countryfr.
    st_outtab-countryto st_spfli-countryto.

    READ TABLE it_scarr INTO st_scarr
      WITH KEY carrid st_spfli-carrid.

    st_outtab-carrid   st_scarr-carrid.
    st_outtab-carrname st_scarr-carrname.
    st_outtab-url      st_scarr-url.

    READ TABLE it_saplane INTO st_saplane
      WITH KEY plantype st_sflight-planetype.

    st_outtab-consum   st_saplane-consum.
    st_outtab-producer st_saplane-producer.

    APPEND st_outtab TO it_outtab.
    CLEAR : st_outtab,
            st_sflight,
            st_spfli,
            st_scarr,
            st_saplane.

  ENDLOOP.


ENDFORM.                    " F_TRATA_DADOS

*&---------------------------------------------------------------------*
*&      Form  F_CRIA_ALV
*&---------------------------------------------------------------------*
FORM f_cria_alv .

  PERFORM z_fieldcat USING : '1'  'CARRID'    'IT_OUTTAB' 'SCARR'   'CARRID',
                             '2'  'CONNID'    'IT_OUTTAB' 'SPFLI'   'CONNID',
                             '3'  'FLDATE'    'IT_OUTTAB' 'SFLIGHT' 'FLDATE',
                             '4'  'PRICE'     'IT_OUTTAB' 'SFLIGHT' 'PRICE',
                             '5'  'CURRENCY'  'IT_OUTTAB' 'SFLIGHT' 'CURRENCY',
                             '6'  'PLANETYPE' 'IT_OUTTAB' 'SFLIGHT' 'PLANETYPE',
                             '7'  'CONSUM'    'IT_OUTTAB' 'SAPLANE' 'CONSUM',
                             '8'  'PRODUCER'  'IT_OUTTAB' 'SAPLANE' 'PRODUCER',
                             '9'  'COUNTRYFR' 'IT_OUTTAB' 'SPFLI'   'COUNTRYFR',
                             '10' 'COUNTRYTO' 'IT_OUTTAB' 'SPFLI'   'COUNTRYTO',
                             '11' 'CARRNAME'  'IT_OUTTAB' 'SCARR'   'CARRNAME',
                             '12' 'URL'       'IT_OUTTAB' 'SCARR'   'URL'
                             .

  st_layout-zebra             'X'.
  st_layout-colwidth_optimize 'X'.


* Caso o usuário tenha informado a variante sem usar a MatchCode.
if p_vari is not initial
  and st_varia-variant is initial.
*  Não se preocupem caso o user coloque babozeiras na tela, pois se a variante
* de layout não existir não ira dar Dump nem nada, só a tela que não irá mudar.
  st_varia-variant p_vari.
  st_varia-report  sy-repid.

endif.

*  O ato de 'flagar'(alimentar com 'X') o parametro 'i_save' da função de criação
* do alv fará aparecer três botões adicionais no cabeçalho do alv que irá te
* possibilitar de gravar o layout do alv, assim você poderá mexer a vontade
* no layout do alv e deixar ele do seu jeito q quiser, salvar e pronto.
*  O Parametro 'is_variant' é uma estrutura de retorno da função

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   EXPORTING
*     I_INTERFACE_CHECK                 = ' '
*     I_BYPASSING_BUFFER                = ' '
*     I_BUFFER_ACTIVE                   = ' '
     i_callback_program                sy-repid
*     I_CALLBACK_PF_STATUS_SET          = ' '
*     I_CALLBACK_USER_COMMAND           = ' '
*     I_CALLBACK_TOP_OF_PAGE            = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
*     I_STRUCTURE_NAME                  =
*     I_BACKGROUND_ID                   = ' '
*     I_GRID_TITLE                      =
*     I_GRID_SETTINGS                   =
     is_layout                         st_layout
     it_fieldcat                       it_fieldcat
*     IT_EXCLUDING                      =
*     IT_SPECIAL_GROUPS                 =
*     IT_SORT                           =
*     IT_FILTER                         =
*     IS_SEL_HIDE                       =
*     I_DEFAULT                         = 'X'
     i_save                            'X'
     is_variant                        st_varia
*     IT_EVENTS                         =
*     IT_EVENT_EXIT                     =
*     IS_PRINT                          =
*     IS_REPREP_ID                      =
*     I_SCREEN_START_COLUMN             = 0
*     I_SCREEN_START_LINE               = 0
*     I_SCREEN_END_COLUMN               = 0
*     I_SCREEN_END_LINE                 = 0
*     IT_ALV_GRAPHICS                   =
*     IT_HYPERLINK                      =
*     IT_ADD_FIELDCAT                   =
*     IT_EXCEPT_QINFO                   =
*     I_HTML_HEIGHT_TOP                 =
*     I_HTML_HEIGHT_END                 =
*   IMPORTING
*     E_EXIT_CAUSED_BY_CALLER           =
*     ES_EXIT_CAUSED_BY_USER            =
    TABLES
      t_outtab                          it_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.

  clear st_varia.


ENDFORM.                    " F_CRIA_ALV
*&---------------------------------------------------------------------*
*&      Form  Z_FIELDCAT
*&---------------------------------------------------------------------*
FORM z_fieldcat  USING    p_col
                          p_fname
                          p_tname
                          p_reftab
                          p_reffield
                          .
  st_fieldcat-col_pos       p_col.
  st_fieldcat-fieldname     p_fname.
  st_fieldcat-tabname       p_tname.
  st_fieldcat-ref_tabname   p_reftab.
  st_fieldcat-ref_fieldname p_reffield.

  APPEND st_fieldcat TO it_fieldcat.
  CLEAR st_fieldcat.

ENDFORM.                    " Z_FIELDCCAT

*&---------------------------------------------------------------------*
*&      Form  Z_SELECT_VARIAVEL_ALV
*&---------------------------------------------------------------------*
FORM z_select_variavel_alv .

*  Informe dentro da estrutura que servirá de import e export o nome do
* programa e pronto, isso criará um pop-up e o retorno será a variante
* que você escolheu.
*  O Parametro I_save dessa função informa se as variantes que serão exibidas
* no pop-up será do usuário expecifico( A ou U ) ou não( X ou space ).
  st_varia-report sy-repid.

  CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
   EXPORTING
     is_variant                st_varia
     i_save                    'A'
   IMPORTING
     es_variant                st_varia
   EXCEPTIONS
     not_found                 1
     program_error             2
     OTHERS                    3
           .

*  Caso tenha dado tudo certo será repassado o valor escolhido para a
* tela de seleção
  IF sy-subrc IS INITIAL.
    p_vari st_varia-variant.
  ENDIF.


ENDFORM.                    " Z_SELECT_VARIAVEL_ALV
Comentários
0 Comentários

Nenhum comentário:

Postar um comentário