Professional Documents
Culture Documents
Alv 01
Alv 01
*& Report ZLUC_APOSTILA_JOSE1
*&
*&---------------------------------------------------------------------*
*& AUTOR: LUCAS GUIMARÃES SANTOS
*& CARGO: APRENDIZ ADMINISTRATIVO/ABAP
* MOTIVO: TESTE
* ANO: 2017
*&---------------------------------------------------------------------*
REPORT zluc_apostila_jose1 NO STANDARD PAGE HEADING.
break desenvolv15.
TABLES mara.
INCLUDE <list>.
TYPE-POOLS: vrm,
gfw,
slis.
TYPES: BEGIN OF ty_saida.
* =======================================================
* Criei uma estrutura que vai exibir apenas os campos que declarei,
* independente de quantos campos coloquei no select
* =======================================================
INCLUDE STRUCTURE zsaida.
TYPES: END OF ty_saida.
TYPES: BEGIN OF ty_mara.
*====================================================================================
* Quando incluimos uma estrutura, podemos selecionar todos os campos dentro da tabela.
*====================================================================================
INCLUDE STRUCTURE mara.
* MATNR LIKE MARA-MATNR,
* ERSDA LIKE MARA-ERSDA,
* ERNAM LIKE MARA-ERNAM,
* AENAM LIKE MARA-AENAM,
* MTART LIKE MARA-MTART,
* MATKL LIKE MARA-MATKL.
TYPES: END OF ty_mara.
TYPES: BEGIN OF ty_makt.
INCLUDE STRUCTURE makt.
* MATNR LIKE MAKT-MATNR,
* MAKTX LIKE MAKT-MAKTX,
TYPES: END OF ty_makt.
TYPES: BEGIN OF ty_t134t.
INCLUDE STRUCTURE t134t.
TYPES: END OF ty_t134t.
DATA: t_saida TYPE TABLE OF ty_saida WITH HEADER LINE,
t_mara TYPE TABLE OF ty_mara WITH HEADER LINE,
t_makt TYPE TABLE OF ty_makt WITH HEADER LINE,
vl_botao TYPE c,
msg(60) TYPE c VALUE ' !!!!! A T E N Ç Ã O !!!!!'.
DATA: t_linecolor TYPE slis_specialcol_alv OCCURS 0 WITH HEADER LINE,
t_listheader TYPE slis_t_listheader,
t_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE,
t_sort TYPE slis_sortinfo_alv OCCURS 0 WITH HEADER LINE.
DATA: v_listheader TYPE slis_listheader,
v_layout TYPE slis_layout_alv,
v_print TYPE slis_print_alv,
v_variante LIKE disvariant.
DATA: v_repid LIKE sy-repid.
START-OF-SELECTION.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-004.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-006.
SELECT-OPTIONS: s_matnr FOR mara-matnr,
s_ersda FOR mara-ersda,
s_aenam FOR mara-aenam,
s_ernam FOR mara-ernam,
s_mtart FOR mara-mtart,
s_matkl FOR mara-matkl.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text-005.
PARAMETERS: p_ordmat RADIOBUTTON GROUP gp1 DEFAULT 'X',
p_ordalf RADIOBUTTON GROUP gp1,
p_ordat RADIOBUTTON GROUP gp1,
p_ordnom RADIOBUTTON GROUP gp1.
SELECTION-SCREEN END OF BLOCK b3.
*
SELECTION-SCREEN END OF BLOCK b1.
*
* SELECTION-SCREEN BEGIN OF BLOCK B5 WITH FRAME TITLE TEXT-004.
* SELECTION-SCREEN BEGIN OF LINE.
* PARAMETERS: P_UNIX RADIOBUTTON GROUP EST.
* SELECTION-SCREEN COMMENT 5(5) TEXT-S06 FOR FIELD P_UNIX.
* PARAMETERS: P_PC RADIOBUTTON GROUP EST.
* SELECTION-SCREEN COMMENT 15(10) TEXT-S05 FOR FIELD P_PC.
* PARAMETERS: P_PC1 RADIOBUTTON GROUP EST.
* SELECTION-SCREEN COMMENT 27(10) TEXT-S07 FOR FIELD P_PC1.
*
* SELECTION-SCREEN END OF LINE.
* SELECTION-SCREEN END OF BLOCK B5.
*quando usamos o inner join no select, excluimos o passo de montar tela, pois o próprio inner j
oin
*ja monta automaticamente
PERFORM z_select_data.
IF t_saida[] IS NOT INITIAL.
PERFORM z_progress_indicator USING ''.
* PERFORM Z_MOUNT_SCREEN.
PERFORM z_fill_alv.
PERFORM z_start_alv.
PERFORM z_sort_t_saida.
* PERFORM Z_TOP_OF_PAGE.
PERFORM z_smartform.
* PERFORM Z_CALL_ALV.
ENDIF.
*&---------------------------------------------------------------------*
*& Form SELECT_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM z_select_data .
PERFORM z_progress_indicator USING 'Lendo dados da tabela'.
* SELECT mara~matnr
* mara~ersda
* mara~ernam
* mara~aenam
* mara~mtart
* t134t~mtbez
* mara~matkl
* makt~maktx
* INTO TABLE t_saida "TODAS AS INFORMAÇÕES JA ESTÃO SENDO JO
GADAS NA TABELA DE SAIDA
* FROM mara "SENDO ASSIM NÃO PRECISAMOS MONTAR UMA
TELA.
* INNER JOIN makt ON mara~matnr EQ makt~matnr "RELACIONANDO OS CAMPOS
* INNER JOIN t134t ON mara~mtart EQ t134t~mtart "Inner join é mais lento que o FOR ALL ENT
RIES IN, sendo assim não é bom para tabelas com muitos registros!!!
* WHERE mara~matnr IN s_matnr
* AND mara~ersda IN s_ersda
* AND mara~ernam IN s_ernam
* AND mara~aenam IN s_aenam
* AND mara~mtart IN s_mtart
* AND mara~matkl IN s_matkl
* AND makt~spras = sy-langu
* AND t134t~spras = sy-langu.
*
SELECT mara~matnr mara~ersda
mara~ernam mara~aenam
mara~mtart mara~matkl
makt~maktx t134t~mtbez
INTO TABLE t_saida "TODAS AS INFORMAÇÕES JA ESTÃO SENDO JOGADAS
NA TABELA DE SAIDA
FROM mara "SENDO ASSIM NÃO PRECISAMOS MONTAR UMA TELA.
INNER JOIN makt ON mara~matnr EQ makt~matnr "RELACIONANDO OS CAMPOS
INNER JOIN t134t ON mara~mtart EQ t134t~mtart "Inner join é mais lento que o FOR ALL ENTRIE
S IN, sendo assim não é bom para tabelas com muitos registros!!!
WHERE mara~matnr IN s_matnr
AND mara~ersda IN s_ersda
AND mara~ernam IN s_ernam
AND mara~aenam IN s_aenam
AND mara~mtart IN s_mtart
AND mara~matkl IN s_matkl
AND makt~spras = sy-langu
AND t134t~spras = sy-langu.
BREAK-POINT.
* SELECT *
* FROM MARA
* INTO TABLE T_MARA
* WHERE MATNR IN S_MATNR
* AND ERSDA IN S_ERSDA
* AND ERNAM IN S_ERNAM
* AND AENAM IN S_AENAM
* AND MTART IN S_MTART
* AND MATKL IN S_MATKL.
*
IF t_saida[] IS INITIAL. "verifica se a tabela esta vazia
* select *
* from makt
* into table t_makt
* WHERE matnr = t_mara-matnr.
** esta é uma função que vai estourar um pop up na tela com uma mensagem, esta mensagem voc
e definirá.
CALL FUNCTION 'POPUP_FOR_INTERACTION'
EXPORTING
headline = msg "mensagem apresentada no topo da janela
de popup
text1 = 'Não há registros nesta tabela '
text2 = 'com os parâmetros requisitados!!!'
text3 = 'Por favor digite um registro válido'
* text4 = vg_chama
ticon = 'E' "IWEQC " * ticon = 'Q' "IWEQC "tipo de mensagem apresentada
button_1 = 'OK'
* button_2 = 'VOLTAR SELEÇÃO'
IMPORTING
button_pressed = vl_botao. "botão da janela
* vg_mostrou = 'X'.
STOP.
LEAVE SCREEN.
ENDIF.
ENDFORM. " SELECT_DATA
*&---------------------------------------------------------------------*
*& Form PROGRESS_INDICATOR
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->PV_TEXT text
*----------------------------------------------------------------------*
FORM z_progress_indicator USING pv_text.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 0
text = pv_text.
ENDFORM. " PROGRESS_INDICATOR
*&---------------------------------------------------------------------*
*& Form FILL_ALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM z_fill_alv .
PERFORM f_preenche_fieldcat USING: 'MATNR' ' ' 'MATERIAL '
'C' '' 'X' 'X',
'ERSDA' ' ' 'DATA DE CRIAÇÃO'
'D' '' ' ' ' ',
'ERNAM' ' ' 'RESP. QUE ADD'
'C' '' ' ' 'X',
'AENAM' ' ' 'RESP.PELA MODIFICAÇÃO'
'C' '' ' ' ' ',
'MTART' ' ' 'TIPO DO MATERIAL'
'C' '' ' ' ' ',
'MTBEZ' ' ' 'DENOMINAÇÃO DO TIPO DE MATERIAL'
'C' '' ' ' ' ',
'MATKL' ' ' 'GRUPO DE MERCADORIA'
'C' '' ' ' ' ',
'MAKTX' ' ' 'DESCRIÇÃO DE MATERIAL'
'C' '' ' ' ' '.
ENDFORM. " FILL_ALV
*&---------------------------------------------------------------------*
*& Form F_PREENCHE_FIELDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_0259 text
* -->P_0260 text
* -->P_0261 text
* -->P_0262 text
* -->P_0263 text
* -->P_0264 text
* -->P_0265 text
*----------------------------------------------------------------------*
FORM f_preenche_fieldcat USING
p_field
p_dict
p_text
p_type
p_output
p_key
p_hotspot.
CLEAR t_fieldcat.
t_fieldcat-fieldname = p_field.
t_fieldcat-tabname = 'T_SAIDA'. "nome da minha tabela
IF p_dict IS INITIAL.
t_fieldcat-reptext_ddic = p_text.
t_fieldcat-inttype = p_type.
t_fieldcat-outputlen = p_output.
ELSE.
t_fieldcat-rollname = p_dict.
ENDIF.
t_fieldcat-key(1) = p_key.
IF p_hotspot = 'X'. "Marque apenas os campo com 'X'
t_fieldcat-hotspot = 'X'.
ENDIF.
APPEND t_fieldcat.
ENDFORM. " F_PREENCHE_FIELDCAT
*&---------------------------------------------------------------------*
*& Form START_ALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM z_start_alv .
v_repid = sy-repid.
CLEAR v_variante.
v_variante-report = v_repid.
CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET'
EXPORTING
i_save = 'A'
CHANGING
cs_variant = v_variante
EXCEPTIONS
not_found = 2.
IF sy-subrc = 0.
ENDIF.
ENDFORM. " START_ALV
*&---------------------------------------------------------------------*
*& Form Z_SORT_T_SAIDA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM z_sort_t_saida .
IF p_ordmat = 'X'.
SORT t_saida BY matnr.
ENDIF.
IF p_ordalf = 'X'.
SORT t_saida BY maktx.
ENDIF.
IF p_ordat = 'X'.
SORT t_saida BY ersda.
ENDIF.
IF p_ordnom = 'X'.
SORT t_saida BY ernam.
ENDIF.
ENDFORM. " Z_SORT_T_SAIDA
*&---------------------------------------------------------------------*
*& Form MOUNT_SCREEN
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
*FORM Z_MOUNT_SCREEN .
*BREAK desenvolv15.
* REFRESH T_SAIDA.
* CLEAR T_SAIDA.
*
*
** SORT T_MARA BY MATNR ERSDA ERNAM AENAM MTART MATKL.
* SORT T_MAKT BY MATNR MAKTX.
*
* LOOP AT T_saida.
*
** READ TABLE T_MAKT WITH KEY MATNR = T_MARA-MATNR
** BINARY SEARCH.
*
*
* MOVE-CORRESPONDING T_MARA TO T_SAIDA.
* MOVE-CORRESPONDING T_MAKT TO T_SAIDA.
** MOVE: T_MARA-MATNR TO T_SAIDA-MATNR,
** T_MARA-ERSDA TO T_SAIDA-ERSDA,
** T_MARA-ERNAM TO T_SAIDA-ERNAM,
** T_MARA-AENAM TO T_SAIDA-AENAM,
** T_MARA-MTART TO T_SAIDA-MTART,
** T_MARA-MATKL TO T_SAIDA-MATKL,
** T_MAKT-MAKTX TO T_SAIDA-MAKTX.
*
* APPEND T_SAIDA.
*
* ENDLOOP.
*ENDFORM. " MOUNT_SCREEN
*&---------------------------------------------------------------------*
*& Form CALL_ALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM z_call_alv .
v_layout-zebra = 'X'. "Layout Zebra
v_layout-expand_all = 'X'. "Abrir subitens
v_layout-colwidth_optimize = 'X'. "Largura melhor possível
* V_LAYOUT-BOX_FIELDNAME = 'SEL'. "Coluna Selecionável
* V_LAYOUT-EDIT = ' '. "Permitir a edição
* v_print-no_print_listinfos = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = v_repid
i_grid_title = 'ALV QUE O JOSÉ MANDOU FAZER COM A MARA' "Título do ALV
i_background_id = 'ALV_BACKGROUND' "background do Header L
ine
i_callback_top_of_page = 'Z_TOP_OF_PAGE'
* I_CALLBACK_PF_STATUS_SET = 'F_STATUS' "CRIAR BOTÕES E OS EVENTOS DOS BOTÕES
i_callback_user_command = 'ZF_USER_COMMAND'
it_fieldcat = t_fieldcat[]
is_layout = v_layout
it_sort = t_sort[]
* I_DEFAULT = 'X'
* I_SAVE = 'A'
* IS_VARIANT = V_VARIANTE
* is_print = v_print
TABLES
t_outtab = t_saida
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM. " CALL_ALV
*&---------------------------------------------------------------------*
*& Form TOP_OF_PAGE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM z_top_of_page .
DATA: l_datum(17) TYPE c.
DATA: l_uzeit(17) TYPE c.
DATA: l_uname(20) TYPE c.
CLEAR t_listheader[].
CLEAR v_listheader.
v_listheader-typ = 'H'.
v_listheader-info = text-013.
APPEND v_listheader TO t_listheader.
CONCATENATE 'Data' ':' sy-datum+6(2) '.' sy-datum+4(2) '.' sy-datum(4)
INTO l_datum.
v_listheader-typ = 'S '.
v_listheader-info = l_datum.
APPEND v_listheader TO t_listheader.
CONCATENATE 'horário' ': ' sy-uzeit(2) ':' sy-uzeit+2(2) ':' sy-uzeit+4(2)
INTO l_uzeit.
v_listheader-typ = 'S'.
v_listheader-info = l_uzeit.
APPEND v_listheader TO t_listheader.
CONCATENATE 'Usuário: ' sy-uname INTO l_uname SEPARATED BY space.
v_listheader-typ = 'S'.
v_listheader-info = l_uname.
APPEND v_listheader TO t_listheader.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
i_logo = 'MARISA_LOGO'
it_list_commentary = t_listheader.
ENDFORM. " TOP_OF_PAGE
*PF_STATUS 'F_STATUS'.
*&---------------------------------------------------------------------*
*& Form Z_HOTSPOT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
*ESTE PERFORME JÁ ESTA DECLARADO DENTRO DA MINHA FUNÇÃO QUE EXIBE O ALV
"l_ucomm
* |
* v
FORM zf_user_command USING p_evento_tela TYPE sy-ucomm
p_selfield TYPE slis_selfield. " SY-UCOMM É O EVENTO QUE O USUÁRIO
FEZ NA TELA
IF sy-subrc = 0.
ENDIF.
CASE p_evento_tela.
WHEN '&IC1'. "comando stander para hotspot
CASE p_selfield-sel_tab_field. "compo que esta sendo selecionado
CHECK p_selfield-value IS NOT INITIAL. "Checar se o campo tem valor
WHEN 'T_SAIDA-MATNR'.
SET PARAMETER ID 'MAT' FIELD p_selfield-value. "colocando ação no campo
* LEAVE TO TRANSACTION 'MM03'.
CALL TRANSACTION 'MM43'.
WHEN 'T_SAIDA-ERNAM'.
SET PARAMETER ID 'XUS' FIELD p_selfield-value.
LEAVE TO TRANSACTION 'SU01'.
ENDCASE.
WHEN 'E'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDFORM. " Z_HOTSPOT
*&---------------------------------------------------------------------*
*& Form Z_SMARTFORM
*&---------------------------------------------------------------------*
FORM z_smartform .
TABLES: ssfcrespd.
DATA: fm_name TYPE rs38l_fnam.
*--- Busca o número do smartform referente ao nome
*--- Esse número muda cada vez que a request é transportada
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = 'Z_SF01_FORM'
IMPORTING
fm_name = fm_name
EXCEPTIONS
no_form = 1
no_function_module = 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.
DATA: t_user LIKE usr02 OCCURS 0 WITH HEADER LINE,
e_control_parameters TYPE ssfctrlop,
e_output_options TYPE ssfcompop.
*
*BREAK-POINT.
*--- As variáveis p/ IMPORTING, EXPORTING e TABLES são definidas no
*--- formulário (algumas já existem e podem ser usadas)
CALL FUNCTION fm_name
TABLES
t_saida = t_saida
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
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. " Z_SMARTFORM