* 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