quinta-feira, 30 de junho de 2011
Agora é soh estrutura.
" Tabelas com ' Header Line ' está extinto, por favor usar estruturas com o mesmo tipo da tabela."
quarta-feira, 29 de junho de 2011
ALV - Parte 1
" hahuahua, tava dando uma olhadinha nos posts que já fiz e
" percebi que tah faltando uma das coisas principais para um
" Abap Junior que eh saber mexer pelomenos no basico do ALV pois
" hoje a maioria dos relatorios solicitados são em ALV, o
" usuário tem uma maior flexibilidade com os dados podendo organizar,
" toda a vez que falarem um report pra vc a primeira coisa que tem
" que vir na sua cabeça eh um ALV, muitos consultores que eu conheço
" já tem um arquivinho com o ALV padrão deles, façam o de vcs tb, mas
" por favor não façam por fazer entendam oq cada coisa significa que
" assim vc conseguirá dar manutenção em qualquer ALV, aki estarei
" colocando um alv basico e com este arquivo estarei trabalhando pra
" fala tudo sobre isso, como colocar botão no ALV, eventos, layout,
" pf-status, e todas as propriedades que essa função pode ter entaum
" vamos lá...
REPORT z_alv_basico.
" Tabelas transparentes ....
TABLES : mara
.
" type-pools .....
" Essa declaração e necessária pois e o grupo de tipos usados no ALV.
TYPE-POOLS: slis
.
" Tipos .....
TYPES :
BEGIN OF ty_mara,
matnr TYPE mara-matnr, " Nº do material
ersda TYPE mara-ersda, " Data de criação
ernam TYPE mara-ernam, " Nome do responsável que adicionou o objeto
pstat TYPE mara-pstat, " Status de atualização
mtart TYPE mara-mtart, " Tipo de material
END OF ty_mara .
" Estruturas ....
DATA : st_mara TYPE ty_mara
.
" Tabelas Internas ....
DATA : it_mara TYPE TABLE OF ty_mara
.
" Declarações usadas no ALV.
" Declaração da tabela e da estrutura que estaram com as informações dos campos
" do ALV
DATA : it_fieldcat TYPE slis_t_fieldcat_alv,
st_fieldcat TYPE slis_fieldcat_alv
.
" Tela de seleção .....
SELECTION-SCREEN BEGIN OF BLOCK b1.
SELECT-OPTIONS :
so_matnr FOR mara-matnr NO INTERVALS, " Nº do material
so_pstat FOR mara-pstat NO INTERVALS " Status de atualização
.
SELECTION-SCREEN END OF BLOCK b1.
START-OF-SELECTION.
PERFORM : z_feed_table,
z_fieldcat,
z_alv
.
*&---------------------------------------------------------------------*
*& Form Z_feed_table
*&---------------------------------------------------------------------*
" Fazendo um select simples pra traze algum dado pra nos podemos visualizar
" no nosso ALV bunitão.
" não entende sobre select, clique aki :
" http://abapjuniores.blogspot.com/2011/06/for-all-entries-in-basico.html
FORM z_feed_table .
SELECT matnr
ersda
ernam
pstat
mtart
INTO TABLE it_mara
FROM mara
UP TO 100 ROWS
WHERE matnr IN so_matnr
AND pstat IN so_pstat
.
ENDFORM. " Z_feed_table
*&---------------------------------------------------------------------*
*& Form Z_FIELDCAT
*&---------------------------------------------------------------------*
" Por melhores praticas eu criei um form pra trata com o fieldcat que significa
" catalogo de campos,
FORM z_fieldcat .
" Este perfome alimenta a tabela que será utilizada na função que cria um ALV
" pois na função eh necessário informar os campos é suas propriedades, entrando
" no tipo da estrutura e da tabela di fieldcat vc verá o tanto de parametros que
" um campo pode ter .
" Não lembra muita coisa sobre Perform, clique aki :
" http://abapjuniores.blogspot.com/2011/04/performs.html
PERFORM z_feed_fieldcat USING :
"Fname Seltext check Edit Col_pos
'MATNR' 'Material' ' ' ' ' 0 ,
'ERSDA' 'Data de criação' ' ' ' ' 1 ,
'ERNAM' 'Nome do responsável' ' ' ' ' 2 ,
'PSTAT' 'Status' ' ' ' ' 3 ,
'MTART' 'Tipo de material' ' ' ' ' 4
.
ENDFORM. " Z_FIELDCAT
*&---------------------------------------------------------------------*
*& Form Z_FEED_FIELDCAT
*&---------------------------------------------------------------------*
FORM z_feed_fieldcat USING fieldname
seltext_m
checkbox
edit
col_pos .
st_fieldcat-fieldname = fieldname. " Nome do campo
st_fieldcat-seltext_m = seltext_m. " texto do campo
st_fieldcat-checkbox = checkbox. " se o campo é do tipo CheckBox
st_fieldcat-edit = edit. " se o campo pode ser editavel
st_fieldcat-col_pos = col_pos. "Em que posição fica a coluna
" Coloca a estrutura alimentada na Tabela.
APPEND st_fieldcat TO it_fieldcat.
" Limpa a estrutura e volta pra poxima linha do form.
CLEAR st_fieldcat.
ENDFORM. " Z_FEED_FIELDCAT
*&---------------------------------------------------------------------*
*& Form Z_ALV
*&---------------------------------------------------------------------*
form Z_ALV .
" Aki tah o prato principal deste Post, a function que torna o ALV em
" realidade, como vc pode ver esta function tem muitos parametros de exporting
" cada um com seu objetivo para que o ALV saia bunitinho, eu ia colocar
" um post falando sobre essa function, mas são muitas as propriedades
" entaum vou fazer ao contrário essa, depois que fala sobre cada propriedade
" eu lanço um post sobre esta function com o link explicando cada
" parametro, não sei quando, mais um dia eu termino rsrs.
" Aki eu soh estou preenchendo os parametros minimos pra que a function
" funcione,
" Obs.: se vc naum quiser colocar o field catalog tudo bem mas aih vc vai
" ter que colocar uma estrutura z ou naum no parametro 'I_STRUCTURE_NAME'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER = ' '
* I_BUFFER_ACTIVE = ' '
i_callback_program = sy-repid " Nome do programa
* 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 =
it_fieldcat = it_fieldcat " catalogo de campos
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* i_save = 'X'
* IS_VARIANT =
* 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
* I_HTML_HEIGHT_TOP = 0
* I_HTML_HEIGHT_END = 0
* IT_ALV_GRAPHICS =
* IT_HYPERLINK =
* IT_ADD_FIELDCAT =
* IT_EXCEPT_QINFO =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = it_mara " Tabela com os dados
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.
endform. " Z_ALV
" percebi que tah faltando uma das coisas principais para um
" Abap Junior que eh saber mexer pelomenos no basico do ALV pois
" hoje a maioria dos relatorios solicitados são em ALV, o
" usuário tem uma maior flexibilidade com os dados podendo organizar,
" toda a vez que falarem um report pra vc a primeira coisa que tem
" que vir na sua cabeça eh um ALV, muitos consultores que eu conheço
" já tem um arquivinho com o ALV padrão deles, façam o de vcs tb, mas
" por favor não façam por fazer entendam oq cada coisa significa que
" assim vc conseguirá dar manutenção em qualquer ALV, aki estarei
" colocando um alv basico e com este arquivo estarei trabalhando pra
" fala tudo sobre isso, como colocar botão no ALV, eventos, layout,
" pf-status, e todas as propriedades que essa função pode ter entaum
" vamos lá...
REPORT z_alv_basico.
" Tabelas transparentes ....
TABLES : mara
.
" type-pools .....
" Essa declaração e necessária pois e o grupo de tipos usados no ALV.
TYPE-POOLS: slis
.
" Tipos .....
TYPES :
BEGIN OF ty_mara,
matnr TYPE mara-matnr, " Nº do material
ersda TYPE mara-ersda, " Data de criação
ernam TYPE mara-ernam, " Nome do responsável que adicionou o objeto
pstat TYPE mara-pstat, " Status de atualização
mtart TYPE mara-mtart, " Tipo de material
END OF ty_mara .
" Estruturas ....
DATA : st_mara TYPE ty_mara
.
" Tabelas Internas ....
DATA : it_mara TYPE TABLE OF ty_mara
.
" Declarações usadas no ALV.
" Declaração da tabela e da estrutura que estaram com as informações dos campos
" do ALV
DATA : it_fieldcat TYPE slis_t_fieldcat_alv,
st_fieldcat TYPE slis_fieldcat_alv
.
" Tela de seleção .....
SELECTION-SCREEN BEGIN OF BLOCK b1.
SELECT-OPTIONS :
so_matnr FOR mara-matnr NO INTERVALS, " Nº do material
so_pstat FOR mara-pstat NO INTERVALS " Status de atualização
.
SELECTION-SCREEN END OF BLOCK b1.
START-OF-SELECTION.
PERFORM : z_feed_table,
z_fieldcat,
z_alv
.
*&---------------------------------------------------------------------*
*& Form Z_feed_table
*&---------------------------------------------------------------------*
" Fazendo um select simples pra traze algum dado pra nos podemos visualizar
" no nosso ALV bunitão.
" não entende sobre select, clique aki :
" http://abapjuniores.blogspot.com/2011/06/for-all-entries-in-basico.html
FORM z_feed_table .
SELECT matnr
ersda
ernam
pstat
mtart
INTO TABLE it_mara
FROM mara
UP TO 100 ROWS
WHERE matnr IN so_matnr
AND pstat IN so_pstat
.
ENDFORM. " Z_feed_table
*&---------------------------------------------------------------------*
*& Form Z_FIELDCAT
*&---------------------------------------------------------------------*
" Por melhores praticas eu criei um form pra trata com o fieldcat que significa
" catalogo de campos,
FORM z_fieldcat .
" Este perfome alimenta a tabela que será utilizada na função que cria um ALV
" pois na função eh necessário informar os campos é suas propriedades, entrando
" no tipo da estrutura e da tabela di fieldcat vc verá o tanto de parametros que
" um campo pode ter .
" Não lembra muita coisa sobre Perform, clique aki :
" http://abapjuniores.blogspot.com/2011/04/performs.html
PERFORM z_feed_fieldcat USING :
"Fname Seltext check Edit Col_pos
'MATNR' 'Material' ' ' ' ' 0 ,
'ERSDA' 'Data de criação' ' ' ' ' 1 ,
'ERNAM' 'Nome do responsável' ' ' ' ' 2 ,
'PSTAT' 'Status' ' ' ' ' 3 ,
'MTART' 'Tipo de material' ' ' ' ' 4
.
ENDFORM. " Z_FIELDCAT
*&---------------------------------------------------------------------*
*& Form Z_FEED_FIELDCAT
*&---------------------------------------------------------------------*
FORM z_feed_fieldcat USING fieldname
seltext_m
checkbox
edit
col_pos .
st_fieldcat-fieldname = fieldname. " Nome do campo
st_fieldcat-seltext_m = seltext_m. " texto do campo
st_fieldcat-checkbox = checkbox. " se o campo é do tipo CheckBox
st_fieldcat-edit = edit. " se o campo pode ser editavel
st_fieldcat-col_pos = col_pos. "Em que posição fica a coluna
" Coloca a estrutura alimentada na Tabela.
APPEND st_fieldcat TO it_fieldcat.
" Limpa a estrutura e volta pra poxima linha do form.
CLEAR st_fieldcat.
ENDFORM. " Z_FEED_FIELDCAT
*&---------------------------------------------------------------------*
*& Form Z_ALV
*&---------------------------------------------------------------------*
form Z_ALV .
" Aki tah o prato principal deste Post, a function que torna o ALV em
" realidade, como vc pode ver esta function tem muitos parametros de exporting
" cada um com seu objetivo para que o ALV saia bunitinho, eu ia colocar
" um post falando sobre essa function, mas são muitas as propriedades
" entaum vou fazer ao contrário essa, depois que fala sobre cada propriedade
" eu lanço um post sobre esta function com o link explicando cada
" parametro, não sei quando, mais um dia eu termino rsrs.
" Aki eu soh estou preenchendo os parametros minimos pra que a function
" funcione,
" Obs.: se vc naum quiser colocar o field catalog tudo bem mas aih vc vai
" ter que colocar uma estrutura z ou naum no parametro 'I_STRUCTURE_NAME'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER = ' '
* I_BUFFER_ACTIVE = ' '
i_callback_program = sy-repid " Nome do programa
* 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 =
it_fieldcat = it_fieldcat " catalogo de campos
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* i_save = 'X'
* IS_VARIANT =
* 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
* I_HTML_HEIGHT_TOP = 0
* I_HTML_HEIGHT_END = 0
* IT_ALV_GRAPHICS =
* IT_HYPERLINK =
* IT_ADD_FIELDCAT =
* IT_EXCEPT_QINFO =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = it_mara " Tabela com os dados
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.
endform. " Z_ALV
' For all Entries in ' Básico
" Vamos fazer um select bem simples usando o comando 'for all entries in',
" esse comando é mais usado do que o 'Inner Join' pois é mais claro
" para dar manutenção.
REPORT zselect_data.
" Tabelas transparentes ....
TABLES : mara
.
" Tipos .....
TYPES :
BEGIN OF ty_mara,
matnr TYPE mara-matnr,
ersda TYPE mara-ersda,
ernam TYPE mara-ernam,
END OF ty_mara,
BEGIN OF ty_makt,
matnr TYPE makt-matnr,
spras TYPE makt-spras,
maktx TYPE makt-maktx,
END OF ty_makt,
BEGIN OF ty_mard,
matnr TYPE mard-matnr,
werks TYPE mard-werks,
lgort TYPE mard-lgort,
pstat TYPE mard-pstat,
END OF ty_mard,
BEGIN OF ty_outtab,
check TYPE c,
matnr TYPE mara-matnr,
ersda TYPE mara-matnr,
maktx TYPE makt-maktx,
werks TYPE mard-werks,
lgort TYPE mard-lgort,
pstat TYPE mard-pstat,
END OF ty_outtab
.
" Estruturas ....
DATA : st_mara TYPE ty_mara,
st_makt TYPE ty_makt,
st_mard TYPE ty_mard,
st_outtab TYPE ty_outtab,
st_outtab2 TYPE ty_outtab
.
" Tabelas internas ....
DATA : it_mara TYPE TABLE OF ty_mara,
it_makt TYPE TABLE OF ty_makt,
it_mard TYPE TABLE OF ty_mard,
it_outtab TYPE TABLE OF ty_outtab,
it_outtab2 TYPE TABLE OF ty_outtab
.
" Tela de seleção .....
SELECTION-SCREEN BEGIN OF BLOCK b1.
SELECT-OPTIONS : so_matnr FOR mara-matnr.
PARAMETERS : p_spras TYPE makt-spras,
p_werks TYPE mard-werks,
p_lgort TYPE mard-lgort
.
SELECTION-SCREEN END OF BLOCK b1.
" Start of selection .....
START-OF-SELECTION.
PERFORM z_select_mara.
" Confere se retornou dados no select
IF sy-subrc = 0.
PERFORM z_select_makt.
PERFORM z_select_mard.
ELSE.
MESSAGE 'Não foi encontrados registro(s) com os dados informados ' TYPE 'I'.
ENDIF.
PERFORM : z_feed_table,
z_show_data.
*&---------------------------------------------------------------------*
*& Form Z_SELECT_MARA
*&---------------------------------------------------------------------*
" Seleciona os dados da tabela MARA e passa os campos selecionados para dentro
" da tabela interna, tente sempre especificar os campos que vc quer trabalhar
" para garantir uma performance melhor nunca coloque '*', nunca esqueça tb de
" colocar os campos na mesma ordem que está na tabela standard e pra melhorar o
" select tente sempre coloca todas as chaves primarias da tabela.
FORM z_select_mara .
" pega os campos matnr, ersda e Ernam ...
SELECT matnr
ersda
ernam
" da tabela mara ...
FROM mara
" e coloca na tabela interna 'it_mara' ....
INTO TABLE it_mara
" só pegue os 100 primeiros registros
UP TO 100 ROWS
" a condição eh que soh pegue o registros que contenham no select options.
WHERE matnr IN so_matnr
.
ENDFORM. " Z_SELECT_MARA
*&---------------------------------------------------------------------*
*& Form Z_SELECT_MAKT
*&---------------------------------------------------------------------*
FORM z_select_makt .
" Seleciona os dados da tabela MAKT e passa os campos selecionados para dentro
" da tabela interna,
SELECT matnr
spras
maktx
" da tabela MAKT ...
FROM makt
" e coloca na tabela interna 'it_makt' ....
INTO TABLE it_makt
" para todas as entradas da tabela 'it_mara' (que jah esta preenchida)
FOR ALL ENTRIES IN it_mara
" com estas condições, lembrando que tem que relacionar as tabelas nas condições
WHERE matnr = it_mara-matnr
AND spras = p_spras
.
ENDFORM. " Z_SELECT_MAKT
*&---------------------------------------------------------------------*
*& Form Z_SELECT_MARD
*&---------------------------------------------------------------------*
FORM z_select_mard .
" faz o mesmo que o select de cima. rsrs
SELECT matnr
werks
lgort
pstat
FROM mard
INTO TABLE it_mard
FOR ALL ENTRIES IN it_mara
WHERE matnr = it_mara-matnr
AND werks = p_werks
AND lgort = p_lgort
.
ENDFORM. " Z_SELECT_MARD
*&---------------------------------------------------------------------*
*& Form Z_feed_table
*&---------------------------------------------------------------------*
FORM z_feed_table .
" Esse loop eh muito importante, debbungando vc verá que ele pega
" o primeiro registro e joga na estrutura...
LOOP AT it_mara INTO st_mara.
" depois lê as tabelas jogando pra um estrutura tb, se atender as
" condições
READ TABLE it_makt INTO st_makt WITH KEY matnr = st_mara-matnr
spras = p_spras.
READ TABLE it_mard INTO st_mard WITH KEY matnr = st_mara-matnr
werks = p_werks
lgort = p_lgort .
" Aki é alimentado a estrutura com os valores que foram solicitados,
st_outtab-check = space.
st_outtab-matnr = st_mara-matnr.
st_outtab-ersda = st_mara-ersda.
st_outtab-maktx = st_makt-maktx.
st_outtab-werks = st_mard-werks.
st_outtab-lgort = st_mard-lgort.
st_outtab-pstat = st_mard-pstat.
" depois da estrutura devidamente preenchida este registro eh colocado
" numa tabela de saida que poderá ser usado para preencher Relatório ALV
APPEND st_outtab TO it_outtab.
" Limpa a estrutura pra naum leva sujeira e começa o Loop tudo denovo.
CLEAR : st_outtab.
ENDLOOP.
ENDFORM. " Z_feed_table
*&---------------------------------------------------------------------*
*& Form Z_SHOW_DATA
*&---------------------------------------------------------------------*
FORM z_show_data .
" Mostra os dados da tabela de saida
LOOP AT it_outtab INTO st_outtab.
WRITE : / st_outtab.
ENDLOOP.
ENDFORM. " Z_SHOW_DATA
" esse comando é mais usado do que o 'Inner Join' pois é mais claro
" para dar manutenção.
REPORT zselect_data.
" Tabelas transparentes ....
TABLES : mara
.
" Tipos .....
TYPES :
BEGIN OF ty_mara,
matnr TYPE mara-matnr,
ersda TYPE mara-ersda,
ernam TYPE mara-ernam,
END OF ty_mara,
BEGIN OF ty_makt,
matnr TYPE makt-matnr,
spras TYPE makt-spras,
maktx TYPE makt-maktx,
END OF ty_makt,
BEGIN OF ty_mard,
matnr TYPE mard-matnr,
werks TYPE mard-werks,
lgort TYPE mard-lgort,
pstat TYPE mard-pstat,
END OF ty_mard,
BEGIN OF ty_outtab,
check TYPE c,
matnr TYPE mara-matnr,
ersda TYPE mara-matnr,
maktx TYPE makt-maktx,
werks TYPE mard-werks,
lgort TYPE mard-lgort,
pstat TYPE mard-pstat,
END OF ty_outtab
.
" Estruturas ....
DATA : st_mara TYPE ty_mara,
st_makt TYPE ty_makt,
st_mard TYPE ty_mard,
st_outtab TYPE ty_outtab,
st_outtab2 TYPE ty_outtab
.
" Tabelas internas ....
DATA : it_mara TYPE TABLE OF ty_mara,
it_makt TYPE TABLE OF ty_makt,
it_mard TYPE TABLE OF ty_mard,
it_outtab TYPE TABLE OF ty_outtab,
it_outtab2 TYPE TABLE OF ty_outtab
.
" Tela de seleção .....
SELECTION-SCREEN BEGIN OF BLOCK b1.
SELECT-OPTIONS : so_matnr FOR mara-matnr.
PARAMETERS : p_spras TYPE makt-spras,
p_werks TYPE mard-werks,
p_lgort TYPE mard-lgort
.
SELECTION-SCREEN END OF BLOCK b1.
" Start of selection .....
START-OF-SELECTION.
PERFORM z_select_mara.
" Confere se retornou dados no select
IF sy-subrc = 0.
PERFORM z_select_makt.
PERFORM z_select_mard.
ELSE.
MESSAGE 'Não foi encontrados registro(s) com os dados informados ' TYPE 'I'.
ENDIF.
PERFORM : z_feed_table,
z_show_data.
*&---------------------------------------------------------------------*
*& Form Z_SELECT_MARA
*&---------------------------------------------------------------------*
" Seleciona os dados da tabela MARA e passa os campos selecionados para dentro
" da tabela interna, tente sempre especificar os campos que vc quer trabalhar
" para garantir uma performance melhor nunca coloque '*', nunca esqueça tb de
" colocar os campos na mesma ordem que está na tabela standard e pra melhorar o
" select tente sempre coloca todas as chaves primarias da tabela.
FORM z_select_mara .
" pega os campos matnr, ersda e Ernam ...
SELECT matnr
ersda
ernam
" da tabela mara ...
FROM mara
" e coloca na tabela interna 'it_mara' ....
INTO TABLE it_mara
" só pegue os 100 primeiros registros
UP TO 100 ROWS
" a condição eh que soh pegue o registros que contenham no select options.
WHERE matnr IN so_matnr
.
ENDFORM. " Z_SELECT_MARA
*&---------------------------------------------------------------------*
*& Form Z_SELECT_MAKT
*&---------------------------------------------------------------------*
FORM z_select_makt .
" Seleciona os dados da tabela MAKT e passa os campos selecionados para dentro
" da tabela interna,
SELECT matnr
spras
maktx
" da tabela MAKT ...
FROM makt
" e coloca na tabela interna 'it_makt' ....
INTO TABLE it_makt
" para todas as entradas da tabela 'it_mara' (que jah esta preenchida)
FOR ALL ENTRIES IN it_mara
" com estas condições, lembrando que tem que relacionar as tabelas nas condições
WHERE matnr = it_mara-matnr
AND spras = p_spras
.
ENDFORM. " Z_SELECT_MAKT
*&---------------------------------------------------------------------*
*& Form Z_SELECT_MARD
*&---------------------------------------------------------------------*
FORM z_select_mard .
" faz o mesmo que o select de cima. rsrs
SELECT matnr
werks
lgort
pstat
FROM mard
INTO TABLE it_mard
FOR ALL ENTRIES IN it_mara
WHERE matnr = it_mara-matnr
AND werks = p_werks
AND lgort = p_lgort
.
ENDFORM. " Z_SELECT_MARD
*&---------------------------------------------------------------------*
*& Form Z_feed_table
*&---------------------------------------------------------------------*
FORM z_feed_table .
" Esse loop eh muito importante, debbungando vc verá que ele pega
" o primeiro registro e joga na estrutura...
LOOP AT it_mara INTO st_mara.
" depois lê as tabelas jogando pra um estrutura tb, se atender as
" condições
READ TABLE it_makt INTO st_makt WITH KEY matnr = st_mara-matnr
spras = p_spras.
READ TABLE it_mard INTO st_mard WITH KEY matnr = st_mara-matnr
werks = p_werks
lgort = p_lgort .
" Aki é alimentado a estrutura com os valores que foram solicitados,
st_outtab-check = space.
st_outtab-matnr = st_mara-matnr.
st_outtab-ersda = st_mara-ersda.
st_outtab-maktx = st_makt-maktx.
st_outtab-werks = st_mard-werks.
st_outtab-lgort = st_mard-lgort.
st_outtab-pstat = st_mard-pstat.
" depois da estrutura devidamente preenchida este registro eh colocado
" numa tabela de saida que poderá ser usado para preencher Relatório ALV
APPEND st_outtab TO it_outtab.
" Limpa a estrutura pra naum leva sujeira e começa o Loop tudo denovo.
CLEAR : st_outtab.
ENDLOOP.
ENDFORM. " Z_feed_table
*&---------------------------------------------------------------------*
*& Form Z_SHOW_DATA
*&---------------------------------------------------------------------*
FORM z_show_data .
" Mostra os dados da tabela de saida
LOOP AT it_outtab INTO st_outtab.
WRITE : / st_outtab.
ENDLOOP.
ENDFORM. " Z_SHOW_DATA
terça-feira, 28 de junho de 2011
Tudo ou nada num Select
"Se usar um parameters vazio na clausula where de um select, não trará registro, agora se usar um select-options vazio trará todos os registros."
terça-feira, 21 de junho de 2011
Controle de Caracteres
" Tentarei mostrar um código muito interessante onde vc consegue
" controlar os caracteres dentro de campos ou variaveis, desmembrando
" caso queira dentro de outras variáveis ou campos de de estruturas
" ou tabelas.
" Debuggem, coloquem contadores em lugares diferentes e ve oq acontece
" mexam nisso pois com certeza um dia isso irá te ajudar.
*&---------------------------------------------------------------------*
REPORT zmj_crtl_caract.
" Variáveis .....
DATA : vg_text TYPE string,
vg_qtde TYPE i.
" Tela de seleção ...
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE text-001.
PARAMETERS:
p_text TYPE string OBLIGATORY, " Texto ( Texto : ).
p_value TYPE c
.
SELECTION-SCREEN END OF BLOCK b01.
" Inicio da seleção ...
START-OF-SELECTION.
" Aqui eu alimento uma variável com a quantidade de caracter do
" parameters que o usuário informado.
vg_qtde = strlen( p_text ).
PERFORM : z_tira_carac,
z_leitura_especif
.
*&---------------------------------------------------------------------*
*& Form z_tira_carac
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM z_tira_carac .
" Joga o texto informado pelo usuário pra dentro de uma variável
" para que vc possa trabalha deboua com a informação.
vg_text = p_text.
" Tira os 3 primeiros caracteres da variavel.
DO 3 TIMES.
SHIFT vg_text.
ENDDO.
WRITE : 'O texto sem os 3 primeiros digitos é : ', vg_text .
ENDFORM. " z_tira_carac
*&---------------------------------------------------------------------*
*& Form Z_LEITURA_ESPECIF
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form Z_LEITURA_ESPECIF .
vg_text = p_text.
" Variáveis locais tarbalhando como contadores.
data : vl_cont TYPE i VALUE '1',
vl_posi TYPE i
.
DO vg_qtde TIMES.
" verifica se primeiro caracter do texto e diferente do caracter informado
IF vg_text(1) ne p_value.
" Anda um caracter e joga ele no final da string pois eh 'CIRCULAR'.
shift vg_text CIRCULAR.
add 1 to vl_cont.
ENDIF.
ENDDO.
IF vl_cont >= vg_qtde.
write : /, 'O caracter ', p_value,' Não foi encontrado no texto ', p_text, ' .'.
ELSE.
write : /, 'O caracter ', p_value,' está na posição ', vl_cont, ' .'.
ENDIF.
WRITE : /,'O texto com "Shift Circular" fica assim a',
/,' partir do caracter selecionado : ', vg_text ,' .'.
endform. " Z_LEITURA_ESPECIF
" controlar os caracteres dentro de campos ou variaveis, desmembrando
" caso queira dentro de outras variáveis ou campos de de estruturas
" ou tabelas.
" Debuggem, coloquem contadores em lugares diferentes e ve oq acontece
" mexam nisso pois com certeza um dia isso irá te ajudar.
*&---------------------------------------------------------------------*
REPORT zmj_crtl_caract.
" Variáveis .....
DATA : vg_text TYPE string,
vg_qtde TYPE i.
" Tela de seleção ...
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE text-001.
PARAMETERS:
p_text TYPE string OBLIGATORY, " Texto ( Texto : ).
p_value TYPE c
.
SELECTION-SCREEN END OF BLOCK b01.
" Inicio da seleção ...
START-OF-SELECTION.
" Aqui eu alimento uma variável com a quantidade de caracter do
" parameters que o usuário informado.
vg_qtde = strlen( p_text ).
PERFORM : z_tira_carac,
z_leitura_especif
.
*&---------------------------------------------------------------------*
*& Form z_tira_carac
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM z_tira_carac .
" Joga o texto informado pelo usuário pra dentro de uma variável
" para que vc possa trabalha deboua com a informação.
vg_text = p_text.
" Tira os 3 primeiros caracteres da variavel.
DO 3 TIMES.
SHIFT vg_text.
ENDDO.
WRITE : 'O texto sem os 3 primeiros digitos é : ', vg_text .
ENDFORM. " z_tira_carac
*&---------------------------------------------------------------------*
*& Form Z_LEITURA_ESPECIF
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form Z_LEITURA_ESPECIF .
vg_text = p_text.
" Variáveis locais tarbalhando como contadores.
data : vl_cont TYPE i VALUE '1',
vl_posi TYPE i
.
DO vg_qtde TIMES.
" verifica se primeiro caracter do texto e diferente do caracter informado
IF vg_text(1) ne p_value.
" Anda um caracter e joga ele no final da string pois eh 'CIRCULAR'.
shift vg_text CIRCULAR.
add 1 to vl_cont.
ENDIF.
ENDDO.
IF vl_cont >= vg_qtde.
write : /, 'O caracter ', p_value,' Não foi encontrado no texto ', p_text, ' .'.
ELSE.
write : /, 'O caracter ', p_value,' está na posição ', vl_cont, ' .'.
ENDIF.
WRITE : /,'O texto com "Shift Circular" fica assim a',
/,' partir do caracter selecionado : ', vg_text ,' .'.
endform. " Z_LEITURA_ESPECIF
segunda-feira, 13 de junho de 2011
Elementos de Texto
" Colocar textos na tela é muito importante pois será onde acontece
" a interação como usuário, deixar de forma explicita oq cada campo" significa é muito importante para que não cause retrabalho pq o
" usuário não sabe aonde imputa as informações rsrsrs, é facil mas as
" vezes a gente esquece mesmo, 'a gente' eu neh.
" Caminho: 'Ir Para / Elemento de texto'
TABLES : mara
.
" No select-screen nos usamos o 'Textos de Seleção'
" O legal deste aih é que se vc tiver com preguiça vc pode 'ligar'
" com o campo da tabela que o objeto da tela de seleção se referencia,
" agora se tem que coloca um texto a mais ou como na maioria das vezes
" colocar ':' rsrsrs, aih eh soh digitar.
SELECTION-SCREEN: BEGIN OF BLOCK bl1 WITH FRAME TITLE text-t01.
SELECT-OPTIONS : s_matnr FOR mara-matnr OBLIGATORY
.
PARAMETERS : p_ersda TYPE mara-ersda,
p_ernam TYPE mara-ernam,
p_meins TYPE mara-meins
.
SELECTION-SCREEN: END OF BLOCK bl1.
" Write
*WRITE : / 'Material :' , s_matnr ,
* / 'Data de criação :' , p_ersda ,
* / 'Nome do responsável :', p_ernam ,
* / 'Unidade :' , p_meins
* .
" Aqui no 'Write' do programa estamos usando 'HardCode', mas está ERRADO
" pra efeito de Tradução sempre faça em elemento de texto, conforme ABAIXO,
" depois de escrever 'text-001' clique duas vezes encima e o SAP informa que
" não existe e se vc deseja criar, claro que vc deseja criar , aih vc vai
" para o 'Simbolo de texto'
.
WRITE : / text-001 , s_matnr , "' Material :'
/ text-002 , p_ersda , "' Data de criação :'
/ text-003 , p_ernam , "' Nome do responsável :'
/ text-004 , p_meins "' Unidade :'
.
" Se vcs perceberem tem ainda uma 3º Abinha, chamada titulos de Lista lista
" e como se fosse um cabeçalho do Write, mas por favor pesoal nunca usem isso,
" é muito ruim de dar manutenção .
" Agora visualizem o retorno e testem de outras formas... t+
segunda-feira, 6 de junho de 2011
Chegar na linha mais rápido
" Apertais Crtl+O e digite o numero da linha desejada, atalho muito interessante rsrsrs"
Assinar:
Postagens (Atom)