Professional Documents
Culture Documents
Eventos comuns
Os eventos so utilizados para estruturar o programa. Os eventos comuns apenas
separam os cdigos e inicializam variveis.
No so obrigatrios.
INITIALIZATION:
Dentro do bloco initialization, possvel definir valores para as variveis declaradas.
Este bloco definido antes de comear a programao bsica (START-OFSELECTION), pois nela sero utilizado os valores previamente definidos.
START-OF-SELECTION:
Bloco da execuo principal do programa. Nele estaro toda a seleo e tratamento
dos dados.
END-OF-SELECTION:
ltimo evento utilizado, nele normalmente colocado a lgica de sada do report.
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 1 de 53
EVENTOS COMUNS
Exemplo:
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 2 de 53
EVENTOS AVANADOS
Os eventos avanados so utilizados para efetuar validaes e criar reports
interativos.
So utilizados de acordo com as necessidades.
At Selection-Screen:
Dentro do bloco at.-selection-screen, so definidas as validaes dos parmetros
inseridos pelo usurio. O bloco dever estar entre os blocos INITIALIZATION e o
START-OF-SELECTION.
Antes do programa ser executado ou a cada enter pressionado o bloco definido
dentro do evento at.-selection-screen ser executado.
At Line-Selection
Utilizados para criao de lista de detalhes. Aps a impresso na tela do report,
possvel tornar interativo, clicando na linha, possvel executar outra rotina.
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 3 de 53
Exemplo:
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 4 de 53
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 5 de 53
____________________________________________________________________
Exemplo:
Pgina 6 de 53
COMANDOS AT..
Os comandos listados a seguir nos permitem fazer um processamento nivelado de
uma tabela interna dentro de um LOOP.
possvel tratar as seguintes mudanas na tabela interna.
COMANDO
LEVEL
DESCRIO
AT FIRST
AT LAST
AT NEW <F>
Inicio
Fim
Novo Campo
AT END OF <F>
Termino Campo
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 7 de 53
____________________________________________________________________
____________________________________________________________________
Exemplo:
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 8 de 53
____________________________________________________________________
____________________________________________________________________
Exemplo:
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 9 de 53
____________________________________________________________________
TABELAS INTERNAS
Composio:
Tipo de linha: o tipo de linha de uma tabela interna pode ser qualquer tipo de dados
do ABAP.
Seqncia da chave: Os campos chaves e suas seqncias o critrio pelo qual o
sistema identifica as linhas da tabela.
Atributos no nicos: Podem-se definir os campos de uma tabela interna como
nica ou no nica. Se a chave nica, no poder haver duplicatas.
Tipo da tabela: O tipo da tabela define como o ABAP acessa uma linha individual na
tabela. Pode ser feito pelo ndice direto ou pela chave primria.
Tipos: h trs tipos de tabelas internas e seus tipos de acesso aos dados:
Standard TABLE: em tabelas Standard, para acessar os dados pode-se usar o
ndice da tabela ou ento a chave. Se o acesso feito pela chave primria, o tempo
de resposta linearmente relativo ao nmero de entradas de uma tabela.
SINTAXE:
DATA: BEGIN OF TI_TAB OCCURS <N>,
<LAYOUT>,
END OF TI_TAB.
READ TABLE TI_TAB WITH TABLE KEY <FIELD> = VALUE
BINARY SEARCH.
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 10 de 53
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Sorted TABLE: Sorted tables so sempre armazenadas em ordem de acordo com a
chave. O acesso pode ser feito pela chave ou pelo ndice direto na tabela. Se for
utilizada a chave, o tempo de resposta logaritmamente relacionado ao nmero de
entradas na tabela desde que o sistema utiliza busca binria. A chave pode ser
nica ou no nica.
SINTAXE:
DATA: TI_TAB TYPE SORTED TABLE OF <LAYOUT>
<WITH UNIQUE KEY [KEY]>
WITH HEADER LINE
INITIALSIZE <TAM>.
READ TABLE TI_TAB WITH TABLE KEY <FIELD> = VALUE.
Neste comando no necessrio utilizar todos os campos da chave. O tempo de
acesso aos dados tambm eficiente e permite uma utilizao do meio de
armazenamento dos dados, o qual deixa todos os dados ordenados.
Apesar de ter um bom desempenho no acesso da tabela, na insero e deleo o
tempo de processo mais elevado pelo fato de ter o ordenamento implcito nos
comandos.
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 11 de 53
____________________________________________________________________
____________________________________________________________________
Hashed TABLE: podem apenas serem acessadas pela chave primria. O tempo de
recuperao dos dados constante, independente do nmero de entradas da tabela,
desde que o acesso seja feito usando um algorismo de mistura (hash). Este
algoritmo determinado internamente, sendo que a chave deve ser sempre nica.
SINTAXE:
DATA: TI_TAB TYPE HASHED TABLE OF <LAYOUT>
WITH UNIQUE KEY <KEY>
WITH HEADER LINE
INITIALSIZE <TAM>.
READ TABLE TI_TAB WITH TABLE KEY <FIELD> = VALUE.
A utilizao de uma tabela HASH deve ser feita quando for acessar registros
simples, com chave nica.
Neste caso o comando eficiente pois deve-se usar todos os campos da chave da
tabela.
Selecionando o tipo de Tabela
Custo de acesso
Nmero de entradas na tabela
5
10
20
Standard 52
121
335
Sorted
44
87
177
Hashed
41
78
151
Tempo em microssegundos
40
1081
80
3884
160
14999
320
59700
391
305
862
613
1895
1249
4048
2497
640
23821
4
8587
5080
1280
951704
18136
10537
Pgina 12 de 53
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Cargas eficientes em tabelas internas
Quando houver necessidade de se copiar tabelas internas com a mesma estrutura,
utilize o comando APPEND LINES ou o uso de TAB1[] = TAB2[], para executar a
cpia. Voc tambm pode utilizar o comando APPEND LINES para copiar certa
quantidade de linhas.
Exemplo:
Em vez de utilizar o comando:
LOOP AT TI_TAB1 INTO WA.
APPEND WA TO TI_TAB2.
ENDLOOP.
Utilize o comando:
APPEND LINES OF TI_TAB1 TO TI_TAB2.
APPEND LINES OF TI_TAB1 FROM 2 TO 20 TO TI_TAB2.
Ou
TI_TAB2[ ] = TI_TAB1[ ].
Outros comandos eficientes de carga de dados em tabelas internas:
SELECT ... FROM ... INTO TABLE <TI_TAB>.
SELECT ... FROM ... APPENDING TABLE <TI_TAB>.
INSERT LINE OF <TI_TAB1> TO <TI_TAB2>.
COLLECT [ <WA> INTO ] <TI_TAB>
DELETE ADJACENT DUPLICATES FROM <TI_TAB>.
[ COMPARING F1 F2 ]
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 13 de 53
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Quando executamos uma leitura usando o comando READ em uma tabela interna
que possua mais de 20 registros, aconselhvel o uso do complemento BINARY
SEARCH ou definirmos a tabela como SORTED TABLE. Quando usamos o
complemento BINARY SEARCH, o tempo de pesquisa na tabela interna ser
incrivelmente reduzido devido pesquisa binria que ser executada.
Exemplo:
READ TABLE TI_TAB WITH KEY K = Y BINARY SEARCH.
O transporte para a memria de apenas campos que se fazem necessrio d um
ganho de performance significativo, principalmente se a tabela for muito grande.
A utilizao do TRASPORTING NO FIELDS permite que seja verificada a existncia
de um dado na tabela sem que seja feita nenhuma transferncia da tabela para a
memria. Esta no transferncia deixa o ambiente mais limpo e com a memria mais
livre para o trabalho.
MODIFY <TI_TAB> TRANSPORTING <F1> ... <FN>.
READ
LOOP
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 14 de 53
____________________________________________________________________
COMANDOS SELECT
Visando garantir a performance e evitar problemas futuros, cuidado com os
comandos empregados.
Existem alguns tipos de selects mais eficientes que outros. Normalmente, o maior
tempo de processamento est localizado no acesso ao DB Server. Assim, toda vez
que foi reduzida a comunicao entre o Application Server e o DB Server, ser obtido
um ganho em termos de performance.
1 SELECT ... FROM <TABLE>
INTO TABLE <INTERNAL TABLE>.
A estrutura da tabela interna deve corresponder estrutura da tabela que est sendo
acessada. O sistema l os registros em conjunto, no individualmente, e os coloca
dentro de um LOOP e ir gravando os registros, um a um.
2 SELECT ... FROM <TABLE>
APPENDING TABLE <INTERNAL TABLE>.
L os registros e os inclui - no sobrepe - em uma tabela interna.
3 SELECT ... FROM <TABLE>
INTO CORRESPONDING TABLE <INTERNAL TABLE>.
Neste caso a estrutura da tabela interna no precisa corresponder estrutura da
tabela que est sendo acessada. Movimentar os registros para as colunas definidas
na tabela que possua, nome igual ao da tabela acessada.
4 SELECT ... FROM <TABLE>
APPENDING CORRESPONDING FIELDS OF TABLE <INTERNAL TABLE>.
L e inclui (no sobrepe) os dados em uma tabela interna que possua nomes
idnticos aos nomes da tabela que est sendo lida.
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 15 de 53
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
5 SELECT SINGLE ... FROM <TABLE>
WHERE <CAMPO> = <CONTEUDO>.
Toda vez que se usa select single a chave primria completa deve ser especificada.
Se a chave especificada no qualificada, voc receber uma mensagem de
warning durante o check e a performance ficar prejudicada.
Deve-se sempre com SINGLE utilizar a chave primria completa na chave. No caso
de haver a necessidade de acessar um nico registro via select, as opes so.
SELECT ... FROM <TABLE>
WHERE <CAMPO> = <CONTEUDO>.
EXIT.
ENDSELECT.
OU
SELECT ... FROM <TABLE> UP TO 1 ROWS
WHERE <CAMPO> = <CONTEUDO>.
ENDSELECT.
6 SELECT ... FROM <TABLE>.
Quando no se impes nenhum tipo de restrio, ocorre uma varredura seqencial
dos registros da tabela. Quando se utiliza grandes tabelas, isso pode afetar o tempo
de execuo.
7 SELECT * FROM <TABLE>.
Select* seleciona todas as colunas de uma tabela. melhor especificar as colunas,
pois em caso de tabelas eco muitas com muitas colunas, prejudicar performance.
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 16 de 53
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
8 SELECT ... FROM <TABLE>
WHERE <CAMPO> = <CONTEUDO>.
ENDSELECT.
L todos os registros da tabela especificada onde o campo igual ao contedo
especificado.
9 SELECT <A1> <A2> ... INTO ( <F1> <F2> )
FROM <TABLE>
WHERE .
L as colunas especificadas (a1, a2). Aps INTO devero ser especificadas as reas
de trabalho auxiliares (f1,f2). O nmero de colunas lidas dever ser igual ao nmero
de reas de trabalho especificadas.
10 SELECT ... FROM <TABLE>
WHERE <TABLE FIELD>
BETWEEN <FIELD1> AND <FIELD2>.
Trabalha com o range especificado nos campos <field1> e <field2>. Inclusive eles.
11 SELECT ... FROM <TABLE>
WHERE <TABLE FIELD> LIKE ... _R%.
_=a primeira letra no importa qual a segunda foi definida como R
%=no importa a seqncia de caracteres que vir.
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 17 de 53
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
12 SELECT MAX
( FIELD )
MIN
( FIELD )
AVG
( FIELD )
COUNT (*) FROM <TABLE>
INTO ( , ..., ..., ..., ... )
WHERE ... .
AVG e SUM: somente para campos numricos.
No se usa ENDSELECT.
13 SELECT ... FROM <TABLE>
WHERE < TABLE FIELD > IN ( ..., ..., ... )
Exemplo: Os campos definidos na listagem, podem ser literais. igual perguntar se
o campo 1 123 ou 1000.
14 SELECT ... FROM <TABLE>
WHERE <TABLE FIELD> IN <INTERNAL TABLE>.
Exemplo:
DATA: BEGIN OF TI_TAB OCCURS 10,
SIGN(1),
OPTION(2),
LOW LIKE SFLIGHT-PRICE,
HIGH LIKE SFLIGHT-PRICE,
END OF TI_TAB.
Ou
RANGES: TI_TAB FOR SFLIGHT-TABLE.
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 18 de 53
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
(A estrutura de tabela interna gerada e a mesma do select-options)
MOVE: I
TO TI_TAB-SIGN,
BT TO TI_TAB-OPTION,
500 TO TI_TAB-LOW,
1000 TO TI_TAB-HIGH.
APPEND TI_TAB.
MOVE: I
TO TI_TAB-SIGN,
BT TO TI_TAB-OPTION,
440 TO TI_TAB-LOW,
450 TO TI_TAB-HIGH.
APPEND TI_TAB.
15 SELECT ... FROM <TABLE> INTO <WORK AREA>.
Move os valores do registro lido para a rea de trabalho.
16 SELECT ... FROM (TABNAME) ... .
ENDSELECT.
obs.: especificando o nome da tabela pode ser especificado dinamicamente no
select statement, porm sempre consome mais tempo de CPU que especificando
estaticamente no programa.
17 SELECT ... FROM <TABLE>
FOR ALL ENTRIES IN <INTERNAL TABLE>
WHERE CAMPO1 = <INTERNAL TABLE>-CAMPO1
AND CAMPO2 = <INTERNAL TABLE>-CAMPO2.
Defino uma tabela interna. Alimento os campos desta tabela interna. (move e
append). No select campo1 e campo2 sero os campos definidos e alimentados da
tabela interna. O comando select...for al entries extremamente interessante, pois
faz a funo de um join. Somente na verso 4.0 existe e pode-se utilizar o comando
JOIN para o ABAP.
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 19 de 53
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
18 SELECT ... FROM <TABLE>
WHERE ...
ORDER BY <FIELD1>, <FIELD2>.
SELECT FROM <TABLE>
WHERE
ORDER BY PRIMARY KEY.
Obs.: Classifica a tabela interna numa rea auxiliar, sem afetar a tabela original.
Evitar o uso de sorts dentro de um select. Consome mais tempo que descarregar os
dados em uma tabela interna e classific-los. A no ser que se esteja acessando via
primary key, ou seja, ndice primrio ou os campos definidos no order by tenham um
ndice apropriado.
19 SELECT CARRID MIN ( PRICE ) MAX ( PRICE )
INTO (CARRID, MINIMUM, MAXIMUM)
FROM SFLIGHT
WHERE
GROUP BY CARRID.
Todos os campos que eu quero que apaream na minha lista eu preciso especificar
aps a clusula GROUP BY.carrid, maximum e minimum so campos auxiliares. Se
o nome do database no conhecido at runtime no se pode especificar a clusula
GROUP BY.
20 SELECT ... FROM <TABLE>
WHERE ...
BYPASSING BUFFER.
Usado para ler diretamente da tabela original, e no do buffer.
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
Pgina 20 de 53
________________________________________________________________
________________________________________________________________
COMANDO INSERT
O comando INSERT insere um novo registro no banco de dados, a partir de uma
rea de dados especificada em TABLES ou uma rea declarada com DATA. Para
usar INSERT, devem-se colocar os dados desejados na rea intermediria e, em
seguida, chamar o comando INSERT. Caso a rea no seja especificada em
TABLES, deve ser usada a opo FROM.
SINTAXE:
TABLE-CAMPO1 = VG_CAMPO1.
TABLE-CAMPO2 = VG_CAMPO2.
TABLE-CAMPO3 = VG_CAMPO3.
INSERT <TABLE>.
COMANDO UPDATE
O comando UPDATE funciona como o comando INSERT, podendo alterar dados no
banco a partir de uma rea ou tabela interna. No caso da tabela interna, no
necessrio especificar a clusula WHERE: sero alterados os registros
correspondentes de acordo com as chaves.
SINTAXE:
UPDATE <TABLE>
SET CAMPO1 = VG_CAMPO1
CAMPO2 = VG_CAMPO2
WHERE CAMPO3 = VG_CAMPO3
AND CAMPO4 = VG_CAMPO4.
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 21 de 53
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
COMANDO MODIFY
O comando MODIFY opera da mesma forma que o comando UPDATE, mas insere
um novo registro caso o registro especificado no exista.
SINTAXE:
TABLE-CAMPO1 = VG_CAMPO1.
TABLE-CAMPO2 = VG_CAMPO2.
TABLE-CAMPO3 = VG_CAMPO3.
MODIFY <TABLE>.
COMANDO DELETE
O comando DELETE elimina registros do banco. Ele opera da mesma forma que o
comando INSERT
SINTAXE:
DELETE FROM <TABLE>
WHERE CAMPO1 = VG_CAMPO1.
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 22 de 53
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 23 de 53
Pgina 24 de 53
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Exemplos WRITE:
CODIGOS ABAP
SADA TELA
DATA: G(5) TYPE C VALUE Hello,
F(5) TYPE C VALUE Dolly.
WRITE: G, F.
WRITE: /10 G,
/
F UNDER G.
Hello Dolly
Hello
Dolly
HelloDolly
WRITE: / G NO-GAP, F.
DATA TIME TYPE T VALUE 154633.
WRITE: TIME,
/ (8) TIME USING EDIT MASK __:__:__.
WRITE: 000123,
/ 000123 NO-ZERO.
154633
15:46:33
000123
123
12.345,600
1.234,569
12,346
1,235
WRITE: SY-DATUM,
/ SY-DATUM YYMMDD.
27.06.2008
080627
____________________________________________________________________
____________________________________________________________________
Pgina 25 de 53
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pode-se imprimir utilizada vrias opes de formatao com o comando WRITE:
SINTAXE:
WRITE <SYMBOL-NAME> AS SYMBOL.
WRITE <ICON-NAME> AS ICON.
Exemplo:
REPORT EXEMPLO_WRITE_03.
INCLUDE <SYMBOL>.
INCLUDE <ICON>.
WRITE: / Simbolo de Telefone:, SYM_PHONE AS SYMBOL.
SKIP.
WRITE: / Icone de Alarme:, ICON_ALARM AS ICON,
Podem-se imprimir Linhas horizontais, verticais e linhas em branco:
SINTAXE:
ULINE [AT [/] [<POS>] [(<LEN>)] ].
* OU
WRITE [AT [/] [<POS>] [(<LEN>)] ] SY-ULINE.
WRITE [AT [/] [<POS>]] SY-VLINE.
* OU
WRITE [AT [/] [<POS>] ] |.
SKIP [<N>].
*OU
SKIP TO LINE <N>.
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 26 de 53
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Listagem de cores:
OFF
1
2
3
4
5
6
7
Tipo
or COL_BACKGROUND
or COL_HEADING
or COL_NORMAL
or COL_TOTAL
or COL_KEY
or COL_POSITIVE
or COL_NEGATIVE
or COL_GROUP
Ref.
0
1
2
3
4
5
6
7
Cor
depends um GUI
gray-blue
light gray
yellow
blue-green
green
red
violet
Utilizao
background
headers
List bodies
totals
Key columns
Positive threshold value
Negative threshold value
Control levels
Pgina 27 de 53
I = I + 1.
ENDWHILE.
Pgina 28 de 53
Pgina 29 de 53
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
RELATRIOS ALV
Pgina 30 de 53
Pgina 31 de 53
Pgina 32 de 53
Pgina 33 de 53
EVENTO INITIALIZATION
Neste evento voc verificar se existe uma variante definida como default para o
relatrio atravs da funo REUSE_ALV_VARIANT_DEFAULT_GET
*Varivel :
def_variante
LIKE disvariant.
Pgina 34 de 53
Neste evento voc dever criar uma rotina para exibir as variantes j existentes para
o relatrio em questo.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_vari.
PERFORM f_f4_variant.
*Variveis :
variant_exit(01) TYPE c,
variante
LIKE disvariant,
*Funo :
CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
EXPORTING
is_variant = variante
i_save
= A
IMPORTING
e_exit
= variant_exit
es_variant = def_variante
EXCEPTIONS
not_found = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
IF variant_exit = space.
p_vari = def_variante-variant.
ENDIF.
FORMATAO DO RELATRIO EM ALV
Pgina 35 de 53
TYPE slis_layout_alv,
TYPE slis_print_alv
TYPE slis_alv_event,
TYPE slis_listheader.
TYPE kkblo_specialcol.
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
2. Rotinas para Formatao do Layout
Pgina 36 de 53
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Outros eventos que retornaro da funo e podem ser tratados :
Pgina 37 de 53
CALLER_EXIT
USER_COMMAND
TOP_OF_PAGE
TOP_OF_COVERPAGE
END_OF_COVERPAGE
FOREIGN_TOP_OF_PAGE
FOREIGN_END_OF_PAGE
PF_STATUS_SET
LIST_MODIFY
TOP_OF_LIST
END_OF_PAGE
END_OF_LIST
AFTER_LINE_OUTPUT
BEFORE_LINE_OUTPUT
REPREP_SEL_MODIFY
SUBTOTAL_TEXT
Estes eventos esto gravados dentro do Tipo SLIS
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
2.2. PERFORM f_cabec_lista. " Cabecalho da Lista
Pgina 38 de 53
Neste FORM iremos criar os textos que devero sair no cabealho do relatrio.
* Texto Principal - Header
CLEAR w_line.
w_line-typ = 'H'.
w_line-info = text-001.
APPEND w_line TO t_top_of_page.
No campo TYP dever ser informado:
H Header
S Selection
A Action
Estes tipos iro colocar os textos em formatos diferentes (letra, negrito ou itlico).
Estas informaes sero gravadas na tabela interna T_TOP_OF_PAGE
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
2.3. PERFORM f_layout. " Layout Geral da Lista
Pgina 39 de 53
Neste FORM iremos formatar o relatrio nos parmetros gerais, ou seja, a aparncia
do relatrio.
Veja abaixo os campos que podem ser formatados :
Campo
Descrio
Parmetros Gerais
no_colhead
Sem Ttulos (Cabealho)
no_hotspot
Ttulos sem Hotspot
no_vline
Colunas separadas por espaos
Zebra
Listrado (Uma linha clara outra escura)
cell_merge
No suprimir a replicao de campo
Edit
Edio somente para o grid todo
edit_mode
Edio somente para o grid todo
numc_sum
Total para campos numricos
no_input
Somente exibio de campos
f2code
no_keyfix
No fixar coluna chave
expand_all
Expandir todas as posies
no_author
Nenhuma verificao padro da autoridade
PF-status
def_status
Status Default
item_text
Opes de Display
colwidth_optimize
Otimizar tamanho da Coluna
no_min_linesize
Tamanho da linha = tamanho da lista
min_linesize
Default 80
max_linesize
Default 250
Excees
lights_fieldname
Nome do campo para exceo
lights_tabname
Nome da tabela para exceo
lights_rollname
lights_condense
Somatrios
no_sumchoice
Sem escolha para Somar para cima
no_totalline
Sem Total Linha
no_subtotals
Sem Sub-Total
totals_before_items
Mostrar total antes dos itens
totals_only
Mostrar somente os totais
totals_text
Texto para a 1a. coluna na linha de total
subtotals_text
Texto para a 1a. coluna na linha de Sub-total
Interaes
box_fieldname
Nome do Campo para Checkbox
box_tabname
box_rollname
expand_fieldname
hotspot_fieldname
Nome do Campo para Hotspot
confirmation_prompt
Confirmar Sada da lista
Pgina 40 de 53
key_hotspot
flexible_key
group_buttons
get_selinfos
group_change_edit
no_scrolling
Mostar Variantes
header_text
default_item
Cores
info_fieldname
Coltab_fieldname
Outros
list_append
xifunckey
xidirect
dtc_layout
Pgina 41 de 53
Pgina 42 de 53
roundtabname
decimalsfieldname
decimalstabname
decimals_out
text_fieldname
reptext_ddic
ddic_outputlen
key_sel
no_sum
sp_group
Reprep
Input
Edit
Hotspot
Nome tabela
Nome campo para Decimais
Nome tabela
Nmero de decimais para escrever um nmero
Texto para a coluna
Tamanho do Campo
field not obligatory
No totalizar o campo
Grupo
Campo como input de dados
Uso interno
Campo como hotspot
de
registros
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
3. Exibir Relatrio
Pgina 43 de 53
= 'X'
= v_save
= variante
= t_event[]
= t_relat
=1
= 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
STOP.
ENDIF.
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Como utilizar outros botes na tela
Pgina 44 de 53
Para inserir novos botes na tela, voc deve copiar o Status Gui Standard
STANDARD_FULLSCREEN para outro a ser utilizado no seu relatrio. Aps a cpia
voc deve retirar botes que no sero utilizados e inserir os seus novos botes :
O tratamento destes novos botes dever ser no FORM F_USER_COMMAND
especificado na chamada da funo de exibio do relatrio :
FORM f_user_command USING p_ucomm LIKE sy-ucomm
p_selfield TYPE slis_selfield.
CASE p_ucomm.
* Modificar Documento
WHEN 'ZVA02'.
CHECK p_selfield-fieldname = 'VBELN'.
SET PARAMETER ID 'AUN' FIELD p_selfield-value.
CALL TRANSACTION 'VA02' AND SKIP FIRST SCREEN.
* Exibir Documento
WHEN 'ZVA03'.
CHECK p_selfield-fieldname = 'VBELN'.
SET PARAMETER ID 'AUN' FIELD p_selfield-value.
CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
* Exibir Remessa
WHEN 'ZVL01'.
CHECK p_selfield-fieldname = 'VBELN'.
READ TABLE t_relat INDEX p_selfield-tabindex.
IF sy-subrc EQ 0.
SET PARAMETER ID 'AUF' FIELD t_relat-vbeln.
SET PARAMETER ID 'VST' FIELD t_relat-vstel.
SET PARAMETER ID 'LEDAT' FIELD t_relat-mbdat.
CALL TRANSACTION 'VL01N' AND SKIP FIRST SCREEN.
ENDIF.
WHEN OTHERS.
ENDCASE.
ENDFORM.
" f_user_command
Pgina 45 de 53
Consideraes Iniciais
Quando comeamos a falar de banco de dados com R/3 nos preocupamos com
Performance, neste curso estaremos apresentando conceitos de anlises para
identificar problemas de Performance em transaes, independente de banco de
dados (Oracle, SQL, Informix, SAPDB, etc).
A anlise comea quando identificamos problemas de performance mais localizadas,
causados por uma ou algumas transaes. Detectadas estas transaes, devemos
submet-las a uma anlise mais detalhada, analisando trechos que realizam
processamentos muitos longos, ligados a execuo de programas ABAP ou ao
acesso tabelas no banco de Dados. Aps detectar o gargalo dentro da transao,
devemos levantar as possveis aes para ameniz-lo ou at mesmo elimin-lo (foco
do treinamento).
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 46 de 53
Use o comando FREE para liberar espao em tabelas internas; sempre utilizar
os comandos CLEAR/REFRESH aps o fim de um processamento.
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 47 de 53
____________________________________________________________________
Introduo ao Join
Para a seleo em mais de uma tabela dispomos de alguns meios que prejudicam a
performance. O que podemos definir como regra o que no fazer: utilizar selects
encadeados.
Os meios disponveis dependem da verso do R/3 que est sendo utilizada:
1.
A clusula For al entries
2.
A clusula Inner Join
3.
A clusula Left Outer Join
4.
Criao de Views no Dicionrio de Dados.
Baseado em teses realizados com o Runtime Analise (transao SE30), foi
comprovado que a melhor soluo, quando possvel, utilizar as clusulas de join no
banco de dados (Inner Join e Left Outer Join)
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 48 de 53
Pgina 49 de 53
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Clusula Inner Join:
Esta clusula tem o mesmo resultado de uma definio de view do Dicionrio de
dados. As duas tabelas so relacionadas e os registros que pertencem as duas so
selecionados.
Exemplo:
SINTAXE:
SELECT A~CARRID A~CONNID A~DISTANCE
B~CARRID B~CONNID B~BOOKID
INTO TABLE TI_BOOKFLIGHT
FROM SFLIGHT AS A
INNER JOIN SBOOK AS B
ON A~CARRID = B~CARRID
AND A~CONNID = B~CONNID
ZND A~FLDATE = B~FLDATE
WHERE A~FLDATE = 19990623
AND B~SMOKER = SPACE.
Clusula Left Outer Join:
Esta clusula difere da anterior pelo fato de que para um registro entrar na tabela de
resultados, no necessita estar nas duas tabelas, bastando estar em uma das duas.
Exemplo:
SINTAXE:
SELECT A~CARRID A~CONNID A~DISTANCE
B~CARRID B~CONNID B~BOOKID
INTO TABLE TI_BOOKFLIGHT
FROM SFLIGHT AS A
LEFT OUTER JOIN SBOOK AS B
ON A~CARRID = B~CARRID
AND A~CONNID = B~CONNID
ZND A~FLDATE = B~FLDATE
WHERE A~FLDATE = 19990623
AND B~SMOKER = SPACE.
Criao de Views:
Ao criar uma view no dicionrio de dados, estamos criando tambm uma view no
banco de dados e, portanto o seu acesso torna-se rpido.
____________________________________________________________________
____________________________________________________________________
Pgina 50 de 53
____________________________________________________________________
____________________________________________________________________
TABELAS CLUSTER
Aparentemente, sempre mais vantajoso especificar todos os campos possveis nas
clusulas where, pois assim diminumos o nmero de dados selecionados j no
Banco de Dados. Esta regra possui uma nica exceo: Cluster Tables. Este tipo de
tabela possui uma estrutura diferente no Banco de Dados. Os campos que ela
possui so os campos chaves e outro que possui todos os demais campos
compactados. Tomando por exemplo a tabela BSEG, podemos dizer que ela possui
6 campos: MANDT, BUKRS, BELNR, GJAHR, BUZEI e todos os demais campos
compactados em um s. Em termos prticos, se especificarmos na clusula where
algum campo que no seja chave, o banco de dados ter que descompactar todo o
campo para realizar a comparao.
Exemplo:
O comando abaixo deve ser evitado:
SELECT BELNR BUZEI ZUONR
INTO TABLE TI_BSEG
FROM BSEG
FOR ALL ENTRIES IN TI_BKPF
WHERE BUKRS = TI_BKPF-BUKRS
AND BELNR = TI_BKPF-BELNR
AND ZTERM = 0001.
E o comando abaixo deve ser utilizado:
SELECT BELNR BUZEI ZUONR ZTERM
INTO TABLE TI_BSEG
FROM BSEG
FOR ALL ENTRIES IN TI_BKPF
WHERE BUKRS = TI_BKPF-BUKRS
AND BELNR = TI_BKPF-BELNR
DELETE TI_BSEG WHERE ZTERM <> 0001.
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 51 de 53
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
BUFFERIZAO DE TABELAS
Tipos de bufferizao:
Tabelas pequenas;
Select...bypasssing buffer;
Select...distinct;
Select...count,som,avg,min,Max;
Select...for update;
Pgina 52 de 53
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Pgina 53 de 53