Vous êtes sur la page 1sur 53

REPORT AVANADO: LGICA DE PROCESSAMENTO

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

____________________________________________________________________

COMANDOS PERFORM E FORM


Utilizamos a instruo PERFORM para a chamada de FORMs (sub-rotinas). Serve
para melhorarmos a codificao.
Podemos criar algumas sob-rotinas que so blocos de cdigo iniciados pelo
comando FORM e finalizados pelo comando ENDFORM. Podem ser chamadas
diversas vezes dentro da programao principal, assim no precisamos repetir o
mesmo cdigo dentro da codificao. No h limites para a criao de FORMs.
A sub-rotina poder receber e retornar parmetros.

____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________

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

Primeira linha da tabela interna


Ultima linha da tabela interna
Comeo de um grupo das linhas com os
mesmos indices no campo <F> e nos
campos esquerda de <F>
Extremidade de um grupo das linhas com
os mesmos ndices no campo <F> e nos
campos esquerda de <F>

Dentro da instruo AT, definido um bloco de instruo que finalizado com a


estrutura ENDAT.
SINTAXE:
AT < level >.
< statement block >
ENDAT.

____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________

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

Para processos onde o volume de dados muito maior, a utilizao do processo


hash muito mais eficiente.
Para a definio das tabelas internas, e necessrio que seja preenchida a clusula
occurs. Como defini - l? Para isto, deve-se conhecer o volume de dados e a forma
de insero dos dados na tabela interna. Isto porque o nmero especificado para as
ocorrncias (occurs) indica de quanto em quanto a tabela ter sua alocao de
memria. Isto , para uma tabela definida com occurs 10, na primeira insero de
dados (append, collect, insert) sero alocados 10 registros; na insero do 11
registro, sero alocados mais 10 posies e assim por diante.
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________

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

<TI_TAB> TRANSPORTING <F1> <FN> [ NO FIELDS ].

LOOP

<TI_TAB> TRANSPORTING NO FIELDS.

____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________

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.

TESTE SELECT: Para saber se o select encontrou algum registro ou no,


utilizamos uma varivel de sistema SY-SUBRC, se o contedo dessa varivel for 0
encontrou caso contrrio no encontrou nenhum registro.

________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________

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

____________________________________________________________________
____________________________________________________________________
____________________________________________________________________

Report Avanado: Lgicas de Impresso


COMANDO WRITE
O comando bsico no ABAP para imprimir informaes na tela o WRITE.
SINTAXE:
WRITE <F>.
O Campo <F> pode ser:
Objeto de dados
Parmetro
Etc.
Exemplo:
REPORT ZEXEMPLO_WRITE_01.
DATA NUMBER TYPE P VALUE -1234567.89 DECIMALS 2.
WRITE: Number, NUMBER, is packed.
Podemos posicionar o local de sada da informao
SINTAXE:
WRITE AT [ / ] [ <POS> ] [ (<LEN>) ] <F>.
Onde:
A / indica uma nova linha
<pos> um nmero ou varivel que indica a posio que ser impressa
<len> o nmero ou varivel que indica o tamanho de sada
Exemplos:
REPORT ZEXEMPLO_WRITE_02.
WRITE Primeira Linha..
WRITE Continua na Primeira Linha.
WRITE / Segunda Linha.
WRITE /13 Terceira Linha..
REPORT ZEXEMPLO_WRITE_03.
DATA: LEN TYPE I VALUE 10,
POS TYPE I VALEU 11,
TEXT(10) TYPE C VALUE 1234567890.
WRITE The text ---------------------- appears in the text..

Pgina 23 de 53

WRITE AT POS(LEN) TEXT.

Podem ser utilizadas vrias opes de formatao com o comando WRITE:


SINTAXE:
WRITE ... <F> <OPTION>.
Opo de formatao para todos os tipos de dados:
Opo
Funo
LEFT-JUSTIFIED
Sada a esquerda
CENTERED
Sada centralizada
RIGHT-JUSTIFIED
Sada a direita
UNDER <g>
Sada comea imediatamente abaixo o campo <g>
NO-GAP
Os brancos aps o campo <f> so omitidos
USING
EDIT Especifica templates
MASK <m>
USING NO EDIT
Desativa templates definidos no Dicionrio de dados
MASK
NO-ZERO
Os Zeros so substitudos por brancos

Opo de formatao para campos numricos:


Opo
Funo
NO-SIGN
Oculta o Sinal
DECIMALS <d>
<d> define o nmero de dgitos aps o ponto dcima.

Opo de formatao para campos de Data:


Opo
Funo
DD/MM/YY
Separados so definidos no mestre de usurios (SU3)
MM/DD/YY
Separados so definidos no mestre de usurios (SU3)
DD/MM/YYYY
Separados so definidos no mestre de usurios (SU3)
MM/DD/YYYY
Separados so definidos no mestre de usurios (SU3)
DDMMYY
Sem separadores
MMDDYY
Sem separadores
YYMMDD
Sem separadores
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________

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

DATA FLOAT TYPE F VALUE 123456789.0.


123456,789E+03
WRITE FLOAT EXPONENT 3.
DATA PACK TYPE P VALUE 123.456 DECIMALS 3.
123,46
WRITE PACK DECIMALS 2.
WRITE: / PACK ROUND -2,
/ PACK ROUND -1,
/ PACK ROUND 1,
/ PACK ROUND 2.

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

EXEMPLO COM CORES:


REPORT DEMO_LIST_FORMAT_COLOR_1.
DATA I TYPE I VALUE 0.
DATA COL(15) TYPE C.
WHILE I < 8.
CASE I.
WHEN 0.
COL = COL_BACKGROUND.
WHEN 1.
COL = COL_HEADING.
WHEN 2.
COL = COL_NORMAL.
WHEN 3.
COL = COL_TOTAL.
WHEN 4.
COL = COL_KEY.
WHEN 5.
COL = COL_POSITIVE.
WHEN 6.
COL = COL_NEGATIVE.
WHEN 7.
COL = COL_GROUP.
ENDCASE.
FORMAT INTENSIFIED COLOR = I.
WRITE: /(4) I, AT 7
SY-VLINE,
COL,
SY-VLINE,
COL INTENSIFIED
SY-VLINE,
COL INVERSE.

Pgina 27 de 53

I = I + 1.
ENDWHILE.

REPORT AVANADO: OUTRAS FUNCIONALIDADES


Criando Transaes
Aps a criao do programa, precisamos associ-lo a uma transao. Assim o
usurio final passa a ter acesso pelo menu de transaes:
Passos para a criao de uma transao:
1. Acessar a transao SE93

2. Definir o nome de transao

Pgina 28 de 53

3. Determinar o tipo da transao e os parmetros de suporte.

Pgina 29 de 53

4. Determinar o programa e salvar

____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
RELATRIOS ALV

Pgina 30 de 53

Objetivo: desenvolver relatrios em ABAP com um bom visual e recursos avanados


no nada trivial.
Imagine desenvolver um relatrio com cores, cabealho, linha de totais, label de
colunas e separadores de colunas. Para piorar um pouco, que permita classificar por
qualquer campo, aumentar ou diminuir o tamanho de colunas, gostaria tambm de
poder trocar a posio das colunas, omitir ou exibir campos, totalizar, agrupar,
exportar para Excel, etc.
Totalmente possvel e igualmente invivel sem o uso de funes ALV.
O ALV padroniza e simplifica a exibio e operao de listas e relatrios no sistema
R/3. Fornece interfaces e formatos padronizados para todas as listas e relatrios.
Relatrios tradicionais
Um relatrio tradicional em ABAP no tem nenhum recurso ou formatao padro.
Tudo deve ser programado via cdigo.

Um programa para listar um relatrio como no exemplo acima, j exige muita


codificao. Veja que no tem nada de complexo.
Depois de pronto, uma simples alterao no posicionamento dos campos ou no
tamanho do papel, j demanda um novo processo de modificao. O usurio no
tem os recursos necessrios para resolver o problema.
Qualquer ao no relatrio apresentado, diferente das opes do menu Standard do
R/3 para esse tipo de listagem, dever ser programado. Uma tarefa nada simples,
visto que o programador dever fazer o processo de ida e volta, ou seja, o relatrio
deve ficar dinmico ao ponto do usurio voltar na situao inicial, aps alguma
modificao.
Listagens ALV so dinmicas por definio. O programador vai escolher quais ou

Pgina 31 de 53

qualrecursos ir disponibilizar em seu relatrio.

Muito similar a uma planilha do Microsoft Excel, cada coluna perfeitamente


ajustvel, podem ser trocadas entre si, as linhas da grade e cores so automticas.
Recursos simples que j eliminam um grande esforo de programao,
principalmente em alteraes.
O ALV Grid formado basicamente por :
Uma barra de ferramenta
Um ttulo
Uma lista de sada

Conceito de Variante de Exibio

Pgina 32 de 53

A variante de exibio utilizada para exibir o relatrio em vrios formatos diferente.


Cada usurio pode criar a sua prpria variante e utiliz-la para visualizar o relatrio.
Por exemplo : Um relatrio que tenha 20 campos exibidos na tela. Voc pode
eliminar os campos que no ir utilizar, acrescentar totalizadores, ordenao, mudar
os campos de posio, etc.
Tela Normal do relatrio

Eliminando Campos, Ordenando pela Data Documento e Criando Totalizadores.

Pgina 33 de 53

Tela de Seleo Relatrio

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.

*Parmetro da tela de seleo :


PARAMETERS : p_vari LIKE disvariant-variant.
*Funo :
CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET'
EXPORTING
i_save = A
CHANGING
cs_variant = def_variante
EXCEPTIONS
not_found = 2.
IF sy-subrc = 0.
p_vari = def_variante-variant.
ENDIF.
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________

EVENTO AT SELECTION-SCREEN ON VALUE-REQUEST ...

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

Neste tpico iremos mostrar as rotinas necessrias para formatao de um relatrio


em ALV. Formatao geral, de campos, botes e etc.
1. Definies de dados para o layout ALV
1.1. Definio de Tipos
*Grupos de tipo
TYPE-POOLS: slis.
TYPE-POOLS: kkblo.
1.2. Workareas
DATA: w_layout
w_print
w_event
w_line
DATA: colinfo

TYPE slis_layout_alv,
TYPE slis_print_alv
TYPE slis_alv_event,
TYPE slis_listheader.
TYPE kkblo_specialcol.

1.3. Tabela Interna


DATA: l_sort
TYPE slis_t_sortinfo_alv,
l_event
TYPE slis_t_event,
l_top_of_page
TYPE slis_t_listheader,
t_campos
TYPE slis_t_fieldcat_alv WITH HEADER LINE.
1.4. Tabela Interna para Impresso do Relatrio
DATA : BEGIN OF t_relat OCCURS 0,
Campo1
Campo2
Campo3
.................
.................
box(1)
TYPE c,
colinfo
TYPE kkblo_t_specialcol,
END OF t_relat.

" Campo Selecao Linha


Formatao de Colunas

____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
2. Rotinas para Formatao do Layout

Pgina 36 de 53

2.1. PERFORM f_evento_lista. " Eventos da Lista


O evento mais comum a ser definido o TOP_OF_PAGE para impresso do
cabealho na lista
Executar a funo para selecionar todos os eventos possveis de serem tratados
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
I_LIST_TYPE = 0
IMPORTING
ET_EVENTS = t_event.
* Ler a tabela para o evento TOP_OF_PAGE
READ TABLE t_event WITH KEY NAME = SLIS_EV_TOP_OF_PAGE
INTO w_event.
Se o evento foi encontrado ento cadastrar o nome do form do seu programa (que
trata o cabealho) no campo FORM
IF SY-SUBRC = 0.
MOVE 'F_CABECALHO' TO w_event-form.
APPEND w_event TO t_event.
ENDIF.
Criar o FORM F_CABECALHO
Criar o FORM f_cabealho e inserir o cdigo abaixo.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary
= l_top_of_page.

____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
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

keys as hotspot " K_KEYHOT


Mover as colunas chaves
Grupo de Botes
Ler tela de seleo
Settings by user for new group
Sem movimentar tela
Texto para o boto

Nome do campo que conter as cores das colunas


Sem chamada de tela
Extended interaction(SAPQuery)
Extended INTeraction(SAPQuery)
Configurao de layout para Tabstrip

2.4. PERFORM f_sort. " Ordenao/SubTotal


Neste FORM voc deve informar os campos pelos quais a lista deve ser ordenada
inicialmente, bem como se deve-se gerar sub-total ou total para esta quebra.
*Campo Centro
t_sort-spos
= '1'.
t_sort-fieldname = 'WERKS'.
t_sort-tabname = 'T_RELAT'.
t_sort-up
= 'X'.
t_sort-subtot = 'X'.
APPEND t_sort.
CLEAR t_sort.
Segue abaixo os campos que podem ser formatados para cada campo de
ordenao.
Campo
Descrio
Spos
Seqncia de Ordenao
fieldname
Nome do campo
Tabname
Nome da tabela a qual pertence o campo
Up
Ordenao Menor para Maior
Down
Ordenao Maior para Menor
Group
Subtot
Gerar Sub Total
Comp
Expa
Obligatory
2.5. PERFORM f_info_campos.

Pgina 41 de 53

Neste FORM voc ir definir o layout de cada coluna do relatrio.


Veja abaixo os campos que podem ser formatados :
Campo
Descrio
row_pos
Sada na linha (1,2,3,...)
col_pos
Posio da coluna
fieldname
Nome do campo
tabname
Nome da tabela interna
currency
Moeda
cfieldname
Campo com Unidade de Moeda
ctabname
Tabela referncia para Unidade Moeda
ifieldname
initial column
quantity
Unidade de Medida
qfieldname
Campo com Unidade Medida
qtabname
Tabela com Unidade Medida
round
Arredondar Campo
exponent
Expoente para floats
key
Campo como Chave
icon
Campo como cone
symbol
Campo como Smbolo
checkbox
Campo como Checkbox
just
Alinhamento R (Direita) L (Esquerda) C (Centralizado)
lzero
leading zero
no_sign
Sem sinal
no_zero
No imprimir campos zerados
no_convext
edit_mask
Mscara de Edio
emphasize
Campo em destaque
fix_column
Fixar Coluna
do_sum
Totalizar Coluna
no_out
No exibir o campo
tech
outputlen
Tamanho do campo para sada dos dados
Offset
seltext_l
Descrio Longa do Campo
seltext_m
Descrio Mdia do Campo
seltext_s
Descrio Curta do Campo
Ddictxt
Indicao de Qual descrio utilizar - (S)hort (M)iddle
(L)ong
rollname
datatype
Tipo do Campo
inttype
Tipo do Campo
intlen
Tamanho do Campo
lowercase
Letra Minscula
ref_fieldname
Campo referncia
ref_tabname
Tabela referncia
roundfieldname
Nome campo para Arredondamento

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

2.6. PERFORM f_print.

Neste FORM voc ir definir dados de impresso.


Campo
Descrio
prnt_info
Informaes de Impresso
print
prnt_title
no_coverpage
no_new_page
reserve_lines
Linhas reservadas para o final da pgina
no_print_listinfos
No imprimir pgina com nmero
selecionados
no_change_print_params
No alterar tamanho de linha

de

registros

____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________

3. Exibir Relatrio

Pgina 43 de 53

Neste FORM voc ir exibir o relatrio.


CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM
= v_repid
I_CALLBACK_PF_STATUS_SET = 'F_SET_STATUS'
I_CALLBACK_USER_COMMAND = 'F_USER_COMMAND'
IS_LAYOUT
= w_layout
IS_LAYOUT
= w_print
IT_FIELDCAT
= t_campos[]
IT_SORT
= t_sort[]
I_DEFAULT
I_SAVE
IS_VARIANT
IT_EVENTS
TABLES
t_outtab
EXCEPTIONS
PROGRAM_ERROR
OTHERS

= '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

Programas Standard - Modelo


BALVST02_GRID Programa teste visor de listas ABAP: lista simples modelo vo
BALVST03_GRID - Programa teste visor de listas ABAP: lista simples modelo vo
BALVHT01 - Programa de teste ALV: lista seqencial hierrquica modelo de vo
A Maioria dos programas DEMO comeam com BCALV*
PERFORMANCE

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

Boas prticas de Codificao

Use o comando FREE para liberar espao em tabelas internas; sempre utilizar
os comandos CLEAR/REFRESH aps o fim de um processamento.

Evite comparaes em SELECT com campos numricos X campos


alfanumricos; aumenta o tempo para converso.

Testar SY-SUBRC aps cada acesso ao banco de dados;

O comando MOVE-CORRESPONDING bom para tabelas pequenas.


interessante que a tabela interna contenha os campos na seqncia em que sero
movimentados;

Ao utilizar o comando CASE, codificar sempre a clusula WHEN OTHERS;

Sempre identifique se um SORT ASCENDING ou DESCENDING e


especifique a clusula BY <fields>. Caso contrrio, todos os campos sero
classificados.

Ao fazer leitura em tabela interna, utilizar a opo BINARY SEARCH, pois a


busca fica mais rpida; no esquecer de ordenar a tabela antes da procura.

____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________

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

Clusula For All Entries:


Esta clusula deve ser utilizada sempre que a seleo de uma tabela depende
diretamente dos dados que esto em outra. Por exemplo, tendo uma tabela interna
com todas as ordens de venda (i_vbak) podemos utilizar este comando para
selecionar todos os itens destas ordens de venda (vbap) com apenas um comando.
Exemplo:
Em vez de utilizar:
LOOP AT TI_VBAK.
SELECT VBELN POSNR MATNR APPENDING TABLE TI_VBAP
FROM VBAP WHERE VBELN = TI_VBAK-VBELN.
ENDLOOP.
Pode-se utilizar o comando:
SELECT VBELN POSNR MATNR INTO TABLE TI_VBALP
FROM VBAP
FOR ALL ENTRIES IN TI_VBAK
WHERE VBELN = TI_VBAK-VBELN.
Alm de permitir a seleo em apenas um comando, temos ainda um ganho de
performance. No primeiro exemplo, para cada select executado dentro do Loop, o
banco de dados realiza um Fetch/Open/Close. O tempo do ganho , basicamente o
temos de todos os Close somados. Para analisar estes resultados, utilize a
transao ST05 (SQL Trace).
Cuidados especiais com o For All Entries:
Registros repetidos: todos os registros repetidos na tabela de resultados so
eliminados. Portanto aconselhvel a utilizao de campos chaves na tabela final
para evitar a duplicidade. Por exemplo, se a partir de uma tabela de ordens de
venda, deseja-se selecionar todos os itens com suas quantidades, na tabela de itens
devemos utilizar os campos vbeln e posnr, pois somente assim ordens com o mesmo
material e quantidade sero apresentadas.
Tabelas em branco: caso a tabela do for al entries esteja vazia, todos os registros
da tabela selecionada sero lidos. Portanto, deve-se tomar cuidado com o valor do
sy-sobrc em selects sucessivos.
Dados invlidos: se a tabela do for al entries possuir algum dado invlido, o select
ser abortado.

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:

Completo: no primeiro acesso tabela, todo o seu contedo armazenado no


buffer;

Genrico: especificado um nmero n de campos chaves igual aos n


campos chaves do acesso so armazenados no buffer;

Parcial: somente os registros lidos so armazenados no buffer.


Para analisar se o tipo de bufferizao est correto, pode-se utilizar a transao
ST02.
Quando bufferizar?

Tabelas pequenas;

Tabelas acessadas muito mais para leitura que para escrita;

Tabelas de controle (parametrizao);

Tabelas Master Data pequenas.


Processos que no usam o Buffer:
Podemos destacar alguns comandos que ignoram a existncia do buffer:

Select...bypasssing buffer;

Select...from <database views>

Select...distinct;

Select...count,som,avg,min,Max;

Select...order by (campos que no so chaves);

Select...for update;

Clusula where que contm o comando IS NULL;

SQL nativo (EXEC SQL...ENDEXEC).


Outros mtodos
O primeiro critrio para melhorar o acesso ao banco de dados definir os critrios
nas telas de seleo que no fazem acesso a tabelas sem utilizao de ndices ou
ento uma busca de dados na tabela inteira.
O simples estudo dos campos que devem ser colocados na tela para seleo dos
valores das tabelas ajudaria o processo de busca. A colocao de campos que no
constam em nenhum ndice, por exemplo, um convite a perda de performance em
acessos a tabelas grandes.
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________

Pgina 52 de 53

____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________

Pgina 53 de 53