Sie sind auf Seite 1von 246

ABAP Training

ABAP Training

Contents
1. Curso Bsico................................................................................................................... 4
1.1. Conceito breve do SAP............................................................................................. 4
1.2. Instncia X Client..................................................................................................... 5
1.3. Objetos Client Dependent e Client Independent................................................6
1.4. Transaes............................................................................................................... 7
1.5. Exemplos................................................................................................................ 12
1.6. Exerccios............................................................................................................... 28
2. Data Dictionary............................................................................................................ 39
2.1. Conceitos de Bancos de Dados Relacionais...........................................................39
2.2. R/3 Data Dictionary................................................................................................ 41
2.3. Exemplos................................................................................................................ 50
2.4. Exerccios............................................................................................................... 57
3. Transporte.................................................................................................................... 60
3.1. Workbench Organizer............................................................................................. 62
3.2. Exerccios............................................................................................................... 65
4. Report........................................................................................................................... 66
4.1. Editor ABAP (SE38)................................................................................................. 67
4.2. Descrio do Template........................................................................................... 80
4.3. Comando Select.................................................................................................. 82
4.4. Consideraes sobre os diferentes tipos de select:................................................86
4.5. Criando Transaes:............................................................................................... 89
4.6. Exerccios............................................................................................................... 91
5. Performance............................................................................................................... 126
5.1. Objetivo................................................................................................................ 126
5.2. Arquitetura Client-Server..................................................................................... 126
5.3. Grandes viles no que se refere performance...................................................126
5.4. Comunicao entre o Application Server e Database Server...............................127
5.5. Processamento de grandes tabelas......................................................................135
5.6. ndices secundrios:............................................................................................. 136
5.7. Comandos Select................................................................................................. 140
5.8. Dicas para otimizao do cdigo..........................................................................144
5.9. Ferramentas para auxliar os desenvolvedores.....................................................145
5.10. Interfaces Batch ou Converses:.......................................................................146
5.11. Estudo de Caso Cliente XYZ...........................................................................148
5.12. Estudo de Caso - Cliente ABC............................................................................153
6. BDC Session............................................................................................................... 190
6.1. Passos para criao de uma BDC Session............................................................190
6.3. Gerando a tabela BDC.......................................................................................... 191
6.4. Enviando uma tabela BDC para o sistema...........................................................194
6.5. Processando dados com CALL TRANSACTION.......................................................195
6.7. Exemplo............................................................................................................... 197
6.8. Exerccios............................................................................................................. 203
7. OnLine........................................................................................................................ 215
7.1. Introduo:........................................................................................................... 215
7.2. Estrutura do Programa OnLine............................................................................. 215
ABAP Training
7.3. Programa Principal............................................................................................... 216
7.4. Screen.................................................................................................................. 216
7.5. GUI Status e GUI Title........................................................................................... 216
7.6. Evento PBO.......................................................................................................... 217
7.7. Evento PAI............................................................................................................ 217
7.8. Criao de menu.................................................................................................. 219
7.9. Definindo ttulo para a tela...................................................................................222
7.10. Associar menus e ttulos s telas......................................................................222
7.11. Criao de uma transao para o programa.....................................................222
7.12. Gerao do programa....................................................................................... 223
7.13. Definio do fluxo do programa (PAI e PBO).....................................................224
7.14. Criao de Tabstrips.......................................................................................... 226
7.15. Criando TABLE CONTROL.................................................................................. 235
ABAP Training

1. Curso Bsico

1.1. Conceito breve do SAP

O SAP um sistema que trabalha com um nmero muito grande de tabelas


interligadas, que armazenam e manipulam os valores de controle dos processos. Essas
tabelas so responsveis pelo armazenamento dos valores do sistema e so divididas em
grupos que se interligam em um todo. Assim, existem tabelas responsveis pelas
informaes de FI, outras pelas informaes de SD, outras ainda por MM, mas todas elas
apresentam campos chaves que permitem, pelos mais diferentes e complicados caminhos,
a interligao e consistncia de todo o sistema. Embora a ferramenta ABAP/4 dentro do
SAP seja muito poderosa e praticamente capaz de permitir qualquer customizao do
sistema, muito importante manter os conceitos originais sempre em mente, e nunca
tentar forar alguma coisa que deveria ter um comportamento natural. Por exemplo,
nunca tente alterar um valor de uma tabela do SAP (embora perfeitamente possvel, com
o comando UPDATE), sem um minucioso estudo de suas implicaes anteriormente. Isso
pode comprometer a integridade dos dados do sistema, se no forem atualizados todos os
valores de todas as tabelas relacionadas a essa alterao.
ABAP Training

1.2. Instncia X Client

Tambm muito importante o conceito do funcionamento do ambiente do sistema


durante a evoluo de um projeto. Inicialmente devemos entender os conceitos de client e
instncia:

Client definido como sendo uma unidade independente do R/3, em termos comerciais,
organizacionais e tcnicos. Isso significa que possuem sua prpria configurao, dados de
aplicao e dados cadastrais (master data).

Instncia definida como um ambiente do R/3 que agrupa um ou mais clients, onde se
executa um determinado trabalho.

Uma instncia de trabalho, geralmente possui mais de um client, onde so


trabalhados simultaneamente diferentes frentes de trabalho do projeto. A inteno dessa
diviso que se possa trabalhar somando valores, sem que haja conflitos de interesse. Por
exemplo, durante um projeto, o client para desenvolvimento das customizaes de ABAP
deve ser diferente dos outros, pois trabalha muito com testes e alteraes constantes, o
que inviabiliza outros tipos de servios.
Se essa diviso muitas vezes ajuda, algumas vezes atrapalha. Geralmente as
massas de dados so diferentes nos clients, e o comportamento principalmente nos testes
dos produtos customizados pode ser diferente. O recomendado pela prpria SAP que
exista um client s para testes, com massa de dados completa que permita recarga
sempre que necessrio, o que permitiria que as condies de teste pudessem ser
repetidas. No dia a dia de um projeto isso muito difcil, pois a manuteno desses clients
pelo time de basis geralmente no muito bem vista.
As instncias variam tambm ao longo de um projeto. A medida que o sistema vai
sendo refinado, geralmente se inicia uma nova instncia livre dos vcios e restos de testes
da anterior. Pelo menos 3 instncias sempre existem durante o perodo de um projeto. A
instncia de desenvolvimento, a de pr-produo e finalmente a de produo. Cada vez
que o sistema migrado de uma instncia para a outra, somente deve ser aproveitado o
ABAP Training
que est comprovadamente funcionando na instncia anterior, de modo a diminuir os
erros a cada migrao.
ABAP Training

1.3. Objetos Client Dependent e Client Independent

Todos os objetos criados em um sistema SAP, podem ser divididos em dois grupos,
tratados diferentemente ao longo de um projeto. Os objetos chamados Client
Independents so aqueles que uma vez criados podem ser utilizados por todos os clients
de uma mesma instncia, sem que se necessite de nenhuma articulao adicional. O
simples fato de se encontrar ativo no repositrio do sistema habilitado para a instncia, o
permite ser utilizado por todos os clients dessa instncia, de maneira simultnea. O maior
exemplo de objetos independentes do client so os programas de ABAP/4 normais
customizados. Por exemplo, um report criado em um client de desenvolvimento, pode ser
executado de um outro client de teste, existente na mesma instncia, uma vez que tenha
sido gerado e ativado.
Os objetos dependentes do client, ao contrrio, uma vez criado, por exemplo, no
client de desenvolvimento no pode ser executado de nenhum outro, a menos que seja
transportado ou copiado para o seu destino. Esse um exemplo tpico dos formulrios em
SAPscript.
Dentro da classe dos objetos dependentes do client, existe um subgrupo que exige
uma ateno maior ainda. o caso dos logotipos utilizados dentro de um SAPscript. Esses
objetos, alm de no serem compartilhados pelos clients, tambm no geram request ao
serem criados, o que impossibilita serem transportados diretamente, precisando
associarmos, primeiro, esses elementos a uma Change Request atravs de um programa.
Nesse caso, os logotipos devem ser gerados em cada um dos clientes em que se deseje
utiliz-lo, atravs da execuo de um programa do SAP. Esse tipo de problema, ao longo
de um projeto, exige uma ateno especial, para evitar problemas futuros. Por exemplo, o
desenhista tcnico deve tomar o cuidado de anexar o arquivo .TIF do logotipo na
especificao do MDM, para futura repetio do processo de gerao do logotipo dentro do
sistema. Caso esse cuidado no seja tomado, futuramente pode-se obter um logotipo de
tamanho diferente, gerando re-work e perda de tempo.
ABAP Training

1.4. Transaes

Transao um cdigo alfanumrico de 20 caracteres, utilizado para iniciar um


processo dentro do sistema SAP. Todo e qualquer processo ou parte dele deve ser
executado dentro do sistema atravs de uma transao. Na customizao de ABAP/4,
sempre que um GAP do sistema coberto, isso gera pelo menos uma transao, de modo
que o usurio possa executar esse produto customizado de dentro do sistema.
Toda operao realizada atravs do menu do sistema, tambm corresponde a uma
transao. Um mtodo para conhecermos o cdigo de uma transao cujo caminho pelo
menu sabido, entrarmos na mesma, e na tela inicial desta transao, utilizarmos o
menu Sistema Status, que informa o programa tela e transao executados.
No desenvolvimento de customizaes ABAP/4, as principais transaes utilizadas,
so:

SE38 abre o editor ABAP/4


SE16 permite a visualizao do contedo de tabelas do SAP
SE11 permite a visualizao da arquitetura de uma tabela/estrutura do SAP
SE43 criao de menus
SE93 criao de transaes customizadas
SE71 criao e manuteno de formulrios SAPscripts
CMOD criao de projetos Exits (Field Exits, User Exits,...)
ABAP Training
Editor ABAP/4

O editor de programao ABAP/4 do SAP pode ser encontrado atravs do caminho:

Menu SAP Ferramentas ABAP Workbench Desenvolvimento Editor


Abap

ou pela transao SE38.

Uma tela para a entrada do nome do programa aberta, como exemplificada


abaixo. Para criar um programa novo, utilize um nome ainda no existente no repositrio,
ABAP Training
e apertar o boto Criar. Para editar ou exibir um programa j existente, entrar com o
nome do programa e apertar os botes respectivos.

Existe um padro de nomenclatura que deve ser seguido, no s para nome de


programas, mas para todos os desenvolvimentos no SAP R/3. Esses padres podem variar
de projeto a projeto e principalmente com a verso do SAP com a qual se est
trabalhando. Em todos os casos os nomes dos desenvolvimentos comeam sempre com Z
ou Y.
ABAP Training
A aparncia do editor no difere muito de um editor de texto bem simples, onde se
possvel escrever linhas de comando e lgica.
ABAP Training
Um dos recursos permitidos para que se utilize um outro editor como o NotePad do
Windows, o recurso de Download e Upload. Atravs do menu Utilitrios Outros
Utilitrios Upload/Download, o sistema permite que cdigos escritos em outros
editores possam ser carregados no editor ABAP/4 e vice-versa.

Esse recurso nos permite salvar os cdigos ainda inativos ou incompletos.


extremamente til para mantermos um controle prprio das verses quando se est
codificando.
ABAP Training

1.5. Exemplos

EXEMPLO 1

REPORT ZEXP0001.

WRITE: '111111'.
WRITE: '222222',
'333333'.
WRITE: /'111111'.
WRITE: 15 '333333'.
WRITE: / TEXT-001.
ULINE.
ULINE 8(6).
SKIP 3.
WRITE : 8 SY-LANGU.
WRITE : / SY-DATUM UNDER SY-LANGU.

Existem alguns tipos de variveis chamadas de variveis do sistema. Elas possuem


informaes e dados do processamento, como o idioma de acesso (sy-langu), a data (sy-
datum), a hora (sy-uzeit), etc.. Essas informaes esto contidas na estrutura SYST
(Campos de sistema ABAP, que pode ser abreviada para SY) e podem ser acessadas
conforme o exemplo acima, o nome da estrutura mais o campo que se deseja.
EXEMPLO 2
ABAP Training
REPORT ZEXC0002 NO STANDARD PAGE HEADING.

WRITE 'PAG 1'.

NEW-PAGE.

WRITE 'PAG 2'.

TOP-OF-PAGE.

WRITE : 'EXEMPLO 2 - CURSO ABAP/4',


80 'Page',
SY-PAGNO.
ULINE.

EXEMPLO 3

REPORT ZEXP0003.
ABAP Training
WRITE : 'NORMAL'.

FORMAT INTENSIFIED OFF.

WRITE : 'NEGRITO '.

FORMAT COLOR 1.

WRITE : 'FUNDO AZUL'.

FORMAT COLOR OFF.

FORMAT INTENSIFIED ON.

WRITE : 'NORMAL'.

EXEMPLO 4

REPORT ZEXP0004.

DATA: NOME(20) TYPE C,


RG(10) TYPE I,
ABAP Training
DATA LIKE BKPF-BUDAT,
HORA(8) VALUE '14:05:45'.

MOVE 'Brazil Delivery Centre' TO NOME.


RG = 42159818.
DATA = '19973005'.
SKIP 2.
WRITE: 'Nome:',
NOME,
/ 'RG:',
RG UNDER NOME,
/ 'Data:',
DATA,
/ 'Hora:',
HORA.

EXEMPLO 5

REPORT ZEXP0005.

PARAMETER: P_NOME1(15) TYPE C,


P_NOME2(15) TYPE C DEFAULT 'Abap Factory',
P_BOTAO1 RADIOBUTTON GROUP G1,
P_BOTAO2 RADIOBUTTON GROUP G1.
ABAP Training

WRITE P_NOME1.

IF P_NOME2 NE 'ABAP FACTORY'.


WRITE P_NOME2.
ENDIF.

IF P_BOTAO1 = 'X'.
WRITE / 'BOTO 1 ACIONADO'.
ELSE.
WRITE / 'BOTO 2 ACIONADO'.
ENDIF.
ABAP Training

EXEMPLO 6
ABAP Training

REPORT ZEXP0006 message-id za.

PARAMETER: P_PAIS LIKE T005S-LAND1.

TABLES T005H.

SELECT * FROM T005H WHERE LAND1 = P_PAIS ORDER BY CITYC.

WRITE: / T005H-Bezei,
T005H-LAND1.

ENDSELECT.

IF SY-SUBRC NE 0.
MESSAGE I000.
ENDIF.
ABAP Training
ABAP Training

EXEMPLO 7
ABAP Training

REPORT ZEXP0007.

TABLES: T005H..

DATA V_VAR1 VALUE '1'.

DATA: BEGIN OF T_T005H OCCURS 0,


LAND1 LIKE T005H-LAND1,
BEZEI LIKE T005H-BEZEI.
DATA: END OF T_T005H.

SELECT * FROM T005H WHERE LAND1 IN ('US', 'DE') ORDER BY LAND1.

T_T005H-LAND1 = T005H-LAND1.
T_T005H-BEZEI = T005H-BEZEI.
APPEND T_T005H.

ENDSELECT.

IF SY-SUBRC NE 0.
WRITE TEXT-001.
ENDIF.

LOOP AT T_T005H.

ON CHANGE OF T_T005H-LAND1.
IF V_VAR1 = 0.
NEW-PAGE.
ENDIF.
FORMAT COLOR OFF.
WRITE 'COUNTRY CITY'.
CLEAR V_VAR1.
ENDON.

IF T_T005H-LAND1 = 'DE'.
FORMAT COLOR COL_TOTAL.
ELSE.
FORMAT COLOR COL_NORMAL.
ENDIF.

WRITE : / T_T005H-LAND1,
21 T_T005H-BEZEI.

ENDLOOP.
ABAP Training

EXEMPLO 8
ABAP Training
REPORT ZEXP0008 MESSAGE-ID ZA. * filetype =''
* mode =''
TABLES: BKPF. * wk1_n_format =''
* WK1_N_SIZE =''
PARAMETER: P_BELNR LIKE BKPF-BELNR * WK1_T_FORMAT = ' '
DEFAULT '5000000041',
P_ANO LIKE BKPF-
GJAHR DEFAULT ' 2001'.

DATA: ARQ LIKE RLGRAP-FILENAME VALUE * WK1_T_SIZE ='


'C:\TEMP\curso.txt'. '
* col_select
DATA: BEGIN OF T_ZCURSO OCCURS 0, =''
ZDATA LIKE BKPF-BUDAT, * col_selectmask
SPACE1 TYPE C VALUE ' ', =''
ZBELNR LIKE BKPF-BELNR, * importing
SPACE2 TYPE C VALUE ' ', * filelength
ZGJAHR LIKE BKPF-GJAHR. =
DATA: END OF T_ZCURSO. TABLES
DATA_TAB =
SELECT * FROM BKPF WHERE BELNR = T_ZCURSO
P_BELNR * fieldnames
AND GJAHR =
= P_ANO. EXCEPTIONS
FILE_OPEN_ERROR =1
T_ZCURSO-ZDATA = BKPF-BUDAT. FILE_WRITE_ERROR =2
T_ZCURSO-ZBELNR = BKPF-BELNR. INVALID_FILESIZE =3
T_ZCURSO-ZGJAHR = BKPF-GJAHR. INVALID_TABLE_WIDTH =4
APPEND T_ZCURSO. INVALID_TYPE =5
NO_BATCH =6
ENDSELECT. UNKNOWN_ERROR =7
OTHERS =
IF SY-SUBRC = 0. 8.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING MESSAGE E007.
* bin_filesize ='' ELSE.
* codepage ='' MESSAGE E008.
FILENAME = ARQ ENDIF.
ABAP Training
ABAP Training

EXEMPLO 9
ABAP Training

REPORT ZEXP0009 MESSAGE-ID ZA. DATA_TAB =


T_ZCURSO
TABLES: ZCURSO. EXCEPTIONS
CONVERSION_ERROR =1
DATA: ARQ LIKE RLGRAP-FILENAME VALUE FILE_OPEN_ERROR =2
'C:\TEMP\CURSO.TXT', FILE_READ_ERROR =3
V_CONT TYPE I. INVALID_TABLE_WIDTH =4
INVALID_TYPE =5
DATA: BEGIN OF T_ZCURSO OCCURS 0, NO_BATCH =6
ZDATA LIKE ZCURSO-ZDATA, UNKNOWN_ERROR =7
SPACE1 TYPE C VALUE ' ', OTHERS = 8.
ZBELNR LIKE ZCURSO-ZNUMERO,
SPACE2 TYPE C VALUE ' ', CLEAR V_CONT.
ZGJAHR LIKE ZCURSO-ZANO.
DATA: END OF T_ZCURSO. LOOP AT T_ZCURSO.

CALL FUNCTION 'WS_UPLOAD' ZCURSO-ZDATA = T_ZCURSO-ZDATA.


ZCURSO-ZNUMERO = T_ZCURSO-ZBELNR.
EXPORTING ZCURSO-ZANO = T_ZCURSO-ZGJAHR.
* CODEPAGE ='' INSERT ZCURSO.
FILENAME = ARQ
* FILETYPE ='' IF SY-SUBRC = 0.
* HEADLEN ='' V_CONT = V_CONT + 1.
* LINE_EXIT ='' ENDIF.
* TRUNCLEN =''
* USER_FORM ='' ENDLOOP.
* USER_PROG =''
* IMPORTING WRITE: 'FORAM INSERIDOS ', V_CONT, 'NA
* FILELENGTH = TABELA ZCURSO'
TABLES
.
ABAP Training
ABAP Training
1.6. Exerccios

EXERCCIO 1

Desenvolver um programa ZEXC##01 que resulte a listagem seguinte onde :

a) ## - Nmero do aluno

Variveis de sistema utilizadas : SY-DATUM e SY-UZEIT

Observaes:

Aps indicar a Development Class: SALVAR o objeto, porm NO salvar como Local Object,
quando o SAP perguntar por um Request Number;
Pressionar CREATE REQUEST e digitar a seguinte descrio:
Curso ABAP Grupo # - Exerccios do mdulo Bsico
Anotar o nmero do request para ser utilizado durante todo este mdulo do curso

EXERCCIO 2
ABAP Training

Desenvolver um programa ZEXC##02 que resulte o cabealho


seguinte onde :

## - Nmero do aluno

Varivel de sistema utilizada :


SY-UNAME
SY-DATUM

EXERCCIO 3
ABAP Training
Desenvolver um programa ZEXC##03 que possua as seguintes caractersticas : ## -
Nmero do aluno

Simulao de uma calculadora com 4 operaes ( +, -, /, * ) e dois campos para entrada


de dados
Exigncia quanto entrada de todos os dados
Lay-out ( tanto de entrada como de sada ) de acordo com os apresentados a seguir

EXERCCIO 4
ABAP Training

Desenvolver um programa ZEXC##04 que possua as seguintes caractersticas :

## - Nmero do aluno

b) Que atravs das tabelas SPFLI e SFLIGHT resulte um relatrio dos vos existentes para
um determinado percurso, sendo que a exposio da aeronave utilizada e do preo da
passagem ocorram apenas quando for uma operao de reserva

c) Lay-out ( tanto de entrada como de sada ) de acordo com os apresentados a seguir

d)Campos utilizados :
SPFLI-CARRID
SPFLI-CITYFROM
SPFLI-CITYTO
SPFLI-FLTIME
SPFLI-ARRTIME
SPFLI-DEPTIME
SFLIGHT-FLDATE
SFLIGHT-PLANETYPE
SFLIGHT-PRICE
ABAP Training
ABAP Training

EXERCCIO 5
ABAP Training
Desenvolver um programa ZEXC##05 que a partir de um arquivo texto contendo a
declarao de uma das aeronaves citadas a seguir, seja capaz de criar um outro arquivo
com a declarao da aeronave bem como o nome da companhia area. O programa deve
conter as seguintes caractersticas:
a) ## - Nmero do aluno
Exibio de mensagem tanto no caso de sucesso na criao do arquivo final como no caso
da ocorrencia de algum erro.
Lay-out ( tanto de entrada como de sada ) de acordo com os apresentados a seguir
Campos utilizados : SFLIGHT-CARRID SFLIGHT-PLANETYPE

RESOLUO 1 REPORT ZEXC0001.

SKIP 5.
ABAP Training
REPORT ZEXC0002 NO STANDARD PAGE
ULINE. HEADING.

ULINE 30(29). SKIP 4.

WRITE: /37 TEXT-001. ULINE 4(88).

SKIP. WRITE: /4 '|',


5 TEXT-001,
WRITE: 30'DIA', 68 '|',
49 SY-DATUM, 77 SY-DATUM,
/'HORA' UNDER 'DIA', 91 '|'.
SY-UZEIT UNDER SY-DATUM.
FORMAT INTENSIFIED OFF.
SKIP.
WRITE: 70 'Data: ',
ULINE 30(29). /1 ''.

ULINE. ULINE 4(88).

WRITE: /5 'Nome:',
70 'Usurio:'.

FORMAT INTENSIFIED ON.

WRITE: 4 '|',
11 'Solution Center',
68 '|',
79 SY-UNAME,
91 '|',
RESOLUO 2 /1 ''.

ULINE 4(88).

P_SUB RADIOBUTTON GROUP


RESOLUO 3 G1,
P_MULT RADIOBUTTON GROUP G1,
REPORT ZEXC0003 MESSAGE-ID YA. P_DIV RADIOBUTTON GROUP
G1.
PARAMETER : P_FATOR1(5) TYPE I,
P_FATOR2(5) TYPE I, DATA : RESULT(6) TYPE I,
P_ADD RADIOBUTTON GROUP OPERACAO(15) TYPE C.
G1,
ABAP Training
IF P_FATOR1 = '' OR P_FATOR2 = ''. ULINE.
MESSAGE I005.
ELSE. FORMAT COLOR COL_NORMAL.

IF P_ADD = 'X'. WRITE : 'OPERADOR 1 =',


RESULT = P_FATOR1 + P_FATOR2. P_FATOR1,
OPERACAO = 'SOMA'. 132 ' ',
ENDIF. / 'OPERADOR 2 =',
P_FATOR2,
IF P_SUB = 'X'. 40 'OPERAO =',
RESULT = P_FATOR1 - P_FATOR2. OPERACAO,
OPERACAO = 'SUBTRAO'. 132 ' '.
ENDIF.
ULINE.
IF P_MULT = 'X'.
RESULT = P_FATOR1 * P_FATOR2. FORMAT COLOR COL_TOTAL.
OPERACAO = 'MULTIPLICAO'.
ENDIF. WRITE : / 'RESULTADO =',
IF P_DIV = 'X'. RESULT,
RESULT = P_FATOR1 / P_FATOR2. 132 ' '.
OPERACAO = 'DIVISO'.
ENDIF. ULINE.

SKIP 3. ENDIF.

RESOLUO 4
REPORT ZEXC0004 MESSAGE-ID YA DATA : V_CONTADOR TYPE I,
NO STANDARD PAGE HEADING. V_VAR1 TYPE I.

PARAMETER: P_ORIGEM LIKE SPFLI-CITYFROM, DATA: BEGIN OF T_VOO OCCURS 0,


P_DESTIN LIKE SPFLI-CITYTO, CARRID LIKE SPFLI-CARRID,
P_RESERV RADIOBUTTON GROUP G1, CITYFROM LIKE SPFLI-CITYFROM,
P_DEST RADIOBUTTON GROUP G1. CITYTO LIKE SPFLI-CITYTO,
FLTIME LIKE SPFLI-FLTIME,
TABLES: SPFLI, SFLIGHT. ARRTIME LIKE SPFLI-ARRTIME,
DEPTIME LIKE SPFLI-DEPTIME,
ABAP Training
FLDATE LIKE SFLIGHT-FLDATE, 30 T_VOO-CITYFROM,
PLANETYPE LIKE SFLIGHT-PLANETYPE, T_VOO-CITYTO,
PRICE LIKE SFLIGHT-PRICE. 95 '|'.
DATA: END OF T_VOO.
CLEAR V_VAR1.
SELECT * FROM SPFLI
WHERE CITYFROM = P_ORIGEM ULINE.
AND CITYTO = P_DESTIN. FORMAT COLOR COL_HEADING.

SELECT * FROM SFLIGHT WRITE: / '|',


WHERE CARRID = SPFLI-CARRID 2 'OPERADORA',
AND CONNID = SPFLI-CONNID.
13 'DATA',
V_CONTADOR = V_CONTADOR + 1. 26 'TEMPO DE VOO',
T_VOO-CARRID = SPFLI-CARRID. 41 'SADA',
T_VOO-CITYFROM = SPFLI-CITYFROM. 51 'CHEGADA'.
T_VOO-CITYTO = SPFLI-CITYTO.
T_VOO-DISTANCE = SPFLI-DISTANCE. IF P_RESERV = 'X'.
T_VOO-FLTIME = SPFLI-FLTIME. WRITE: 61 'AERONAVE',
T_VOO-ARRTIME = SPFLI-ARRTIME. 89 'PREO'.
T_VOO-DEPTIME = SPFLI-DEPTIME.
ENDIF.
T_VOO-DISTID = SPFLI-DISTID.
T_VOO-FLDATE = SFLIGHT-FLDATE.
T_VOO-PLANETYPE = SFLIGHT-PLANETYPE. WRITE: 95 '|'.
T_VOO-PRICE = SFLIGHT-PRICE.
APPEND T_VOO. ULINE.

ENDSELECT. ENDIF.
ENDSELECT.
FORMAT COLOR COL_NORMAL.
IF SY-SUBRC NE 0.
MESSAGE E006.
WRITE: / '|',
ENDIF. 2 T_VOO-CARRID,
SKIP. 13 T_VOO-FLDATE,
26 T_VOO-FLTIME,
WRITE: TEXT-001, 41 T_VOO-DEPTIME,
V_CONTADOR, 51 T_VOO-ARRTIME.
95 ''.
IF P_RESERV = 'X'.
SKIP 2.
WRITE: 61 T_VOO-PLANETYPE,
V_VAR1 = 1. 75 T_VOO-PRICE.
ENDIF.
LOOP AT T_VOO.
WRITE: 95 '|'.
IF V_VAR1 = 1.
ULINE. ENDLOOP.
FORMAT COLOR COL_GROUP.
WRITE: / '|',
ULINE

RESOLUO 5
REPORT ZEXC0005 MESSAGE-ID YA.
BEGIN OF T_ZCURSO2 OCCURS 0,
TABLES: SFLIGHT. ZAERONAV LIKE SFLIGHT-PLANETYPE,
ESPACE1 TYPE C VALUE ' ',
PARAMETER: P_ARQ LIKE RLGRAP-FILENAME ZCOMPANY LIKE SFLIGHT-CARRID.
DEFAULT 'C:\TEMP\NAVE.TXT', END OF T_ZCURSO2.
P_ARQ2 LIKE RLGRAP-FILENAME
DEFAULT 'C:\TEMP\DADOS.TXT'. CALL FUNCTION 'WS_UPLOAD'
EXPORTING
DATA: FILENAME = P_ARQ
BEGIN OF T_ZCURSO OCCURS 0, TABLES
ZAERONAV LIKE SFLIGHT-PLANETYPE, DATA_TAB = T_ZCURSO
END OF T_ZCURSO, EXCEPTIONS
ABAP Training
CONVERSION_ERROR =1 FILENAME =
FILE_OPEN_ERROR =2 P_ARQ2
FILE_READ_ERROR =3 TABLES
INVALID_TABLE_WIDTH =4 DATA_TAB =
INVALID_TYPE =5 T_ZCURSO2
NO_BATCH =6 EXCEPTIONS
UNKNOWN_ERROR =7 FILE_OPEN_ERROR =1
OTHERS = 8. FILE_WRITE_ERROR =2
INVALID_FILESIZE =3
SELECT * FROM SFLIGHT INVALID_TABLE_WIDTH =4
WHERE PLANETYPE = T_ZCURSO-ZAERONAV. INVALID_TYPE =5
NO_BATCH =
T_ZCURSO2-ZAERONAV = SFLIGHT-PLANETYPE. 6
T_ZCURSO2-ZCOMPANY = SFLIGHT-CARRID. UNKNOWN_ERROR =7
APPEND T_ZCURSO2. OTHERS
= 8.
ENDSELECT.
MESSAGE I007.
IF SY-SUBRC = 0. ELSE.
MESSAGE E008.
CALL FUNCTION 'WS_DOWNLOAD' ENDIF.
EXPORTING
ABAP Training

Data Dictionary

1.7. Conceitos de Bancos de Dados Relacionais

Modelo Entidade-Relacionamento

Modelo desenvolvido para facilitar o projeto de banco de dados, permitindo a


especificao de um esquema que represente a estrutura lgica global de um banco
de dados.

Entidade: um objeto que existe e distinguvel de outros objetos, ou seja,


identifica o agrupamento de objetos do mesmo tipo. Exemplos: Clientes, Bancos,
Agncias, Contas-Corrente.

Atributos: So os qualificadores de uma entidade, isto , representam no modelo


o que uma entidade pretende ser. Exemplos: Nome, RG, CPF, Endereo, Nro Conta,
Nro Agncia, Nro Banco

Domnio: Conjunto de valores permissveis para um atributo. Exemplo: Estado


Civil, Sexo, Cor, Meses do Ano.

Relacionamento: a associao entre duas entidades, ou seja, representa a


maneira como duas entidades esto relacionadas ou ligadas. Exemplos: Conta-
Corrente de um Cliente, Agncias de um Banco, Contas-Corrente de uma Agncia.

Restries de Mapeamento: Representam o modo como as diferentes entidades


de um modelo se relacionam. Determinadas pela cardinalidade dos relacionamentos
entre as entidades.

Um-para-Um: Uma ocorrncia da Entidade A est relacionada com uma e


apenas uma ocorrncia da Entidade B.

Um-para-N:Uma ocorrncia da Entidade A est relacionada com uma ou vrias


ocorrncias da Entidade B.
N-para-Um:Vrias ocorrncias da Entidade A esto relacionadas com apenas uma
ocorrncia da Entidade B.

N-para-N: Vrias ocorrncias da Entidade A est relacionada com vrias


ocorrncias da Entidade B.Modelo Relacional

Um banco de Dados Relacional a implementao fsica do Modelo Entidade-


Relacionamento e traduz concretamente o que o modelo conceitual procura
representar. Consiste em uma coleo de tabelas cada uma das quais associada a
um nome nico e que possuem relacionamentos entre si. Tabelas representam
fisicamente as Entidades.

40
ABAP Training
Cada tabela possui uma estrutura similar quilo que pretende a representar, isto ,
tabelas so formadas de linhas que por sua vez so formadas por colunas. Colunas
representam fisicamente os Atributos.

A cada linha da tabela chamamos de Ocorrncia e o conjunto de ocorrncias pode


ou no estar relacionado com ocorrncias de outras tabelas.

Como distinguir as ocorrncias umas das outras?

Utilizando o conceito de Chave Primria!!

Chave Primria: Conjunto de atributos que garante a unicidade de cada


ocorrncia da tabela. Exemplos: RG, CPF, Nro Chassis.

Normalizao: Processo de reconhecimento da chave primria

Como representar os relacionamentos entre tabelas?

Transferindo a chave primria de uma tabela para a outra!!

Chave Estrangeira: Quando a chave primria de uma tabela um atributo em


outra(s) tabela(s).

Como definir todos esses elementos num BD?

Utilizando linguagens especiais para cada Sistema Gerenciador de BD.

SQL:
Structured Query Language Linguagem desenvolvida nos anos 70 para definio e
manipulao de dados em sistemas de bancos de dados relacionais. Conjunto
reduzido de comandos, sem recursos de lgica, unica e exclusivamente para criar
objetos no banco de dados e permitir que os dados possam ser mantidos, de acordo
com as necessidades funcionais. Nos gerenciadores de BD, ferramentas especficas
de cada fabricante oferecem recursos adicionais para a contruo de lgica. Outras
linguagens foram adaptadas para trabalharem em conjunto com o SQL, como
COBOL, C e ABAP/4. O SQL utilizado no R/3 proprietrio e segue um mnimo da
regulamentao internacional para esta, estando longe de possuir os mesmos
mecanismos de funcionamento. Seus comandos podem ser divididos em:

DDL: Data Definition Language Comandos especficos para definio de


objetos do banco de dados. Exemplo: Create Table, Create View, Create TableSpace,
Drop Table, etc.

DML: Data Manipulation Language Comandos especficos para tratamento dos


dados armazenados nos objetos do banco. Exemplo: Select, Insert, Delete, Update,
etc.

41
ABAP Training

42
ABAP Training

1.8. R/3 Data Dictionary

O dicionrio de dados do ABAP/4 (DD) uma fonte central de informaes


provenientes do sistema gerenciador de dados do SAP. Sua principal funo
suportar a criao e o gerenciamento das definies de dados, tambm conhecidas
como metadados.

Neste curso, o DD ser utilizado em exerccios prticos com o seguinte objetivo:

Visualizar objetos do SAP (Tabelas, estruturas, elementos de dados, domnios, etc)


Observar a estrutura e atributos dos dados armazenados nas bases de dados do
SAP.
Fazer consultas (query) de dados.
Descobrir os relacionamentos entre diferentes objetos (tabelas e estruturas de
dados).
Criar objetos (Tabelas, estruturas e elementos de dados) a partir do dicionrio.

Funes desempenhadas pelo Data Dictionary:

Gerenciamento das Definies de Dados


Criao e manuteno das definies de dados num repositrio central
Proviso de informaes para avaliaes
Permite obter informaes sobre o modo como os objetos esto relacionados
Suporte ao desenvolvimento
Diferentemente de outros dicionrios de dados, est integrado ao ambiente
de desenvolvimento de modo que alteraes ou criao de novos objetos
promovem automaticamente a gerao dos outros objetos dependentes,
sejam eles parte do dicionrio ou programas aplicativos.
Suporte documentao
Permite obter documentao atualizada
Garantia de que as definies de dados sejam flexveis e atualizadas
Gerao de objetos de runtime garantindo performance.

43
ABAP Training
Transao SE11

Tabelas: Definir a estrutura das tabelas transparentes onde os dados sero


armazenados fisicamente.

Estruturas: Definir estruturas que viro a ser utilizadas em programas para definir
a estrutura de uma tabela interna, ou como include em uma estrutura de uma
tabela transparente.

Vises: Definir relacionamentos entre tabelas transparentes para facilitar o acesso


ao banco de dados, geralmente so criadas para substituir select joins que
durante a execuo do programa degradam a performance do mesmo.

Elementos de dados: Associar os atributos tcnicos e significado para um campo


em uma tabela.

Domnio: Definir atributos tcnicos que sero atribudos a um elemento de dados

Objetos de bloqueio: Definir os bloqueio de acesso aos dados no banco de dados

Ajuda p/ pesquisa: Definio dos objetos de matchcode que sero utilizados nas
telas do SAP

Grupos de tipos: Os tipos de dados que definem a estrutura de uma tabela, o tipo
do campo em um domnio podem ser armazenados em um pool de tipos, para
posteriormente acion-los em uma funo ou programa.

44
ABAP Training
Estrutura Tabela

Modificar / Exibir a estrutura do objeto

Verificar objeto

Ativar objeto

Lista de utilizaes de objeto (Elemento de Dados, Domnio)

Visualizar estrutura de outro objeto

Chaves extrangeiras

Expande todas as estruturas includas na tabela

Expande uma estrutura includa na tabela

45
ABAP Training

Comprime uma estrutura expandida da tabela

Comprime todas as estrutura expandidas da tabela

DER Grafico

Permite anexar campos estrutura da tabela

Configurao do tipo de dado armazenado, tamanho, buffer

Criao de ndices na tabela

46
ABAP Training
Opes tcnicas

47
ABAP Training
Criao de ndices

48
ABAP Training
Vises

49
ABAP Training
Elemento de dados

Domnio

50
ABAP Training

51
ABAP Training

1.9. Exemplos

Visualizao da Estrutura de uma Tabela

a)
1. Acessar o Dicionrio de Dados (TOOLSABAP Workbench Development ->ABAP
Dictionary)
2. Entrar com o nome da tabela de Accounting Document Segment (BSEG)
3. DoubleClick na coluna Field Type ()
4. Click no matchcode da coluna Data Type ()
5. Click no boto Find ou CTRL + F e procurar o campo WRBTR

b)
Acessar o Dicionrio de Dados:
FerramentasABAP/4 WorkbenchABAP/4 Dictionary (SE11)
Informar o nome da Tabela BSEG <Display>
DoubleClick na coluna Data Elem BUKRS
<BACK>
Click no matchcode da coluna Ctg
<Cancel>
<Find> o campo PSWSL
<Avanar>
Click no boto <Chaves Externas>
<ENTER>
DoubleClick em sua CheckTable (TCURC)
<BACK>
Click no boto <Outra Tabela>
Informe BKPF <ENTER>
Opo GOTO ndices
DoubleClick #1
<BACK>
<CANCEL>
Opo Utilitrios Administrao de Verso
<BACK>

Visualizao do Contedo das Tabelas


a)
Procurar o campo ALTKT

52
ABAP Training
Acessar UTILITIESTable Contents -> Display (Transao SE16)
Click em executar (F8)
DoubleClick em uma linha da tabela
Acessar Settings -> List Format -> Choose Fields
Desmarcar todos os campos (terceiro boto)
Checar () os campos: BUKRS , BELNR , WRBTR , HKONT, LIFNR
Click Transfer
Acessar Settings -> User Parameters ->
Selecionar Field Text
Click em Transfer

b)
Procurar o campo WAERS
DoubleClick em sua CheckTable (TCURC)
Opo Utilitrios Table Contents (SE16)
<F8>
DoubleClick na coluna WAERS com valor ADP
Click no campo WAERS e <F1>
Veja o help e depois <F9>
<Cancel> / <Cancel> / <Back> (Table Contents)
Voltar tela de estrutura de tabela (<BACK> 3x)
Opo Utilittios Table Contents
<F8>
Opo Opes Formato de Lista Seleo Coluna
Desmarcar todos os campos (terceiro boto)
Selecionar os campos BUKRS, BELNR, GJAHR e XBLNR
<ENTER>
Selecionar XBLNR = 000022-1
<F8>
<BACK>
Opo Opes Critrios de Seleo
Selecionar tambm WWERT e TCODE <ENTER>
Encerrar o DD e retornar ao menu principal do R/3

53
ABAP Training
Criao de uma tabela customizada

a) Tabela de Contas do Razo


TOOLSABAP/4 WORKBENCHABAP/4 DICTIONARY
Object Name: ZFLABII# (# = nmero do grupo)
<CREATE>
SHORT TEST: Lab DD Grupo # - Tabela de Contas do Razo
DELIVERY CLASS: A
Tab.Maint.Allowed :
Field Name: MANDT key: <ENTER>
(Obs: o campo MANDT sempre participa dachave primria e obrigatrio para
tabelas Client Dependent)
Field Name: HKONT key: (copiar data-element de BSEG-HONT)
Repetir o processo para os seguintes campos:

Campo Tabela de Origem


BELNR BSEG key:
GJAHR BSEG
SGTXT BSEG
PSWBT BSEG
DMBTR BSEG
BUDAT BKPF
BKTXT BKPF
TXT50 SKAT
Incluir um campo com as seguintes caractersticas:
- Field Name: OBS
- Data elem : TOBS_ACC (Double Click para criar)
- Short Text: Texto de Observao do Movimento
- Domain Name: TEXT50
- Data Type : CHAR
- Field length: 20
- Texts: 10 : Obs
15: Observao
20: Observao sobre o movimento
Salvar o Data Element
Ativar o Data Element
<BACK>
Salvar a Tabela
Verificar a Tabela
Ativar a Tabela
b) Dados Adicionais para Nota de Crdito
Criar uma Tabela com as seguintes caractersticas:

54
ABAP Training
Nome: ZSEC#
Descrio: Dados Adicionais para Nota de Crdito Grupo #

Delivery Class: A
Table Maintenance Allowed: Checked

Field Name Key Data Element Type Length Short Text

MANDT X MANDT CLNT 3 Mandante


Documento X VBELN_VF CHAR 10 Doc. Faturamento
Razao ZRAZAO CHAR 40 Razo Social Emissor
Endereco ZENDERECO CHAR 40 Ender. do Emissor
Bairro ZBAIRRO CHAR 20 Bairro do Emissor
Cidade ZCIDADE CHAR 20 Cidade do Emissor
UF ZUF CHAR 2 Unid. Fed. Emissor

55
ABAP Training
Criao de um Dilogo de manuteno para tabela customizada

Aps criar uma tabela customizada, s vezes preciso que seja criado um
Maintenance Dialog Box, para que seja possvel incluir, alterar ou excluir dados de
uma nova tabela atravs da transao SM30.

Criar um Function Group:


Transao SE80
Duplo clique na opo Function Group, utilizar o nome ZFG# e pressionar
CRIAR
Apresentar um nome condizente ao grupo de funes e pressionar SAVE
Ativar a Function Group
Informar a Development Class utilizada at o momento e pressionar SAVE
Utilizar o mesmo transporte criado para a criao da tabela no item anterior

Gerar Maintenance Dialog Box


Tools ABAP Workbench Development Other Tools General Table
Maint. Dialog (ou executar diretamente a transao SE54)
Escrever o nome da tabela ZTST#
Selecionar a opo Generated Objects e pressionar CREATE/CHANGE
Pressionar YES no dialog de confirmao
Informar o Authorization Group &NC&, que no exige autorizao
Informar o Function Group ZFG# criado no item anterior
Selecionar a opo One Step para maintenance type
<Procurar n Tela> e <Continuar>
Pressionar CREATE
Informar a Development Class utilizada at o momento e pressionar SAVE

Alterar a tabela criada


Executar a transao SM30
Informar o nome da tabela ZTST# e pressionar MAINTAIN
Pressionar NEW ENTRIES , incluir dados e salvar
Informar o mesmo nmero de transporte criado para o Function Group
Selecionar uma das linhas da tabela e pressionar o boto DELETE
Confirmar a excluso

56
ABAP Training
Criao de uma Transao para o Dilogo de manuteno

Executar a transao SE93


Pesquisar no matchcode o nome da transao desejado (de acordo com os
padres de nomenclatura) e verificar qual o prximo nmero vlido de
transao
Informar o nome da nova transao
<CRIAR>
Escolher a opo " Transao com parmetros
<CONTINUAR>
Informar texto de descrio da transao (Texto da transao)
No quadro Valor proposto para, informar cdigo da transao SM30
Escolher a opo omitir 1 tela
Na primeria linha do quadro "Valores Propostos" :
"Nome do campo da Tela" atribuir "VIEWNAME"
"Valor" atribuir < Nome da Tabela >

Na segunda linha do quadro "Default Values" :


"Nome do campo da Tela" atribuir "SHOW"
"Valor" atribuir X
<SALVAR>
Informar classe de desenvolvimento
Indicar o request equivalente da atividade
Sair da transao < Voltar >

57
ABAP Training

Testando a Transao:

Sair da transao SE93


Digitar o cdigo da transao criada

58
ABAP Training

1.10. Exerccios

EXERCCIO 1

Criar uma ESTRUTURA com as seguintes caractersticas:


(Transao SE11 -> clicar em Data Type _> Create -> Selecionar Estrutura

Name: ZSCRIPT# (# = nmero do grupo)


Short Text: Estrutura de preenchimento do layout set ZM_TSTSCRIPT

Field name Data elem. Type Length Short text

BLDAT BLDAT DATS 8 Date of the document


BELNR BELNR D CHAR 10 Accounting document
number
CABIERTO1 BKTXT CHAR 25 Document header text
NAME1 NAME1_GP CHAR 35 Name 1
CABIERTO2 IN_WORDS CHAR 256 Amount in words
SGTXT SGTXT CHAR 50 Line item text
HKONT HKONT CHAR 10 G/L account
TXT50 TXT50_SKAT CHAR 50 G/L account long
text
XBLNR XBLNR CHAR 16 Reference
document number
BEDAT EBDAT DATS 8 Purchasing
document date
EBELN EBELN CHAR 10 Purchasing
document number

59
ABAP Training

EXERCCIO 2

Tabela BSEG

1 - Dado uma GL account HKONT = 50014001. Encontrar todos os documentos


associados, selecionar apenas os campos BUKRS, BELNR, GJAHR, DMBTR, WRBTR,
HKONT, DMBE2 e imprim-los.

2 - Dado o documento de nmero 1200000005. Verificar quais contas incluem este


documento (imprimir).

3 - Encontrar a GL account que inclui o documento do ex 2 e possui o campo de line


item (BUZEI) igual a 2.

Tabela BKPF

4 - Encontrar documentos que possuam:

Company Code = RP01


Document Date = 28.12.2000
Posting Date = 28.12.2000

60
ABAP Training
EXERCCIO 3

Criar uma Tabela com as seguintes caractersticas:

Name: ZTBL# (# = nmero do grupo)


Short Text: Tabela para manuteno via transao SM30

Field Name Key Data Element Type Length Short Text

MANDT x MANDT CLNT 3 Client


BELNR x BELNR D CHAR 10 Acc. Doc Num
TXT50 TXT50_SKAT CHAR 50 G/L acct long
txt

Criar um dilogo de manunteno com as seguintes caractersticas:

Function Group: ZGF#

Utilizar a transao SM30 para manuteno desta tabela.

61
ABAP Training

2. Transporte
Ordens (Change Requests): Recurso atravs do qual um conjunto de objetos C.D.
ou C.I. que podem ser transferidos de um client para outro ou de uma instncia
para outra.
Utilizam-se ordens para segurana na alterao de objetos j existentes, sejam eles
standards do SAP ou customizados, e para efetuar controle de verses destes
objetos.
A nomenclatura das ordens controlada pelo prprio SAP, que promove a criao
do cdigo do transporte, no momento em que a manuteno de objetos especficos
exige que o mesmo seja associado a uma ordem.
Gerao de Arquivo de Controle (Interno
SAP)
Nmero do transporte

AF1K900109

Objeto SAP (Interno SAP)


Instncia

Tipos de Objetos: Locais ou Transportveis

Ordens e Tarefas (Tasks): Cada ordem pode possuir uma ou mais Tasks. Cada Task
possui os objetos agrupados de acordo com seu tipo e ordem na qual devero ser
criados no Cliente de destino.

Padronizao ABAP Factory :

Ordem: 1 programa + objetos associados


OU
1 alterao de programa + objetos associados

Descrio da ordem:

nome_da_tarefa ou nome_do_produto - Gerao Inicial


nome_da_tarefa ou nome_do_produto - 1a Correo

Controlando e Administrando Transportes

Uma ordem criada por um determinado usurio garante que os objetos a ele
associados ficam reservados para tal usurio e somente sero liberados no
momento que a ordem for encerrada.

62
ABAP Training
Quando uma ordem ainda permanece associado a um usurio, dizemos que ele est
com o status de Modifiable.

Quando uma ordem encerrada, deixa de estar associado a um usurio e passa a


ter o status de Released (liberada), ou seja, os objetos a ela associados so
liberados para alterao por outros usurios.

Enquanto uma ordem possui o status Modifiable, pode-se manipular seus objetos
livrevente, mudar o usurio responsvel transferindo a responsabilidade, ou
simplesmente eliminar a ordem, liberando assim seus objetos, ao passo que uma
ordem liberada algo imutvel.

Transao SE01 Permite verificar o contedo das ordens (objetos) e sua Log de
transporte (sucessos, erros ou warnings) para os outros clientes e instncias.
Transao SE09 Permite verificar as ordens de objetos Client Independent
(Workbench Organizer) criados por um determinado usurio, bem como efetuar o
Release de tasks e da ordem em si.
Transao SE10 Permite verificar os transportes de objetos Client Dependent e
Client Independent (Customizing Organizer) criados por um determinado usurio,
bem como efetuar o Release de tasks e do transporte em si.

Tais transaes fornecem informaes para que criemos a planilha de controle das
ordens criadas e transportadas dentro de um projeto, permitindo assim,
conhecermos o histrico da criao e transporte dos objetos entre as vrias
instncias.

63
ABAP Training

2.1. Workbench Organizer

Esta transao permite controlar as ordens (requests) geradas atravs das


alteraes feitas nos objetos ABAP.
As alteraes so sempre registradas em ordens do tipo local e transportvel

Ordem tranportvel: Alteraes transportveis para objetos do ABAP/4


Development Workbench so gravados em ordens transportveis. Isto permite que
as ordens possam ser enviadas ao demais ambientes do SAP, cada ordem gerada
para um objeto ABAP/4 consiste em uma nova verso para este objeto, permitindo
assim comparar, verificar e consolidar as alteraes entre os ambientes de
desenvolvimento e produo.

Ordem Local: Alteraes no transportveis para objetos do ABAP/4 Development


Workbench so gravados em ordens locais. Isto garante que as ordens esto
sujeitas ao mesmo tipo de controle aplicado aos objetos transportveis. Da mesma
forma, quando uma ordem local liberada so criadas verses para o objeto.

64
ABAP Training
Nesta opo podemos acompanhar o transporte de todas as requests que foram
liberadas

Clicando no boto de transportes podemos acompanhar todas as requests do tipo


Desenvolvimento/Correo.

65
ABAP Training
Toda alterao em objetos standard feita em requests do tipo Reparao.

Acessando pelo menu Ordem/tarefa Procurar Ordens, podemos efetuar


pesquisas nas request do sistema.

Clicando no boto de seleo de valores na seo Tipo de Ordem podemos


selecionar os tipos de change request que sero pesquisados.

2.2. Exerccios

66
ABAP Training
Manuteno de transportes

Tools ABAP Workbench Overview Workbench Organizer (ou


SE09)

Obs: SE09 apenas C.I.;


SE10 C.D. ou C.I..

Display.
Obs: diferena entre transportvel e local

Abrir uma ordem (request).

Abrir a Tarefa (Task).


Obs: visualizar objetos

Posicionar o cursor na Task e pressionar o boto Release.

Completar o item : &T_Description& acrescentando uma breve descrio do


que foi feito na request

Salvar e voltar para a tela anterior.

Perceba que a Task mudou de cor.

Posicionar o cursor na ordem e pressionar Release.

Perceba que o ordem mudou de cor.

Voltar para a tela anterior.

Clicar em Release e desativar Modifiable para ver apenas as ordens liberadas.

Acompanhamento e controle dos transportes das ordens

Executar a transao SE01


Entrar com o nmero da ordem.
Display Visualizar informaes.
Clicar Editor Visualizao de objetos.

67
ABAP Training

3. Report

Antes de iniciarmos o estudo dos Reports, devemos entender primeiro o conceito de


Report dentro do SAP. Apesar do nome indicar que so relatrios, Report tem uma
abrangncia maior do que isso. Devemos entend-los como programas, que so
capazes de fazer muito mais coisas do que exibir relatrios.

O ambiente de trabalho para criar os objetos ABAP, chama-se ABAP Workbench


(pelo menu do SAP Ferramentas -> ABAP Workbench ou transao S001), nele
podemos verificar todos os objetos relacionados a um programa (Repository
Browser), acessar os objetos do dicionrio de dados do SAP (Dictionary), criar/editar
fontes do ABAP (Editor ABAP), criar funes (Function Builder), desenhar telas para
os programas ABAP (Screen Painter) e por fim criar menus para inserir nas telas dos
programas (Menu Painter).

Cdigos das transaes associadas s opes do ABAP Workbench:

Opo Transao
Repository Browser SE80
Dictionary SE11
Editor ABAP SE38
Function Builder SE37
Screen Painter SE51
Menu Painter SE41

68
ABAP Training

3.1. Editor ABAP (SE38)

69
ABAP Training
No editor ABAP, alm de digitar o cdigo fonte do programa, possvel tambm
efetuar outras tarefas e adicionar outros objetos inerentes sua execuo.

Na janela de Objetos parciais h 5 opes bsicas de objetos associados a um


programa ABAP:

Texto fonte: Atravs desta opo acionamos o editor de programas ABAP.

Variantes: Definem-se os valores pr-definidos para os parmetros de execuo de


um programa ABAP. Os parmetros de um programa so definidos pelos comandos
Parameters e Select-options do ABAP.

Atributos: Definem-se os atributos de programa, como classe de desenvolvimento,


ttulo, categoria, status, aplicao, etc.

Documentao: Texto com uma descrio breve do que o programa executa e as


suas condies necessrias para execuo.

Elementos de texto: Definem-se os textos que sero relacionados s mensagens,


rtulos de parmetros do programa e ttulos e nome de colunas para o relatrio
gerado pelo programa.

Barra de botes da transao:


Verificao da Sintaxe do programa
Ativar verso do programa

Executar o programa

Lista de Utilizaes do programa

Mostra os objetos do sistema que esto sendo utilizados pelo programa

Ajuda Online

Eliminar o programa

Copiar programa
Renomear o programa

Executar o programa em modo de depurao

Executar o programa com variante de execuo

Atualizar as variantes de execuo

70
ABAP Training
Estrutura do programa ABAP

* Com o comando REPORT so definidas as caractersticas bsicas para um


* programa ABAP, como o nome do programa, a classe de mensagens
utiliza-
* da, o tamanho da folha de impresso, etc.

REPORT Z_CURSO_ABAP
NO STANDARD PAGE HEADING no exibe o cabealho padro de Report
LINE-SIZE 170 define o tamanho da linha em 170
caracteres
LINE-COUNT 65 define o nmero de linhas por pgina
MESSAGE-ID ZSADUP define a classe de mensagens
RESERVE 8 LINES. pelo menos 8 linhas sero impressas na lt.
pg

*----------------------------------------------------------------------*
* Insero de comentrio
* ou assim
" outra forma de comentar um programa
*----------------------------------------------------------------------*
* Nome: Z_curso_abap
* Descrio: Meu primeiro programa ABAP
* data: 21/08/2009
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
* Declarao de tabelas do sistema
*----------------------------------------------------------------------*
* Com o comando TABLES so definidas as tabelas do dicionrio de dados
* que sero utilizadas no programa

TABLES: T001W, " Tabela de centros


J_1BAGT. "Descrio de CFOP

*----------------------------------------------------------------------*
* Declarao dos tipos de campos
*----------------------------------------------------------------------*
* Na declarao de tipos de campos so definidas as caractersticas de
* para um campo de uma estrutura que ir compor a estrutura de uma
tabe-
* la interna e sua respectiva WorkArea. Usa-se isso quando declaramos
vrias tabelas internas com a mesma estrutura

TYPES:
BEGIN OF T_T001W,
CENTRO LIKE T001W-WERKS, "Centro
DESCRICAO LIKE T001W-NAME1, "Descrio centro

71
ABAP Training
END OF T_T001W.
*----------------------------------------------------------------------*
* Declarao de tabelas Internas
*----------------------------------------------------------------------*
* Tabelas internas so objetos que somente existem durante a execuo
do
* programa. Elas servem para armazenar os dados selecionados a partir do
* banco de dados e assim manusear os dados selecionados dentro do
progr.

DATA: I_T001W TYPE TABLE OF T_T001W


WITH NON-UNIQUE KEY CENTRO.

DATA: I_TAPP TYPE TABLE OF T_T001W


WITH NON-UNIQUE KEY CENTRO.

*----------------------------------------------------------------------*
* Declarao de parmetros
*----------------------------------------------------------------------*
* Com o comando SELECT-OPTIONS podemos montar parmetros com lista
de
* valores a partir de campos do banco de dados

SELECT-OPTIONS: S_CENTRO FOR T001W-WERKS. declara um select-options do


tipo
centro

* Com o comando PARAMETERS, cria-se parmetros de seleo que


permitem a entrada de
* apenas um valor. Eles podem receber um valor, como o Select-Option,
mas tambm podem
* ser Radiobuttos e tambm checkbox
PARAMETERS:
P_1 RADIOBUTTON GROUP CURS, Com o comando Radiobutton, cria-se
P_2 RADIOBUTTON GROUP CURS, botes para a seleo de 1 ou outro
parmetro. O comando GROUP XXX
identifica quais parmetros fazem
parte
do grupo. Neste exemplo, temos 2
grupos
distintos, o CURS e o SRUC
P_3 RADIOBUTTON GROUP SRUC,
P_4 RADIOBUTTON GROUP SRUC,
P_5 AS CHECKBOX.

*----------------------------------------------------------------------*
* Constantes
*----------------------------------------------------------------------*

72
ABAP Training
CONSTANTS: C_X(1) TYPE C VALUE 'X'. "Constante X

*----------------------------------------------------------------------*
* Variveis
*----------------------------------------------------------------------*
DATA: v_cfop like j_1bagt-cfop, Declara uma varivel do tipo Cdigo de
CFOP
v_nome(15) type c, Nome
v_contador type n. Contador de linhas

*----------------------------------------------------------------------*
* Na tela de seleo
*----------------------------------------------------------------------*
* neste momento, podemos inserir uma lgica de verificao para os
parmetros inseridos
* pelo usurio na tela de seleo
AT SELECTION-SCREEN.
IF S_CENTRO IS INITIAL. Se o centro estiver vazio
MESSAGE E001(ZA). exibe mensagem de erro. Todas as mensagens de erro
dentro
da lgica da tela de seleo, fazem com que o programa
fique
parado na tela de seleo. Nas demais partes do
programa, a
mensagem de erro faz com que o programa termine a
sua
execuo. Neste caso, utilizamos uma classe de
mensagem
diferente da especificada no comando REPORT. Se no
especificar a classe de mensagens, ele assuma a classe
definida
no Report. Se nenhuma classe de mensagens estiver
definida, d
erro.
ENDIF.

*----------------------------------------------------------------------*
* Qdo o usurio selecionar uma linha
*----------------------------------------------------------------------*
AT LINE-SELECTION.

*----------------------------------------------------------------------*
* Qdo o usurio apertar um boto
*----------------------------------------------------------------------*
AT USER-COMMAND.

*----------------------------------------------------------------------*
* Cabealho do relatrio

73
ABAP Training
*----------------------------------------------------------------------*
* inserir aqui as informaes que se deseja que apaream no cabealho do
relatrio
TOP-OF-PAGE.

WRITE:/ 10 Cabealho do meu primeiro programa ABAP. escreve na posio 10


ULINE at 10(40). linha comeando na posio 10 e com tamanho 40.

*----------------------------------------------------------------------*
* Rodap do relatrio
*----------------------------------------------------------------------*
* inserir aqui as informaes que se deseja que apaream no rodap do
relatrio
* OBS: essas informaes s aparecero se o tamanho da pgina estiver
definido no comando
* REPORT e somente qdo houver quebra de pgina. Caso contrrio, no
aparecer
END-OF-PAGE.

ULINE.
WRITE:/ As informaes continuam na prxima pgina.

*----------------------------------------------------------------------*
* Inicio do programa
*----------------------------------------------------------------------*

* O evento START-OF-SELECTION determina que o algoritmo do programa


* inicia neste ponto, sua utilizao obrigatria.

START-OF-SELECTION.

* Com o comando PERFORM executamos uma rotina que est fora do fluxo
* normal do programa
PERFORM ACESSANDO_CFOP.

*Com o comando SELECT buscamos a informaes do banco de dados a


partir dos parmetros de seleo
SELECT WERKS cd do centro
NAME1 descrio
FROM T001W da tabela T001W
INTO TABLE I_T001W inserindo na tabela interna I_T001W
WHERE WERKS IN S_CENTRO. onde o centro esteja dentro dos parmetros
informados

* Testando se a execuo do comando SELECT foi bem sucedida


IF SY-SUBRC NE 0.
* Com a varivel de sistema SY-SUBRC sempre poderemos testar se o

74
ABAP Training
* comando ABAP foi executado com sucesso ou no.

MESSAGE I015 WITH 'Erro no comando SELECT'.


* Com o comando EXIT neste ponto termina-se a execuo do programa
EXIT.
ENDIF.

IF P_1 EQ C_X.
MESSAGE I015 WITH 'Ensinando a fazer mensagens' 'de informao'.
ELSEIF P_2 EQ C_X.
MESSAGE E015 WITH 'Ensinando a fazer mensagens' 'de erro'.
ENDIF.

* Para ler/manusear os registros selecionados no comando SELECT devem


* utilizar o comando LOOP que far a leitura seqencial dos registros na
* tabela interna
LOOP AT I_T001W.

WRITE: / TEXT-031, I_T001W-CENTRO, " HEADER LINE (Campo centro)


TEXT-042, I_T001W-DESCRICAO. " HEADER LINE (Campo descrio)

* Como modificar o contedo de um campo de uma tabela interna durante


a
* execuo de um programa
* Primeiro: Alterar o contedo do campo
i_t001w-descricao = 'Texto de alterao'.
* Segundo: Utilizar o comando MODIFY para gravar a alterao na tabela
* interna
MODIFY i_t001w.

ENDLOOP.

* Com o comando READ fazemos a leitura de um registro na tabela interna


* pelo valor de uma chave especfica
READ TABLE I_T001W WITH KEY CENTRO = '1700' BINARY SEARCH.
IF SY-SUBRC NE 0.
MESSAGE I015 WITH 'Registro no encontrado'.
ELSE.
* Insere uma linha de traos na tela.

ULINE.
* Ao usar ":" no comando WRITE o comando entende que sero impressas
* vrias strings na mesma linha, a "/" que aparece aps o comando
* indica salto de linha antes de escrever os dados na tela/relatrio.
WRITE: / I_T001W.
ULINE.
ENDIF.

75
ABAP Training

* Acessando um determinado registro na tabela interna baseado no ndice


* do mesmo
READ TABLE I_T001W INDEX 8.
IF SY-SUBRC NE 0.
MESSAGE I015 WITH 'Registro no encontrado'.
ELSE.
ULINE.
WRITE I_T001W.
ULINE.
ENDIF.
* Comando para limpar o HEADER LINE
CLEAR I_T001W.

* Apendando (anexando) registros em outra tabela interna

LOOP AT I_T001W.
* Utilizando o comando CASE para verificar o valor de um campo ou
* varivel
CASE I_T001W-CENTRO.
WHEN '1010'. "Testando se o valor = 1010
I_TAPP-CENTRO = I_T001W-CENTRO.
I_TAPP-DESCRICAO = I_T001W-DESCRICAO.
APPEND I_TAPP.

WHEN '1650'.

* Com o comando MOVE-CORRESPONDING movemos os campos


correspondentes em
* entre duas tabelas de uma para a outra, ou seja, move-se o campo
* i_t001w-centro em i_tapp-centro, etc.
MOVE-CORRESPONDING I_T001W TO I_TAPP.
APPEND I_TAPP.
WHEN OTHERS.
ENDCASE.
ENDLOOP.

* Insere um BREAK-POINT fixo no cdigo do programa.

BREAK-POINT.

* Com o comando REFRESH apagamos todos os registros da tabela interna,


* mas no se apaga o HEADER LINE da mesma
REFRESH I_TAPP.
CLEAR I_TAPP. "Limpando o HEADER LINE

* A instruo IS INITIAL no comando IF, testa se a tabela interna esta

76
ABAP Training
* vazia
*
* Se testar usando apenas o nome da tabela i_tapp sem os colchetes
* estarei testando o contedo do HEADER LINE
IF I_TAPP[] IS INITIAL.
WRITE: / 'Tabela esta vazia'.
ENDIF.

* Sorteando (classificando) os registros da tabela interna


SORT I_T001W BY DESCRICAO DESCENDING.
WRITE: / 'Saindo do programa.'.

END-OF-SELECTION.
* O evento END-OF-SELECTION determina o fim do fluxo do programa

*----------------------------------------------------------------------*
* Sesso de Forms
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
* Definio da sub-rotina ACESSANDO_CFOP
*----------------------------------------------------------------------*

FORM ACESSANDO_CFOP.

SELECT CFOP CFOTXT FROM J_1BAGT


INTO I_CFOP.
ENDSELECT.
IF SY-SUBRC NE 0.
MESSAGE E015 WITH 'Tabela CFOP vazia'.
EXIT.
ENDIF.

WRITE: / ===>,Form ACESSANDO_CFOP foi acionado,****.

ENDFORM. Fim do Form ACESSANDO_CFOP

*----------------------------------------------------------------------*
* Definio da sub-rotina acessando_cfop_com_comando_at
* Essa sub-rotina utiliza um parmetro que passado qdo ela
* Chamada. Portanto, existe o comando USING.
*----------------------------------------------------------------------*

FORM acessando_cfop_com_comando_at USING v_cfop.


v_cfop no precisa mais ser declarada, pois est na declarao da sub-rotina. Se
especificarmos um tipo (FORM acessando_cfop_com_comando_at USING v_cfop
LIKE J_1BAGT-CFOP ), essa sub-rotina s aceitar parmetros desse tipo. Se no
especificarmos, aceita qq parmetro.

77
ABAP Training
se esse parmetro tiver que ser alterado, usa-se o comando CHANGING.
LOOP AT i_t001w.

* O comando AT dentro de um comando LOOP nos permite controlar o fluxo


dos
* dados para montar um listagem dos dados

AT FIRST.
*Quando o primeiro registro da tabela seja lido
WRITE: / Inicio dos registros da tabela i_t001w.
ENDAT.

AT NEW WERKS.
*Sempre que o valor do campo mudar acionar esta ao
WRITE: / Mudana do valor campo, WERKS.
ENDAT.

AT LAST.
*Quando o ltimo registro da tabela seja lido
WRITE: / Fim dos registros da tabela i_t001w.
ENDAT.

ENDFORM.

78
ABAP Training

Processo Geral de Programao

Nome e Descrio do
Programa

Declarao de
Variveis

Montagem da
Tela de
Input

Montagem e
Impresso do
Relatrio ou outra lgica

Template Detalhado

79
ABAP Training

Nome do Programa.
e Descrio

No. de linhas e colunas


classe de mensagem

Declarao de dados
(variveis, ctes e tabelas
internas)

Parmetros de input
(parameters e select
options)

Lgica da tela de
seleo

Ao comando do
usurio (caso
haja algum boto)

Seleo e Impresso
de Dados ou outra lg.
(performs na ordem)

Cabealho e Rodap

80
ABAP Training

Seo das Sub-rotinas

3.2. Descrio do Template

Nome do Programa e Descrio:

Nome do Shell
Nome do Programa
Data
ltima atualizao

81
ABAP Training
Descrio
Include
Calls
Function Modules
Histrico de Modificaes

No. de Linhas, Colunas e Classe de Mensagem:

No Standard Page Heading


Line-Size
Line-Count
Message - ID
Reserve n lines

Declarao de Dados:

Include ZZIHEADR
Tabelas
Constantes e Variveis
Tabelas Internas

Parmetros de Entrada:

Select-Option
Parameters

Lgica da Tela de Seleo:

Initialization
At Selection-Screen

Ao Comando do Usurio:

At User-Command

Seleo e Impresso de Dados:

Start-of-Selection
End-of-Selection

Cabealho e Rodap

Top-of-page
End-of-page

82
ABAP Training

Seo das Sub-rotinas

Forms Section

3.3. Comando Select

O comando select usado para acessar e selecionar dados de tabelas internas do


SAP. Por existirem diversas variaes do mesmo comando, fundamental que o
programador saiba o mecanismo de funcionamento de cada uma delas pois s
assim poder dar ao programa uma performance satisfatria.

Variaes :

SELECT * FROM dbtab.


....

83
ABAP Training

ENDSELECT.
Seleciona dados de uma tabela do banco de dados num processo de loop que
comea no select e termina no endselect. A cada pasagem pelo loop temos um
elemento lido e selecionado.
necessrio que se coloque aps o ENDSELECT uma condio de checagem de
dados selecionados:

If sy-subrc ne 0.
WRITE : Nenhum dado foi selecionado.
Endif.

Se sy-subrc = 0 : pelo menos um dado foi lido

Se sy-subrc = 4 : nenhum dado foi lido

EXEMPLO:

SELECT * FROM BSEG.

ENDSELECT.

Adies:

WHERE Condition
Seleciona apenas os dados que satisfazem a condio estipulada.

EXEMPLO:
SELECT * FROM T001 WHERE BUKRS EQ 0001.

ENDSELECT.

ORDER BY f1fn
ORDER BY PRIMARY KEY

Organiza os dados em ordem ascendente de acordo com os campos especificados


(f1,fn).

EXEMPLO:

84
ABAP Training

SELECT * FROM T001 ORDER BY MSGNR DESCENDING ARBGB


ASCENDING.

ENDSELECT.

UP TO n ROWS
Seleciona um nmero mximo de dados.

EXEMPLO:

SELECT * UP TO 100 ROWS FROM T001 WHERE

ENDSELECT.

SELECT * FROM dbtab INTO TABLE itab.


Os dados so selecionados e colocados na tabela interna itab de uma s vez. No
h mais o processo de loop e portanto no h mais ENDSELECT. Os dados novos da
tabela interna so gravados por cima dos antigos.
importante ressaltar que o * pode ser substitudo pelos nomes dos campos da
tabela, agilizando assim o processo e melhorando a performance (no pode ser
usado para tabelas pooled e clustered).

EXEMPLO:

SELECT * FROM T001 INTO TABLE TAUX.

Adies :

WHERE
ORDER BY
UP TO n ROWS

SELECT * FROM dbtab APPENDING TABLE itab.


Mesmo processo do item 2-) s que os dados novos so inseridos sem apagar os
antigos.

EXEMPLO:

SELECT * FROM T100 APPENDING TABLE TAUX.

WHERE

85
ABAP Training
ORDER BY
UP TO n ROWS

SELECT SINGLE * FROM dbtab WHERE f1 = g1 AND AND


fn +
Seleciona apenas um nico dado que satisfaa as condies do where.

EXEMPLO:

SELECT SINGLE * FROM T100 WHERE BUKRS=02.

SELECT * FROM dbtab APPENDING CORRESPONDING


FIELDS OF TABLE itab.
Mecanismo semelhante ao do item 2-) e deve ser usado quando a sintaxe do item
2-) no puder ser usada. H diferenas de performance.

EXEMPLO:

SELECT * FROM T100 APPENDING CORRESPONDING FIELDS OF TABLE TAUX.

Onde TAUX recebeu a estrutura da tabela T100 (comando INCLUDE STRUCTURE).

SELECT * FROM dtab FOR ALL ENTRIES in itab where


Usado quando selecionamos dados de uma tabela e precisamos de dados de outra
tabela para compr as condies do where.
EXEMPLO:

SELECT * FROM BSEG FOR ALL ENTRIES IN T_BKPF


WHERE BUKRS = T_BKPF-BUKRS
AND BELNR = T_BKPF-BELNR
AND BELNR = T_BKPF-BELNR.

Onde T_BKPF uma tabela interna que recebeu a tebela BKPF.

NOTA: se itab estiver vazia, esse comando selecionar todo o contedo da


tabela, pois nenhuma restrio est sendo colocada. Uma maneira de fazer essa
verificao a seguinte:

IF NOT ( itab[] IS INITIAL ). se itab no est vazia


SELECT * FROM dtab FOR ALL ENTRIES in itab
where campo = itab-campo
ENDIF. fim do: se itab no est vazia

86
ABAP Training

87
ABAP Training

3.4. Consideraes sobre os diferentes tipos de select:

SELECT * FROM <tabela>


(Quando no se impe nenhum tipo de restrio, ocorre uma varredura sequencial
dos registros da tabela. Quando se utiliza grandes tabelas, isso obviamente afeta o
runtime.

Performance: Select * - seleciona todas as colunas de uma tabela. melhor


sempre especificar as colunas, pois em caso de tabelas com muitas colunas,
prejudicar a performance).

SELECT * FROM <tabela> WHERE <campo> eq <contedo>.


(L todos os registros da tabela especificada onde o campo igual ao contedo
especificado)

Performance: Select * Where - seleciona todas as colunas de uma tabela de


acordo com a condio de where. melhor sempre especificar as colunas, pois em
caso de tabelas com muitas colunas, prejudicar a performance.

SELECT * FROM <table> WHERE <table field> BETWEEN <field1> and


<field2>.
Ex.: field1 = 100 e field2 = 500. Pega inclusive 100 e 500. Voc trabalha com o
range.

SELECT * FROM <table> WHERE <table field> LIKE ._R%.


_ = a primeira letra no importa o que vir
a segunda dever ser R (eu defini)
% = no importa a sequncia de caracteres que vir.

SELECT * FROM <table> WHERE <table field> IN (.,.).


Exemplo: select * from <table> where campo1 in (123,1000) - podem ser valores
ou literais
como perguntar se campo1 123 ou 1000.

SELECT * FROM <table> WHERE <table field> IN <internal table>.


Exemplo:
DATA : begin of ITAB occurs 10,
sign(1), option(2), low like sflight-price, high like sflight-price,
end of ITAB.
* RANGES: ITAB for sflight-table
Move: I to itab-sign, btto itab-option, 500 to itab-low, 1000 to itab-high.
Append itab. Move: I to itab-sign, btto itab-option, 440 to itab-low.
Append itab.

88
ABAP Training

SELECT * FROM <table> ORDER BY <field1> <field2> 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.

SELECT * FROM <table> BYPASSING BUFFER.


(Usado para ler diretamente da tabela original, e no do buffer).

OBS.: Select single * sempre com chave completa especificada. Particularidade do


Abap/4
Select * - procurar evitar. Informar as colunas que sero necessrias,
apenas.
Uso de comando extract (insert header, details) para relatrios

SELECT * FROM <table> APPENDING TABLE <internal table>.


(L os registros e os inclui - no sobrepe - em um internal table).

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 uma internal table. Este processo mais rpido que ler
individualmente atravs de um LOOP e ir gravando os registros, um a um).

SELECT . INTO CORRESPONDING FIELDS OF TABLE <itab>.


(Neste caso a estrutura da tabela interna no precisa corresponder estrutura da
tabela que est sendo acessada. <itab> o nome da internal table. Movimentar
os registros para as colunas definidas na internal table que possuam nome igual ao
da tabela acessada).
Obs.: corresponding ou appending corresponding no exigem o endselect.

SELECT .. APPENDING CORRESPONDING FIELDS OF TABLE <itab>.


( L e grava (no sobrepe) os dados em uma internal table que possua nomes
idnticos aos nomes da tabela que est sendo lida).

SELECT SINGLE * FROM SPFLI WHERE ..<campo>.. EQ


<contedo>
(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 e a performance ficar prejudicada).
No caso de haver a necessidade de acessar um nico registro via select, as opes
so: select * .. seguido de comando exit OU select * up to 1 row.
Neste caso no necessrio especificar a chave completa.

89
ABAP Training

SELECT <a1> <a2> INTO (<f1>, <f2>, ) FROM .<tabela>


WHERE .
L as colunas especificada (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 work-areas especificadas.
SELECT MAX(campo)
MIN(campo)
AVG(campo)
COUNT(*) FROM <table> INTO (..,,..,.)
WHERE .

AVG e SUM: somente para campos numricos.


No se usa endselect.
Mais rpido fazer uma rotina mo que utilizar este comando.

SELECT * FROM SFLIGHT WHERE PRICE IN ITAB.

SELECT * FROM (<table>) INTO <work area>.


Exemplo: data: begin of WA,
line(100),
end of WA.
Parameters: tabname(10) default SPFLI. *** especificando o nome da tabela em
tempo dinamicamente no select statement sempre consome mais tempo de CPU
que especificando estaticamente no programa ***

Select * from (tabname) into WA


Write .
Endselect.

SELECT * FROM <table> FOR ALL ENTRIES IN <internal table>


WHERE
campo1 = <contedo> and
campo2 = <contedo>
Defino uma tabela interna. Alimento os campos desta tabela interna. (move e
append).
No meu select campo1 e campo2 sero os campos definidos e alimentados na
tabela interna.

SELECT carrid MIN( price ) max (price ) INTO (carrid, minimum, maximum) FROM
sflight 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).

90
ABAP Training

3.5. Criando Transaes:


Para os usurios poderem utilizar os programas desenvolvidos, necessrio
criarmos transaes para eles, pois, normalmente, por questo de segurana, os
usurios no possuem acesso transao SE38.

Para a criao de transaes, utilizamos a transao SE93.

Nela, devemos digitar o nome da transao a ser criada (lembrando sempre os


padres de nomenclatura adotados) e clicar em <CRIAR>.

Em seguida, aparecer uma tela com diversos tipos de transaes a serem criadas,
onde deve-se preencher uma descrio para a transao e selecionar o tipo
adequado. Para Reports, selecionar:

91
ABAP Training
Em seguida, preencher o nome do programa e salvar a transao que ela estar
criada.

92
ABAP Training
3.6. Exerccios

EXERCCIO 1

Desenvolver um programa Z_EXC_REP_1_AL## que mostre os cdigos dos


Materiais, os tipos e o centro.
Ordenar a exibio por centro, tipo e material

Tabelas: MARA
MARC

Opcional:
fazer a quebra do relatrio por centro (Pode-se usar os seguintes comandos
para fazer isso: ON CHANGE, AT END ou AT NEW. Ateno s peculiaridades
de cada comando)
Ao clicar sobre a linha do material, chamar a transao de exibio de
materiais para que o usurio possa ver detalhes do mesmo (utilizar o
comando AT LINE-SELECTION e o comando HIDE. Leia o Help desses
comandos).
Inserir a descrio do Material campo MAKTX da tabela MAKT

93
ABAP Training
EXERCCIO 2

Desenvolver um programa Z_EXC_REP_2_AL## que armazene e imprima os campos


abaixo desde que o campo Empresa relacionado com cada um deles seja comum a
todos:

Tipo de Documento da tabela BKPF (campo BLART),


Montante em Moeda do Documento da tabela BSEG (campo WRBTR),
No. do fornecedor da tabela BSEG (campo LIFNR).

Os campos : No. do documento contbil e Exerciccio contbil (ambos existem nas 2


tabelas) devem ser digitados como parmetros pelo usurio.

Caso o usurio digite algum parmetro inexistente nas tabelas, o programa deve
avis-lo e no processar a informao.

Sugesto : Usar transao SE16 para comparar o contedo da tabela com o


resultado informado. Na transao SE11, analisar as estruturas da tabelas para
identificar os campos necessrios.
Usar select xxx into table i_xxx.

94
ABAP Training
RESOLUO 1

************************************************************************************
* *
* ******************************************** *
* * Confidencial e Proprietrio * *
* * Copyright 2001, Accenture * *
* * Todos os direitos reservados * *
* ******************************************** *
* *
* Nome do Shell: YTRP0010 Verso do Shell: v1.01 *
* *
*************************************************************************************
* Nome do Programa : Z_R_EXERCIO1 *
* Ttulo do Programa : Shell - ABAP/4 List Report *
* Programador : ZEZINHO *
* Data : 21/03/2001 *
* ltima atualizao : dd/mm/aa *
* *
* Descrio : Este um programa report para exibir os cdigos de *
* materiais e tipo por centro *
* *
* *
* Include : ZZIHEADR *
* *
* Calls : *
* *
* Mdulos de Funes: *
* *
*----------------------------------------------------------------------------------------------- *
* Lista de Modificaes: *
* Data Autor Corr. # Descrio *
* 21/03/2001 ACPROGR1 AF1K901210 Desenvolv. inicial do prg. *
* *
************************************************************************************
REPORT Z_R_EXERCIO1
NO STANDARD PAGE HEADING "No mostra o cabealho padro SAP
LINE-SIZE 170 "Largura do report de 170 caracteres
LINE-COUNT 58 "Comprimento do report de 58 caracteres
MESSAGE-ID ZM. "Classe de mensagens ZM

RESERVE 8 LINES. "Pelo menos n linhas sero impressas na ltima pgina

"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>"
" SESSO DE DECLARAO DE DADOS "
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>"

95
ABAP Training
************************************************************************
* Includes *
************************************************************************
INCLUDE:
ZZIHEADR. "Cabealho padro de report

************************************************************************
* Tabelas *
************************************************************************
TABLES:
MARA, "Mestre do material: dados gerais
MARC. "Segmento C do mestre material
************************************************************************
* Dados: *
* Constantes (C_...) *
* Variaveis (V_...) *
* Tabelas Internas (T_...) *
************************************************************************
*- Constantes ---------------------------------------------------------*
*DATA:

*- Variaveis ----------------------------------------------------------*
DATA: V_TOTAL TYPE i.

*- Tabela Interna -----------------------------------------------------*

DATA: BEGIN OF T_MARA OCCURS 3000,


MATNR LIKE MARA-MATNR, " cdigo do material
MTART LIKE MARA-MTART. " tipo do material
DATA: END OF T_MARA.

DATA: BEGIN OF T_MARC OCCURS 10000,


MATNR LIKE MARA-MATNR, " cdigo do Material
WERKS LIKE MARC-WERKS. " centro
DATA: END OF T_MARC.

DATA: BEGIN OF T_FINAL OCCURS 10000,


MATNR LIKE MARA-MATNR, " cdigo do material
MTART LIKE MARA-MTART, " tipo do material
WERKS LIKE MARC-WERKS. " centro
DATA: END OF T_FINAL.

************************************************************************
* Parmetros de entrada : *
* Select Options (S_...) *
* Parameters (P_...) *
************************************************************************

96
ABAP Training
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE T1.
SELECT-OPTIONS:
SO_MATNR FOR MARA-MATNR, cd material
SO_WERKS FOR MARC-WERKS. centro
SELECTION-SCREEN END OF BLOCK B1.

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE T2.


SELECT-OPTIONS: SO_MTART FOR MARA-MTART. tipo de material
SELECTION-SCREEN END OF BLOCK B2.

"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>"
" SESSO DE PROCESSAMENTO "
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>"
*----------------------------------------------------------------------*
INITIALIZATION. "Logica para defaults "inteligentes"
*----------------------------------------------------------------------*
T1 = 'Selecione um Material'.
T2 = 'Selecione um tipo de Material'.
*----------------------------------------------------------------------*
AT SELECTION-SCREEN. "Tratamento de Erros e lgica para tela de seleo
*----------------------------------------------------------------------*

* atribui valor ao parmetro da transao MM03 de acordo com seu ID

set parameter id 'MAT' field t_final-matnr.

* Chamada transacao MM03 (Consulta Materiais), pulando a primeira tela. Para


pular essa tela.
* a informao TEM que ser passada ao parmetro antes

call transaction 'MM03' and skip first screen .

*----------------------------------------------------------------------*
START-OF-SELECTION. "Processamento principal
*----------------------------------------------------------------------*
PERFORM F_SELECT_DATA.
PERFORM F_PRINT_REPORT.

*----------------------------------------------------------------------*
END-OF-SELECTION. "Fim do processamento principal
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
TOP-OF-PAGE. "Cabealho (Aparece sempre no topo da tela.)

97
ABAP Training
*----------------------------------------------------------------------*

uline (90) .
format color col_heading.
write: /'| Rel. Materiais P/ Centro | Data..:',
sy-datum,
' - ',
sy-uzeit,
' | Pagina..: ',
sy-pagno,
90 '|' .
uline (90) .
format color col_total.
write: /'|Centro ',
7 '| Num. Mat.' ,
17 '| Tipo',
90 '|' .
uline (90) .

*----------------------------------------------------------------------*
END-OF-PAGE. "Rodap
*----------------------------------------------------------------------*

"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>"
" SESSO DE FORMS "
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>"

*&---------------------------------------------------------------------*
*& Form F_SELECT_DATA
*&---------------------------------------------------------------------*
* Seleciona dados e armazena-os na tabela interna *
*----------------------------------------------------------------------*
FORM F_SELECT_DATA.

SELECT MATNR
MTART
FROM MARA
INTO TABLE T_MARA
WHERE MATNR IN SO_MATNR
AND MTART IN SO_MTART.

if sy-subrc ne 0.

98
ABAP Training
message e100. no existem materiais
endif.

if not ( T_MARA[] IS INITIAL ). se a tabela no estiver vazia


esse commando redundante pois j foi feita
a verificao do sy-subrc, mas serve para
exemplificar o seu uso

SELECT MATNR
WERKS
FROM MARC
INTO TABLE T_MARC
FOR ALL ENTRIES IN T_MARA
WHERE MATNR = T_MARA-MATNR
AND WERKS IN SO_WERKS.

endif.

ENDFORM. " F_SELECT_DATA

*&---------------------------------------------------------------------*
*& Form F_PRINT_REPORT
*&---------------------------------------------------------------------*
* Imprime o report *
*----------------------------------------------------------------------*
FORM F_PRINT_REPORT.

ULINE.
FORMAT COLOR COL_HEADING.
WRITE: /02 'Material',
25 'Tipo de Material',
40 'Centro'.
FORMAT COLOR COL_BACKGROUND.

FORMAT COLOR COL_NORMAL.

* Ordena as tabelas internas pela mesma chave para agilizar a leitura

SORT T_MARA BY MATNR.


SORT T_MARC BY MATNR.

LOOP AT T_MARC.

READ TABLE T_MARA WITH KEY MATNR = T_MARC-MATNR BINARY SEARCH.


IF SY-SUBRC EQ 0.
T_FINAL-MATNR = T_MARA-MATNR.
T_FINAL-MTART = T_MARA-MTART.
T_FINAL-WERKS = T_MARC-WERKS.

99
ABAP Training

APPEND T_FINAL.
ENDIF. se encontrou dados da tabela interna t_mara.

ENDLOOP.

* Ordena a tabela final por centro, tipo e material


SORT T_FINAL BY WERKS MTART MATNR

v_color = 1. " Inicia variavel de cor .

LOOP AT T_FINAL.

* lgica para alternar as cores de impresso a cada centro, para facilitar a


visualizao
on change of t_final-werks. a cada mudana de centro
if v_color = 1. verifica a ltima cor utilizada e usa a outra
v_color = 2.
format color 2.
else.
v_color = 1.
format color 4.
endif.
endon.

WRITE: /
02 T_FINAL-MATNR HOTSPOT, o comando hotspot facilita a seleo da
linha
25 T_FINAL-MTART, pelo usurio, necessitando apenas
um clique.
40 T_FINAL-WERKS.

hide: t_final-matnr. " armazena a varivel para o comando at line-selection

ENDLOOP.

FORMAT COLOR COL_BACKGROUND.

DESCRIBE TABLE T_FINAL LINES V_TOTAL.

FORMAT COLOR COL_TOTAL.


WRITE: /02 'TOTAL DE MATERIAIS LIDOS: ', V_TOTAL.

ENDFORM. " F_PRINT_REPORT

100
ABAP Training
RESOLUO 2

************************************************************************
*
* ********************************************
* * Confidencial e Proprietrio *
* * Copyright 2001, Accenture *
* * Todos os direitos reservados *
* ********************************************
*
* Nome do Shell: Z_TEMPLATE_REPORT Verso do Shell: v1.03
*
************************************************************************
* Nome do Programa : Z_TEMPLATE_REPORT
* Ttulo do Programa : Shell - ABAP/4 List Report
* Programador : Aluno do curso de ABAP
* Data : 02/04/2001
* ltima atualizao : 03/04/2001
*
* Descrio : Este um programa para exibio dos documentos cont-
* beis, o tipo do documento, seu valor, fornecedor e
* tipo
* Include :
*
* Calls :
*
* Mdulos de Funes:
*
*----------------------------------------------------------------------*
* Lista de Modificaes:
* Data Autor Corr. # Descrio
* 02/04/2001 ABAPDEV1 AF1K900023 Desenvolvimento inicial do prg
*
************************************************************************
REPORT Z_EXC_REPORT_2_AL06_D
no standard page heading "No mostra o cabealho padro SAP
line-size 170 "Largura do report de 170 caracteres
line-count 58 "Comprimento do report de 58 caracteres
message-id zabap. "Classe de mensagens ZABAP
*RESERVE 8 LINES. "Pelo menos n linhas sero impressas na ltima
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>"
* " SESSO DE DECLARAO DE DADOS "
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>"
************************************************************************
* Includes *
************************************************************************
*INCLUDE:
*

************************************************************************

101
ABAP Training
* Tabelas
************************************************************************
tables: bkpf,
bseg.

************************************************************************
* Dados:
* Constantes (C_...)
* Variaveis (V_...)
* Tabelas Internas (I_...)
************************************************************************
*- Constantes ---------------------------------------------------------*
*DATA:
* C_..

*- Variveis ---------------------------------------------------------*

*- Tabela Interna -----------------------------------------------------*

* TABELA DOS CABEALHOS DOS DOCUMENTOS


DATA: BEGIN OF I_bkpf OCCURS 100,
bukrs like bkpf-bukrs,
belnr like bkpf-belnr,
gjahr like bkpf-gjahr,
blart like bkpf-blart,
END OF I_bkpf.

* TABELA DOS ITENS DOS DOCUMENTOS


DATA: BEGIN OF I_bseg OCCURS 200,
bukrs like bseg-bukrs,
belnr like bseg-belnr,
gjahr like bseg-gjahr,
wrbtr like bseg-wrbtr,
lifnr like bseg-lifnr,
END OF I_bseg.

* TABELA FINAL
DATA: BEGIN OF I_final OCCURS 200,
bukrs like bkpf-bukrs,
belnr like bkpf-belnr,
blart like bkpf-blart,
gjahr like bseg-gjahr,
wrbtr like bseg-wrbtr,
lifnr like bseg-lifnr,
END OF I_final.

************************************************************************
* Parmetros de entrada :
* Select Options (S_...)
* Parameters (P_...)
************************************************************************
selection-screen begin of block b1.

102
ABAP Training
select-options:
s_belnr for bkpf-belnr obligatory,
s_gjahr for bseg-gjahr obligatory.
selection-screen end of block b1.

"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>"
" SESSO DE PROCESSAMENTO "
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>"
*----------------------------------------------------------------------*
initialization. "Logica para defaults "inteligentes"

*----------------------------------------------------------------------*
T1 = 'Entre com os parmetros de seleo'.

*----------------------------------------------------------------------*
at selection-screen. "Tratamento de Erros e lgica para tela de seleo
*----------------------------------------------------------------------*
* verifica se o ano vlido
select belnr up to 1 rows
from bkpf
into bkpf-belnr
where belnr in s_belnr.
endselect.

if sy-subrc ne 0.
message e013. " no existem documentos para esse exerccio
endif.

* verifica se o documento vlido


select belnr up to 1 rows
from bkpf
into bkpf-belnr
where gjahr in s_gjahr.
endselect.

if sy-subrc ne 0.
message e014. " no existe o documento informado
endif.

* verifica se o documento vlido para aquele exerccio contbil


select belnr up to 1 rows
from bkpf
into bkpf-belnr
where belnr in s_belnr
and gjahr in s_gjahr.
endselect.

if sy-subrc ne 0.
message e015. " no existem documentos/ano informados
endif.

103
ABAP Training
*----------------------------------------------------------------------*
start-of-selection. "Processamento principal
*----------------------------------------------------------------------*
perform f_select_data.
perform f_print_report.

*----------------------------------------------------------------------*
end-of-selection. "Fim do processamento principal
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
top-of-page. "Cabealho (Aparece sempre no topo da tela.)
*----------------------------------------------------------------------*

format color 2.
write: 'Tipo de Documento',
20 ' Montante',
36 'Conta do Fornecedor'.

*----------------------------------------------------------------------*
end-of-page. "Rodap
*----------------------------------------------------------------------*

"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>"
" SESSO DE FORMS "
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>"

*&---------------------------------------------------------------------*
*& Form F_SELECT_DATA
*&---------------------------------------------------------------------*
* Seleciona dados e armazena-os na tabela interna
*----------------------------------------------------------------------*
form f_select_data.

select bukrs
belnr
gjahr
blart
from bkpf
into table i_bkpf
where belnr in s_belnr
and gjahr in s_gjahr.

select bukrs
belnr
gjahr
wrbtr
lifnr
from bseg

104
ABAP Training
into table i_bseg
for all entries in i_bkpf
where bukrs eq i_bkpf-bukrs
and belnr eq i_bkpf-belnr
and gjahr eq i_bkpf-gjahr.

loop at i_bkpf.
read table i_bseg with key bukrs = i_bkpf-bukrs
belnr = i_bkpf-belnr
gjahr = i_bkpf-gjahr.
if sy-subrc eq 0.
i_final-bukrs = i_bkpf-bukrs .
i_final-belnr = i_bkpf-belnr .
i_final-blart = i_bkpf-blart .
i_final-gjahr = i_bkpf-gjahr .
i_final-wrbtr = i_bseg-wrbtr .
i_final-lifnr = i_bseg-lifnr .
append i_final.
endif.
endloop.

endform. " F_SELECT_DATA

*&---------------------------------------------------------------------*
*& Form F_PRINT_REPORT
*&---------------------------------------------------------------------*
* Imprime o report *
*----------------------------------------------------------------------*
form f_print_report.

*write: 'Tipo de Documento', 20 'Montante', 35 'Conta do Fornecedor'.

format color 1.

loop at i_final.
write: /7 i_final-blart,
20 i_final-wrbtr,
40 i_final-lifnr , ' '.
endloop.

105
ABAP Training
Exemplo 1:
O exemplo abaixo um programa de impresso de etiquetas com cdigo de barras
que mostra a flexibilidade que o programador tem para criar uma tela de seleo
sem precisar utilizar Online. No caso abaixo, a tela de seleo muda e preenchida
de acordo com os parmetros informados pelo usurio.
************************************************************************ V_FLAG_IMED VALUE 'X', " Flag de impresso
* V_FLAG_KEEP VALUE 'X', " Deixa no spool
* ******************************************** C_DIAS TYPE I VALUE '3'. " No. de dias no spool
* * Confidencial e Proprietrio
* * Copyright 2001, Accenture
* * Todos os direitos reservados *- Variaveis ---------------------------------------------------------*
* ******************************************** DATA:
* V_NUM_ITENS TYPE I, " mmero total de itens por OT
* Nome do Shell: YBRA001 Verso do Shell: v1.02 V_QTD_T LIKE LTAP-NISTA, " Quantidade total acumulada
* V_POS_ITEM LIKE SY-TABIX, " Armazena a pos. item na tabela interna
************************************************************************ V_ETIQ_OT TYPE C, " indicador para impresso de etiquetas
* Nome do Programa : ZMRW0010 " criadas com OT
* Ttulo do Programa : Etiqueta de identificao do material V_RESPOSTA TYPE C. " Resposta da Janela Pop-up
* ( WM / Matria-prima )
* Programador : Antonio Celso Hunnicutt Cortada *- Tabela Interna -----------------------------------------------------*
* Data : 10/05/2000
* ltima atualizao : 10/05/2000 * Tabela interna que armazenar os dados da Ordem de transferncia
* DATA: BEGIN OF I_LTAP OCCURS 0,
* Descrio : Este um programa report para imprimir as etiquetas de LGNUM LIKE LTAP-LGNUM, " Sistema de depsito
* identificao do material TANUM LIKE LTAP-TANUM, " N OT
* TAPOS LIKE LTAP-TAPOS, " N Item
*----------------------------------------------------------------------* MATNR LIKE LTAP-MATNR, " Cdigo do material
* Lista de Modificaes: NLPLA LIKE LTAP-NLPLA, " Local
* Data Autor Corr. # Descrio NISTA LIKE LTAP-NISTA, " Quantidade ingressada
* 10/05/2000 AC@CORTADAA MD0K921423 Desenvolvimento inicial WDATU LIKE LTAP-WDATU. " Data EM
do prg DATA: END OF I_LTAP.
* 24/05/2000 AC@CORTADAA MD0K922285 Desenvolv.do prog.
continuao * tabela interna que armazenar os dados das etiquetas criadas com OT
************************************************************************ DATA: BEGIN OF I_ETIQUETAS OCCURS 0,
REPORT ZMRW0010 MATNR LIKE LTAP-MATNR, " Cdigo do material
NO STANDARD PAGE HEADING "No mostra o cabealho padro SAP QTD LIKE LTAP-NISTA, " Quantidade
LINE-SIZE 170 "Largura do report de 170 caracteres LOCAL LIKE LTAP-NLPLA, " Local
LINE-COUNT 58 "Comprimento do report de 58 caracteres DATA LIKE LTAP-WDATU. " Data EM
MESSAGE-ID ZM. "Classe de mensagens ZM DATA: END OF I_ETIQUETAS.

RESERVE 8 LINES. "Pelo menos n linhas sero impressas na ltima ************************************************************************


pgina * Parmetros de entrada :
* Select Options (S_...)
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>> * Parameters (P_...)
>>>>>>>>>>>>>>>>>" ************************************************************************
" SESSO DE DECLARAO DE DADOS "
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>> PARAMETERS:
>>>>>>>>>>>>>>>>>" P_ET_OT RADIOBUTTON GROUP G1, " Opo Etiqueta por OT
************************************************************************ P_ET_MAN RADIOBUTTON GROUP G1, " Opo Etiqueta Manual
* Includes * P_ET_COD RADIOBUTTON GROUP G1. " Opo Etiqueta Cdigo Barras
************************************************************************
INCLUDE: SELECTION-SCREEN ULINE. " linha de separao
ZZIHEADR. "Cabealho padro de report
PARAMETERS:
************************************************************************ P_PRINT LIKE TSP01-RQDEST. " Impressora
* Tabelas
************************************************************************ SELECTION-SCREEN ULINE. " linha de separao
TABLES:
LTAP. " Item de ordem de transferncia SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE T1.
PARAMETERS:
P_SD LIKE LTAP-LGNUM MODIF ID M1, " Sistema de Depsito
P_OT LIKE LTAP-TANUM MODIF ID M1, " N OT
************************************************************************ P_ITEM LIKE LTAP-TAPOS MODIF ID M1, " N Item
* Dados: P_MAT LIKE LTAP-MATNR MODIF ID M2, " N Material
* Constantes (C_...) P_LOCAL LIKE LTAP-NLPLA MODIF ID M2, " Local
* Variaveis (V_...) P_DATA LIKE LTAP-WDATU MODIF ID M2, " Data EM
* Tabelas Internas (I_...) P_NUM_ET TYPE P DECIMALS 0 MODIF ID M2, " Nmero de Etiquetas
************************************************************************ P_QTD_ET LIKE LTAP-NISTA MODIF ID M2, " Qtde por Etiqueta
*- Constantes ---------------------------------------------------------* P_QTD_A LIKE LTAP-NISTA MODIF ID M5, " Qtd acumulada
DATA: P_QTD_T LIKE LTAP-NISTA MODIF ID M4, " Qtd total
* constantes utilizadas na programao da impressora para impresso P_QTD_I LIKE LTAP-NISTA MODIF ID M5, " Qtd inserida
das P_DIFER LIKE LTAP-NISTA MODIF ID M4. " Diferena entre qtd.
* etiquetas " Total e inserida
C_FIM_LINHA(3) VALUE '^FS', " trmino da linha
C_INI_ET(3) VALUE '^XA', " incio etiqueta SELECTION-SCREEN END OF BLOCK B1.
C_FIM_ET1(4) VALUE '^MMC', " fim etiqueta 1
C_FIM_ET2(3) VALUE '^XZ', " fim etiqueta 2 SELECTION-SCREEN PUSHBUTTON /10(20) T3 USER-COMMAND GRAV
C_ESPANHOL VALUE 'S', " cd. espanhol MODIF ID M1.
C_SIM VALUE 'J'. " Sim (Ja) SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE T2.
PARAMETERS:
* Dados para controle de spool da impressora definida
DATA: C_COPIAS TYPE I VALUE '1', " Nmero de cpias P_DADO(15) MODIF ID M3, " Dados para criao cdigo de barras

106
ABAP Training
P_COPIA(3) TYPE N MODIF ID M3. " nmero de etiquetas de cd barras PERFORM F_CALC_QUANTIDADE.
V_QTD_T = V_QTD_T + ( P_QTD_ET * P_NUM_ET ).
SELECTION-SCREEN END OF BLOCK B2.
IF P_DIFER EQ SPACE. " se a diferenca com quantidade recebida = 0.
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>> * verifica se existem mais tens.
>>>>>>>>>>>>>>>>>" IF V_POS_ITEM NE V_NUM_ITENS. " se existirem mais itens
" SESSO DE PROCESSAMENTO " * inicializa as quantidades para o prximo registro
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>> CLEAR: V_QTD_T,
>>>>>>>>>>>>>>>>>" P_QTD_T.
*----------------------------------------------------------------------*
INITIALIZATION. "Logica para defaults "inteligentes" * passa os dados do prximo item para o parmetro
*----------------------------------------------------------------------* V_POS_ITEM = V_POS_ITEM + 1. " ndice do prximo item
IF SY-LANGU EQ C_ESPANHOL. READ TABLE I_LTAP INDEX V_POS_ITEM. " le a tabela
T1 = 'Crear Etiqueta con OT'. P_MAT = I_LTAP-MATNR. " cdigo do material
T2 = 'Crear Cdigo de Barras'. P_LOCAL = I_LTAP-NLPLA. " Local
ELSE. P_DATA = I_LTAP-WDATU. " Data EM
T1 = 'Criar Etiqueta com OT'. P_ITEM = I_LTAP-TAPOS. " Item
T2 = 'Criar Cdigo de Barras'. P_QTD_I = I_LTAP-NISTA. " Quantidade ingressada
ENDIF. P_NUM_ET = 1. " nmero de etiquetas
* calcula a quantidade acumulada
T3 = 'Gravar dados Item'. PERFORM F_CALC_QUANTIDADE.
ELSE. " se for ltimo item
IF P_OT EQ SPACE. " Se a tela j contm dados (impresso com OT) MESSAGE I118 WITH TEXT-007 " Criao de etiquetas completa
LOOP AT SCREEN. TEXT-008. " Executar o programa para imprimir
IF SCREEN-GROUP1 = 'M1' OR V_ETIQ_OT = C_SIM.
SCREEN-GROUP1 = 'M2' OR ENDIF. " se existirem mais itens
SCREEN-GROUP1 = 'M3' OR ENDIF. " se a diferenca com quantidade recebida = 0.
SCREEN-GROUP1 = 'M4' OR
SCREEN-GROUP1 = 'M5'. * Se usurio pressionar a tecla <ENTER>
SCREEN-INPUT = 0. ELSEIF SY-UCOMM NE 'GRAV' AND SY-UCOMM NE 'ONLI'.
SCREEN-OUTPUT = 0. IF P_SD NE SPACE " se Sist. Dep. estiver preenchido e
SCREEN-INVISIBLE = 1. P_OT NE SPACE " se ot estiver preenchida e
MODIFY SCREEN. AND P_ITEM EQ SPACE. " se item estiver vazio.
ENDIF. * seleciona dados da OT
ENDLOOP. SELECT LGNUM " Sistema de depsito
ENDIF. TANUM " N OT
TAPOS " N Item
* limpa variveis de trabalho MATNR " Cdigo do material
PERFORM F_LIMPA_VARIAVEIS. NLPLA " Local
NISTA " Quantidade ingressada
*----------------------------------------------------------------------* WDATU " Data EM
*AT SELECTION-SCREEN. "Tratamento de Erros e lgica para tela de FROM LTAP
seleo INTO TABLE I_LTAP
*----------------------------------------------------------------------* WHERE LGNUM EQ P_SD " sistema de depsito
AND TANUM EQ P_OT. " nmero da OT
AT SELECTION-SCREEN OUTPUT. IF SY-SUBRC NE 0. " se no encontrar registro, mensagem de erro
MESSAGE E005. " no foram encontrados dados
* seleo do ttulo do box a ser exibido na tela de seleo ENDIF. " se no encontrar registro, mensagem de erro
IF SY-LANGU EQ C_ESPANHOL. " Se idioma for espanhol
IF P_ET_OT EQ 'X'. " se for criao de etiqueta por OT * detemina o nmero total de itens
T1 = 'Crear Etiqueta con OT'. DESCRIBE TABLE I_LTAP LINES V_NUM_ITENS.
ELSEIF P_ET_MAN EQ 'X'. " se for criao de etiqueta manual
T1 = 'Crear Etiqueta Manual'. READ TABLE I_LTAP INDEX 1. " L O PRIMEIRO MATERIAL
ENDIF. " se for criao de etiqueta por OT
ELSE. " se for outro idioma * armazena a posio do item (para verificar se existem mais itens)
IF P_ET_OT EQ 'X'. " se for criao de etiqueta por OT V_POS_ITEM = SY-TABIX.
T1 = 'Criar Etiqueta com OT'.
ELSEIF P_ET_MAN EQ 'X'. " se for criao de etiqueta manual P_MAT = I_LTAP-MATNR. " cdigo do material
T1 = 'Criar Etiqueta Manual'. P_LOCAL = I_LTAP-NLPLA. " Local
ENDIF. " se for criao de etiqueta por OT P_DATA = I_LTAP-WDATU. " Data EM
ENDIF. " Se idioma for espanhol P_ITEM = I_LTAP-TAPOS. " Item
P_QTD_I = I_LTAP-NISTA. " Quantidade ingressada
* determina quais campos devem ser visualizados em funo da seleo
* do usurio ELSEIF P_SD NE SPACE AND " Se o Sistema de depsito estiver pr.
PERFORM F_DETERMINA_CAMPOS. P_OT NE SPACE AND " Se N OT estiver preenchido e
P_ITEM NE SPACE. " N item tambm
AT SELECTION-SCREEN. * L os dados da OT
READ TABLE I_LTAP WITH KEY LGNUM = P_SD " sistema de
IF P_ET_OT EQ 'X'. " se criao de etiqueta por OT depsito
IF SY-UCOMM EQ 'GRAV'. TANUM = P_OT " nmero da OT
* verfica se o nmero de etiquetas a ser impresso diferente de zero. TAPOS = P_ITEM. " nmero do item
IF P_NUM_ET EQ SPACE. " se o nmero etiquetas estiver preenchido IF SY-SUBRC NE 0. " se no encontrar registro
MESSAGE E118 WITH TEXT-009. " preencher o nmero de etiquetas MESSAGE E005. " no foram encontrados dados
ENDIF. ENDIF. " se no encontrar registro

* grava os dados da etiqueta a ser impressa em uma tabela * armazena a posio do item (para verificar se existem mais itens)
* interna i_etiquetas, passa os valores do prximo item para os V_POS_ITEM = SY-TABIX.
* parmetros, calcula a quantidade total acumulada (v_qtd_t)
* e volta pra tela de seleo * atribui os dados da OT para os parmetros de entrada
DO P_NUM_ET TIMES. " grava os dados n vezes,conforme P_MAT = I_LTAP-MATNR. " cdigo do material
parmetro P_LOCAL = I_LTAP-NLPLA. " Local
I_ETIQUETAS-MATNR = P_MAT. " cdigo material P_DATA = I_LTAP-WDATU. " Data EM
I_ETIQUETAS-QTD = P_QTD_ET. " quantidade por etiqueta P_QTD_I = I_LTAP-NISTA. " Quantidade ingressada
I_ETIQUETAS-LOCAL = P_LOCAL. " local
I_ETIQUETAS-DATA = P_DATA. " data ENDIF. " se item estiver vazio.
APPEND I_ETIQUETAS. " grava dados na tabela interna
ENDDO. " grava os dados n vezes, conforme par. * calcula a quantidade acumulada
* calcula as quantidades IF P_NUM_ET NE SPACE. " se o nmero etiquetas estiver preenchido

107
ABAP Training
IF P_QTD_ET NE SPACE. " se a qtde por etiqueta estiver preenchida *----------------------------------------------------------------------*
P_QTD_A = P_QTD_ET * P_NUM_ET. " Qtd. acumulada
P_QTD_T = V_QTD_T + P_QTD_A. " Total Qtde. acumulada
IF P_QTD_I >= P_QTD_T. " se diferena for positiva "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>
P_DIFER = P_QTD_I - P_QTD_T. " Diferena >>>>>>>>>>>>>>>>>>>>>>>>>>>"
ELSE. " se diferena menor que zero. " SESSO DE FORMS "
MESSAGE E118 WITH TEXT-010. " Qtd. Total > Qtd. Ingressada "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>
ENDIF. " se diferena for positiva >>>>>>>>>>>>>>>>>>>>>>>>>>>"
ELSE. " se a qtde por etiqueta estiver vazia
P_QTD_ET = P_QTD_I / P_NUM_ET. " Qtd por etiqueta *&---------------------------------------------------------------------*
P_QTD_A = P_QTD_ET * P_NUM_ET. " Qtd. acumulada *& Form F_IMPRIME_ETIQ_OT
P_QTD_T = V_QTD_T + P_QTD_A. " Total Qtde. acumulada *&---------------------------------------------------------------------*
IF P_QTD_I >= P_QTD_T. " se diferena for positiva * Imprime a etiqueta por OT
P_DIFER = P_QTD_I - P_QTD_T. " Diferena *----------------------------------------------------------------------*
ELSE. " se diferena menor que zero. FORM F_IMPRIME_ETIQ_OT.
MESSAGE E118 WITH TEXT-010. " Qtd. Total > Qtd. Ingressada
ENDIF. " se diferena for positiva * declarao de dados locais
ENDIF. " se a qtde por etiqueta estiver preenchida DATA: V_QTD(6) TYPE N. " quantidade por etiqueta
ELSE. " se o nmero etiquetas estiver vazio
CLEAR: P_QTD_A. " Qtd. acumulada * Leitura da tabela com os dados da OT
ENDIF. " se o nmero etiquetas estiver preenchido
LOOP AT I_ETIQUETAS. " Leitura da tabela com os dados da OT
ENDIF. " se usurio pressionou boto
ELSEIF P_ET_MAN EQ 'X'. " se criao de etiqueta manual. * passa o contedo do campo i_etiquetas-qtd para a varivel v_qtd, para
* limpa as variveis * que apaream os caracteres 0 esquerda para completar o campo.
CLEAR: P_SD, " Sistema de Depsito V_QTD = I_ETIQUETAS-QTD.
P_OT, " N OT
P_ITEM, " N Item * palavra material
P_QTD_I, " Nmero de Etiquetas WRITE:/ '^FO560,040^A0R45,36^FR^FDMATERIAL^FS',
P_QTD_T, " Qtd total * codigo do material
P_DIFER. " Diferena entre qtd. / '^FO440,304^A0R140,100^FR^FD' NO-GAP,
" Total e inserida I_ETIQUETAS-MATNR NO-GAP,'^FS',
* linha vertical
* calcula a quantidade acumulada / '^FO400,000^GB000,1200,2^FS',
P_QTD_A = P_QTD_ET * P_NUM_ET. " Qtd. acumulada * palavra cantidad
/ '^FO352,040^A0R45,36^FR^FDCANTIDAD^FS',
* Se for impresso de cdigo de barras * qtd do material
ELSE. " se for impresso de cdigo de barras / '^FO232,104^A0R140,100^FR^FD' NO-GAP,
V_QTD NO-GAP,'^FS',
ENDIF. " se criao de etiqueta por OT * linha horizontal
/ '^FO184,640^GB000,0216,2^FS',
*----------------------------------------------------------------------* * palavra ubicacin de ingreso
START-OF-SELECTION. "Processamento principal * OBS.: dependendo do modela de impressora zebra no possvel
*----------------------------------------------------------------------* acentua-
* o, portanto, no foram utilizados acentos
* Se a opo for criar etiquetas com OT / '^FO352,680^A0R45,36^FR^FDUBICACION DE INGRESO^FS',
IF P_ET_OT EQ 'X'. " Se impresso etiqueta com OT * codigo ubicacion de ingreso
* verifica se terminou criao de etiquetas com OT / '^FO680,240^A0R140,100^FR^FD' NO-GAP,
IF V_ETIQ_OT NE C_SIM. " se no terminou criao com OT I_ETIQUETAS-LOCAL NO-GAP,'^FS',
* Se existirem, envia mensagem de erro * palavra transporte
MESSAGE E118 WITH TEXT-011 " Criao no terminada / '^FO128,040^A0R140,100^FR^FDTRANSPORTE^FS',
TEXT-006. " impresso cancelada * codigo de barras do transporte (material+Qtd por etiqueta)
ENDIF. " se terminou criao com OT / '^FO016,040^BY3^BCR,080,Y,N,N^FV' NO-GAP,
ENDIF. " Se impresso etiqueta com OT I_ETIQUETAS-MATNR(10) NO-GAP,V_QTD NO-GAP,'^FS',
* linha horizontal
* Chama uma janela para confirmar a impresso / '^FO000,952^GB000,0184,2^FS',
PERFORM F_CONFIRMA_IMPRESSAO. * palavra fecha em
/ '^FO128,960^A0R140,100^FR^FDFECHA EM^FS',
* Define sada para impressora * variavel fecha em
* PERFORM F_DEF_IMPR. / '^FO128,040^A0R140,100^FR^FD' NO-GAP,
I_ETIQUETAS-DATA NO-GAP,'^FS'.
* inicializa a impressora.
PERFORM F_INICIALIZA_IMPRESSORA. ENDLOOP. " Leitura da tabela com os dados da OT

* verificao do layout etiquetas a ser impresso ENDFORM. " F_IMPRIME_ETIQ_OT


IF P_ET_OT EQ 'X'. " Se impresso etiqueta com OT
PERFORM F_IMPRIME_ETIQ_OT. " imprime layout etiqueta com OT *&---------------------------------------------------------------------*
ELSEIF P_ET_MAN EQ 'X'. " Se impresso etiqueta manual *& Form F_IMPRIME_ETIQ_MAN
PERFORM F_IMPRIME_ETIQ_MAN. " imprime layout etiqueta manual *&---------------------------------------------------------------------*
ELSE. " se for imp. cd barras * Imprime a etiqueta
IF P_DADO EQ SPACE. " se parmetro estiver vazio *----------------------------------------------------------------------*
MESSAGE E037. " mensagem de erro. FORM F_IMPRIME_ETIQ_MAN.
ENDIF. " se parmetro estiver vazio
PERFORM F_IMPRIME_COD_BARRAS. " imprime layout etiqueta cd. * declarao de dados locais
barras DATA: V_QTD(6) TYPE N. " quantidade por etiqueta
ENDIF. " Verificao layout a ser impresso
* passa o contedo do campo P_QTD_ET para a varivel v_qtd, para
*----------------------------------------------------------------------* * que apaream os caracteres 0 esquerda para completar o campo.
END-OF-SELECTION. "Fim do processamento principal V_QTD = P_QTD_ET.
*----------------------------------------------------------------------*
DO P_NUM_ET TIMES. " imprime a etiqueta X vezes, conforme par.
entrada
*----------------------------------------------------------------------*
TOP-OF-PAGE. "Cabealho (Aparece sempre no topo da tela.) * palavra material
*----------------------------------------------------------------------* WRITE:/ '^FO560,040^A0R45,36^FR^FDMATERIAL^FS',
* codigo do material
*----------------------------------------------------------------------* / '^FO440,304^A0R140,100^FR^FD' NO-GAP,P_MAT NO-
END-OF-PAGE. "Rodap GAP,'^FS',

108
ABAP Training
* linha vertical *----------------------------------------------------------------------*
/ '^FO400,000^GB000,1200,2^FS', * FORM F_INICIALIZA_IMPRESSORA
* palavra cantidad * inicializa a impressora
/ '^FO352,040^A0R45,36^FR^FDCANTIDAD^FS', *----------------------------------------------------------------------*
* qtd do material FORM F_INICIALIZA_IMPRESSORA.
/ '^FO232,104^A0R140,100^FR^FD' NO-GAP,V_QTD NO- * Inicializa a impressora
GAP,'^FS',
* linha horizontal WRITE:/ '^XA'.
/ '^FO184,640^GB000,0216,2^FS', WRITE:/ '^MCY^FS'.
* palavra ubicacin de ingreso WRITE:/ '^XZ'.
* OBS.: dependendo do modela de impressora zebra no possvel WRITE:/ '^XA'.
acentua- WRITE:/ '^PRC'.
* o, portanto, no foram utilizados acentos WRITE:/ '^LL410'.
/ '^FO352,680^A0R45,36^FR^FDUBICACION DE INGRESO^FS', WRITE:/ '^MMT'.
* codigo ubicacion de ingreso WRITE:/ '^XZ'.
/ '^FO680,240^A0R140,100^FR^FD' NO-GAP,P_LOCAL NO-
GAP,'^FS', ENDFORM. " FORM F_INICIALIZA_IMPRESSORA
* palavra transporte
/ '^FO128,040^A0R140,100^FR^FDTRANSPORTE^FS', *----------------------------------------------------------------------*
* codigo de barras do transporte (material+Qtd por etiqueta) * FORM F_CALC_QUANTIDADE
/ '^FO016,040^BY3^BCR,080,Y,N,N^FV', * Calcula as quantidades acumulada, total da OT e a diferena entre a
I_ETIQUETAS-MATNR(10) NO-GAP,V_QTD NO-GAP,'^FS', * qtde recebida e a total
* linha horizontal *----------------------------------------------------------------------*
/ '^FO000,952^GB000,0184,2^FS', FORM F_CALC_QUANTIDADE.
* palavra fecha em
/ '^FO128,960^A0R140,100^FR^FDFECHA EM^FS', IF P_QTD_ET NE SPACE. " se a qtde por etiqueta estiver preenchida
* variavel fecha em P_QTD_A = P_QTD_ET * P_NUM_ET. " Qtd. acumulada
/ '^FO128,040^A0R140,100^FR^FD' NO-GAP,P_DATA NO- P_QTD_T = V_QTD_T + P_QTD_A. " Total Qtde. acumulada
GAP,'^FS'. IF P_QTD_I >= P_QTD_T. " se diferena for positiva
P_DIFER = P_QTD_I - P_QTD_T. " Diferena
ENDDO. " imprime a etiqueta X vezes, conforme par. entrada ELSE. " se diferena menor que zero.
MESSAGE E118 WITH TEXT-010. " Qtd. Total > Qtd. Ingressada
ENDFORM. " F_IMPRIME_ETIQ_MAN ENDIF. " se diferena for positiva
ELSE. " se a qtde por etiqueta estiver vazia
*&---------------------------------------------------------------------* P_QTD_ET = P_QTD_I / P_NUM_ET. " Qtd por etiqueta
*& Form F_IMPRIME_COD_BARRAS. P_QTD_A = P_QTD_ET * P_NUM_ET. " Qtd. acumulada
*&---------------------------------------------------------------------* P_QTD_T = V_QTD_T + P_QTD_A. " Total Qtde. acumulada
* Imprime a etiqueta IF P_QTD_I >= P_QTD_T. " se diferena for positiva
*----------------------------------------------------------------------* P_DIFER = P_QTD_I - P_QTD_T. " Diferena
FORM F_IMPRIME_COD_BARRAS. ELSE. " se diferena menor que zero.
MESSAGE E118 WITH TEXT-010. " Qtd. Total > Qtd. Ingressada
* declarao de dados locais ENDIF. " se diferena for positiva
DATA: ENDIF. " se a qtde por etiqueta estiver preenchida
C_COM_CB(35) " comando para imprimir em cdigo de barras
VALUE '^FO440,040^BY3^BCR,248,Y,N,N^FV', ENDFORM. " FORM F_CALC_QUANTIDADE
C_COM_CARAC(24) VALUE '^FO576,040^A0R140,100^FR^FD',
V_COD_BARRA(52). " armazena a string impresso cd. barras *----------------------------------------------------------------------*
* FORM F_DETERMINA_CAMPOS
* inicializa a varivel que armazenar a string para imp. cd. barras * Determina quais campos devem ser mostrados, depedendo da seleo
CLEAR V_COD_BARRA. do
* usurio
* monta a string de impresso em cd barras. *----------------------------------------------------------------------*
CONCATENATE C_COM_CB P_DADO C_FIM_LINHA INTO V_COD_BARRA. FORM F_DETERMINA_CAMPOS.
* Alterao dos parmetros da tela em funo do layout a ser imprimido
DO P_COPIA TIMES. " imprime a etiqueta X vezes, conforme par. IF P_ET_OT EQ 'X'. " se criao de etiqueta por OT
entrada LOOP AT SCREEN. " leitura dos parmetros da tela
IF SCREEN-GROUP1 = 'M1' OR " Se id do parmetro for M1 ou M2
* inicializa a impressora. SCREEN-GROUP1 = 'M2'. " torna os campos visveis.
* PERFORM F_INICIALIZA_IMPRESSORA. SCREEN-INPUT = 1.
SCREEN-OUTPUT = 1.
WRITE:/ C_INI_ET, SCREEN-INVISIBLE = 0.
/ C_COM_CARAC , P_DADO, C_FIM_LINHA, ELSEIF SCREEN-GROUP1 = 'M3'. " se for grupo M3
/ V_COD_BARRA, SCREEN-INPUT = 0. " oculta os campos
/ C_FIM_ET1, SCREEN-OUTPUT = 0.
/ C_FIM_ET2. SCREEN-INVISIBLE = 1.
ELSEIF SCREEN-GROUP1 = 'M4' OR " se for grupo M4 ou M5
ENDDO. " imprime a etiqueta X vezes, conforme par. entr. SCREEN-GROUP1 = 'M5'. " bloqueia entrada do
SCREEN-INPUT = 0. " usurio
ENDFORM. " F_IMPRIME_COD_BARRAS SCREEN-OUTPUT = 1.
SCREEN-INVISIBLE = 0.
*&---------------------------------------------------------------------* ENDIF.
*& Form f_def_impr MODIFY SCREEN. " altera os parmetros da tela
* Imprime direto dos parmetros ENDLOOP. " leitura dos parmetros da tela
*&---------------------------------------------------------------------* ELSEIF P_ET_MAN EQ 'X'. " se criao de etiqueta manual
FORM F_DEF_IMPR. LOOP AT SCREEN. " leitura dos parmetros da tela
IF SCREEN-GROUP1 = 'M2'. " Se id do parmetro for M2
NEW-PAGE PRINT ON SCREEN-INPUT = 1. " exibe parmetro
DESTINATION P_PRINT SCREEN-OUTPUT = 1.
COPIES C_COPIAS SCREEN-INVISIBLE = 0.
IMMEDIATELY V_FLAG_IMED ELSEIF SCREEN-GROUP1 = 'M1' OR " se forem os grupos M1, M2
KEEP IN SPOOL V_FLAG_KEEP SCREEN-GROUP1 = 'M3' OR " M3 ou M4, oculta os campos
DATASET EXPIRATION C_DIAS SCREEN-GROUP1 = 'M4'.
NO DIALOG. SCREEN-INPUT = 0.
MESSAGE I019. " Processamento realizado com sucesso SCREEN-OUTPUT = 0.
SCREEN-INVISIBLE = 1.
ENDFORM. " form f_def_impr. ELSEIF SCREEN-GROUP1 = 'M5'. " se for grupo M5
*----------------------------------------------------------------------* SCREEN-INPUT = 0. " bloqueia entrada do
SCREEN-OUTPUT = 1. " usurio

109
ABAP Training
SCREEN-INVISIBLE = 0. EXCEPTIONS
ENDIF. OTHERS = 1.
MODIFY SCREEN. " altera os parmetros da tela IF V_RESPOSTA NE C_SIM. " Se resposta for no
ENDLOOP. " leitura dos parmetros da tela STOP. " sai do processamento
ELSE. " se criao de cdigo de barras ENDIF. " Se resposta for no
LOOP AT SCREEN. " leitura dos parmetros da tela
IF SCREEN-GROUP1 = 'M3'. " Se id do parmetro for M3 ENDFORM. " F_CONFIRMA_IMPRESSAO.
SCREEN-INPUT = 1. " mostra parmetros
SCREEN-OUTPUT = 1. *----------------------------------------------------------------------*
SCREEN-INVISIBLE = 0. * FORM F_LIMPA_VARIAVEIS.
ELSEIF SCREEN-GROUP1 = 'M1' OR " seno * Limpas as variveis utilizadas no processamento
SCREEN-GROUP1 = 'M2' OR *----------------------------------------------------------------------*
SCREEN-GROUP1 = 'M4' OR FORM F_LIMPA_VARIAVEIS.
SCREEN-GROUP1 = 'M5'.
SCREEN-INPUT = 0. " oculta parmetros CLEAR: I_LTAP,
SCREEN-OUTPUT = 0. I_ETIQUETAS,
SCREEN-INVISIBLE = 1. V_NUM_ITENS,
ENDIF. V_QTD_T,
MODIFY SCREEN. " altera os parmetros da tela V_POS_ITEM,
ENDLOOP. " leitura dos parmetros da tela V_ETIQ_OT,
ENDIF. " verificao do layout V_RESPOSTA,
P_SD,
ENDFORM. " FORM F_DETERMINA_CAMPOS P_OT,
P_ITEM,
*----------------------------------------------------------------------* P_MAT,
* FORM F_CONFIRMA_IMPRESSAO. P_LOCAL,
* Determina quais campos devem ser mostrados, depedendo da seleo P_DATA,
do P_NUM_ET,
* usurio P_QTD_ET,
*----------------------------------------------------------------------* P_QTD_A,
FORM F_CONFIRMA_IMPRESSAO. P_QTD_T,
* Chama a funo POPUP_TO_CONFIRM_STEP para o usurio confirmar a P_QTD_I,
* impresso P_DIFER,
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP' P_DADO,
EXPORTING P_COPIA.
DEFAULTOPTION = 'N'
TEXTLINE1 = TEXT-003 REFRESH: I_LTAP,
TITEL = TEXT-004 I_ETIQUETAS.
IMPORTING
ANSWER = V_RESPOSTA ENDFORM. " form f_limpa_variaveis.

110
ABAP Training
Exemplo 2:
O programa abaixo um exemplo de relatrio que permite a interao do usurio
na tela de exibio do relatrio, onde pode-se selecionar um valor para chamar
outra transao. Possui tambm o recurso de Drill-Down (expande o relatrio e
mostra mais detalhes), entre outros.

Alguns comandos utilizados:


At Line-Selection.
Set Pf-Status.
At User-Command
Call Transaction and skip first screen

************************************************************************ TVAUT. "Documentos de venda: motivos ordem: textos


*
* ******************************************** ************************************************************************
* * Confidencial e Proprietrio * Dados:
* * Copyright 2001, Accenture * Constantes (C_...)
* * Todos os direitos reservados * Variaveis (V_...)
* ******************************************** * Tabelas Internas (T_...)
* ************************************************************************
* Nome do Shell: YTRP0010 Verso do Shell: v1.01
* * Variaveis e Constantes ----------------------------------------------*
************************************************************************ DATA:
* Nome do Programa : ZSRG0030 V_FIELD(20), "Contm o campo clicado do report
* Ttulo do Programa : Gerenciamento de Contratos de Compra V_FNAME(20), "Contm o nome do campo
Antecipada V_VAR LIKE VBFA-RFMNG, "Auxiliar do clculo da qtde
* Programador : Programador 1 V_TIP_REL, "Tipo do relatrio
* Data : 03/02/2001 V_SUBTIT(50), "Subtitulo do relatrio
* ltima atualizao : 06/02/2001 V_COUNT TYPE I, "Contador de registros impressos
* V_TABIX LIKE SY-TABIX, "Varivel auxiliar para posicionar na I_VBFA2
* Descrio : Este relatrio ir mostrar as ordens do tipo ZVEF V_KWMENG TYPE I,
* com informaes de CCA, remessa de compra antecipada, V_RFMNGP TYPE I,
* recusas e devolues Contab. Estoque V_RFMNGR TYPE I,
* V_RFMNGE TYPE I,
* Include : V_RFMNGC TYPE I,
* V_RFMNG1 TYPE I,
* Calls : V_RFMNG2 TYPE I,
* V_RFMNG3 TYPE I,
* Mdulos de Funes: V_RFMNG4 TYPE I,
* V_RFMNG5 TYPE I,
*----------------------------------------------------------------------* V_RFMNG6 TYPE I.
* Lista de Modificaes:
* Data Autor Corr. # Descrio CONSTANTS:
* -------- ------------ ---------- ----------------------------------- C_REC_ZRVF LIKE VBAK-AUART VALUE 'ZRVF',
* 03/02/0199 AC@PROG1 MD0K915810 Desenvolvimento inicial do C_REC_ZRVR LIKE VBAK-AUART VALUE 'ZRVR',
prg C_DEV_ZDVF LIKE VBAK-AUART VALUE 'ZDVF',
************************************************************************ C_DEV_ZDVR LIKE VBAK-AUART VALUE 'ZDVR'.
REPORT ZSRG0030 MESSAGE-ID ZV
NO STANDARD PAGE HEADING DATA BEGIN OF I_BDCDATA OCCURS 0.
LINE-SIZE 234 INCLUDE STRUCTURE BDCDATA.
LINE-COUNT 65(4). DATA END OF I_BDCDATA.
************************************************************************
* Includes DATA:
************************************************************************ BEGIN OF I_VBAK OCCURS 0,
*include: VBELN LIKE VBAK-VBELN, "Ordem ZVEF
* zziheadr. "Cabealho padro de report BSTNK LIKE VBAK-BSTNK, "Numero do pedido
KUNNR LIKE VBAK-KUNNR, "Emissor da ordem
************************************************************************ END OF I_VBAK.
* Tabelas
************************************************************************ DATA:
TABLES: BEGIN OF I_VBAK1 OCCURS 0,
VBAK, "Documento de vendas: dados de cabealho VBELN LIKE VBAK-VBELN, "Ordem ZVEF
VBAP, "Documento de vendas: dados de item AUART LIKE VBAK-AUART, "Tipo de documento de venda
VBUK, "Documento VD: status de cabealho e dados AUGRU LIKE VBAK-AUGRU, "Motivo da ordem
administrativos VGBEL LIKE VBAK-VGBEL, "N documento do documento
M_J1BAB, "Tabela de referncia para achar a NF a partir da fatura modelo
J_1BNFDOC, "Cabealho da nota fiscal XBLNR LIKE VBAK-XBLNR, "N documento referncia
ZFA03A, "Faturamento Antecipado - Billing documents / Movement POSNR LIKE VBAP-POSNR, "Item ZVEF
types END OF I_VBAK1.
VBFA, "Fluxo de documentos de vendas e distribuio (VD)
VBRK, "Documento de faturamento: dados de cabealho DATA:
VBRP, "Documento de faturamento: dados de item BEGIN OF I_VBUK OCCURS 0,
LIKP, "Documento SD: fornecimento: dados de cabealho VBELN LIKE VBUK-VBELN, "Status de faturamento da Ordem
KNA1, "Mestre de clientes (parte geral) concluida
BKPF, "Cabealho do documento contbil END OF I_VBUK.

DATA:

111
ABAP Training
BEGIN OF I_VBAP OCCURS 0, ZZDENTR LIKE J_1BNFDOC-ZZDENTR, "Nota fiscal date: Data de
VBELN LIKE VBAP-VBELN, "Ordem ZVEF Entrada
POSNR LIKE VBAP-POSNR, "Item da ordem END OF I_BNFDOC.
MATNR LIKE VBAP-MATNR, "Material
KWMENG LIKE VBAP-KWMENG, "Quantidado do item na ordem DATA:
WERKS LIKE VBAP-WERKS, "Centro BEGIN OF I_ZFA03A OCCURS 0,
END OF I_VBAP. ABLNR LIKE ZFA03A-ABLNR, "Documento de venda
FBLNR LIKE ZFA03A-FBLNR, "Documento de faturamento
DATA: FKDAT LIKE ZFA03A-FKDAT, "Dt.faturamento p/ndice de
BEGIN OF I_VBFA OCCURS 0, docs.fatur
VBELV LIKE VBFA-VBELV, "Documento precedente MBLNR LIKE ZFA03A-MBLNR, "N documento de material
POSNV LIKE VBFA-POSNV, "Item precedente END OF I_ZFA03A.
VBELN LIKE VBFA-VBELN, "Documento subsequente
POSNN LIKE VBFA-POSNN, "Item subsequente DATA:
VBTYP_N LIKE VBFA-VBTYP_N, "Ctg.doc.subseq. BEGIN OF I_ZFA03A1 OCCURS 0,
RFMNG LIKE VBFA-RFMNG, "Quantidade ABLNR LIKE ZFA03A-ABLNR, "Documento de venda
FKTYP LIKE VBFA-FKTYP, "Ctg.doc.fat FBLNR LIKE ZFA03A-FBLNR, "Documento de faturamento
END OF I_VBFA. FKDAT LIKE ZFA03A-FKDAT, "Dt.faturamento p/ndice de
docs.fatur
DATA: MBLNR LIKE ZFA03A-MBLNR, "N documento de material
BEGIN OF I_VBFA1 OCCURS 0, END OF I_ZFA03A1.
VBELV LIKE VBFA-VBELV, "Documento precedente
POSNV LIKE VBFA-POSNV, "Item precedente DATA:
VBELN LIKE VBFA-VBELN, "Documento subsequente BEGIN OF I_KNA1 OCCURS 0,
POSNN LIKE VBFA-POSNN, "Item subsequente KUNNR LIKE KNA1-KUNNR, "Cdigo Emissor
RFMNG LIKE VBFA-RFMNG, "Quantidade NAME1 LIKE KNA1-NAME1, "Nome do Emissor
END OF I_VBFA1. END OF I_KNA1.

DATA: DATA:
BEGIN OF I_VBFA2 OCCURS 0, BEGIN OF I_LIKP OCCURS 0,
VBELV LIKE VBFA-VBELV, "Documento precedente VBELN LIKE LIKP-VBELN, "Fornecimento
POSNV LIKE VBFA-POSNV, "Item precedente ERNAM LIKE LIKP-ERNAM, "usurio que criou o objeto
VBELN LIKE VBFA-VBELN, "Documento subsequente ERDAT LIKE LIKP-ERDAT, "Data de criao do registro
POSNN LIKE VBFA-POSNN, "Item subsequente ROUTE LIKE LIKP-ROUTE, "Itinerrio
VBTYP_N LIKE VBFA-VBTYP_N, "Ctg.doc.subseq. WADAT LIKE LIKP-WADAT_IST, "Data real de sada de
END OF I_VBFA2. mercadoria
END OF I_LIKP.
DATA:
BEGIN OF I_VBFA3 OCCURS 0, DATA:
VBELV LIKE VBFA-VBELV, "Documento precedente BEGIN OF I_FINAL OCCURS 0,
POSNV LIKE VBFA-POSNV, "Item precedente FLAG TYPE C, "Flag para mostrar registro
VBELN LIKE VBFA-VBELN, "Documento subsequente VBELN LIKE VBAK-VBELN, "Ordem ZVEF
POSNN LIKE VBFA-POSNN, "Item subsequente POSNR LIKE VBAP-POSNR, "Item ZVEF
END OF I_VBFA3. BSTNK LIKE VBAK-BSTNK, "Numero do pedido
KUNNR LIKE VBAK-KUNNR, "Emissor
DATA: NAME1(20) TYPE C, "Descrio do emissor
BEGIN OF I_VBRK OCCURS 0, XBLNR(8) TYPE C, "Numero da Nota Fiscal
VBELN LIKE VBRK-VBELN, "Documento de faturamento DOCNUM LIKE M_J1BAB-DOCNUM, "No.Documento NF interno
FKDAT LIKE VBRK-FKDAT, "Data de faturamento FKDAT LIKE VBRK-FKDAT, "Data da emisso da Nota Fiscal
XBLNR LIKE VBRK-XBLNR, "Referncia - Nmero da NF WERKS LIKE VBAP-WERKS, "Centro
END OF I_VBRK. MATNR(10) TYPE C, "Material
KWMENG TYPE I, "Quantidade faturada
DATA: VBELNF LIKE VBFA-VBELN, "Ordem ZVFR
BEGIN OF I_VBRK1 OCCURS 0, RFMNGP TYPE I, "Qtde remessa a programar
VBELN LIKE VBRK-VBELN, "Documento de faturamento RFMNGR TYPE I, "Qtde remessa em remessa
FKDAT LIKE VBRK-FKDAT, "Data de faturamento RFMNGE TYPE I, "Qtde remessa expedido
XBLNR LIKE VBRK-XBLNR, "Referncia - Nmero da NF RFMNGC TYPE I, "Qtde remessa recebido
END OF I_VBRK1. RFMNG1 TYPE I, "ZRVF
RFMNG2 TYPE I, "ZRVR
DATA: RFMNG3 TYPE I, "ZDVF
BEGIN OF I_VBRK2 OCCURS 0, RFMNG4 TYPE I, "ZDVR
VBELN LIKE VBRK-VBELN, "Documento de faturamento RFMNG5 TYPE I, "Contab.Estq(S)
FKDAT LIKE VBRK-FKDAT, "Data de faturamento RFMNG6 TYPE I, "Contab.Estq(E)
XBLNR LIKE VBRK-XBLNR, "Referncia - Nmero da NF END OF I_FINAL.
BELNR LIKE BKPF-BELNR, "Documento contbil
END OF I_VBRK2. DATA:
BEGIN OF I_SOMA OCCURS 0,
DATA: KEYVALUE(37) TYPE C, "Chave
BEGIN OF I_VBRP2 OCCURS 0, KWMENG TYPE I, "Quantidade faturada
VBELN LIKE VBRP-VBELN, "Documento de faturamento RFMNGP TYPE I, "Qtde remessa a programar
POSNR LIKE VBRP-POSNR, "DItem de documento de RFMNGR TYPE I, "Qtde remessa em remessa
faturamen RFMNGE TYPE I, "Qtde remessa expedido
KZWI6 LIKE VBRP-KZWI6, "Subtotal-condio 6 do esquema RFMNGC TYPE I, "Qtde remessa recebido
END OF I_VBRP2. RFMNG1 TYPE I, "ZRVF
RFMNG2 TYPE I, "ZRVR
DATA: RFMNG3 TYPE I, "ZDVF
BEGIN OF I_J1BAB OCCURS 0, RFMNG4 TYPE I, "ZDVR
REFKEY LIKE M_J1BAB-REFKEY, "Documento faturamento RFMNG5 TYPE I, "Contab.Estq(S)
DOCNUM LIKE M_J1BAB-DOCNUM, "N documento NF RFMNG6 TYPE I, "Contab.Estq(E)
END OF I_J1BAB. END OF I_SOMA.

DATA: DATA:
BEGIN OF I_BNFDOC OCCURS 0, BEGIN OF I_REMESSA OCCURS 0,
DOCNUM LIKE J_1BNFDOC-DOCNUM, "N documento NF VBELV LIKE VBFA-VBELV, "Ordem ZVEF
ZZEFETI LIKE J_1BNFDOC-ZZEFETI, "Data efetiva de sada da
mercadoria
POSNV LIKE VBFA-POSNV, "Item ZVEF ROUTE LIKE LIKP-ROUTE, "Itinerrio
VBELN LIKE LIKP-VBELN, "Fornecimento VBELNT LIKE VBFA-VBELN, "transporte

112
ABAP Training
ERDAT LIKE LIKP-ERDAT, "Data de criao do registro SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
ERNAM LIKE LIKP-ERNAM, "usurio que criou o objeto SELECT-OPTIONS: S_KUNNR FOR VBAK-KUNNR MATCHCODE OBJECT
WADAT LIKE LIKP-WADAT_IST, "Data real de sada de DEBI,
mercadoria S_MATNR FOR VBAP-MATNR MATCHCODE OBJECT MAT1.
RFMNG TYPE I, "Quantidade fornecida PARAMETERS: P_VBELN LIKE VBAK-VBELN MATCHCODE OBJECT
END OF I_REMESSA. VMVA.
SELECTION-SCREEN END OF BLOCK B1.
DATA: SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-002.
BEGIN OF I_EXPEDIDO OCCURS 0, SELECT-OPTIONS: S_AUDAT FOR VBAK-AUDAT,
VBELV LIKE VBFA-VBELV, "Ordem ZVEF S_WERKS FOR VBAP-WERKS.
POSNV LIKE VBFA-POSNV, "Item ZVEF SELECTION-SCREEN END OF BLOCK B2.
VBELN LIKE LIKP-VBELN, "Fornecimento
VBELNT LIKE VBFA-VBELN, "transporte *-----------------------------------------------------------------------
VBELNF LIKE VBFA-VBELN, "Fatura INITIALIZATION.
XBLNR LIKE VBRK-XBLNR, "Numero da NF *-----------------------------------------------------------------------
DOCNUM LIKE J_1BNFDOC-DOCNUM, "No.Documento NF interno
FKDAT LIKE VBRK-FKDAT, "Data de emisso *-----------------------------------------------------------------------
ZZEFETI LIKE J_1BNFDOC-ZZEFETI, "Data real de sada de mercado AT SELECTION-SCREEN.
ZZDENTR LIKE J_1BNFDOC-ZZDENTR, "Data de entrega do *-----------------------------------------------------------------------
material
RFMNG TYPE I, "Quantidade * preciso indicar pelo menos 1 parmetro
END OF I_EXPEDIDO. IF S_KUNNR = SPACE AND S_MATNR = SPACE AND P_VBELN = SPACE.
MESSAGE E075.
DATA: ENDIF.
BEGIN OF I_RECEBIDO OCCURS 0,
VBELV LIKE VBFA-VBELV, "Ordem ZVEF * Ao indicar ordem, iremos desconsiderar os outros parmetros.
POSNV LIKE VBFA-POSNV, "Item ZVEF IF P_VBELN NE SPACE.
VBELN LIKE LIKP-VBELN, "Fornecimento REFRESH: S_MATNR, S_KUNNR.
VBELNT LIKE VBFA-VBELN, "transporte ENDIF.
VBELNF LIKE VBFA-VBELN, "Fatura
XBLNR LIKE VBRK-XBLNR, "Numero da NF *-----------------------------------------------------------------------
DOCNUM LIKE J_1BNFDOC-DOCNUM, "No.Documento NF interno START-OF-SELECTION.
FKDAT LIKE VBRK-FKDAT, "Data de emisso *-----------------------------------------------------------------------
ZZEFETI LIKE J_1BNFDOC-ZZEFETI, "Data real de sada de mercado PERFORM F_INICIA_VAR.
ZZDENTR LIKE J_1BNFDOC-ZZDENTR, "Data de entrega do PERFORM F_SELECIONA_DADOS.
material PERFORM F_MONTA_TABELA.
RFMNG TYPE I, "Quantidade
END OF I_RECEBIDO. *-----------------------------------------------------------------------
END-OF-SELECTION.
DATA: *-----------------------------------------------------------------------
BEGIN OF I_RECDEV OCCURS 0, PERFORM F_MOSTRA_DADOS.
AUART LIKE VBAK-AUART, "Tipo da ordem
VBELN LIKE VBAP-VBELN, "Ordem ZVEF *-----------------------------------------------------------------------
POSNR LIKE VBAP-POSNR, "Item da ordem AT LINE-SELECTION.
VBELNO LIKE VBFA-VBELV, "Recusa/Devoluo *-----------------------------------------------------------------------
AUGRU LIKE VBAK-AUGRU, "Motivo SET PF-STATUS 'MAIN2'.
VBELNF LIKE VBFA-VBELN, "Fatura
FKDAT LIKE VBRK-FKDAT, "Data da fatura GET CURSOR FIELD V_FIELD.
BELNR LIKE BKPF-BELNR, "Doc.Contabil CASE V_FIELD.
NETWR LIKE VBRK-NETWR, "Valor WHEN 'I_FINAL-RFMNGR'. "Coluna L - em remessa
NFNUM LIKE VBAK-XBLNR, "NF cliente/devolvida V_TIP_REL = 'R'.
XBLNR LIKE VBRK-XBLNR, "Referncia V_SUBTIT = TEXT-054. "Remessas em processamento
VGBEL LIKE VBAK-VGBEL, "N documento do documento PERFORM F_MONTA_REMESSA.
modelo
DOCNUM LIKE J_1BNFDOC-DOCNUM, "No.Documento NF interno WHEN 'I_FINAL-RFMNGE'. "Coluna M - expedido
RFMNG TYPE I, "Quantidade V_TIP_REL = 'E'.
END OF I_RECDEV. V_SUBTIT = TEXT-055. "Remessas expedidas
PERFORM F_MONTA_EXPEDIDO.
DATA:
BEGIN OF I_CTBESTQE OCCURS 0, WHEN 'I_FINAL-RFMNGC'. "Coluna N - recebido
VBELV LIKE VBFA-VBELV, "Ordem ZVEF V_TIP_REL = 'C'.
POSNV LIKE VBFA-POSNV, "Item V_SUBTIT = TEXT-056. "Remessas recebidas pelo Cliente
VBELN LIKE VBFA-VBELN, "Documento Fatura PERFORM F_MONTA_RECEBIDO.
MBLNR LIKE ZFA03A-MBLNR, "N documento de material
FKDAT LIKE ZFA03A-FKDAT, "Data de faturamento p/ndice d WHEN 'I_FINAL-RFMNG1'. "Coluna O - Recusa/Devoluo
RFMNG TYPE I, "Quantidade ZRVF
END OF I_CTBESTQE. V_TIP_REL = '1'.
V_SUBTIT = TEXT-057. "Recusas de Simples Faturamento (ZRVF)
DATA: PERFORM F_MONTA_RECDEV USING C_REC_ZRVF.
BEGIN OF I_CTBESTQS OCCURS 0,
VBELV LIKE VBFA-VBELV, "Ordem ZVEF WHEN 'I_FINAL-RFMNG2'. "Coluna P - Recusa/Devoluo
POSNV LIKE VBFA-POSNV, "Item ZRVR
VBELN LIKE VBFA-VBELN, "Documento Fatura V_TIP_REL = '2'.
MBLNR LIKE ZFA03A-MBLNR, "N documento de material V_SUBTIT = TEXT-058. "Recusas de Simples Remessa (ZRVR)'.
FKDAT LIKE ZFA03A-FKDAT, "Data de faturamento p/ndice d PERFORM F_MONTA_RECDEV USING C_REC_ZRVR.
RFMNG TYPE I, "Quantidade
END OF I_CTBESTQS. WHEN 'I_FINAL-RFMNG3'. "Coluna Q - Recusa/Devoluo
ZDVF
************************************************************************ V_TIP_REL = '3'.
* Parmetros de entrada : V_SUBTIT = TEXT-059. "Devolues de Simples Faturamento
* Select Options (S_...) (ZDVF)
* Parameters (P_...) PERFORM F_MONTA_RECDEV USING C_DEV_ZDVF.
************************************************************************

WHEN 'I_FINAL-RFMNG4'. "Coluna R - Recusa/Devoluo PERFORM F_MONTA_RECDEV USING C_DEV_ZDVR.


ZDVR
V_TIP_REL = '4'. WHEN 'I_FINAL-RFMNG5'. "Coluna S - Contab.Estoque(S)
V_SUBTIT = TEXT-060. "Devolues de Simples Remessa (ZDVR) V_TIP_REL = '5'.

113
ABAP Training
V_SUBTIT = TEXT-061. "Contabilizao estoque-Simples ELSEIF V_FIELD = 'I_RECEBIDO-VBELN'. "Remessa - recebida
Faturamento SET PARAMETER ID 'VL' FIELD I_RECEBIDO-VBELN.
PERFORM F_MONTA_CTBESTQ_S. CALL TRANSACTION 'VL03' AND SKIP FIRST SCREEN.

WHEN 'I_FINAL-RFMNG6'. "Coluna T - Contab.Estoque(E) ELSEIF V_FIELD = 'I_RECEBIDO-VBELNT'. "Transporte - recebido


V_TIP_REL = '6'. SET PARAMETER ID 'TNR' FIELD I_RECEBIDO-VBELNT.
V_SUBTIT = TEXT-062. "Contabilizao estoque-Devolues e CALL TRANSACTION 'VT03' AND SKIP FIRST SCREEN.
Recusas
PERFORM F_MONTA_CTBESTQ_E. ELSEIF V_FIELD = 'I_RECEBIDO-VBELNF'. "Fatura - recebido
ENDCASE. SET PARAMETER ID 'VF' FIELD I_RECEBIDO-VBELNF.
CALL TRANSACTION 'VF03' AND SKIP FIRST SCREEN.
*-----------------------------------------------------------------------
AT USER-COMMAND. ELSEIF V_FIELD = 'I_RECEBIDO-XBLNR'. "Nota Fiscal - Recebido
*----------------------------------------------------------------------- SET PARAMETER ID 'JEF' FIELD I_RECEBIDO-DOCNUM.
CASE SY-UCOMM. CALL TRANSACTION 'J1B3' AND SKIP FIRST SCREEN.
WHEN 'PRIN'.
V_TIP_REL = 'I'. "Cabealho principal ELSEIF V_FIELD = 'I_RECDEV-VBELNO'. "Ord.Inversa - Recusa/Devol
V_SUBTIT = 'Principal'. SET PARAMETER ID 'AUN' FIELD I_RECDEV-VBELNO.
LOOP AT I_FINAL. CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
IF I_FINAL-FLAG = SPACE.
I_FINAL-FLAG = 'X'. ELSEIF V_FIELD = 'I_RECDEV-VBELNF'. "Fatura - Recusa/Devol
MODIFY I_FINAL. SET PARAMETER ID 'VF' FIELD I_RECDEV-VBELNF.
ENDIF. CALL TRANSACTION 'VF03' AND SKIP FIRST SCREEN.
ENDLOOP. "I_final
PERFORM F_MOSTRA_DADOS. ELSEIF V_FIELD = 'I_RECDEV-XBLNR'. "Nota Fiscal - Recusa/Devol
IF V_TIP_REL = '1'. "ZRVF
WHEN 'SOMA'. "Somatria por coluna SET PARAMETER ID 'JEF' FIELD I_FINAL-DOCNUM.
SET PF-STATUS ''. CALL TRANSACTION 'J1B3' AND SKIP FIRST SCREEN.
V_TIP_REL = 'S'.
V_SUBTIT = 'Somatria por coluna'. ELSEIF V_TIP_REL = '2'. "ZRVR
PERFORM F_MONTA_SOMA. READ TABLE I_J1BAB
WITH KEY REFKEY = I_RECDEV-VGBEL.
WHEN 'ASCE'. "Classificao crescente IF SY-SUBRC = 0.
V_TIP_REL = 'I'. SET PARAMETER ID 'JEF' FIELD I_J1BAB-DOCNUM.
PERFORM F_SORT_TABELA. CALL TRANSACTION 'J1B3' AND SKIP FIRST SCREEN.
PERFORM F_MOSTRA_DADOS. ENDIF.

WHEN 'DESC'. "Classificao Decrescente ELSEIF V_TIP_REL = '3'. "ZDVF


V_TIP_REL = 'I'. SET PARAMETER ID 'JEF' FIELD I_RECDEV-DOCNUM.
PERFORM F_SORT_TABELA. CALL TRANSACTION 'J1B3' AND SKIP FIRST SCREEN.
PERFORM F_MOSTRA_DADOS.
ELSEIF V_TIP_REL = '4'. "ZDVR
WHEN 'DISP'. "Exibir Documento SET PARAMETER ID 'JEF' FIELD I_RECDEV-DOCNUM.
GET CURSOR FIELD V_FIELD. CALL TRANSACTION 'J1B3' AND SKIP FIRST SCREEN.
IF V_FIELD = 'I_FINAL-VBELN'. "Ordem ZVEF
SET PARAMETER ID 'AUN' FIELD I_FINAL-VBELN. ENDIF.
CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
ELSEIF V_FIELD = 'I_RECDEV-NFNUM'. "Nota Fiscal - Recusa/Devol
ELSEIF V_FIELD = 'I_FINAL-VBELNF'. "Ordem ZVFR * if v_tip_rel = '1'. "ZRVF
SET PARAMETER ID 'AUN' FIELD I_FINAL-VBELNF. SET PARAMETER ID 'JEF' FIELD I_FINAL-DOCNUM.
CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN. CALL TRANSACTION 'J1B3' AND SKIP FIRST SCREEN.

ELSEIF V_FIELD = 'I_FINAL-XBLNR'."Nota Fiscal - ZVEF ELSEIF V_FIELD = 'I_RECDEV-BELNR'. "Doc.Crdito - Recusa/Devol
SET PARAMETER ID 'JEF' FIELD I_FINAL-DOCNUM. IF V_TIP_REL = '1' OR "ZRVF
CALL TRANSACTION 'J1B3' AND SKIP FIRST SCREEN. V_TIP_REL = '3'. "ZDVF
PERFORM F_DISPLAY_DOCUMENT USING I_RECDEV-VBELNF.
ELSEIF V_FIELD = 'I_REMESSA-VBELN'. "Remessa - Remessa ENDIF.
SET PARAMETER ID 'VL' FIELD I_REMESSA-VBELN.
CALL TRANSACTION 'VL03' AND SKIP FIRST SCREEN. ELSEIF V_FIELD = 'I_CTBESTQS-VBELN'. "Fatura - CtbEst(S)
SET PARAMETER ID 'VF' FIELD I_CTBESTQS-VBELN.
ELSEIF V_FIELD = 'I_REMESSA-VBELNT'. "Transporte - remessa CALL TRANSACTION 'VF03' AND SKIP FIRST SCREEN.
SET PARAMETER ID 'TNR' FIELD I_REMESSA-VBELNT.
CALL TRANSACTION 'VT03' AND SKIP FIRST SCREEN. ELSEIF V_FIELD = 'I_CTBESTQE-VBELN'. "Fatura - CtbEst(E)
SET PARAMETER ID 'VF' FIELD I_CTBESTQE-VBELN.
ELSEIF V_FIELD = 'I_EXPEDIDO-VBELN'. "Remessa - Expedida CALL TRANSACTION 'VF03' AND SKIP FIRST SCREEN.
SET PARAMETER ID 'VL' FIELD I_EXPEDIDO-VBELN.
CALL TRANSACTION 'VL03' AND SKIP FIRST SCREEN. ENDIF.

ELSEIF V_FIELD = 'I_EXPEDIDO-VBELNT'. "Transporte - expedido WHEN 'SDRE'. "Saldo em remessa - coluna i - m <> 0
SET PARAMETER ID 'TNR' FIELD I_EXPEDIDO-VBELNT. V_TIP_REL = 'P'. "Cabealho principal
CALL TRANSACTION 'VT03' AND SKIP FIRST SCREEN. V_SUBTIT = 'Saldo em remessa'.
LOOP AT I_FINAL.
ELSEIF V_FIELD = 'I_EXPEDIDO-VBELNF'. "Fatura - expedido V_VAR = I_FINAL-KWMENG - I_FINAL-RFMNGE.
SET PARAMETER ID 'VF' FIELD I_EXPEDIDO-VBELNF. IF V_VAR <> 0.
CALL TRANSACTION 'VF03' AND SKIP FIRST SCREEN. I_FINAL-FLAG = 'X'.
ELSE.
ELSEIF V_FIELD = 'I_EXPEDIDO-XBLNR'. "Nota Fiscal - expedido I_FINAL-FLAG = ' '.
SET PARAMETER ID 'JEF' FIELD I_EXPEDIDO-DOCNUM. ENDIF.
CALL TRANSACTION 'J1B3' AND SKIP FIRST SCREEN. MODIFY I_FINAL.

ENDLOOP. "I_final IF I_FINAL-KWMENG <> I_FINAL-RFMNG5.


PERFORM F_MOSTRA_DADOS. I_FINAL-FLAG = 'X'.
ELSE.
WHEN 'DCFT'. "Divergncia na contab. de faturamento - coluna i <> I_FINAL-FLAG = ' '.
s ENDIF.
V_TIP_REL = 'P'. "Cabealho principal MODIFY I_FINAL.
V_SUBTIT = 'Divergncia na contab. de faturamento'. ENDLOOP. "I_final
LOOP AT I_FINAL. PERFORM F_MOSTRA_DADOS.

114
ABAP Training
ENDIF.
WHEN 'DCDR'. "Divergncia na contab. de devol/recusa- coluna o+q
<> t WRITE:
V_TIP_REL = 'P'. "Cabealho principal /1 TEXT-005, 14 I_FINAL-KUNNR,
V_SUBTIT = 'Divergncia na contab. de devoluo/recusa'. /1 TEXT-010, 14 I_FINAL-MATNR,
LOOP AT I_FINAL. /1 TEXT-009, 14 I_FINAL-WERKS.
V_VAR = I_FINAL-RFMNG1 + I_FINAL-RFMNG3. SKIP.
IF V_VAR <> I_FINAL-RFMNG6.
I_FINAL-FLAG = 'X'. FORMAT COLOR COL_HEADING.
ELSE.
I_FINAL-FLAG = ' '. CASE V_TIP_REL.
ENDIF. WHEN 'R'. "Remessa
MODIFY I_FINAL. PERFORM F_CABEC_REMESSA.
ENDLOOP. "I_final
PERFORM F_MOSTRA_DADOS. WHEN 'E'. "Expedido
PERFORM F_CABEC_EXPREC.
WHEN 'DVRE'. "Divergncia na recusa - coluna o <> p
V_TIP_REL = 'P'. "Cabealho principal WHEN 'C'. "Recebido
V_SUBTIT = 'Divergncia na recusa'. PERFORM F_CABEC_EXPREC.
LOOP AT I_FINAL.
IF I_FINAL-RFMNG1 <> I_FINAL-RFMNG2. WHEN '1'. "ZRVF
I_FINAL-FLAG = 'X'. PERFORM F_CABEC_ZRVF.
ELSE.
I_FINAL-FLAG = ' '. WHEN '2'. "ZRVR
ENDIF. PERFORM F_CABEC_ZRVR.
MODIFY I_FINAL.
ENDLOOP. "I_final WHEN '3'. "ZDVF
PERFORM F_MOSTRA_DADOS. PERFORM F_CABEC_ZDVF.

WHEN 'DVDV'. "Divergncia na devoluo - coluna q <> r WHEN '4'. "ZDVR


V_TIP_REL = 'P'. "Cabealho principal PERFORM F_CABEC_ZDVR.
V_SUBTIT = 'Divergncia na devoluo'.
LOOP AT I_FINAL. WHEN '5'. "Contab.Estoque(S)
IF I_FINAL-RFMNG3 <> I_FINAL-RFMNG4. PERFORM F_CABEC_CTBESTQ.
I_FINAL-FLAG = 'X'.
ELSE. WHEN '6'. "Contab.Estoque(S)
I_FINAL-FLAG = ' '. PERFORM F_CABEC_CTBESTQ.
ENDIF. ENDCASE.
MODIFY I_FINAL. ENDIF.
ENDLOOP. "I_Final FORMAT COLOR COL_NORMAL.
PERFORM F_MOSTRA_DADOS.
ENDCASE. *-----------------------------------------------------------------------
END-OF-PAGE.
*----------------------------------------------------------------------- *-----------------------------------------------------------------------
TOP-OF-PAGE.
*----------------------------------------------------------------------- *&---------------------------------------------------------------------*
PERFORM F_CABEC_PRINCIPAL. *& Form F_Inicia_Var
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------- * Inicializa as variveis usados no programa *
TOP-OF-PAGE DURING LINE-SELECTION. *----------------------------------------------------------------------*
*----------------------------------------------------------------------- FORM F_INICIA_VAR.
IF V_TIP_REL = 'S'. "Soma
PERFORM F_CABEC_SOMA. V_TIP_REL = 'I'. "Tipo inicial do relatrio
V_SUBTIT = 'Principal'.
ELSEIF V_TIP_REL = 'P'. "Principal
PERFORM F_CABEC_PRINCIPAL. REFRESH:
I_VBAK,
ELSEIF V_TIP_REL = 'I'. "Inicio I_VBAK1,
PERFORM F_CABEC_PRINCIPAL. I_VBAP,
I_VBFA,
ELSE. I_VBFA1,
FORMAT COLOR COL_HEADING. I_VBFA2,
I_VBFA3,
WRITE 1 V_SUBTIT. I_KNA1,
SKIP. I_VBRK,
I_VBRK1,
FORMAT COLOR COL_NORMAL. I_LIKP,
I_J1BAB,
WRITE: /1 TEXT-003, 14 I_FINAL-VBELN. I_BNFDOC,
I_ZFA03A,
IF V_TIP_REL <> '5' AND I_ZFA03A1,
V_TIP_REL <> '6'. I_REMESSA,
I_EXPEDIDO,
WRITE: /1 TEXT-012, 14 I_FINAL-VBELNF. I_RECEBIDO,
I_RECDEV,
I_CTBESTQS, *----------------------------------------------------------------------*
I_CTBESTQE. FORM F_SELECIONA_DADOS.
* i_fcode.
*Seleciona as ordens ZVEF
* i_fcode-fcode = 'PRIN'. IF P_VBELN <> SPACE. "Se parmetro nmero de ordem foi digitado
* append i_fcode.
SELECT VBELN BSTNK KUNNR
ENDFORM. "f_inicia_var FROM VBAK
INTO TABLE I_VBAK
*&---------------------------------------------------------------------* WHERE VBELN = P_VBELN
*& Form F_Seleciona_dados. AND AUART = 'ZVEF'.
*&---------------------------------------------------------------------* ELSE.
* Seleciona os dados necessrios para gerar o relatrio

115
ABAP Training
SELECT VBELN BSTNK KUNNR SORT I_VBAP BY VBELN POSNR.
FROM VBAK
INTO TABLE I_VBAK *Verifica o fluxo dos documentos
WHERE AUDAT IN S_AUDAT SELECT VBELV POSNV VBELN POSNN VBTYP_N RFMNG FKTYP
AND KUNNR IN S_KUNNR FROM VBFA
AND AUART = 'ZVEF'. INTO TABLE I_VBFA
ENDIF. FOR ALL ENTRIES IN I_VBAP
WHERE VBELV = I_VBAP-VBELN
*Verifica se selecionou alguma ordem ZVEF AND POSNV = I_VBAP-POSNR.
IF I_VBAK[] IS INITIAL.
MESSAGE ID 'ZM' TYPE 'S' NUMBER '083' SORT I_VBFA BY VBELV POSNV VBTYP_N DESCENDING.
WITH 'No foi selecionado nenhuma ordem ZVEF'
'para os parmetros acima'. LOOP AT I_VBFA.
STOP.
ENDIF. *verifica se o documento subsequente uma fatura
IF I_VBFA-VBTYP_N = 'M' AND "Fatura
SORT I_VBAK BY KUNNR. I_VBFA-FKTYP = 'A'. "Fatura/o baseado em orde

*seleciona as descries dos emissores na tabela kna1 *Seleciona o documento de faturamento


LOOP AT I_VBAK. SELECT SINGLE VBELN FKDAT XBLNR
ON CHANGE OF I_VBAK-KUNNR. FROM VBRK
CLEAR I_KNA1. INTO I_VBRK
WHERE VBELN = I_VBFA-VBELN.
SELECT SINGLE NAME1 IF SY-SUBRC = 0.
FROM KNA1 APPEND I_VBRK.
INTO I_KNA1-NAME1 ENDIF.
WHERE KUNNR = I_VBAK-KUNNR.
*Verifica a existncia do registro na ZFA03A
I_KNA1-KUNNR = I_VBAK-KUNNR. SELECT SINGLE ABLNR FBLNR FKDAT MBLNR
APPEND I_KNA1. FROM ZFA03A
ENDON. INTO I_ZFA03A
ENDLOOP. "I_VBAK WHERE ABLNR = I_VBFA-VBELV
AND FBLNR = I_VBFA-VBELN.
SORT I_VBAK BY VBELN. IF SY-SUBRC = 0.
SORT I_KNA1 BY KUNNR. APPEND I_ZFA03A.
ENDIF.
*Selecionar somente as ordens com Status de faturamento C-Concludo
SELECT VBELN *seleciona o nmero do documento NF a partir da fatura
FROM VBUK SELECT REFKEY DOCNUM
INTO TABLE I_VBUK FROM M_J1BAB
FOR ALL ENTRIES IN I_VBAK APPENDING TABLE I_J1BAB
WHERE VBELN = I_VBAK-VBELN UP TO 1 ROWS
AND FKSAK = 'C'. WHERE REFKEY = I_VBFA-VBELN.

*Verifica se selecionou alguma ordem *verifica se o documento subsequente uma remessa ZVFR
IF I_VBUK[] IS INITIAL. ELSEIF I_VBFA-VBTYP_N = 'C'.
MESSAGE ID 'ZM' TYPE 'S' NUMBER '083'
WITH 'No foi selecionado nenhuma ordem ZVEF' *Seleciona as remessas ZVFR
'para os parmetros acima'. SELECT VBELV POSNV VBELN POSNN RFMNG
STOP. FROM VBFA
ENDIF. APPENDING TABLE I_VBFA1
WHERE VBELV = I_VBFA-VBELN
*Seleciona os tens da ordem ZVEF AND POSNV = I_VBFA-POSNN
SELECT VBELN POSNR MATNR KWMENG WERKS AND VBTYP_N = 'J'
FROM VBAP AND VBTYP_V = 'C'.
INTO TABLE I_VBAP
FOR ALL ENTRIES IN I_VBUK *verifica se o documento subsequente uma recusa/devoluo
WHERE VBELN = I_VBUK-VBELN ELSEIF I_VBFA-VBTYP_N = 'H'. "Recusa/Devoluo
AND MATNR IN S_MATNR
AND WERKS IN S_WERKS. *verfica se essa recusa/devoluo est faturada
* clear vbuk-fksak.
*Verifica se selecionou algum item
IF I_VBAP[] IS INITIAL. * select single fksak
MESSAGE ID 'ZM' TYPE 'S' NUMBER '083' * from vbuk
WITH 'No foi selecionado nenhuma ordem ZVEF' * into vbuk-fksak
'para os parmetros acima'. * where vbeln = i_vbfa-vbeln.
STOP. * if vbuk-fksak = 'C'. "se Recusa/Devol. est faturada
ENDIF.
CLEAR VBAK-AUART.

SELECT SINGLE VBELN AUART AUGRU VGBEL XBLNR *processa somente as remessas selecionadas
FROM VBAK LOOP AT I_VBFA1. "Remessas
INTO I_VBAK1
WHERE VBELN = I_VBFA-VBELN. *verifica se remessa est faturada
IF I_VBAK1-AUART = 'ZRVF' OR CLEAR VBUK.
I_VBAK1-AUART = 'ZRVR' OR
I_VBAK1-AUART = 'ZDVF' OR SELECT SINGLE FKSTK TRSTA
I_VBAK1-AUART = 'ZDVR'. FROM VBUK
I_VBAK1-POSNR = I_VBFA-POSNN. INTO (VBUK-FKSTK, VBUK-TRSTA)
APPEND I_VBAK1. WHERE VBELN = I_VBFA1-VBELN.
IF VBUK-FKSTK = 'C'. "se Remessa est faturada
ENDIF.
* endif. *seleciona o documento fatura da remessa que est faturada
ENDIF. SELECT VBELV POSNV VBELN POSNN VBTYP_N
ENDLOOP. "I_VBFA FROM VBFA
SORT I_VBRK BY VBELN. APPENDING TABLE I_VBFA2
SORT I_VBFA1 BY VBELV POSNV. WHERE VBELV = I_VBFA1-VBELN
SORT I_ZFA03A BY ABLNR FBLNR. AND POSNV = I_VBFA1-POSNN

116
ABAP Training
AND VBTYP_N = 'M'. "Doc. Faturamento
ELSE. *seleciona valor de crdito da Recusa/Devoluo
SELECT VBELN POSNR KZWI6
*seleciona os dados de transporte dessa remessa FROM VBRP
SELECT SINGLE VBELN ERNAM ERDAT ROUTE WADAT_IST INTO TABLE I_VBRP2
FROM LIKP FOR ALL ENTRIES IN I_VBFA3
INTO I_LIKP WHERE VBELN = I_VBFA3-VBELN
WHERE VBELN = I_VBFA1-VBELN. AND POSNR = I_VBFA3-POSNN.
IF SY-SUBRC = 0.
APPEND I_LIKP. *seleciona dados da fatura da Recusa/Devoluo
ENDIF. SELECT VBELN FKDAT XBLNR
ENDIF. FROM VBRK
INTO TABLE I_VBRK2
*seleciona o numero do transporte da remessa FOR ALL ENTRIES IN I_VBFA3
SELECT VBELV POSNV VBELN POSNN VBTYP_N WHERE VBELN = I_VBFA3-VBELN.
FROM VBFA
APPENDING TABLE I_VBFA2 LOOP AT I_VBRK2.
WHERE VBELV = I_VBFA1-VBELN
AND VBTYP_N = '8'. "No. do Transporte *seleciona os documentos contbeis relacionados a fatura
ENDLOOP. "I_VBFA1 SELECT BELNR
FROM BKPF
SORT I_VBFA2 BY VBELV POSNV VBTYP_N. INTO I_VBRK2-BELNR
UP TO 1 ROWS
*processa as faturas e transporte das remessas selecionadas WHERE AWTYP = 'VBRK'
LOOP AT I_VBFA2. AND AWKEY = I_VBRK2-VBELN.
IF I_VBFA2-VBTYP_N = 'M'. "Fatura ENDSELECT.
IF SY-SUBRC = 0.
*seleciona a data/numero da NF fsica da remessa faturada MODIFY I_VBRK2.
SELECT SINGLE VBELN FKDAT XBLNR ENDIF.
FROM VBRK ENDLOOP. "i_vbrk2
INTO I_VBRK1
WHERE VBELN = I_VBFA2-VBELN. *seleciona o nmero do documento NF a partir da fatura
IF SY-SUBRC = 0. SELECT REFKEY DOCNUM
APPEND I_VBRK1. FROM M_J1BAB
ENDIF. APPENDING TABLE I_J1BAB
FOR ALL ENTRIES IN I_VBRK2
*seleciona o nmero do documento NF a partir da fatura WHERE REFKEY = I_VBRK2-VBELN.
SELECT REFKEY DOCNUM
FROM M_J1BAB *seleciona dados da coluna contabilizao de estoque
APPENDING TABLE I_J1BAB SELECT ABLNR FBLNR FKDAT MBLNR
UP TO 1 ROWS FROM ZFA03A
WHERE REFKEY = I_VBFA2-VBELN. INTO TABLE I_ZFA03A1
ENDIF. FOR ALL ENTRIES IN I_VBFA3
WHERE ABLNR = I_VBFA3-VBELV
ENDLOOP. "I_VBFA2 AND FBLNR = I_VBFA3-VBELN.
ENDIF.
SORT I_LIKP BY VBELN. ENDIF.
SORT I_VBRK1 BY VBELN. SORT I_VBFA3 BY VBELV POSNV.
SORT I_VBAK1 BY VBELN POSNR. SORT I_VBRK2 BY VBELN.
SORT I_ZFA03A1 BY ABLNR FBLNR.
IF NOT I_VBAK1[] IS INITIAL.
IF NOT I_J1BAB[] IS INITIAL.
*processa os documentos de recusa/devoluo selecionados
*busca os documentos de crdito da recusa/devoluo *seleciona os dados da NF
SELECT VBELV POSNV VBELN POSNN SELECT DOCNUM ZZEFETI ZZDENTR
FROM VBFA FROM J_1BNFDOC
INTO TABLE I_VBFA3 INTO TABLE I_BNFDOC
FOR ALL ENTRIES IN I_VBAK1 FOR ALL ENTRIES IN I_J1BAB
WHERE VBELV = I_VBAK1-VBELN WHERE DOCNUM = I_J1BAB-DOCNUM.
AND POSNV = I_VBAK1-POSNR ENDIF.
AND VBTYP_N = 'O'.
SORT I_J1BAB BY REFKEY.
IF NOT I_VBFA3[] IS INITIAL. SORT I_BNFDOC BY DOCNUM.
BINARY SEARCH.
ENDFORM. "F_SELECIONA_DADOS CHECK SY-SUBRC = 0.
*&---------------------------------------------------------------------*
*& Form F_Monta_tabela. MOVE:
*&---------------------------------------------------------------------* I_VBAK-BSTNK TO I_FINAL-BSTNK,
* Monta a tabela interna com os dados que sero impressos no I_VBAK-KUNNR TO I_FINAL-KUNNR.
relatrio *
*----------------------------------------------------------------------* *posiciona no emissor para pegar o nome
FORM F_MONTA_TABELA. READ TABLE I_KNA1
WITH KEY KUNNR = I_VBAK-KUNNR
LOOP AT I_VBAP. BINARY SEARCH.

CLEAR I_FINAL. MOVE I_KNA1-NAME1 TO I_FINAL-NAME1.

MOVE: *posiciona no fluxo dos documentos a partir da ordem ZVEF


'X' TO I_FINAL-FLAG, READ TABLE I_VBFA
I_VBAP-VBELN TO I_FINAL-VBELN, WITH KEY VBELV = I_VBAP-VBELN
I_VBAP-POSNR TO I_FINAL-POSNR, POSNV = I_VBAP-POSNR
I_VBAP-WERKS TO I_FINAL-WERKS, BINARY SEARCH.
I_VBAP-MATNR TO I_FINAL-MATNR,
I_VBAP-KWMENG TO I_FINAL-KWMENG. LOOP AT I_VBFA FROM SY-TABIX.
IF I_VBFA-VBELV <> I_VBAP-VBELN OR
*posiciona no cabealho da ordem ZVEF I_VBFA-POSNV <> I_VBAP-POSNR.
READ TABLE I_VBAK EXIT.
WITH KEY VBELN = I_VBAP-VBELN ENDIF.

117
ABAP Training
IF I_VBFA-VBTYP_N = 'C'. "Existem remessas para ordem BINARY SEARCH.
*Verifica se existe remessa para o item ZVFR
MOVE I_VBFA-VBELN TO I_FINAL-VBELNF. *posiciona no transporte da remessa
CLEAR I_VBFA2.
CLEAR V_VAR.
READ TABLE I_VBFA2
*posiciona ZVFR a partir ZVEF WITH KEY VBELV = I_VBFA1-VBELN
READ TABLE I_VBFA1 VBTYP_N = '8' "Transporte
WITH KEY VBELV = I_VBFA-VBELN BINARY SEARCH.
POSNV = I_VBFA-POSNN
BINARY SEARCH. MOVE:
*para cada ZVEF existem varias ZVFR I_VBFA-VBELV TO I_EXPEDIDO-VBELV,
LOOP AT I_VBFA1 FROM SY-TABIX. I_VBFA-POSNV TO I_EXPEDIDO-POSNV,
IF I_VBFA1-VBELV <> I_VBFA-VBELN OR I_VBFA1-VBELN TO I_EXPEDIDO-VBELN,
I_VBFA1-POSNV <> I_VBFA-POSNN. I_VBFA2-VBELN TO I_EXPEDIDO-VBELNT,
EXIT. I_VBRK1-VBELN TO I_EXPEDIDO-VBELNF,
ENDIF. I_VBRK1-XBLNR TO I_EXPEDIDO-XBLNR,
I_BNFDOC-DOCNUM TO I_EXPEDIDO-DOCNUM,
V_VAR = V_VAR + I_VBFA1-RFMNG. I_VBRK1-FKDAT TO I_EXPEDIDO-FKDAT,
I_BNFDOC-ZZEFETI TO I_EXPEDIDO-ZZEFETI,
*posiciona na fatura da remessa I_BNFDOC-ZZDENTR TO I_EXPEDIDO-ZZDENTR,
*se existir ento esta remessa est faturada I_VBFA1-RFMNG TO I_EXPEDIDO-RFMNG.
READ TABLE I_VBFA2
WITH KEY VBELV = I_VBFA1-VBELN COLLECT I_EXPEDIDO.
POSNV = I_VBFA1-POSNN
VBTYP_N = 'M' IF I_BNFDOC-ZZDENTR > '00000000'.
BINARY SEARCH. *se data de entrega estiver preenchida ento a remessa j est
IF SY-SUBRC = 0. entregue,
*Pode existir mais de uma fatura por ordem ZVFR (estorno) ento *ento qtde ser somada a coluna recebido
*devo selecionar a mais atual (ltima). I_FINAL-RFMNGC = I_FINAL-RFMNGC + I_VBFA1-RFMNG.
LOOP AT I_VBFA2 FROM SY-TABIX.
IF I_VBFA2-VBELV <> I_VBFA1-VBELN OR MOVE:
I_VBFA2-POSNV <> I_VBFA1-POSNN OR I_VBFA-VBELV TO I_RECEBIDO-VBELV,
I_VBFA2-VBTYP_N <> 'M'. I_VBFA-POSNV TO I_RECEBIDO-POSNV,
EXIT. I_VBFA1-VBELN TO I_RECEBIDO-VBELN,
ENDIF. I_VBFA2-VBELN TO I_RECEBIDO-VBELNT,
V_TABIX = SY-TABIX. I_VBRK1-VBELN TO I_RECEBIDO-VBELNF,
ENDLOOP. I_VBRK1-XBLNR TO I_RECEBIDO-XBLNR,
I_BNFDOC-DOCNUM TO I_RECEBIDO-DOCNUM,
READ TABLE I_VBFA2 INDEX V_TABIX. I_VBRK1-FKDAT TO I_RECEBIDO-FKDAT,
I_BNFDOC-ZZEFETI TO I_RECEBIDO-ZZEFETI,
*remessa faturada, ento qtde ser somada na coluna expedido I_BNFDOC-ZZDENTR TO I_RECEBIDO-ZZDENTR,
I_FINAL-RFMNGE = I_FINAL-RFMNGE + I_VBFA1-RFMNG. I_VBFA1-RFMNG TO I_RECEBIDO-RFMNG.

*posiciona na fatura do documento da remessa COLLECT I_RECEBIDO.


READ TABLE I_VBRK1
WITH KEY VBELN = I_VBFA2-VBELN ENDIF.
BINARY SEARCH. ENDIF.
ELSE.
*Verifica se existe NF associada a essa fatura *remessa no faturada, ento qtde ser somada a coluna em remessa
READ TABLE I_J1BAB
WITH KEY REFKEY = I_VBFA2-VBELN I_FINAL-RFMNGR = I_FINAL-RFMNGR + I_VBFA1-RFMNG.
BINARY SEARCH. CLEAR I_LIKP.
IF SY-SUBRC = 0.
*posiciona no fornecimento da remessa
*posiciona na NF para pegar data de entrega e data efetiva READ TABLE I_LIKP
READ TABLE I_BNFDOC WITH KEY VBELN = I_VBFA1-VBELN
WITH KEY DOCNUM = I_J1BAB-DOCNUM BINARY SEARCH.

*posiciona no transporte da remessa *Busca ordem da recusa/devoluo


CLEAR I_VBFA2. READ TABLE I_VBAK1
WITH KEY VBELN = I_VBFA-VBELN
READ TABLE I_VBFA2 POSNR = I_VBFA-POSNN
WITH KEY VBELV = I_VBFA1-VBELN BINARY SEARCH.
VBTYP_N = '8' IF SY-SUBRC = 0.
BINARY SEARCH.
*verifica se esta ordem est faturada
MOVE: READ TABLE I_VBFA3
I_VBFA-VBELV TO I_REMESSA-VBELV, WITH KEY VBELV = I_VBFA-VBELN
I_VBFA-POSNV TO I_REMESSA-POSNV, POSNV = I_VBFA-POSNN
I_VBFA1-VBELN TO I_REMESSA-VBELN, BINARY SEARCH.
I_LIKP-ROUTE TO I_REMESSA-ROUTE, IF SY-SUBRC = 0.
I_VBFA2-VBELN TO I_REMESSA-VBELNT,
I_LIKP-ERDAT TO I_REMESSA-ERDAT, *busca o valor do crdito no item da ordem
I_LIKP-ERNAM TO I_REMESSA-ERNAM, READ TABLE I_VBRP2
I_LIKP-WADAT TO I_REMESSA-WADAT, WITH KEY VBELN = I_VBFA3-VBELN
I_VBFA1-RFMNG TO I_REMESSA-RFMNG. POSNR = I_VBFA3-POSNN
APPEND I_REMESSA. BINARY SEARCH.
ENDIF.
ENDLOOP. "I_VBFA1 *posiciona na fatura da ordem
*no existe remessa, ento qtde do item ser somada a coluna a READ TABLE I_VBRK2
programar WITH KEY VBELN = I_VBFA3-VBELN
BINARY SEARCH.
I_FINAL-RFMNGP = I_FINAL-RFMNGP + I_VBFA-RFMNG - V_VAR. IF SY-SUBRC = 0.

ELSEIF I_VBFA-VBTYP_N = 'H'. "Existem recusa/devolues *Verifica se existe NF associada a essa fatura
READ TABLE I_J1BAB
CLEAR: I_VBAK1, I_VBFA3, I_VBRP2, I_VBRK2, I_J1BAB. WITH KEY REFKEY = I_VBRK2-VBELN

118
ABAP Training
BINARY SEARCH. FROM VBRK
ENDIF. INTO I_RECDEV-NFNUM "NF devolvida
ENDIF. WHERE VBELN = I_VBAK1-VGBEL.
ENDIF.
ENDCASE.
MOVE: COLLECT I_RECDEV.
I_VBAK1-AUART TO I_RECDEV-AUART,
I_VBAP-VBELN TO I_RECDEV-VBELN, ELSEIF I_VBFA-VBTYP_N = 'M' "Existem faturas para ordem
I_VBAP-POSNR TO I_RECDEV-POSNR, AND I_VBFA-FKTYP = 'A'.
* i_vbfa3-vbelv to i_recdev-vbelno, *posiciona na fatura da ordem para pegar o numero/data da nota fiscal
I_VBAK1-VBELN TO I_RECDEV-VBELNO, CLEAR I_VBRK.
I_VBAK1-AUGRU TO I_RECDEV-AUGRU,
I_VBAK1-VGBEL TO I_RECDEV-VGBEL, READ TABLE I_VBRK
I_VBFA3-VBELN TO I_RECDEV-VBELNF, WITH KEY VBELN = I_VBFA-VBELN
I_VBRK2-FKDAT TO I_RECDEV-FKDAT, BINARY SEARCH.
I_VBRK2-BELNR TO I_RECDEV-BELNR,
I_VBRP2-KZWI6 TO I_RECDEV-NETWR, *posiciona no documento da NF
I_VBFA-RFMNG TO I_RECDEV-RFMNG. CLEAR I_J1BAB.

CASE I_VBAK1-AUART. READ TABLE I_J1BAB


WHEN C_REC_ZRVF. "ZRVF WITH KEY REFKEY = I_VBFA-VBELN
I_FINAL-RFMNG1 = I_FINAL-RFMNG1 + I_VBFA-RFMNG. BINARY SEARCH.

MOVE I_FINAL-XBLNR TO I_RECDEV-XBLNR. "NF ZVEF MOVE:


I_VBRK-FKDAT TO I_FINAL-FKDAT,
PERFORM F_CALC_CONT_ESTQ_E."Calcula coluna T I_VBRK-XBLNR TO I_FINAL-XBLNR,
I_J1BAB-DOCNUM TO I_FINAL-DOCNUM.
WHEN C_REC_ZRVR. "ZRVR
I_FINAL-RFMNG2 = I_FINAL-RFMNG2 + I_VBFA-RFMNG. *posiciona na zfa03a
READ TABLE I_ZFA03A
MOVE: WITH KEY ABLNR = I_VBFA-VBELV
I_VBAK1-XBLNR TO I_RECDEV-XBLNR, "NF Recusada FBLNR = I_VBFA-VBELN
I_J1BAB-DOCNUM TO I_RECDEV-DOCNUM. BINARY SEARCH.
IF SY-SUBRC = 0.
WHEN C_DEV_ZDVF. "ZDVF I_FINAL-RFMNG5 = I_FINAL-RFMNG5 + I_FINAL-KWMENG.
I_FINAL-RFMNG3 = I_FINAL-RFMNG3 + I_VBFA-RFMNG.
MOVE:
MOVE: I_VBFA-VBELV TO I_CTBESTQS-VBELV,
I_FINAL-XBLNR TO I_RECDEV-NFNUM, "NF devolvida I_VBFA-POSNV TO I_CTBESTQS-POSNV,
I_VBAK1-XBLNR TO I_RECDEV-XBLNR, "NF do cliente I_ZFA03A-FBLNR TO I_CTBESTQS-VBELN,
I_J1BAB-DOCNUM TO I_RECDEV-DOCNUM. "NF Interno cliente I_ZFA03A-MBLNR TO I_CTBESTQS-MBLNR,
I_ZFA03A-FKDAT TO I_CTBESTQS-FKDAT,
PERFORM F_CALC_CONT_ESTQ_E."Calcula coluna T I_VBFA-RFMNG TO I_CTBESTQS-RFMNG.

WHEN C_DEV_ZDVR. "ZDVR COLLECT I_CTBESTQS.


I_FINAL-RFMNG4 = I_FINAL-RFMNG4 + I_VBFA-RFMNG. ENDIF.
ENDIF.
MOVE: ENDLOOP. "I_VBFA
I_VBAK1-XBLNR TO I_RECDEV-XBLNR, "NF do cliente APPEND I_FINAL.
I_J1BAB-DOCNUM TO I_RECDEV-DOCNUM. "NF interno cliente
ENDLOOP. "I_VBPA
*seleciona a nf devolvida SORT I_REMESSA BY VBELV POSNV VBELN.
SELECT SINGLE XBLNR
SORT I_EXPEDIDO BY VBELV POSNV VBELN. ENDIF.
SORT I_RECEBIDO BY VBELV POSNV VBELN. ENDIF.
SORT I_RECDEV BY AUART VBELN POSNR VBELNO.
ENDFORM. "F_MONTA_TABELA ENDFORM. " F_CALC_CONT_ESTQ_E
*&---------------------------------------------------------------------* *&---------------------------------------------------------------------*
*& Form F_CALC_CONT_ESTQ_E *& Form F_MONTA_REMESSA
*&---------------------------------------------------------------------* *&---------------------------------------------------------------------*
* Calcula coluna T-Contab.Estoq.(E) para ordens Recusa/Devoluo * Mostra os dados de remessas *
* *----------------------------------------------------------------------*
* do tipo ZRVF e ZDVF * FORM F_MONTA_REMESSA.
*----------------------------------------------------------------------* * data: v_i(2) type n.
FORM F_CALC_CONT_ESTQ_E. CLEAR:
V_COUNT,
READ TABLE I_VBFA3 V_RFMNGR.
WITH KEY VBELV = I_VBFA-VBELN
POSNV = I_VBFA-POSNN FORMAT COLOR COL_NORMAL.
BINARY SEARCH.
IF SY-SUBRC = 0. READ TABLE I_REMESSA
WITH KEY VBELV = I_FINAL-VBELN
READ TABLE I_ZFA03A1 POSNV = I_FINAL-POSNR
WITH KEY ABLNR = I_VBFA3-VBELV BINARY SEARCH.
FBLNR = I_VBFA3-VBELN LOOP AT I_REMESSA FROM SY-TABIX.
BINARY SEARCH. IF I_REMESSA-VBELV <> I_FINAL-VBELN OR
IF SY-SUBRC = 0. I_REMESSA-POSNV <> I_FINAL-POSNR.
I_FINAL-RFMNG6 = I_FINAL-RFMNG6 + I_VBFA-RFMNG. EXIT.
ENDIF.
MOVE:
I_VBFA-VBELV TO I_CTBESTQE-VBELV, WRITE:
I_VBFA-POSNV TO I_CTBESTQE-POSNV, /1 '|',
I_VBFA3-VBELN TO I_CTBESTQE-VBELN, 2 I_REMESSA-VBELN,
I_ZFA03A1-MBLNR TO I_CTBESTQE-MBLNR, 12 '|',
I_ZFA03A1-FKDAT TO I_CTBESTQE-FKDAT, 13 I_REMESSA-ROUTE,
I_VBFA-RFMNG TO I_CTBESTQE-RFMNG. 19 '|',
20 I_REMESSA-VBELNT,
COLLECT I_CTBESTQE. 30 '|',

119
ABAP Training
31 I_REMESSA-ERDAT, I_EXPEDIDO-POSNV <> I_FINAL-POSNR.
41 '|', EXIT.
42 I_REMESSA-ERNAM, ENDIF.
54 '|',
55 I_REMESSA-WADAT, WRITE:
65 '|', /1 '|',
66 I_REMESSA-RFMNG NO-ZERO, 2 I_EXPEDIDO-VBELN,
77 '|'. 12 '|',
13 I_EXPEDIDO-VBELNT,
HIDE: 23 '|',
I_REMESSA-VBELN, 24 I_EXPEDIDO-VBELNF,
I_REMESSA-VBELNT. 34 '|',
35 I_EXPEDIDO-XBLNR,
V_RFMNGR = V_RFMNGR + I_REMESSA-RFMNG. 43 '|',
V_COUNT = V_COUNT + 1. 44 I_EXPEDIDO-FKDAT,
ENDLOOP. 54 '|',
IF V_COUNT > 0. 55 I_EXPEDIDO-ZZEFETI,
WRITE / SY-ULINE(77). 65 '|',
ENDIF. 66 I_EXPEDIDO-ZZDENTR,
FORMAT COLOR COL_TOTAL. 76 '|',
WRITE: 77 I_EXPEDIDO-RFMNG NO-ZERO,
/1 '|', 88 '|'.
2 TEXT-052,
65 '|', HIDE:
66 V_RFMNGR NO-ZERO, I_EXPEDIDO-VBELN,
77 '|'. I_EXPEDIDO-VBELNT,
WRITE / SY-ULINE(77). I_EXPEDIDO-VBELNF,
I_EXPEDIDO-DOCNUM.
ENDFORM. " F_MONTA_REMESSA
*&---------------------------------------------------------------------* V_RFMNGE = V_RFMNGE + I_EXPEDIDO-RFMNG.
*& Form F_MONTA_EXPEDIDO V_COUNT = V_COUNT + 1.
*&---------------------------------------------------------------------* ENDLOOP.
* Mostra os dados expedidos pelo cliente * IF V_COUNT > 0.
*----------------------------------------------------------------------* WRITE / SY-ULINE(88).
FORM F_MONTA_EXPEDIDO. ENDIF.
FORMAT COLOR COL_TOTAL.
CLEAR: WRITE:
V_COUNT, /1 '|',
V_RFMNGE. 2 TEXT-052,
76 '|',
FORMAT COLOR COL_NORMAL. 77 V_RFMNGE NO-ZERO,
88 '|'.
READ TABLE I_EXPEDIDO WRITE / SY-ULINE(88).
WITH KEY VBELV = I_FINAL-VBELN
POSNV = I_FINAL-POSNR ENDFORM. " F_MONTA_EXPEDIDO
BINARY SEARCH. *&---------------------------------------------------------------------*
LOOP AT I_EXPEDIDO FROM SY-TABIX. *& Form F_MONTA_RECEBIDO
IF I_EXPEDIDO-VBELV <> I_FINAL-VBELN OR
*&---------------------------------------------------------------------* HIDE:
* Mostra os dados recebidos pelo cliente * I_RECEBIDO-VBELN,
*----------------------------------------------------------------------* I_RECEBIDO-VBELNT,
FORM F_MONTA_RECEBIDO. I_RECEBIDO-VBELNF,
I_RECEBIDO-DOCNUM.
CLEAR:
V_COUNT, V_RFMNGC = V_RFMNGC + I_RECEBIDO-RFMNG.
V_RFMNGC. V_COUNT = V_COUNT + 1.
ENDLOOP.
FORMAT COLOR COL_NORMAL. IF V_COUNT > 0.
WRITE / SY-ULINE(88).
READ TABLE I_RECEBIDO ENDIF.
WITH KEY VBELV = I_FINAL-VBELN FORMAT COLOR COL_TOTAL.
POSNV = I_FINAL-POSNR WRITE:
BINARY SEARCH. /1 '|',
LOOP AT I_RECEBIDO FROM SY-TABIX. 2 TEXT-052,
IF I_RECEBIDO-VBELV <> I_FINAL-VBELN OR 76 '|',
I_RECEBIDO-POSNV <> I_FINAL-POSNR. 77 V_RFMNGC NO-ZERO,
EXIT. 88 '|'.
ENDIF. WRITE / SY-ULINE(88).

WRITE: ENDFORM. " F_MONTA_RECEBIDO


/1 '|', *&---------------------------------------------------------------------*
2 I_RECEBIDO-VBELN, *& Form F_MONTA_RECDEV
12 '|', *&---------------------------------------------------------------------*
13 I_RECEBIDO-VBELNT, * Mostra os dados de Recusa/Devoluo *
23 '|', *----------------------------------------------------------------------*
24 I_RECEBIDO-VBELNF, FORM F_MONTA_RECDEV USING V_RECDEV.
34 '|', CLEAR:
35 I_RECEBIDO-XBLNR, V_COUNT,
43 '|', V_RFMNG1.
44 I_RECEBIDO-FKDAT,
54 '|', FORMAT COLOR COL_NORMAL.
55 I_RECEBIDO-ZZEFETI,
65 '|', READ TABLE I_RECDEV
66 I_RECEBIDO-ZZDENTR, WITH KEY AUART = V_RECDEV
76 '|', VBELN = I_FINAL-VBELN
77 I_RECEBIDO-RFMNG NO-ZERO, POSNR = I_FINAL-POSNR
88 '|'. BINARY SEARCH.
LOOP AT I_RECDEV FROM SY-TABIX.

120
ABAP Training
IF I_RECDEV-AUART <> V_RECDEV OR 114 '|'.
I_RECDEV-VBELN <> I_FINAL-VBELN OR
I_RECDEV-POSNR <> I_FINAL-POSNR. ELSEIF V_RECDEV = C_REC_ZRVR. "somente para ZRVR
EXIT. WRITE:
ENDIF. 60 I_RECDEV-XBLNR,
70 '|',
CLEAR TVAUT. 71 I_RECDEV-RFMNG NO-ZERO,
82 '|'.
SELECT SINGLE BEZEI
FROM TVAUT ELSEIF V_RECDEV = C_DEV_ZDVF. "somente para ZDVF
INTO TVAUT-BEZEI WRITE:
WHERE SPRAS = 'P' 60 I_RECDEV-BELNR,
AND AUGRU = I_RECDEV-AUGRU. 70 '|',
71 I_RECDEV-NETWR,
WRITE: 91 '|',
/1 '|', 92 I_RECDEV-NFNUM,
2 I_RECDEV-VBELNO, 102 '|',
12 '|', 103 I_RECDEV-XBLNR,
13 I_RECDEV-AUGRU, 113 '|',
16 '|', 114 I_RECDEV-RFMNG NO-ZERO,
17 TVAUT-BEZEI(20), 125 '|'.
37 '|',
38 I_RECDEV-VBELNF, ELSEIF V_RECDEV = C_DEV_ZDVR. "somente para ZDVR
48 '|', WRITE:
49 I_RECDEV-FKDAT, 60 I_RECDEV-NFNUM,
59 '|'. 70 '|',
71 I_RECDEV-XBLNR,
HIDE: 81 '|',
I_RECDEV-VBELNO, 82 I_RECDEV-RFMNG NO-ZERO,
I_RECDEV-VBELNF, 93 '|'.
I_RECDEV-VGBEL, ENDIF.
I_RECDEV-DOCNUM. V_COUNT = V_COUNT + 1.
V_RFMNG1 = V_RFMNG1 + I_RECDEV-RFMNG.
IF V_RECDEV = C_REC_ZRVF. "somente para ZRVF ENDLOOP.
WRITE: IF V_COUNT > 0.
60 I_RECDEV-BELNR, IF V_RECDEV = C_REC_ZRVF. "somente para ZRVF
70 '|', WRITE / SY-ULINE(114).
71 I_RECDEV-NETWR, ELSEIF V_RECDEV = C_REC_ZRVR. "somente para ZRVR
91 '|', WRITE / SY-ULINE(82).
92 I_RECDEV-XBLNR, ELSEIF V_RECDEV = C_DEV_ZDVF. "somente para ZDVF
102 '|', WRITE / SY-ULINE(125).
103 I_RECDEV-RFMNG NO-ZERO, ELSEIF V_RECDEV = C_DEV_ZDVR. "somente para ZDVR
WRITE / SY-ULINE(93).
ENDIF. * if v_tip_rel = 'I'.
ENDIF. SET PF-STATUS 'MAIN1'.
FORMAT COLOR COL_TOTAL. SUBTRACT 1 FROM SY-LSIND.
WRITE: * endif.
/1 '|',
2 TEXT-052. FORMAT COLOR COL_NORMAL.
IF V_RECDEV = C_REC_ZRVF. "somente para ZRVF
WRITE: LOOP AT I_FINAL.
102 '|',
103 V_RFMNG1 NO-ZERO, CHECK I_FINAL-FLAG = 'X'. "Somente mostrar registro se flag='X'
114 '|'.
WRITE / SY-ULINE(114). V_COUNT = V_COUNT + 1.
ELSEIF V_RECDEV = C_REC_ZRVR. "somente para ZRVR
WRITE: WRITE:
70 '|', /1 '|',
71 V_RFMNG1 NO-ZERO, 2 I_FINAL-VBELN,
82 '|'. 12 '|',
WRITE / SY-ULINE(82). 13 I_FINAL-BSTNK(10),
ELSEIF V_RECDEV = C_DEV_ZDVF. "somente para ZDVF 23 '|',
WRITE: 24 I_FINAL-KUNNR,
113 '|', 34 '|',
114 V_RFMNG1 NO-ZERO, 35 I_FINAL-NAME1,
125 '|'. 55 '|',
WRITE / SY-ULINE(125). 56 I_FINAL-XBLNR,
ELSEIF V_RECDEV = C_DEV_ZDVR. "somente para ZDVR 64 '|',
WRITE: 65 I_FINAL-FKDAT,
81 '|', 75 '|',
82 V_RFMNG1 NO-ZERO, 76 I_FINAL-WERKS,
93 '|'. 80 '|',
WRITE / SY-ULINE(93). 81 I_FINAL-MATNR,
ENDIF. 91 '|',
ENDFORM. " F_MONTA_RECDEV 92 I_FINAL-KWMENG NO-ZERO,
*&---------------------------------------------------------------------* 103 '|',
*& Form F_MOSTRA_DADOS 104 I_FINAL-VBELNF,
*&---------------------------------------------------------------------* 114 '|',
* Mostra os campos do registro com flag = 'X' * 115 I_FINAL-RFMNGP NO-ZERO,
*----------------------------------------------------------------------* 126 '|',
FORM F_MOSTRA_DADOS. 127 I_FINAL-RFMNGR NO-ZERO HOTSPOT,
CHECK NOT I_FINAL IS INITIAL. 138 '|',
139 I_FINAL-RFMNGE NO-ZERO HOTSPOT,
CLEAR: 150 '|',
V_COUNT, V_KWMENG, V_RFMNGP, V_RFMNGR, V_RFMNGE, 151 I_FINAL-RFMNGC NO-ZERO HOTSPOT,
V_RFMNGC, 162 '|',
V_RFMNG1, V_RFMNG2, V_RFMNG3, V_RFMNG4, V_RFMNG5, 163 I_FINAL-RFMNG1 NO-ZERO HOTSPOT,
V_RFMNG6. 174 '|',

121
ABAP Training
175 I_FINAL-RFMNG2 NO-ZERO HOTSPOT, IF V_COUNT > 0.
186 '|', ULINE.
187 I_FINAL-RFMNG3 NO-ZERO HOTSPOT, ENDIF.
198 '|', FORMAT COLOR COL_TOTAL.
199 I_FINAL-RFMNG4 NO-ZERO HOTSPOT, WRITE:
210 '|', 1 '|', TEXT-051, V_COUNT,
211 I_FINAL-RFMNG5 NO-ZERO HOTSPOT, 91 '|',
222 '|', 92 V_KWMENG NO-ZERO,
223 I_FINAL-RFMNG6 NO-ZERO HOTSPOT, 103 '|',
234 '|'. 114 '|',
115 V_RFMNGP NO-ZERO,
* if v_tip_rel = 'I'. "montar se for a primeira tela 126 '|',
127 V_RFMNGR NO-ZERO,
HIDE: 138 '|',
I_FINAL-VBELN, 139 V_RFMNGE NO-ZERO,
I_FINAL-POSNR, 150 '|',
I_FINAL-VBELNF, 151 V_RFMNGC NO-ZERO,
I_FINAL-XBLNR, 162 '|',
I_FINAL-DOCNUM, 163 V_RFMNG1 NO-ZERO,
I_FINAL-KUNNR, 174 '|',
I_FINAL-MATNR, 175 V_RFMNG2 NO-ZERO,
I_FINAL-WERKS. 186 '|',
* endif. 187 V_RFMNG3 NO-ZERO,
V_KWMENG = V_KWMENG + I_FINAL-KWMENG. 198 '|',
V_RFMNGP = V_RFMNGP + I_FINAL-RFMNGP. 199 V_RFMNG4 NO-ZERO,
V_RFMNGR = V_RFMNGR + I_FINAL-RFMNGR. 210 '|',
V_RFMNGE = V_RFMNGE + I_FINAL-RFMNGE. 211 V_RFMNG5 NO-ZERO,
V_RFMNGC = V_RFMNGC + I_FINAL-RFMNGC. 222 '|',
V_RFMNG1 = V_RFMNG1 + I_FINAL-RFMNG1. 223 V_RFMNG6 NO-ZERO,
V_RFMNG2 = V_RFMNG2 + I_FINAL-RFMNG2. 234 '|'.
V_RFMNG3 = V_RFMNG3 + I_FINAL-RFMNG3. ULINE.
V_RFMNG4 = V_RFMNG4 + I_FINAL-RFMNG4.
V_RFMNG5 = V_RFMNG5 + I_FINAL-RFMNG5. ENDFORM. " F_MOSTRA_DADOS
V_RFMNG6 = V_RFMNG6 + I_FINAL-RFMNG6. *&---------------------------------------------------------------------*
ENDLOOP. "I_FINAL *& Form F_MONTA_SOMA
*&---------------------------------------------------------------------*
* text * WRITE / SY-ULINE(170).
*----------------------------------------------------------------------* WRITE:
FORM F_MONTA_SOMA. /1 '|',
2 TEXT-052,
FIELD-SYMBOLS: <FNAME>. 38 '|',
39 I_SOMA-KWMENG NO-ZERO,
GET CURSOR FIELD V_FIELD. 50 '|',
ASSIGN (V_FIELD) TO <FNAME>. 51 I_SOMA-RFMNGP NO-ZERO,
REFRESH I_SOMA. 62 '|',
LOOP AT I_FINAL. 63 I_SOMA-RFMNGR NO-ZERO,
74 '|',
CHECK I_FINAL-FLAG = 'X'. "Somente mostrar registro se flag='X' 75 I_SOMA-RFMNGE NO-ZERO,
86 '|',
CLEAR I_SOMA. 87 I_SOMA-RFMNGC NO-ZERO,
I_SOMA-KEYVALUE = <FNAME>. 98 '|',
MOVE-CORRESPONDING I_FINAL TO I_SOMA. 99 I_SOMA-RFMNG1 NO-ZERO,
COLLECT I_SOMA. 110 '|',
ENDLOOP. "I_FINAL 111 I_SOMA-RFMNG2 NO-ZERO,
122 '|',
FORMAT COLOR COL_NORMAL. 123 I_SOMA-RFMNG3 NO-ZERO,
134 '|',
SORT I_SOMA. 135 I_SOMA-RFMNG4 NO-ZERO,
LOOP AT I_SOMA. 146 '|',
WRITE: 147 I_SOMA-RFMNG5 NO-ZERO,
/1 '|', 158 '|',
2 I_SOMA-KEYVALUE, 159 I_SOMA-RFMNG6 NO-ZERO,
38 '|', 170 '|'.
39 I_SOMA-KWMENG NO-ZERO, ENDAT.
50 '|', ENDLOOP.
51 I_SOMA-RFMNGP NO-ZERO, WRITE / SY-ULINE(170).
62 '|',
63 I_SOMA-RFMNGR NO-ZERO, ENDFORM. "F_MONTA_SOMA
74 '|', *&---------------------------------------------------------------------*
75 I_SOMA-RFMNGE NO-ZERO, *& Form F_MONTA_CTBESTQ_S
86 '|', *&---------------------------------------------------------------------*
87 I_SOMA-RFMNGC NO-ZERO, * text *
98 '|', *----------------------------------------------------------------------*
99 I_SOMA-RFMNG1 NO-ZERO, FORM F_MONTA_CTBESTQ_S.
110 '|',
111 I_SOMA-RFMNG2 NO-ZERO, CLEAR:
122 '|', V_COUNT,
123 I_SOMA-RFMNG3 NO-ZERO, V_RFMNG5.
134 '|',
135 I_SOMA-RFMNG4 NO-ZERO, FORMAT COLOR COL_NORMAL.
146 '|',
147 I_SOMA-RFMNG5 NO-ZERO, READ TABLE I_CTBESTQS
158 '|', WITH KEY VBELV = I_FINAL-VBELN
159 I_SOMA-RFMNG6 NO-ZERO, POSNV = I_FINAL-POSNR
170 '|'. BINARY SEARCH.
AT LAST. LOOP AT I_CTBESTQS FROM SY-TABIX.
SUM. IF I_CTBESTQS-VBELV <> I_FINAL-VBELN OR
FORMAT COLOR COL_TOTAL. I_CTBESTQS-POSNV <> I_FINAL-POSNR.

122
ABAP Training
EXIT. ENDFORM. " F_MONTA_CTBESTQ_S
ENDIF. *&---------------------------------------------------------------------*
WRITE: *& Form F_MONTA_CTBESTQ_E
/1 '|', *&---------------------------------------------------------------------*
2 I_CTBESTQS-VBELN, * text *
12 '|', *----------------------------------------------------------------------*
13 I_CTBESTQS-MBLNR, FORM F_MONTA_CTBESTQ_E.
23 '|',
24 I_CTBESTQS-FKDAT, CLEAR:
34 '|', V_COUNT,
35 I_CTBESTQS-RFMNG NO-ZERO, V_RFMNG6.
46 '|'.
FORMAT COLOR COL_NORMAL.
HIDE I_CTBESTQS-VBELN.
READ TABLE I_CTBESTQE
V_COUNT = V_COUNT + 1. WITH KEY VBELV = I_FINAL-VBELN
V_RFMNG5 = V_RFMNG5 + I_CTBESTQS-RFMNG. POSNV = I_FINAL-POSNR
ENDLOOP. BINARY SEARCH.
IF V_COUNT > 0. LOOP AT I_CTBESTQE FROM SY-TABIX.
WRITE / SY-ULINE(46). IF I_CTBESTQE-VBELV <> I_FINAL-VBELN OR
ENDIF. I_CTBESTQE-POSNV <> I_FINAL-POSNR.
FORMAT COLOR COL_TOTAL. EXIT.
WRITE: ENDIF.
/1 '|', WRITE:
2 TEXT-052, /1 '|',
34 '|', 2 I_CTBESTQE-VBELN,
35 V_RFMNG5 NO-ZERO, 12 '|',
46 '|'. 13 I_CTBESTQE-MBLNR,
WRITE / SY-ULINE(46). 23 '|',
24 I_CTBESTQE-FKDAT,
34 '|', 76 TEXT-009,
35 I_CTBESTQE-RFMNG NO-ZERO, 80 '|',
46 '|'. 82 TEXT-010,
91 '|',
HIDE I_CTBESTQE-VBELN. 93 TEXT-011,
103 '|',
V_COUNT = V_COUNT + 1. 107 TEXT-012,
V_RFMNG6 = V_RFMNG6 + I_CTBESTQE-RFMNG. 114 '|',
ENDLOOP. 115 TEXT-013,
IF V_COUNT > 0. 126 '|',
WRITE / SY-ULINE(46). 127 TEXT-014,
ENDIF. 138 '|',
FORMAT COLOR COL_TOTAL. 140 TEXT-015,
WRITE: 150 '|',
/1 '|', 152 TEXT-016,
2 TEXT-052, 162 '|',
34 '|', 167 TEXT-017,
35 V_RFMNG6 NO-ZERO, 174 '|',
46 '|'. 179 TEXT-018,
WRITE / SY-ULINE(46). 186 '|',
191 TEXT-019,
ENDFORM. " F_MONTA_CTBESTQ_E 198 '|',
*&---------------------------------------------------------------------* 203 TEXT-020,
*& Form F_CABEC_PRINCIPAL 210 '|',
*&---------------------------------------------------------------------* 215 TEXT-021,
* Monta o cabealho principal do relatrio * 222 '|',
*----------------------------------------------------------------------* 227 TEXT-022,
FORM F_CABEC_PRINCIPAL. 234 '|'.
ULINE.
FORMAT COLOR COL_HEADING.
WRITE 1 V_SUBTIT. ENDFORM. " F_CABEC_PRINCIPAL
SKIP. *&---------------------------------------------------------------------*
ULINE. *& Form F_CABEC_SOMA
WRITE: *&---------------------------------------------------------------------*
1 '|', * Monta cabealho do SOMA *
38 TEXT-023, *----------------------------------------------------------------------*
103 '|', FORM F_CABEC_SOMA.
118 TEXT-024, FORMAT COLOR COL_HEADING.
162 '|', WRITE 1 V_SUBTIT.
176 TEXT-050, SKIP.
210 '|', WRITE / SY-ULINE(170).
212 TEXT-025, WRITE:
234 '|'. /1 '|',
ULINE. 2 TEXT-053,
WRITE: 38 '|',
1 '|', 41 TEXT-011,
2 TEXT-003, 50 '|',
12 '|', 51 TEXT-013,
13 TEXT-004, 62 '|',
23 '|', 64 TEXT-014,
25 TEXT-005, 74 '|',
34 '|', 77 TEXT-015,
37 TEXT-006, 86 '|',
55 '|', 89 TEXT-016,
56 TEXT-007, 98 '|',
64 '|', 103 TEXT-017,
65 TEXT-008, 110 '|',
75 '|', 115 TEXT-018,

123
ABAP Training
122 '|', 13 TEXT-027,
127 TEXT-019, 19 '|',
134 '|', 20 TEXT-028,
139 TEXT-020, 30 '|',
146 '|', 31 TEXT-029,
151 TEXT-021, 41 '|',
158 '|', 44 TEXT-030,
163 TEXT-022, 54 '|',
170 '|'. 55 TEXT-031,
WRITE / SY-ULINE(170). 65 '|',
67 TEXT-032,
ENDFORM. " F_CABEC_SOMA 77 '|'.
*&---------------------------------------------------------------------* WRITE / SY-ULINE(77).
*& Form F_CABEC_REMESSA
*&---------------------------------------------------------------------* ENDFORM. " F_CABEC_REMESSA
* Monta cabealho do relatrio de remessa * *&---------------------------------------------------------------------*
*----------------------------------------------------------------------* *& Form F_CABEC_EXPREC
FORM F_CABEC_REMESSA. *&---------------------------------------------------------------------*
* Monta cabealho do relatrio expedido/recebido *
WRITE / SY-ULINE(77). *----------------------------------------------------------------------*
WRITE: FORM F_CABEC_EXPREC.
/1 '|',
3 TEXT-026, WRITE / SY-ULINE(88).
12 '|', WRITE:
/1 '|', 16 '|',
3 TEXT-026, 23 TEXT-039,
12 '|', 37 '|',
13 TEXT-028, 38 TEXT-037,
23 '|', 48 '|',
24 TEXT-037, 49 TEXT-008,
34 '|', 59 '|',
35 TEXT-007, 60 TEXT-042,
43 '|', 70 '|',
44 TEXT-033, 71 TEXT-043,
54 '|', 82 '|'.
55 TEXT-034, WRITE / SY-ULINE(82).
65 '|',
66 TEXT-035, ENDFORM. " F_CABEC_ZRVR
76 '|', *&---------------------------------------------------------------------*
78 TEXT-036, *& Form F_CABEC_ZDVF
88 '|'. *&---------------------------------------------------------------------*
WRITE / SY-ULINE(88). * Monta cabealho do relatrio ZDVF *
*----------------------------------------------------------------------*
ENDFORM. " F_CABEC_EXPREC FORM F_CABEC_ZDVF.
*&---------------------------------------------------------------------*
*& Form F_CABEC_ZRVF WRITE / SY-ULINE(125).
*&---------------------------------------------------------------------* WRITE:
* Monta cabealho do relatrio ZRVF * /1 '|',
*----------------------------------------------------------------------* 2 TEXT-044,
FORM F_CABEC_ZRVF. 12 '|',
13 TEXT-038,
WRITE / SY-ULINE(114). 16 '|',
WRITE: 22 TEXT-039,
/1 '|', 37 '|',
2 TEXT-044, 38 TEXT-037,
12 '|', 48 '|',
13 TEXT-038, 49 TEXT-008,
16 '|', 59 '|',
22 TEXT-039, 60 TEXT-040,
37 '|', 70 '|',
38 TEXT-037, 75 TEXT-041,
48 '|', 91 '|',
49 TEXT-008, 92 TEXT-049,
59 '|', 102 '|',
60 TEXT-040, 103 TEXT-045,
70 '|', 113 '|',
75 TEXT-041, 115 TEXT-046,
91 '|', 125 '|'.
92 TEXT-042, WRITE / SY-ULINE(125).
102 '|',
103 TEXT-043, ENDFORM. " F_CABEC_ZDVF
114 '|'. *&---------------------------------------------------------------------*
WRITE / SY-ULINE(114). *& Form F_CABEC_ZDVR
*&---------------------------------------------------------------------*
ENDFORM. " F_CABEC_ZRVF * Monta cabealho do relatrio ZDVR *
*&---------------------------------------------------------------------* *----------------------------------------------------------------------*
*& Form F_CABEC_ZRVR FORM F_CABEC_ZDVR.
*&---------------------------------------------------------------------*
* Monta cabealho do relatrio ZRVR * WRITE / SY-ULINE(93).
*----------------------------------------------------------------------* WRITE:
FORM F_CABEC_ZRVR. /1 '|',
2 TEXT-044,
WRITE / SY-ULINE(82). 12 '|',
WRITE: 13 TEXT-038,
/1 '|', 16 '|',
2 TEXT-044, 22 TEXT-039,
12 '|', 37 '|',
13 TEXT-038, 38 TEXT-037,

124
ABAP Training
48 '|',
49 TEXT-008, WRITE / SY-ULINE(46).
59 '|', WRITE:
60 TEXT-049, /1 '|',
70 '|', 2 TEXT-037,
71 TEXT-045, 12 '|',
81 '|', 13 TEXT-047,
83 TEXT-046, 23 '|',
93 '|'. 25 TEXT-048,
WRITE / SY-ULINE(93). 34 '|',
36 TEXT-036,
ENDFORM. " F_CABEC_ZDVR 46 '|'.
*&---------------------------------------------------------------------* WRITE / SY-ULINE(46).
*& Form F_CABEC_CTBESTQ
*&---------------------------------------------------------------------* ENDFORM. " F_CABEC_CTBESTQ
* Monta cabealho do relatrio CTBESTQ * *&---------------------------------------------------------------------*
*----------------------------------------------------------------------* *& Form F_SORT_TABELA
FORM F_CABEC_CTBESTQ. *&---------------------------------------------------------------------
*
* Ordena a tabela I_FINAL *
*----------------------------------------------------------------------*
FORM F_SORT_TABELA.

CLEAR: V_FIELD, V_FNAME.

GET CURSOR FIELD V_FIELD.


V_FNAME = V_FIELD+8(12).

* check sy-lilli >= 10.

IF SY-UCOMM = 'ASCE'.
SORT I_FINAL BY (V_FNAME) ASCENDING.
ELSE.
SORT I_FINAL BY (V_FNAME) DESCENDING.
ENDIF.

* subtract 1 from sy-lsind.

ENDFORM. "F_SORT_TABELA
*&---------------------------------------------------------------------*
*& Form F_DISPLAY_DOCUMENT
*&---------------------------------------------------------------------*
* Visualiza documento crdito a partir da fatura (VF03-Contabil) *
*----------------------------------------------------------------------*
FORM F_DISPLAY_DOCUMENT USING V_VBELN_F.

REFRESH I_BDCDATA.

* Main screen for invoice display


I_BDCDATA-PROGRAM = 'SAPMV60A'.
I_BDCDATA-DYNPRO = '0101'.
I_BDCDATA-DYNBEGIN = 'X'.
APPEND I_BDCDATA.

* Enter the invoice number


CLEAR I_BDCDATA.
I_BDCDATA-FNAM = 'VBRK-VBELN'.
I_BDCDATA-FVAL = V_VBELN_F.
APPEND I_BDCDATA.

CLEAR I_BDCDATA.
I_BDCDATA-FNAM = 'BDC_OKCODE'.
I_BDCDATA-FVAL = 'UEBB'.
APPEND I_BDCDATA.

CALL TRANSACTION 'VF03' USING I_BDCDATA MODE 'E'.

ENDFORM.

125
ABAP Training

4. Performance

4.1. Objetivo

Troca de informaes sobre os pontos mais comuns no mercado de programao


ABAP que tem causado problemas graves de performance (clientes e parceiros)
Recomendaes SAP
Demonstrar alguns casos verdicos
Demonstrar estatsticas sobre o uso de algumas tcnicas de converso (Batch-
Input, Call Transaction, Direct Input)

4.2. Arquitetura Client-Server

O R/3 trabalha com uma filosofia de cliente/servidor de 3 nveis:

Database server : responsvel pelo acesso e pela atualizao dos dados


Application server : responsvel pelo processamento da aplicao (tempo
despendido com a interpretao de comandos ABAP)
Frontend : responsvel pelo processamento dos grficos (tempo
despendido pelo sistema R/3, ou seja, o middleware e
Kernel). Kernel = conjunto de programas utilitrios que
existe dentro do R/3, servindo ao cumprimento de
inmeras tarefas

A alocao dos servidores de aplicao definida automaticamente no momento de


logon ( checado qual servidor est menos sobrecarregado).

Dica: Para se obter uma otimizao da performance em programas ABAP, deve-se


minimizar o tempo de acesso ao database.

4.3. Grandes viles no que se refere performance

Ninhos de select
Select . Endselect ao invs de comandos que recuperem do banco de dados
todos os registros de uma nica vez
Select * ao invs de select com as colunas necessrias ao processamento
Select single sem chave completa especificada ao invs de Select up to 1 row
Selects genricos, ou seja, onde a clusula where no foi fortemente
especificada, com vrias condies, visando restringir a seleo
ndices no utilizados
Falta de ndices

126
ABAP Training
Select em tabelas com alto nmero de registros utilizando clusula where
baseada em tela de seleo onde o preenchimento no obrigatrio
Definio funcional falha
Grandes tabelas do sistema: BKPF, BSEG, EKKO, EKPO, VBAK, VBAB, MKPF,
MSEG, J_1BNFDOC, J_1BNFLIN
Funes genricas, como por exemplo CLAF_CLASSIFICATION_OF_OBJECTS

4.4. Comunicao entre o Application Server e Database


Server

Premissa:
VBAK contm 1000 registros, sendo que cada registro contm 575 bytes.

Fato:
A comunicao entre o DB server e o Application server acontece em pacotes de
32.000 bytes, dependendo da rede e equipamentos de comunicao utilizados.

Select * from VBAK.

Portanto:
1000 registros x 575 bytes = 575.000 bytes
575.000 bytes / 32.000 = 20 pacotes
20 pacotes: na verdade este nmero um pouco mais alto (mais ou menos 24),
uma vez que informaes administrativas so transferidas em cada transmisso,
juntamente com os dados.
O exemplo acima tenta ilustrar que, se forem selecionadas apenas as colunas
necessrias, a transferncia de dados ser menor e, consequentemente, haver
uma reduo significativa no tempo de resposta.

Select e Logical Database

Get VBAK
Get VBAK fields vbeln auart bname kunnr

O segundo comando muito melhor que o primeiro. Porm, nem todos os logical
database suportam select em colunas. Para verificar se isso possvel, acesse a
transao SE36, coloque o nome do database no qual se deseja efetuar uma
pesquisa e escolha a opo: extras -> field selection.

127
ABAP Training
Cursor Caching

Os seguintes comandos SQL produzem o mesmo resultado, mas cada um deles


requer seu prprio cursor uma vez que os comandos no so idnticos (verifique a
ordem das colunas aps a palavra Select e na clusula WHERE):

Select vbeln auart into (vbak-vbeln, vbak-auart) from vbak


where vbeln = nnn and auart = yyyy

Select vbeln auart into (vbak-vbeln, vbak-auart) from vbak


where auart = yyyy and vbeln = nnn

Select auart vbeln into (vbak-auart, vbak- vbeln) from vbak


where vbeln = nnn and auart = yyyy

Select auart vbeln into (vbak-auart, vbak- vbeln) from vbak


where auart = yyyy and vbeln = nnn

Desnecessrios comandos Declare e Prepare podem ser evitados se os comandos


SQL so mantidos consistentes nos programas que esto sendo desenvolvidos
(quando se usar select com colunas ou declarando condies WHERE sempre use a
sequncia de campos conforme definido no Data Dictionary)

128
ABAP Training
Logical database e Tables statements
Report ZACCENTURE.

Tables: vbak, vbkd, vbpa.

Get vbak fields vbeln auart bname kunnr.


Write: vbak-vbeln, vbak-auart, . .

Get vbpa fields parvw kunnr.


Write: vbpa-parvw, vbpa-kunnr, vbkd-zterm.

Ao invs use:

Get vbak fields vbeln auart bname kunnr.


Write: vbak-vbeln, vbak-auart, . .

Get vbkd field zterm.

Get vbpa fields parvw kunnr.


Write: vbpa-parvw, vbpa-kunnr, vbkd-zterm.

OBS.: A estrutura do logical database VAV (utilizado anteriormente) VBAK VBUK


VBKD VBPA.

Se uma tabela no especificada via um carto TABLES ento o sistema


automaticamente recupera somente os campos chave para aquela tabela (aqui
VBUK no est presente no carto tables, assim somente os campos chaves so
recuperados pelo sistema).

Se uma tabela especificada via TABLES, todas as colunas so recuperadas,


mesmo se nenhum campo daquela tabela usado no programa (veja a tabela VBKD
somente o campo ZTERM deveria ser impresso).

Para evitar ter todas as colunas selecionadas da tabela, insira um comando GET
para aquela tabela, especificando os campos que sero utilizados pelo programa
posteriormente.

Select exit versus Select . Up to 1 rows.

Vantagem em performance:
Select exit. Endselect. = 150.000 ms
Select up to 1 rows = 1.500 ms

Check inside Select endselect.

129
ABAP Training

Comparao de Runtime baseada numa varredura de 57.000 registros na VBAK

Select & Check = 27.958.000 ms


Select com clusula WHERE = 3.065.000 ms

Em caso de condies de checagens muito complexas poderia ser mais rpido obter
dados do banco de dados primeiramente. SQL Trace precisa ser usado para verificar
qual mtodo o mais rpido.

Isso tambm vlido para select single.

Selects em campos sem ndices

Select-options: bname_so for vbak-bname.

Select vbeln bname . Into (vbak-vbeln ) from vbak


Where bname in bname_so order by <field> descending.

Endselect.

O sistema standard distribudo sem um ndice para o campo bname. A seleo


acima ir resultar numa varredura sequencial da tabela vbak. Isto no aceitvel
num sistema em produo. Criando um ndice na tabela vbak para o campo bname
ir resolver o problema neste caso. Exceo: tabelas cuja buferizao full ou
generic (neste caso no tem sentido pois o primeiro acesso ir trazer todos os
dados para a memria. Das prximas vezes, o sistema busca do buffer e no do
database at que o dado mude novamente).

Select sum, avg, min, max versus ABAP calculations

Select matnr kwmeng meins into <internal table>


From vbap where . .
Collect <internal table>.
Endselect.

Ao invs use:
Select matnr sum( kwmeng ) meins into table <internal table>
From vbap where .
Group by matnr meins.

O ganho em performance para o processamento de 10.000 registros:


Select + collect = 2.370.000 ms
Select sum . Into table = 1.574.000 ms
OBS.: o group by no pode ser usado para tabelas pool e cluster.
Select sem clusula where

Select col1 col2 . Into . from vbak.

130
ABAP Training
Perform calculate_stuff.
Endselect.

Um select sem clusula WHERE idnica um erro no design do programa,


especialmente se o select usado em tabelas SAP com grande
crescimento/tamanho em pouco tempo, em geral, BKPF, BSEG, COBK, COEP, LIPK,
LIPS, MKPF, MSEG, VBAK, VBAP, VBPA, VBFA.

Programas iro rodar de forma correta e bem na entrada em produo, todavia a


performance ir decrescer medida que dados so adicionados diariamente.

Table buffering

Para analisar a buferizao de tabelas use funo de chamadas estatsticas:


Transaction ST02 -> details analysis menu -> call statistics (tables). Esta funo
ajuda voc a determinar se tabelas desenvolvidas pelo cliente so buferizadas
corretamente.

Para analisar a qualidade da buferizao de tabelas use a transao ST02, d duplo


click em TABLES (generic key) e clique no pushbutton buffered objects.

Por que buferizar ?


Usando buferizao pode-se reduzir consideravelmente o tempo que se leva para
recuperar um registro.

Tipos de buferizao:

Full: resident buffer (100 %): o contedo de toda a tabela carregado no


buffer no primeiro acesso realizado na tabela
Generic: uma chave genrica (primeiros n campo chaves) especificado
quando da criao da tabela, quando se mantm technical settings. Esta
chave genrica divide o contedo da tabela em chamadas reas genricas.
Quando acessando qualquer dado com uma deteminada/especificada chave
genrica, toda a rea genrica carregada no buffer.
Partial (single record): somente registros nicos so lidos do banco de
dados e armazenados no buffer.

Quando bufferizar uma tabela ?

Uma tabela deveria ser buferizada quando:


Menor em tamanho (poucas linhas ou poucas colunas com tamanho de
campos pequenos)
acessada muito mais para leitura
alteraes no ocorrem frequentemente

Tabelas que so boas candidatas a buferizao:

131
ABAP Training

tabelas de controle/tabelas de customizao


small master data tables (ex.: 100 material master recores -> few changes)

Como buferizar uma tabela ?

Como ativar/desativar uma buferizao:


dictionary maintenance (SE11 -> technical settings)
technical settings for a table (transaction SE13)

Decidindo sobre o tipo de buferizao:


full (resident = 100 %)
generic (with number of key fields for the generic key)
single records (partial buffering)

Comandos SQL bypassing a buferizao:

select bypassing buffer


select from database views (projection views are ok)
select distinct
select count, sum, avg, min, max
select order by (outros alm da chave primria)
select for update
Clusula where contm o comando IS NULL
Comandos natives do SQL (EXEC SQL ENDEXEC) Evite esses commandos
quando estiver trabalhando com tabelas buferizadas!!!

Outros responsveis pela degradao da performance

Move corresponding interessante para pequenas tabelas ou quando alguns


campos (mas no todos) precisam ser movimentados.
No use sort - appends. Ele consome muito tempo de CPU e os resultados so
frequentemente imprevisveis.
Sempre especifique ASCENDING ou DESCENDING em processamentos com
SORT. Qualificar todos os comados SORT atravs da clusula BY <data fields>
melhora a performance e a leitura do cdigo, evitando assim que todos os
campos do registro sofram classificao
Use COMPUTE ao invs de ADD, SUB, MULTI, DIV desde que performance no
seja um grande problema. O comando COMPUTE mais fcil de implementar e
com ele a leitura do programa se torna mais fcil. A diferena em performance
minuto, todavia se o objetivo conseguir tempo de resposta de subsegundos
para transaes complexas, ento deve-se usar comandos separados
Quando da definio de uma tabela no dicionrio de dados do R/3 os campos
chave sempre devem ser colocados nas primeiras posies do registro da tabela
(primeiras colunas). O banco de dados comprime os dados para todos os campos

132
ABAP Training
da tabela, mas a compresso no ocorre para campos chave. A compresso
tambm s possvel para as colunas aps o ltimo campo chave: isso explica o
porque de agrupar todos os campos chaves nas primeiras posies
Transparent e Pool Tables: sempre que for feito um select para buscar dados de
tabelas deste tipo pode-se qualificar a clusula WHERE com campos chave e no
chave, ou seja, quanto mais condies puderem ser definidas, melhor para a
obteno de performance. Isto permite que o banco de dados avalie os registros
e retorne somente aqueles que combinem com o critrio de seleo definido
Cluster table: ocorre exatamente o inverso: devido a forma de armazenamento
destas tabelas, na clusula WHERE deve constar apenas os campos chaves e os
demais campos devem ser checados atravs do comando CHECK. O banco de
dados no consegue processar cluster tables como ele processa transparent
tables. Forando o banco de dados a descompactar e checar campos (em caso
de Select com campos no chaves na clusula WHERE) menos eficiente, na
maioria dos casos, que qualificando somente com campos chaves e deixando o
CHECK para os campos no chave aps eles terem sido retornados. Na verdade
ambos modos iro funcionar, porm um deles ser ineficiente pois ir requerer
grande parte da memria disponvel, espao em buffer e tempo do banco de
dados para descompactar campos no chave, o que certamente ir refletir em
performance. Em algumas tabelas Cluster, mesmo a seleo com restries
atravs das chaves primrias torna-se lenta, compensando, nestes casos, a
seleo da tabela inteira e jogando-a para uma tabela interna e a partir desta
fazer as restries.
Campos que sero comparados na clusula WHERE devem ter atributos
similares. Se isso no ocorre, o sistema tem que converter o dado toda vez que a
comparao feita. Quando isso no possvel, mova o dado a ser comparado
para uma rea
auxiliar, antes de efetuar a comparao (esta rea auxiliar deve ser definida
com o mesmo tipo e tamanho da coluna da tabela)
Evitar classificaes em vrias tabelas e, posteriormente, a realizao de loops.
Ou seja, evitar construes do tipo SORT tab1, SORT tab2, , e depois o LOOP
tab1, LOOP tab2 . . Isso funciona, porm ir requerer mais memria e recursos
para possuir todos os dados resultantes da classificao at que eles sejam
usados. Ao contrrio, quando se faz SORT seguido de LOOP, o espao liberado
ao trmino do loop

Quando usar internal table ou Dictionary structure

Para tabelas que so usadas repetidamente ou por vrios programas, considere a


possibilidade de criar estruturas de dados no Data Dictionary (e abr-las atravs do
comando TABLES) ao invs de defin-las dentro de programas individuais (atravs
do comando DATA . ENDDATA).

Sobre estas circunstncias, o uso de tabela interna atravs do Data Dictionary


prefervel:

a tabela interna grande

133
ABAP Training
a tabela acessada da mesma forma toda vez
a mesma tabela interna usada em vrios programas
o programa ir processar vrias tabelas internas ao mesmo tempo (e ento
precisa de muita memria)
o uso de memria um ponto chave para otimizao de um programa em
particular

Use o comando FREE para liberar memria alocada a tabelas internas. Este
comando deve seguir o ltimo comando para processamento do dado na tabela.

Use o comando FREE sob as seguintes condies:


a tabela interna grande
a tabela interna classificada e reprocessada vrias vezes
o programa est processando vrias tabelas internas (e portanto necessita de
grande quantidade de memria)
o uso de memria importante para um programa em particular ser otimizado:
um LOOP AT . WHERE prefervel a um LOOP AT CHECK ENDLOOP porque
estar sendo reduzido o nmero de comandos a serem interpretados

134
ABAP Training

4.5. Processamento de grandes tabelas

Quando estiverem sendo manipuladas grandes tabelas muito importante que seja
processada a maior quantidade possvel de informao num primeiro momento e,
se possvel, eliminar qualquer outra passagem nesta mesma tabela. Muitas vezes
isso requer o uso de tabelas internas. Cada situao deve ser analisada e
avalidada, para ver qual o procedimento correto a ser tomado: se armazenar o dado
ou fazer novo acesso tabela do Data Dictionary. Considere as seguintes questes:

qual o tamanho da tabela original comparado ao subset que seria armazenado


em uma tabela interna ?
quanto espao para armazenamento seria necessrio para armazenar o dado em
uma taela interna ?

Se o processamento precisar ocorrer somente uma vez (por exemplo, armazenar


alguns dados para posterior comparao), esteja certo que isso acontecer for a de
uma estrutura em forma de looping (por exemplo, Select, Loop, Do), de forma que o
processamento no seja repetido desnecessariamente.

Dica: o operador IN consome muito tempo de mquina e no deveria ser usado em


lugar do operador EQ .
Expresses lgicas so avaliadas da esquerda para a direita. A avaliao termina
quando o resultado final foi estabelecido (eliminao ou incluso completa).
Todavia, quando se utiliza os operadores AND ou OR (por exemplo, em IF, WHERE) o
critrio de eliminao mais comum deve ocorrer primeiramente.

Exemplo:
A seguinte tabela deve ser lida, imprimindo-se os empregados da companhia ABC
na Georgia

EMPLOYEE NAME COMPANY STATE


001 Doe, Jr. ABC TX
002 Doe, M. ABC OK
003 Jones, A. XYZ TX
004 Jones, B. ABC GA
005 Jones, C. ABC TX
006 Jones, D. XYZ GA
007 Jones, E. ABC TX
008 Smith, A. ABC GA
009 Smith, B. ABC TX
010 Smith, C. ABC OK

if company = ABC and


state = GA
write ..

135
ABAP Training
endif.
isto funciona, mas tanto os campos company quanto state precisam ser
avaliados para oito de dez campos

if state = GA and
company = ABC
write ..
endif.
isto necessita menos tempo para ser processado, porque ele elimina
todos os registros sem state = GA e portanto tanto o campo company
quanto state precisam ser avaliados para somente trs registros.

4.6. ndices secundrios:

sempre esteja certo que o seu ndice est sendo usado:


A well-defined and properly implemented index is one of the best performance
and tuning tool available. Because of the diversity of various database systems,
however, and in particular various database optimizers, it is not possible to
establish any hard-and-fast rules for creating and using database index.
Additionally, it is impossible to guarantee that the database optimizers will use your
index .
Para saber se o ndice definido est sendo usado:
use o SQL Trace (transao ST05) para ativar e desativar o trace
clique em trace on
execute a transao em questo em uma outra sesso
retorne a ST05 e clique em trace off
clique em list trace para visualizar os resultados de seu trace
clique em prepare, open ou reopen para selecionar o comando SQL que ser
avaliado
clique em EXPLAIN para obter o resultado do comando SQL

136
ABAP Training
Regras gerais para criao e uso de ndices secundrios:

Um ndice suporta pesquisa a dados no banco de dados. Todas as tabelas standard


SAP possuem um ndice primrio, o qual consiste de campos chaves que o usurio
define quando da criao de uma tabela. Para os selects aonde a chave primria
no pode ser utilizada na clusula WHERE, ou quando selects no so qualificados,
o banco de dados pesquisa a tabela inteira (executa uma varredura sequencial).

O Dicionrio de Dados da SAP suporta at 16 ndices para cada tabela.


Geralmente, crie ndices com menos que 5 campos.

Geralmente, se uma condio inclui OR, o otimizador pra o processamento


(e chama uma varredura sequencial) to logo o primeiro OR seja encontrado.
A exceo possvel um OR que prope uma condio separada e nica
para avaliao.

Exemplo:
ZTABLE definida com um ndice secundrio:

FIELDNAME TYPE LENGTH


FieldC Char 3
FieldF Char 2

Select * from ztable where


fieldc = ABC and
(fieldf = 12 or 13)
isto executado, mas no usa o ndice conforme esperado

Select * from ztable where


(fieldc = ABC and fieldf = 12) or
(fieldc = ABC and fieldf = 13)
isto executado usando o ndice

137
ABAP Training
Informaes gerais:

Clusulas IN so frequentemente interpretadas como condies OR e podem


gerar alguns problemas
ndices no so usados para condies IS (NOT) NULL
A maior parte dos otimizadores tem problemas com condies OR, NEQ e LIKE

Exemplo:
ZTABLE definida com um ndice secundrio

FIELD NAME TYPE LENGTH


FieldA Char 3
FieldB Char 3
FieldC Char 2
FieldD Char 4

Select * from ztable


Where fieldA = ABC and
field B = XYZ and
fieldC = 12.
isto funciona bem.

Select * from ztable


Where fieldA = ABC and
field B = XYZ and
fieldD = DEFG.

isto no usa o ndice conforme esperado e provavelmente invoca uma varredura


sequencial da tabela baseada na chave primria

138
ABAP Training
Considere a criao de um ndice se um ou mais condies se aplicarem:

campos no chave so repetidamente usados para fazer selees


somente uma pequena parte de uma grande tabela selecionada (< 5%)
a clusula WHERE de um comando SELECT simples
os campos que compe o ndice reduzem significativamente o conjunto de
registros em uma clusula WHERE

No crie ndices se uma das seguintes condies se aplicar:


a redundncia de dados de armazenamento do ndice cria problemas devido ao
tamanho da tabela ou ndice
atualizaes constantes criam excessivo overhead ou perda de performance
durante a atualizao do ndice
manuteno de um ndice (como a reorganizao) causa perda dos benefcios
esto sendo usados campos cujos valores para a maioria dos registros na tabela
um valor inicial ou tem um valor que idntico para a maioria dos registros

Conceito de atualizao em update task

Para aproveitar ao mximo os recursos computacionais de cada nvel, a SAP criou


um conceito de atualizao em update task. Se for feita uma pesquisa em todos os
programas "on-line" da SAP, ser verificado que a atualizao sempre em funes
que s fazem o update, e que no retornam valores nem mesmo exceptions se
estas ocorrerem. (CALL FUNCTION .... IN UPDATE TASK).

Logo todas as aplicaes fazem todas as checagens possveis e imaginveis antes


de chamarem estas funes, ou seja, as exceptions que podem ocorrer so
somentes as de BD (por exemplo table space, ou algo no previsto). Se uma
aplicao faz "n" atualizaes, esta ir chamar "n" funes (uma para cada update
de um conjunto de tabelas) e, ao final, dar um commit work. O que o R/3 faz
simplesmente ir criando todos estes dados em uma espcie de log. No momento do
commit work ele cria uma outra LUW (Logical Unit of Work) no servidor de BD e
passa esta tarefa para este. Note que o programa (que esta sendo processado no
servidor de aplicao), no fica esperando a resposta se o update ocorreu
corretamente ou no, ele continua o processamento e termina a transao muitas
vezes antes do servidor de DB ter terminado o processamento.

A vantagem bvia deste processo a diminuio de gargalos via este


"tratamento de mensagens" entre as duas camadas (DB e aplicao).
Quando se utiliza o comando SET UPDATE TASK LOCAL o servidor de aplicao
passa a executar o update (ou seja, no criado uma outra LUW no servidor de DB)
e este fica esperando a resposta se tudo ocorreu OK.

Um SET UPDATE TASK LOCAL suficiente para todo o processamento do commit


ser efetuado como local. Por isso, todos os updates da SAP procuram no utilizar o
comando Set update task local. O default o SET UPDATE (em funes). Isso evita
que a performance seja degradada.

139
ABAP Training
4.7. Comandos Select
Visando garantir a performance e evitar problemas futuros, cuidado com os
comandos empregados. Existem alguns tipos de select mais eficientes que outros.
Analise a aplicao que ser desenvolvida e faa a melhor escolha.

ALGUNS TIPOS DE SELECT

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 uma internal table. Este processo mais rpido que ler
individualmente atravs de um LOOP e ir gravando os registros, um a um.

SELECT * FROM <table> APPENDING TABLE <internal table>.


L os registros e os inclui - no sobrepe - em uma internal table.

SELECT . INTO CORRESPONDING FIELDS OF TABLE <itab>.


Neste caso a estrutura da tabela interna no precisa corresponder
estrutura da tabela que est sendo acessada. <itab> o nome da internal
table. Movimentar os registros para as colunas definidas na internal table
que possuam nome igual ao da tabela acessada).
Obs.: corresponding ou appending corresponding no exigem o endselect.

SELECT .. APPENDING CORRESPONDING FIELDS OF TABLE <itab>.


L e grava (no sobrepe) os dados em uma internal table que possua nomes
idnticos aos nomes da tabela que est sendo lida.

SELECT SINGLE * FROM SPFLI WHERE ..<campo>.. EQ


<contedo>
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 e a performance ficar prejudicada.
No caso de haver a necessidade de acessar um nico registro via select, as opes
so: select * .. seguido de comando exit OU select * up to 1 rows. Neste
caso no necessrio especificar a chave completa.

140
ABAP Training
SELECT * FROM <tabela>
Quando no se impe nenhum tipo de restrio, ocorre uma varredura sequencial
dos registros da tabela. Quando se utiliza grandes tabelas, isso obviamente afeta o
runtime.

Select * seleciona todas as colunas de uma tabela. melhor sempre especificar as


colunas, pois em caso de tabelas com muitas colunas, prejudicar performance.

SELECT * FROM <tabela> WHERE <campo> eq <contedo>.


L todos os registros da tabela especificada onde o campo igual ao contedo
especificado. O ideal que se qualifique a clusula WHERE tanto mais quanto seja
possvel. Atentar que isso vlido para tabelas do tipo Pool e Transparent. Para
Cluster, seguir as recomendaes dadas anteriormente.

SELECT <a1> <a2> INTO (<f1>, <f2>, ) FROM .<tabela>


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 work-areas especificadas.

SELECT * FROM <table> WHERE <table field> BETWEEN <field1> and


<field2>.
Ex.: field1 = 100 e field2 = 500. Pega inclusive 100 e 500. Voc trabalha com o
range.

SELECT * FROM <table> WHERE <table field> LIKE ._R%.


_ = a primeira letra no importa o que vir
a segunda dever ser R (eu defini)
% = no importa a sequncia de caracteres que vir.
(Varredura para que possa realizar a comparao)

SELECT MAX(campo)
MIN(campo)
AVG(campo)
COUNT(*) FROM <table> INTO (..,,..,.)
WHERE .

AVG e SUM: somente para campos numricos.


No se usa endselect.
Mais rpido fazer uma rotina mo que utilizar este comando.

141
ABAP Training
SELECT * FROM <table> WHERE <table field> IN (.,.).
Exemplo: select * from <table> where campo1 in (123,1000) - podem ser valores
ou literais. igual a perguntar se campo1 123 ou 1000.

SELECT * FROM <table> WHERE <table field> IN <internal table>.


Exemplo:
DATA : begin of ITAB occurs 10,
sign(1), option(2), low like sflight-price, high like sflight-price,
end of ITAB.

* RANGES: ITAB for sflight-table


Move: I to itab-sign, btto itab-option, 500 to itab-low, 1000 to itab-high.
Append itab. Move: I to itab-sign, btto itab-option, 440 to itab-low.
Append itab.

SELECT * FROM (<table>) INTO <work area>.


Exemplo: data: begin of WA,
line(100),
end of WA.

Select * from (tabname) into WA


Write .
Endselect.

Parameters: tabname(10) default SPFLI.


Obs.: especificando o nome da tabela dinamicamente no select statement sempre
consome mais tempo de CPU que especificando estaticamente no programa.

SELECT * FROM <table> FOR ALL ENTRIES IN <internal table>


WHERE
campo1 = <contedo> and
campo2 = <contedo>
Defino uma tabela interna. Alimento os campos desta tabela interna. (move e
append). No meu select campo1 e campo2 sero os campos definidos e
alimentados na tabela interna.
Esta uma excelente soluo quando se trabalha com grandes tabelas.
O select for all entries simula a funcionalidade join.

SELECT * FROM <table> ORDER BY <field1> <field2> 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.

142
ABAP Training
SELECT carrid MIN( price ) max( price ) INTO (carrid, minimum,
maximum) FROM sflight 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).
Performance no to boa (funes MIN, MAX, etc. geram uma varredura
sequencial na tabela).

SELECT * FROM <table> BYPASSING BUFFER.


(Usado para ler diretamente da tabela original, e no do buffer).

OBS.: Select single * sempre com chave completa especificada. Particularidade do


Abap/4.
Select * - procurar evitar. Informar as colunas que sero necessrias,
apenas.

143
ABAP Training

4.8. Dicas para otimizao do cdigo

- Use o comando FREE para liberar espao em internal tables; Sempre usar os
comandos Clear / Refresh aps o fim de um LOOP;
- Evite comparaes num SELECT com campos numricos versus campos
alfanumricos; o sistema perde 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 sequncia 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.
- Evitar lgicas do tipo IF not CPOA = CPOB. mais claro codificar IF CPOA ne
CPOB.
- Evitar construes do tipo:
SORT tabela1, SORT tabela2, SORT tabela3.
LOOP tabela1, LOOP tabela2, LOOP tabela3
Para cada SORT fazer o LOOP correspondente. A ento iniciar novo
SORT e LOOP, e assim por diante.
- Campos chave devem ser sempre os primeiros campos da tabela. Assim, todos
os demais campos sero comprimidos;
- SELECT (para Transparent e Pool Tables): a clusula WHERE deve conter,
preferencialmente, os campos chaves e demais campos que possam restringir a
pesquisa;
- SELECT (para Cluster Tables): s os campos chaves devem ser especificados na
clusula WHERE. Os demais devem ser checados atravs do comando CHECK;
- O conhecimento do contedo dos dados de uma tabela pode auxiliar no
momento da codificao do comando select. O campo que ocorrer em nmero
menor de vezes dever constar na clusula where antes daquele que ocorre um
nmero maior de vezes, caso seja necessrio satisfazer a ambas condies. Isso
faz com que o processamento seja mais gil.
- Manuseio de tabelas: Estudar a possibilidade de manuseio em tabelas internas
para agilizar o processo. Analisar tambm o uso de comando select, sendo o que
melhor se adapte a situao em questo.

144
ABAP Training

4.9. Ferramentas para auxliar os desenvolvedores

Existem algumas ferramentas que auxiliam os desenvolvedores a descobrir erros


(errors, warnings, etc), bem como avaliar a performance de seus programas.

Path: Tools Abap/4 Workbench Test - Runtime Analysis

Existe um pushbutton chamado Tips and Tricks Clicando-se nele poder ser feita
comparao entre comandos Select (diferentes tipos). Dando double-click sobre um
dos exemplos voc passar para outra tela, onde voc visualizar a medida do
tempo em microsegundos de ambos, servindo de base de comparao.

Neste mesmo path, pode-se utilizar as facilidades do Runtime Analysis para


verificar a performance de seu programa. Ao final da execuo voc poder acessar
informaes sobre o seu programa (grficos, acesso a tabelas, etc). Para tanto
clique o pushbutton ANALYSE, que somente aparecer depois que for informado o
nome do programa e/ou transao e clicado execute.

O SQL Trace (transao ST05) outra facilidade que pode ser utilizada para trilhar
a lgica de sua aplicao e verificar possveis pontos de correo. Voc poder
visualizar os comandos de acesso a banco de dados utilizados, obter informaes
sobre um comando especfico, visualizar os ndices que esto sendo utilizados (ver
tpico 5.3 sobre como utilizar o SQL Trace).

O Extended Program Check outra facilidade que deve ser empregada visando
manter o seu cdigo o mais correto possvel. Nesta opo voc poder selecionar os
tens que voc deseja que sejam checados e o sistema apontar o seu parecer. Para
tanto basta clicar os tens e o pushbutton PERFORM CHECK Selecionando uma linha
voc poder ver os detalhes, bem como posicionando o cursor em uma linha e
clicando o pushbutton DISPLAY ALL CHANGES.

145
ABAP Training

4.10. Interfaces Batch ou Converses:

Segundo a documentao da SAP, existem trs mtodos para converso: Direct


input, Call transaction e o Batch Input.

Direct Input: um dos mtodos para transferncia de dados do sistema


legado para o sistema R/3. considerado o mtodo mais rpido. Um arquivo
sequencial com dados gerado como um arquivo texto para processamento
por alguns function modules especiais. Estas funes executam todas as
checagens normais para garantir a integridade de dados. Quando os registros
so processados com sucesso, eles so gravados diretamente nas
correspondentes tabelas do banco de dados da aplicao. Na ocorrncia de
erros, os dados errados so passados para uma rotina de manuseio de
exceo. O gargalo associado com o processamento do dialog e update so
eliminados neste caso. Para todas as necessidades de transferncia de
dados, especialmente com transaes de alto volume, o direct input o
mtodo mais indicado. Nota: este mtodo deveria ser usado em todas as
situaes nas quais funes de aplicao utilizando esta tecnologia existam.

Call Transaction: o prximo mtodo mais rpido para processamento de


dados do sistema legado para o sistema R/3. Neste caso, o programa de
transferncia de dados processa os dados do arquivo sequencial e chama a
transao desejada usando um comando Abap. Dados de um arquivo
sequencial so processados via telas de aplicao para uma nica transao.
A lgica de aplicao executa todos os checks e a validao dos dados. Este
um processamento sncrono. Quando o processamento do dialog
realizado com sucesso, o processamento do update chamado pela
aplicao correspondente para executar todas as solicitaes do banco de
dados. A escolha pode ser feita entre update sncrono ou assncrono. Nenhum
protocolo de erros ou sada para lidar com os erros fornecida por esta
tcnica. responsabilidade do programador da aplicao incorporar rotinas
de execuo e funes dos protocolos desejados como parte do programa de
transferncia de dados. A nossa recomendao usar o mtodo Call
Transaction em todos os casos em que no existe um programa Direct Input.
Somente em situaes de lidar com erros ns recomendamos que o batch-
input tradicional seja realizado para posterior processamento. Resumo: em
contraste com o Batch-Input, o Call Transaction permite que sejam passados
dados diretamente ao dialog interface sem usar uma fila. Para armazenar
estes dados temporariamente, voc usa uma internal table (uma tabela BDC,
a qual tem a mesma estrutura daquela utilizada no batch-input). Antes de
entrar dados na BDC table necessrio fazer uma verificao nos dados. Call
transaction: pode ser executado imediatamente.

Batch-Input: o batch-input tem sido tradicionalmente selecionado como um


mtodo de implementao de programas de transferncia de dados. Um
benefcio que este mtodo traz sobre o Call Transaction que o batch-input

146
ABAP Training
tem um utilitrio responsvel pela administrao e gerenciamento das
funes do batch-input. Alm do mais, utilitrios existem para monitorar e
dar manuteno em tarefas associadas com este mtodo. Assim, no h
necessidade de nenhuma programao adicional para anlise de excees e
funes de protocolo. Dados vindos de um arquivo sequencial so
processados via telas de aplicao e armazenados numa sesso batch-input.
Por definio, uma sesso uma coleo de dados de transao para uma ou
mais transaes. As sesses batch-input so fisicamente armazenadas pelo
sistema num banco de dados como uma fila. Estas sesses podem conter
tanto registros de dados corretos quanto incorretos. O batch-input trata tanto
o update sncrono como o assncrono. O mtodo batch-input, em contraste
com o mtodo Call Transaction, pode transferir dados do sistema legado para
o sistema R/3 para mltiplas transaes da aplicao. Todavia, nenhuma
nova transao iniciada at que a transao anterior tenha sido gravada no
correspondente banco de dados durante o processamento das sesses de
batch-input. Tambm, sesses de batch-input no podem ser geradas em
paralelo. Ele pode ser processado de trs modos: foreground, display erros
only ou background.
Este mtodo oferece excelente capacidade para gerenciamento de erros e
detalhado para anlise do protocolo da transao.
Resumo: gerado um log e pode ser programada a execuo. Em caso de
erro, o registro pode ser corrigido e inserido novamente. Atravs deste
recurso, todos os dados so entrados na transao original SAP, ou seja,
seguindo todas as consistncias necessrias, evitando assim que erros de
integridade sejam cometidos.

AVALIAO:

Sempre execute alguns testes dentro do processo de transferncia de dados e


avalie qual o mtodo mais apropriado para uso, dado o volume de dados,
tamanho, recursos e performance do sistema.

Todos os fatores sendo iguais, o mtodo Direct Input deve ser usado em todos os
casos em que tais funes estejam disponveis ou novas funes para transferncia
de dados precisem ser desenvolvidas.

Para escolher entre o Call Transaction e o Batch-Iput, sempre use o Call Transaction
primeiro e manuseie as excees ento atravs do mtodo de batch-input. Esta
estratgia altamente recomendada em implementao de solues de
programao para transferncia de dados com sistemas legados.

147
ABAP Training

4.11. Estudo de Caso Cliente XYZ


(Parte do relatrio de Quality Assurance da Fase III)

Dentro do escopo do XYZ seria necessrio o desenvolvimento dos seguintes tipos


de programa:

. Converses
. Reports
. Formulrios (SapScript)
. Interfaces

O trabalho baseou-se na anlise de interfaces, haja visto as converses j terem


sido processadas (na sua maioria) para atender a primeira fase de implantao do
projeto. Mesmo assim, foi analisado um programa de converso, cuja tcnica
utilizada foi Batch-Input. Quanto aos Reports, estes se encontram em fase de
levantamento, no sendo possvel, portanto, fazer qualquer tipo de validao.

Do total de interfaces desenvolvidas, buscou-se uma amostra (7 programas),


utilizando-se os seguintes critrios:

. programas considerados crticos, ou seja, que necessitam de um tempo de


resposta eficiente, pela necessidade de serem pseudo-online e seu processamento
ocorrer a cada x minutos;
. programas que manipulam quantidades elevadas de dados diariamente;
. grandes tabelas do R/3 (quantidade de registros versus colunas existentes);
. funes do standard que no apresentam boa performance (por serem genricas)
quando utilizadas com finalidades especficas;
. reas de aplicao diferentes (MM, FI, etc)
. desenvolvedores diferentes (foram analisados programas de diferentes pessoas).

Obs.: exclui-se de nossa anlise todos os programas de interface que encontram-se


em fase de desenvolvimento.
Alguns dados:
. Total de interfaces : 40
. Status : 03 em desenvolvimento
02 no tiveram desenvolvimento ABAP
35 esto concludas
. Programas selecionados : ZIFIT002, ZIFIT006, ZLUIZ001 (antigo ZIMMT001)
ZIMMT006, ZIMMT010, ZIPMR001

148
ABAP Training
Quanto confeco de especificao tcnica:

O correto seria existir uma especificao tcnica com o intuito de servir como
base para o desenvolvedor. Todavia, tal documentao est ficando pronta
apenas ao trmino do programa. Esta situao no a ideal. Todavia, se
torna indispensvel a sua confeco visando facilitar manutenes futuras;

Quanto ao esquema de testes:

de extrema importncia que, alm dos testes individuais, sejam realizados


testes com massa de dados real de produo, visando reproduzir um
ambiente real durante a fase de execuo das interfaces, com o objetivo de
minimizar/eliminar problemas com performance;

Os testes devem englobar todas as condies lgicas possveis, e at mesmo


condies de erro. No existe esquema de stress-test (com grande volume
de dados). A massa de dados no deve ser gerado pelos desenvolvedores;

Quanto uniformidade do cdigo e ao uso da metodologia (padres) definidos na


Fase II:

Na amostragem analisada foi constatado que o manual de Padres no foi


seguido de forma ntegra. Em alguns casos (como por exemplo na
Nomenclatura definida para Funes) constante no manual, a forma utilizada
nos programas muito mais clara que aquela anteriormente definida.
Aconselha-se alterar o manual de Padres, citando a nova forma utilizada. No
caso da definio de data-elements, este padro no foi seguido para as
tabelas analisadas. Isso tambm se aplica aos nomes definidos para as
sesses de Batch-input pesquisadas via SM35 na data de nossa visita. Estes
pontos no tem implicaes graves sobre os programas, todavia somente
vale a pena a criao de uma metodologia caso ela seja, de fato, seguida, e
que esta visa facilitar o trabalho de pesquisa/leitura/manuteno de
programas ;

Ainda dentro do tpico metodologia alguns pontos deveriam estar sendo


seguidos: so os nomes de variveis. Nem todos os programas obedecem
este tpico de forma integral ou parcial. Este item muito importante, uma
vez que facilita a leitura dos programas e futuras manutenes por terceiros
ou at mesmo pela equipe tcnica do XYZ;

Uso de mensagens fixas ao invs de text-elements, uma vez que o R/3 aceita
vrias linguagens e isto definido em momento de logon no sistema.

149
ABAP Training
Quanto a performance dos programas:

1. Dentro da amostra selecionada foram encontrados erros que se repetiam. So eles:

a) Ninhos de select
b) Select * ao invs de select com suas respectivas colunas
c) Falta de condies na clusula where para limitar o nmeros de registros retornados
atravs do comando Select
d) Tabelas como BKPF, BSEG, EKKO, EKPO, VBAK, VBAB, MKPF, MSEG, J_1BNFDOC,
J_1BNFLIN devem possuir, tantos campos quanto possvel para restringir a pesquisa
e busca de dados.
e) Uso da funo CLAS_CLASSIFICATION_OF_OBJECTS com finalidades especficas

Devido estrutura cliente servidor, resultados melhores de performance estaro sendo


alcanados toda vez que a comunicao entre o servidor de aplicao e o servidor de
banco de dados for minimizado.

Em vrios casos encontramos selects em tabelas grandes, como por exemplo, a BKPF,
trazendo-se todos os registros que atendessem a uma nica condio (por exemplo,
cdigo da transao). de extrema importncia que, em casos de tabelas grandes
(tanto em termos de volume quanto em termos de quantidade de colunas) sejam
recuperadas apenas as informaes necessrias ao atendimento do propsito do
programa (colunas e condies). Deve-se lembrar que, com o passar do tempo, a
quantidade de dados presentes nestas tabelas estar crescendo; em contrapartida,
haver uma reduo da performance caso o programa no esteja fazendo selees
adequadas. Uma forma de se obter maior seleo inserindo um delimitador do tipo
DATA, campos que estejam presentes no somente na tabela acessada mas tambm na
prxima que se deseja acessar.

Dentro do exemplo acima, em forma de um ninho de Selects, feito um outro Select


para a tabela BSEG. Ou seja, para cada registro da BKPF ser acessada a tabela BSEG.
Esta mesma situao pode aparece em vrios nveis, o que resulta num caos em
termos de performance, medida que temos a base de dados sendo acrescida.

Alm das precaues anteriores, as quais devem ser aplicadas sempre que possvel,
vale a pena mencionar que o uso de tabelas internas agiliza muito o processamento.
Selects que, num nico comando, sejam responsveis por acessar a tabela, fazer a
seleo do range de dados necessrio, movimentar estes dados para uma tabela
interna e gravar estes dados tero performance superior uma situao de Select
endselect e infinitamente superior a uma situao de Select endselect em ninho.

Ilustrando uma situao semelhante, temos:

Select * from bkpf where tcode = FB01.

Select * from bseg where bukrs = bkpf-bukrs and


belnr = bkpf-belnr and

150
ABAP Training
gjahr = bkpf-gjahr.
Endselect.

Endselect.

* O primeiro comando seleciona as 79 colunas da tabela bkpf atravs do campo TCODE


que, alm de no pertencer chave primria desta tabela, tambm um critrio muito
amplo para pesquisa em tabelas deste porte. Campos como company code, data, ano
fiscal, entre outros, podem ser fortes candidados a restringir a pesquisa.

* O segundo comando seleciona as 266 colunas da tabela bseg, onde os campos bukrs,
belnr e gjahr sejam iguais tabela anterior. Como na tabela anterior no foi utilizado
um critrio de seleo mais adequado, muitos registros sero retornados da bkpf e,
consequentemente, para cada um destes registros, sero retornados n registros da
BSEG.

*Ambos os selects correspondero a tantos acessos no banco de dados quantos


registros existirem.

Visando garantir melhor performance, poder-se-ia utilizar:

Select col1 col2 col3 into table tab_bkpf from bkpf where <conditions>.

Select col1 col2 col3 col4 into table tab_bseg


from bseg
for all entries in tab_bkpf
where < conditions >.

OBS.: O exemplo dado de seleo de colunas vlido. Porm, vale lembrar que no
possvel fazer select colunado de tabelas Cluster.

Algumas consideraes:

* Ambos os selects correspondero a um nico acesso no banco de dados.


* O primeiro comando select j seleciona, move e grava os dados numa tabela
interna.
* O segundo select ser baseado no resultado, j em tabela interna, do primeiro
select.
* So selecionadas apenas as colunas realmente necessrias. Assim, os pacotes
transmitidos entre o servidor de banco de dados e o servidor de aplicao so
menores, agilizando portanto a transferncia.
* tab_bkpf e tab_bseg so tabelas internas.

Outros erros que devem ser evitados:

Hard Code
Alguns programas foram desenvolvidos baseando-se apenas na configurao atual
do sistema R/3. Com isso, aparecem algumas checagens de forma fixa, por

151
ABAP Training
exemplo, checagens de centros (campo werks), conta contbil, etc., o que invalida
os programas caso seja alterada a configurao.

Tabela de contadores idealizada para controle de processamentos e


reprocessamentos no totalmente confivel
Foi criada uma tabela para controle do processamento, visando controlar quais
registros foram ou no processados em caso de alguma interrupo. O objetivo
permitir reprocessamentos parciais. Tendo em mente que as transaes esto
sendo chamadas via Call transaction, tcnica esta que possui um commit prprio, e
que a atualizao da tabela de controle est num outro commit, poder ocorrer
situaes onde a tabela de controle no representa exatamente o que aconteceu.

Necessidades:

Stress-test
Testes integrados

Comentrios/Recomendaes:

O ponto mais crtico est associado ao tpico de performance. necessrio fazer


reviso em todos os programas de interface, visando detectar situaes
semelhantes descrita anteriormente e providenciar as adequaes necessrias.

Outro ponto de fundamental importncia se refere aos testes. A garantia do bom


funcionamento do programa e a minimizao de problemas com performance
somente ocorrer caso seja realizado testes com massa de dados real, ou seja,
volumes prximos ao esperado em ambiente produtivo, cobrindo as situaes que
possam ocorrer.

Restries:

Caso ocorra a entrada em produo sem a alteraes nos programas, a


performance ser decrescente, medida que as bases de dados forem crescendo.
Tambm no se pode garantir que todas as interfaces pseudo-online sero
processadas e finalizadas dentro do tempo estipulado (por exemplo, a cada 5
minutos, etc).

Parecer:

De uma forma geral pode-se dizer que o desenvovimento est bom, porm
caso os programas no sejam revisados e adequados, certamente ocorrero
problemas de performance aps a implantao.

QUADRO RESUMO DA SITUAO DO PROJETO DA XYZ

152
ABAP Training

Tpico Status
Confeco de especificao tcnica
Validado com
restries
Esquema de testes No validado
Uniformidade do cdigo- Validado com restries
metodologia-padres
Performance Validado com restries,
desde que os programas
sejam revisados e
alterados
Outros erros No se aplica

4.12. Estudo de Caso - Cliente ABC


(Parte do relatrio de Quality Assurance da Fase III)

SITUAO ATUAL

Dentro do escopo da ABC seria necessrio o desenvolvimento dos seguintes tipos


de programa:

. Converses
. Reports
. Formulrios (SapScript)
. Interfaces

Obs.: No houve necessidade de programas online.

Devido a alguns problemas, que sero detalhados mais adiante, o cronograma


inicial cuja expectativa era conter apenas 26 gaps sofreu alteraes em termos de
volume de desenvolvimentos e tambm um atraso, estando neste momento a
maioria dos programas em fase de desenvolvimento e/ou testes. Novos
desenvolvimentos tambm foram incorporados ao projeto (cerca de oito novos
programas foram criados). Assim sendo, optou-se por fazer o QA sobre os
programas em 24.06.98, independente de no estarem concludos, uma vez que em
caso da necessidade de efetuar algum tipo de correo, haveria ainda seis dias
corridos antes da data de implantao.

Dado a esta situao, ressalta-se tambm que o coordenador de ABAP (parceiro da


SAP) ainda no teve tempo hbil para fazer a reviso dos programas que foram
desenvolvidos, verificando o cumprimento de normas, padres e situaes cuja
performance no fosse satisfatria, antes que os programas fossem apresentados

153
ABAP Training
ao Quality Assurance da SAP. A grande preocupao, no momento, a confeco
dos programas.

Essa situao de anlise de programas em desenvolvimento atpica, uma


vez que nossa anlise deveria se basear apenas sobre os programas j
concludos e revisados pelo parceiro de implementao, mas dada a
situao, isso no foi possvel.

Alguns dados (dados aproximados, uma vez que o cronograma do projeto e


status no estavam atualizados):
. Total de programas : 34
. Status

1. Converses - Cargas automticas:


. Cadastro de cdigo NBM : converso realizada
. Cadastro de taxas de cmbio : converso realizada
. Cadastro de Materiais (inicial) : converso realizada
. Cadastro de Fornecedores (inicial) : converso realizada
. Cadastro de Contas a Pagar (inicial) : programa em fase de testes
. Atualizao de Estoques : em desenvolvimento-80 % j
realizado
. Atualizao de Pedidos : em desenvolvimento-80 % j
realizado

2. Interfaces (em ordem de prioridade):


. Estoques (SAP -> DISPO/OP) : em desenvolvimento
. Livros Fiscais (SAP->PRECIS) : em desenvolvimento
. Pedidos (SAP -> AVERAGE) : em desenvolvimento
. Contas a Pagar (SAP -> BAYMAP) : em desenvolvimento
. Movimentos de Materiais (SAP -> BAYMAP): em desenvolvimento
. Fornecedores (SAP -> BAYMAP) : no desenvolvido
. Moedas (SAP -> AVERAGE) : no desenvolvido

Obs.: Interfaces de Estoques e Livros Fiscais so indispensveis para a data de


implantao (01.07.98), no mnimo. As demais devem ser disponibilizadas logo
aps, para uso no decorrer do ms de julho.

3. SapScripts:
. Certificado de Qualidade : desenvolvido
. Certificado de Anlise : desenvolvido
. Pedidos : em testes
. Cotaes : em testes
. Requisies : no ser desenvolvido

154
ABAP Training
4. Relatrios:
. Relatrio de Confirmao de ordem de processo (1 e 2): desenvolvido
. Relatrio de produo diria e mensal : aguarda definio de uma das
interfaces para ser desenvolvido
. Relatrio sntese de estoque : no ser desenvolvido. Ser
utilizado relatrio standard do R/3.

5. Matchcodes:
.Lote na ordem de processo : ser desenvolvido
. Ordens no liberadas : ser desenvolvido
. Ordens no confirmadas : ser desenvolvido
. Materiais por grupo de listas tcnicas : desenvolvido
. Fornecedores CGC/CPF : desenvolvido

Panorama das atividades:

O trabalho baseou-se na anlise de interfaces, e de alguns relatrios j concludos,


haja visto a maioria dos programas de converso j terem sido processados antes
do Quality Assurance da Fase III. Mesmo assim, foi analisado um programa de
converso, cujas tcnicas utilizadas foram Batch-Input/Call Transaction.
Posteriormente, obteve-se a informao de que estes mesmos programas sero
utilizados para as interfaces inbound (carga de dados do sistema R/3 a partir do
sistema legado). Neste caso, sero encaminhados somente os dados alterados e/ou
os dados novos. Como a carga de dados inicial apresentou tempo de
processamento considerado baixo pela equipe da ABC, utilizando os mesmos
programas e com volume de dados superior ao que existir na execuo das
interfaces, este item no se torna preocupante.

Do total de interfaces desenvolvidas, buscou-se uma amostra (11 programas),


utilizando-se os seguintes critrios:
. programas considerados crticos, ou seja, que necessitam de um tempo de
resposta eficiente, pela necessidade de serem pseudo-online e seu processamento
ocorrer a cada x minutos;
. programas que manipulam quantidades elevadas de dados diariamente;
. grandes tabelas do R/3 (quantidade de registros versus colunas existentes);
. funes do standard que no apresentam boa performance (por serem genricas)
quando utilizadas com finalidades especficas;
. reas de aplicao diferentes (MM, FI, etc)
. desenvolvedores diferentes (foram analisados programas de diferentes pessoas).

. Programas selecionados : ZAFIB001 - Converso


ZACII001 - Include do programa anterior
ZAFII001 - Interface para lanamentos contbeis
ZAPPR001 - Relatrio de confirmao da ordem de
Processo
ZAPPR002 - Listagem do cadastro de material
ZAMMI001 - Interface para movimento de materiais

155
ABAP Training
M. BAYMAP
ZAMMI002 - Interface para livros fiscais
ZAMMI003 - Interfaces para pedidos de compras
ZAMMI010 - Interface para movimento de materiais
M. BAYMAP
ZAMMI020 - Interface para livros fiscais
ZAMMI030 - Interfaces para pedidos de compras
ZAPPI001 - Interface para produo de materiais

Obs.: Dos programas relacionados anteriormente, apenas os programas ZAPPR001


e 002 tinham status concludo. Todos os programas foram analisados a partir de
verses existentes no ambiente de desenvolvimento da ABC.

Quanto confeco de especificao funcional/tcnica:

O correto seria existir uma especificao tcnica com o intuito de servir como
base para o desenvolvedor. Todavia, devido ao aumento do nmero de
programas a serem desenvolvidos (entre programas novos e programas para
correo de cargas j realizadas/programas para auxiliar na conferncia,
problemas com o ambiente R/3 que tem apresentado short dumps em
transaes standard) tal documentao ficar pronta apenas ao trmino dos
desenvolvimentos. Esta situao no a ideal. Todavia, se torna
indispensvel a sua confeco visando facilitar manutenes futuras. O
coordenador do projeto est realizando um levantamento junto equipe
funcional e fornecendo as informaes necessrias para que os
desenvolvedores ABAP possam realizar suas atividades.

Quanto documentao do projeto (cronogramas, relatrios de controle e


acompanhamento):

Estes documentos no esto sofrendo atualizao

Quanto ao esquema de testes:

de extrema importncia que, alm dos testes individuais, sejam realizados


testes com massa de dados real de produo, visando reproduzir um
ambiente real durante a fase de execuo das interfaces, com o objetivo de
minimizar/eliminar problemas com performance. Na ABC no esto sendo
feitos testes com alto volume de dados. Isso acaba mascarando problemas
que podem vir a ocorrer no futuro, caso haja um aumento significativo nos
dados;

Os testes devem englobar todas as condies lgicas possveis, e at mesmo


condies de erro. No existe esquema de stress-test (com grande volume
de dados). A massa de dados no deve ser gerado pelos desenvolvedores
nesta etapa de testes finais, pr-produo.

156
ABAP Training
Quanto uniformidade do cdigo e ao uso da metodologia (padres) definidos na
Fase II:

Foi estabelecido na fase II de QA que a metodologia e padres seriam adotados do


parceiro de implementao.

Na amostragem analisada foi constatado que o manual de Padres no foi


seguido de forma ntegra. Algumas das diferenas so demonstradas abaixo

. nome de programa: no manual estava estabelecido que a composio seria:


Z23456789, onde Z = fixo, 2 e 3 = ao mdulo SAP (FI, MM, PP, etc), 4 a 6 = gap de
origem, 7 = B (batch-input) ou I (interface) ou R (relatrio) ou S (Sapscript), 8 e 9 =
nmero sequencial referente ao gap. Na verdade, os programas desenvolvidos no
esto obedecendo este padro;

. classes de desenvolvimento: de fato, obedeceu a estrutura definida anteriormente,


ou seja, uma por mdulo. Todavia, existem programas que no esto na sua classe
de desenvolvimento correta (exemplo, programa de FI na classe de MM);

. nome de variveis: notamos que a atribuio de nomes para tabelas internas,


parameters, select-options, constants e types nem sempre estiveram padronizadas
entre os programas. Este item importante, na medida que facilita a leitura dos
programas e futuras manutenes por terceiros ou at mesmo pela equipe tcnica
da ABC;

. existem forms sem nenhum contedo sendo chamados pelos programas;


. existem variveis definidas que no esto sendo utilizadas;
. certificar-se que tabelas definidas com clusula occurs de forma fixa no
iro
estourar.

Quanto a performance dos programas:

Dentro da amostra selecionada foram encontrados erros que se repetiam.


So eles:

a) Ninhos de select
b) Select * ao invs de select com suas respectivas colunas
c) Falta de mais condies na clusula where para limitar o nmeros de registros
retornados atravs do comando Select
d) Tabelas como BKPF, BSEG, EKKO, EKPO, VBAK, VBAB, MKPF, MSEG, J_1BNFDOC,
J_1BNFLIN devem possuir tantos campos quanto possvel para restringir a pesquisa e
busca de dados

Devido estrutura cliente servidor, resultados melhores de performance estaro


sendo alcanados toda vez que a comunicao entre o servidor de aplicao e o
servidor de banco de dados for minimizado.

157
ABAP Training

Em vrios casos encontramos selects em tabelas grandes, como por exemplo, a


BSEG, trazendo-se todos os registros que atendessem a uma nica condio. de
extrema importncia que, em casos de tabelas grandes (tanto em termos de
volume quanto em termos de quantidade de colunas) sejam recuperadas apenas as
informaes necessrias ao atendimento do propsito do programa (colunas e
condies). Deve-se lembrar que, com o passar do tempo, a quantidade de dados
presentes nestas tabelas estar crescendo; em contrapartida, haver uma reduo
da performance caso o programa no esteja fazendo selees adequadas. Uma
forma de se obter maior seleo inserindo um delimitador do tipo DATA, campos
que estejam presentes no somente na tabela acessada mas tambm na prxima
que se deseja acessar, etc.

Num outro programa existe um ninho de Selects em trs nveis. Para cada registro
da tabela J_1BNFDOC feito um ou mais acessos na tabela J_1BNFLIN e um ou mais
acessos na tabela J_1BNFSTX. Ninhos como este, com o crescimento na base de
dados, trar resultados desfavorveis performance. Esta mesma situao se
repete em outros programas.

Alm das precaues anteriores, as quais devem ser sempre tomadas, vale a pena
mencionar que o uso de tabelas internas agiliza muito o processamento. Selects
que, num nico comando, seja responsvel por acessar a tabela, fazer a seleo do
range de dados necessrio, movimentar estes dados para uma tabela interna e
gravar estes dados tero performance superior uma situao de Select
endselect e infinitamente superior a uma situao de Select endselect em ninho.

Ilustrando situao semelhante, com grandes tabelas do sistema, temos:

Select * from bkpf where condition = XXXX.

Select * from bseg where bukrs = bkpf-bukrs and


belnr = bkpf-belnr and
gjahr = bkpf-gjahr.
Endselect.

Endselect.

* O primeiro comando seleciona as 79 colunas da tabela bkpf atravs do campo


<condition> que um critrio muito amplo para pesquisa em tabelas deste porte.
Campos como company code, data, ano fiscal, entre outros, podem ser fortes
candidados a restringir a pesquisa.

* O segundo comando seleciona as 266 colunas da tabela bseg, onde os campos bukrs,
belnr e gjahr sejam iguais tabela anterior. Como na tabela anterior no foi utilizado
um critrio de seleo mais adequado, muitos registros sero retornados da bkpf e,
consequentemente, para cada um destes registros, sero retornados n registros da
BSEG.

158
ABAP Training
* Ambos os selects correspondero a tantos acessos no banco de dados quantos
registros existirem.

Visando garantir melhor performance, poder-se-ia utilizar:

Select col1 col2 col3, into table tab_bkpf from bkpf where <conditions>.

Select col1 col2 col3 col4 into table tab_bseg


from bseg
for all entries in tab_bkpf
where < conditions >.

Algumas consideraes:

* Ambos os selects correspondero a um nico acesso no banco de dados.


* O primeiro comando select j seleciona, move e grava os dados numa tabela
interna.
* O segundo select ser baseado no resultado, j em tabela interna, do primeiro
select.
* So selecionadas apenas as colunas realmente necessrias. Assim, os pacotes
transmitidos entre o servidor de banco de dados e o servidor de aplicao so
menores, agilizando portanto a transferncia.
* tab_bkpf e tab_bseg so tabelas internas.

Exemplificando atravs de um trecho do programa ZAFII001:

Select mblnr bldat budat into table tab01


From bkpf where budat in s_budat

Loop at tab01.
Select * from bseg where mblnr eq tab01-mblnr.
Move-corresponding tab01 to tab02.
Move-corresponding mseg to tab02.
Append tab02. Clear tab02.
Endselect.
Endloop.

O primeiro select faz um nico acesso ao servidor de banco de dados, trazendo


todos os dados necessrios de uma nica vez. (OK)

O select * na tabela bseg est dentro de um loop. Ou seja, este comando estar
trazendo todas as colunas desta tabela, que uma das maiores do sistema R/3.
Ser movimentado atravs do comando move-corresponding os campos cujos
nomes sejam semelhantes de tab01 e mseg. Este comando no oferece boa
performance (gasta tempo identificando a igualdade no nome dos campos).

159
ABAP Training
Alternativa: O loop na tab01 indica que, para cada registro da tab01 (tabela
interna), ser acessado um registro na bseg. Ento, seria melhor proceder conforme
abaixo:

Select mblnr bldat budat into table tab01 from bkpf where <conditions>.

Select col1 col2 col3 col4 into table tab_bseg (*)


from bseg
for all entries in tab01
where < conditions >.

Ou seja, evitar select * trazendo somente os campos necessrios e fazer um nico


acesso tabela BSEG, trazendo todos os registros importantes para o
processamento. Colocar tambm mais selees, objetivando restringir a quantidade
de dados trazidos no primeiro select para, consequentemente, restringir a
quantidade de dados trazidos no segundo select. Pode-se pensar em trazer todos
os dados da BSEG para a prpria tab01, atravs de appending corresponding fields
os table . .
Ver help online para maiores detalhes sobre os comandos, em caso de dvidas.

Este recurso de for all entries baseado na tabela anterior pode ser usado sempre,
principalmente nos casos onde performance for um fator crtico. Normalmente, os
casos de selects encadeados em forma de ninhos podem usar tal facilidade com
uma incrvel melhoria na performance.

Classificao dos programas ps-anlise:

Exemplos de programas que encontram-se na situao de ninhos de select:


ZAMMI020, ZAMMI030, ZAMMI002, ZAMMI003.

Exemplos de programas que encontram-se na situao de vrios acessos entre o


servidor de aplicao e o servidor de banco de dados: ZAMMI010.

Exemplos de programas que selecionam todas as colunas das tabelas acessadas:


ZAFII001, ZAMMI002, ZAMMI003.

Exemplos de programas que no acessam, selecionam, movimentam e gravam num


nico comando select: ZAFII001.
Necessidades:

a) Stress-test
b) Testes integrados

Comentrios/Recomendaes:

160
ABAP Training
O ponto mais crtico est associado ao tpico de performance. necessrio fazer
reviso em todos os programas, visando detectar situaes semelhantes descrita
anteriormente e providenciar as adequaes necessrias.

Outro ponto de fundamental importncia se refere aos testes. A garantia do bom


funcionamento do programa e a minimizao de problemas com performance aps
entrada em produo somente ocorrer caso seja realizado testes com massa de
dados real, ou seja, volumes prximos ao esperado em ambiente produtivo,
cobrindo as situaes que possam ocorrer.

Restries:

Caso ocorra a entrada em produo sem a alteraes nos programas, a


performance ser decrescente, medida que as bases de dados forem crescendo.
Tambm no se pode garantir que todas as interfaces pseudo-online sero
processadas e finalizadas dentro do tempo estipulado (por exemplo, a cada x
minutos, etc).

A documentao dos programas dever ser providenciada, mesmo que aps


entrada em produo, visando facilitar trabalhos de manutenes futuras.

Testes com massas de dados real ou com alto volume de dados


eliminam/minimizam os problemas com performance. A entrada em produo, na
maioria dos casos, no comprometida. Porm, aps alguns meses, pode-se ter um
decrscimo significativo na performance.

O atraso no cronograma deveu-se ao aumento do nmero de desenvolvimentos,


problemas com o ambiente R/3 da ABC, que apresentava short dump em transaes
online, o que impossibilitava configuraes, entrada de dados para testes, etc.
Outro ponto que trouxe dificuldades para a equipe ABAP do parceiro de
implementao foi a inexistncia de formulrios (Sapscripts) da localizao no
ambiente que eles estavam utilizando, sendo necessrio desenvolv-los a partir de
cpia de outros clientes. Principalmente devido ao problema de dumps em
transaes standard, a equipe de ABAP foi inmeras vezes
interrompida para auxiliar os funcionais, tentando driblar o problema, para que o
projeto sofresse menor impacto.

Obteve-se a informao que o material de Quality Assurance da Fase II apenas foi


entregue equipe de desenvolvimento ABAP a cerca de uma semana atrs. Vale
ressaltar que este material altamente tcnico, e basicamente voltado equipe do
projeto ABAP. O fato da equipe no ter feito a leitura deste material desde o incio
do projeto traz alguns pontos negativos. Estes s no foram maiores dada a
experincia da equipe em outros projetos. Mesmo assim, certas irregularidades
poderiam ter sido evitadas.

Parecer:

161
ABAP Training
De uma forma geral pode-se dizer que o desenvovimento est bom, porm caso os
programas no sejam revisados e adequados, certamente ocorrero problemas de
performance aps a implantao.
Um ponto positivo que todos os programas possuem lgica simples e fcil para
manutenes futuras, se houver necessidade.

162
ABAP Training
QUADRO RESUMO DA SITUAO DO PROJETO

Tpico Status
Confeco de especificao tcnica
Validado com
restries:
o formato
da
especifica
o tcnica
foi
validado
no Quality
Assurance
da Fase II,
porm
nesta fase
no se
pde ver
as
especifica
es
concludas
.
Esquema de testes No validado.
So necessrios testes
com alto volume de
dados.
Uniformidade do cdigo- Validado com restries.
metodologia-padres
Performance Validado com restries,
desde que os programas
sejam revisados e
alterados no que se
refere questes de
performance. Ponto
fundamental e
indispensvel para
correo antes da
entrada em produo.
Outros erros No se aplica

163
ABAP Training
Observao:

Valer muito pouco todo este trabalho se a configurao da mquina no estiver


correta. necessrio que ocorra uma visita de basis se o problema de performance
no est num programa em especfico, mas em vrios.

164
ABAP Training
Anlise de casos reais programas com problemas:

1.Performance ruim seleo de dados


*- Tabelas Internas ---------------------------------------------------*

* Tabela de OV's incompletas.


DATA: I_ZPTES_ESPECIF LIKE ZPTES_ESPECIF OCCURS 100 WITH HEADER LINE.

* Tabela de OV's serem especificadas.


DATA: BEGIN OF I_ESPECIF OCCURS 100.
INCLUDE STRUCTURE ZPTES_ESPECIF.
DATA: FLAG. "// O valor 'X' indica que o
"// registro dever ser
"// atualizado.
DATA: END OF I_ESPECIF.

* Tabela p/ atualizao das Ordens de Venda.


DATA: BEGIN OF I_ATUALIZA OCCURS 100,
VBELN LIKE VBAP-VBELN, "// Documento de venda.
POSNR LIKE VBAP-POSNR, "// Item do documento.
MTVO LIKE ZPTES_ESPECIF-MOTIVO. "// Motivo da
"// impossibilidade de
"// completar a OV.
DATA: END OF I_ATUALIZA.

* Mestre de clientes (parte geral).


DATA: BEGIN OF I_KNA1 OCCURS 100,
KUNNR LIKE KNA1-KUNNR, "// N cliente.
NAME1 LIKE KNA1-NAME1. "// Nome do cliente.
DATA: END OF I_KNA1.

* Documento de vendas: dados de cabealho.


DATA: BEGIN OF I_VBAK OCCURS 100,
VBELN LIKE VBAK-VBELN, "// Documento de venda.
ERDAT LIKE VBAK-ERDAT, "// Data criao do registro.
ERZET LIKE VBAK-ERZET, "// Hora do registro.
ERNAM LIKE VBAK-ERNAM, "// Nome do responsvel.
VBTYP LIKE VBAK-VBTYP, "// Ctg.documento de vendas e
"// distribuio.
KUNNR LIKE KNA1-KUNNR, "// Cliente
VKGRP LIKE VBAK-VKGRP. "// Grupo de trabalho
DATA: END OF I_VBAK.

* Documento de vendas: dados de item.


DATA: BEGIN OF I_VBAP OCCURS 100,
VBELN LIKE VBAP-VBELN, "// Documento de venda.
POSNR LIKE VBAP-POSNR, "// Item do documento.
MATNR LIKE VBAP-MATNR, "// N do material.
OBJNR LIKE VBAP-OBJNR, "// N objeto a nvel de item.
CUOBJ LIKE VBAP-CUOBJ. "// Configurao.
DATA: END OF I_VBAP.

* Cpia de I_VBAP p/ melhor performance.


DATA: I_VBAP_AUX LIKE I_VBAP OCCURS 100 WITH HEADER LINE.

* Status individual por objeto.


DATA: BEGIN OF I_JEST OCCURS 100,
OBJNR LIKE JEST-OBJNR, "// N objeto.
STAT LIKE JEST-STAT. "// Status individual de um
"// objeto.
DATA: END OF I_JEST.

* Textos relativos a status de usurio.


DATA: BEGIN OF I_TJ30T OCCURS 100,

165
ABAP Training
ESTAT LIKE TJ30T-ESTAT, "// Status do usurio.
TXT04 LIKE TJ30T-TXT04. "// Status individual de um
"// objeto (forma breve).
DATA: END OF I_TJ30T.

* Textos relativos a status do sistema.


DATA: BEGIN OF I_TJ02T OCCURS 100,
ISTAT LIKE TJ02T-ISTAT, "// Status do sistema.
TXT04 LIKE TJ02T-TXT04. "// Status individual de um
"// objeto (forma breve).
DATA: END OF I_TJ02T.

* Dados do usurio.
DATA: BEGIN OF I_USER_ADDR OCCURS 100,
BNAME LIKE USER_ADDR-BNAME, "// Nome do usurio no
"// cadastro.
NAME_FIRST LIKE USER_ADDR-NAME_FIRST. "// Nome.
DATA: END OF I_USER_ADDR.

* Caractersticas.
DATA: BEGIN OF I_CABN OCCURS 100,
ATINN LIKE CABN-ATINN, "// Valor da caracterstica
ATNAM LIKE CABN-ATNAM. "// Nome da caracterstica
DATA: END OF I_CABN.

* Descricao das Caractersticas e Valor.


DATA: BEGIN OF I_CARACT OCCURS 20,
NOME LIKE CABN-ATNAM, "// Nome da caraterstica
VALOR LIKE ZPTES_ESPECIF-CANAL. "// Valor da caracterstica
DATA: END OF I_CARACT.

* Tabela com nomes das caractersticas.


RANGES: R_ATNAM FOR CABN-ATNAM.

*&---------------------------------------------------------------------*
*& Form f_seleciona_dados
*&---------------------------------------------------------------------*
* Seleciona os dados, carregando os mesmos nas tabelas internas.
*----------------------------------------------------------------------*
FORM F_SELECIONA_DADOS.

* Recupera as ordens de venda do tipo make to order.


select vbeln posnr matnr objnr cuobj
from vbap
into table i_vbap
where pstyv = c_tac
or pstyv = c_ytac
or pstyv = c_ztac.

if sy-subrc ne c_zero.
message e007(zp_abap).
endif. "// No existe dados no parmetro indicado.

* Grava os documentos em i_vbap_aux, e apaga os registros duplicados.


i_vbap_aux[] = i_vbap[].
delete adjacent duplicates from i_vbap_aux comparing vbeln.

* Obtem os tipos de documentos (ordem ou contrato).


select vbeln erdat erzet ernam vbtyp kunnr vkgrp
from vbak
into table i_vbak
for all entries in i_vbap_aux
where vbeln = i_vbap_aux-vbeln.

166
ABAP Training

if sy-subrc ne c_zero.
message e007(zp_abap).
endif. "// No existe dados no parmetro indicado.

* Obtem a descrio do cliente.


select kunnr name1
from kna1
into table i_kna1
for all entries in i_vbak
where kunnr = i_vbak-kunnr.

if sy-subrc ne c_zero.
message e007(zp_abap).
endif. "// No existe dados no parmetro indicado.

* Obtem a chave de pesquisa para os status.


select objnr stat
from jest
into table i_jest
for all entries in i_vbap
where objnr = i_vbap-objnr
and inact <> c_x.

if sy-subrc ne c_zero.
message e007(zp_abap).
endif. "// No existe dados no parmetro indicado.

* Obtem o status do usurio. (I_JEST-STAT(1) = 'E')


select estat txt04
from tj30t
into table i_tj30t
for all entries in i_jest
where estat = i_jest-stat
and spras = sy-langu.

if sy-subrc ne c_zero.
message e007(zp_abap).
endif. "// No existe dados no parmetro indicado.

* Obtem o status do sistema. (I_JEST-STAT(1) = 'I')


select istat txt04
from tj02t
into table i_tj02t
for all entries in i_jest
where istat = i_jest-stat
and spras = sy-langu.

if sy-subrc ne c_zero.
message e007(zp_abap).
endif. "// No existe dados no parmetro indicado.

* Obtem o nome do usurio que criou a ordem.


select bname name_first
from user_addr
into table i_user_addr
for all entries in i_vbak
where bname = i_vbak-ernam.

if sy-subrc ne c_zero.
message e007(zp_abap).
endif. "// No existe dados no parmetro indicado.

* Obtem os itens a serem especificados.

167
ABAP Training
select *
from zptes_especif
into table i_zptes_especif.

perform f_carregar_caracteristicas. "// Carrega a tabela i_cabn.

ENDFORM. "// f_seleciona_dados




Performance melhorada seleo de dados

* Tabela de OV's incompletas.


DATA: I_ZPTES_ESPECIF LIKE ZPTES_ESPECIF OCCURS 100 WITH HEADER LINE.

* Tabela de OV's serem especificadas.


DATA: BEGIN OF I_ESPECIF OCCURS 100.
INCLUDE STRUCTURE ZPTES_ESPECIF.
DATA: FLAG. "// O valor 'X' indica que o
"// registro dever ser
"// atualizado.
DATA: END OF I_ESPECIF.

* Tabela p/ atualizao das Ordens de Venda.


DATA: BEGIN OF I_ATUALIZA OCCURS 100,
VBELN LIKE VBAP-VBELN, "// Documento de venda.
POSNR LIKE VBAP-POSNR, "// Item do documento.
MTVO LIKE ZPTES_ESPECIF-MOTIVO. "// Motivo da
"// impossibilidade de
"// completar a OV.
DATA: END OF I_ATUALIZA.

* Mestre de clientes (parte geral).


DATA: BEGIN OF I_KNA1 OCCURS 100,
KUNNR LIKE KNA1-KUNNR, "// N cliente.
NAME1 LIKE KNA1-NAME1. "// Nome do cliente.
DATA: END OF I_KNA1.

* Documento de vendas: dados de cabealho.


DATA: BEGIN OF I_VBAK OCCURS 5000,
VBELN LIKE VBAK-VBELN, "// Documento de venda.
ERDAT LIKE VBAK-ERDAT, "// Data criao do registro.
ERZET LIKE VBAK-ERZET, "// Hora do registro.
ERNAM LIKE VBAK-ERNAM, "// Nome do responsvel.
VBTYP LIKE VBAK-VBTYP, "// Ctg.documento de vendas e
"// distribuio.
KUNNR LIKE KNA1-KUNNR, "// Cliente
VKGRP LIKE VBAK-VKGRP. "// Grupo de trabalho
DATA: END OF I_VBAK.

* Documento de vendas: dados de item.


DATA: BEGIN OF I_VBAP OCCURS 10000,
VBELN LIKE VBAP-VBELN, "// Documento de venda.
POSNR LIKE VBAP-POSNR, "// Item do documento.
MATNR LIKE VBAP-MATNR, "// N do material.
OBJNR LIKE VBAP-OBJNR, "// N objeto a nvel de item.
CUOBJ LIKE VBAP-CUOBJ. "// Configurao.
DATA: END OF I_VBAP.

* Cpia de I_VBAP p/ melhor performance.


DATA: I_VBAP_AUX LIKE I_VBAP OCCURS 10000 WITH HEADER LINE.

168
ABAP Training

* Ordens de Venda
DATA: BEGIN OF I_ordem OCCURS 10000,
vbeln LIKE vbap-vbeln, "// Documento de venda
posnr LIKE vbap-posnr. "// Item Documento de venda
DATA: END OF I_ordem.

* Status individual por objeto.


DATA: BEGIN OF I_JEST OCCURS 100000,
OBJNR LIKE JEST-OBJNR, "// N objeto.
STAT LIKE JEST-STAT. "// Status individual de um
"// objeto.
DATA: END OF I_JEST.

* Status individual por objeto.


DATA: BEGIN OF I_JEST_aux OCCURS 100000,
OBJNR LIKE JEST-OBJNR, "// N objeto.
STAT LIKE JEST-STAT. "// Status individual de um
"// objeto.
DATA: END OF I_JEST_aux.

* Histrico de modificaes no satus do usurio/sistema.


DATA: BEGIN OF I_JCDS OCCURS 1000,
STAT LIKE JCDS-STAT, " Status do usurio.
CHGNR LIKE JCDS-CHGNR. " Nmero da modificao
DATA: END OF I_JCDS.

* Textos relativos a status de usurio.


DATA: BEGIN OF I_TJ30T occurs 100,
ESTAT LIKE TJ30T-ESTAT, "// Status do usurio.
TXT04 LIKE TJ30T-TXT04. "// Status individual de um
"// objeto (forma breve).
DATA: END OF I_TJ30T.

* Textos relativos a status do sistema.


DATA: BEGIN OF I_TJ02T,
ISTAT LIKE TJ02T-ISTAT, "// Status do sistema.
TXT04 LIKE TJ02T-TXT04. "// Status individual de um
"// objeto (forma breve).
DATA: END OF I_TJ02T.

* Dados do usurio.
DATA: BEGIN OF I_USER_ADDR OCCURS 100,
BNAME LIKE USER_ADDR-BNAME, "// Nome do usurio no
"// cadastro.
NAME_FIRST LIKE USER_ADDR-NAME_FIRST. "// Nome.
DATA: END OF I_USER_ADDR.

* Caractersticas.
DATA: BEGIN OF I_CABN OCCURS 100,
ATINN LIKE CABN-ATINN, "// Valor da caracterstica
ATNAM LIKE CABN-ATNAM. "// Nome da caracterstica
DATA: END OF I_CABN.

* Descricao das Caractersticas e Valor.


DATA: BEGIN OF I_CARACT OCCURS 20,
NOME LIKE CABN-ATNAM, "// Nome da caraterstica
VALOR LIKE ZPTES_ESPECIF-CANAL. "// Valor da caracterstica
DATA: END OF I_CARACT.

* Tabela com nomes das caractersticas.


RANGES: R_ATNAM FOR CABN-ATNAM.

169
ABAP Training

*&---------------------------------------------------------------------*
*& Form f_seleciona_dados
*&---------------------------------------------------------------------*
* Seleciona os dados, carregando os mesmos nas tabelas internas.
*----------------------------------------------------------------------*
FORM F_SELECIONA_DADOS.

* Obtem o status do usurio. (I_JEST-STAT(1) = 'E')


select estat txt04
from tj30t
into table i_tj30t
where spras = sy-langu
and ( txt04 = c_spec
or txt04 = c_lcot
or txt04 = c_pcot ).

if sy-subrc ne c_zero.
message e007(zp_abap).
endif. "// No existe dados no parmetro indicado.

* Obtem o status do sistema. (I_JEST-STAT(1) = 'I')


select istat txt04
up to 1 rows
from tj02t
into i_tj02t
where spras = sy-langu
and txt04 = c_incompleto.
endselect.

if sy-subrc ne c_zero.
message e007(zp_abap).
endif. "// No existe dados no parmetro indicado.

read table i_tj30t with key txt04 = c_spec.


if sy-subrc ne c_zero.
message e007(zp_abap).
endif. "// No existe dados no parmetro indicado.

* Obtem a chave de pesquisa para os status.


select objnr stat
from jest
into table i_jest
where ( STAT = i_tj30t-estat or
STAT = i_tj02t-istat )
and inact <> c_x.

if sy-subrc ne c_zero.
message e007(zp_abap).
endif. "// No existe dados no parmetro indicado.

* ordena a tabela i_jest.


sort i_jest by objnr stat.

* seleo das OVs incompletas.

i_jest_aux[] = i_jest[].

loop at i_jest. "leitura da tabela de Status individual por objeto


read table i_jest_aux with key objnr = i_jest-objnr
stat = i_tj30t-estat.
if sy-subrc eq c_zero.

170
ABAP Training
read table i_jest_aux with key objnr = i_jest-objnr
stat = i_tj02t-istat.
if sy-subrc eq c_zero.
i_ordem-vbeln = i_jest-objnr+2(10).
i_ordem-posnr = i_jest-objnr+12(6).
append i_ordem.
clear i_ordem.
endif.
endif.
endloop. " fim da leitura da tab de Status indiv. por objeto

* elimina registros duplicados da tabela.


delete adjacent duplicates from i_ordem.
if i_ordem[] is initial.
message e007(zp_abap).
endif. "// No existe dados no parmetro indicado.

* Recupera as ordens de venda do tipo make to order cujo status seja


* incompleta

select vbeln posnr matnr objnr cuobj


from vbap
into table i_vbap
for all entries in i_ordem
where vbeln = i_ordem-vbeln
and posnr = i_ordem-posnr
and ( pstyv = c_tac
or pstyv = c_ytac
or pstyv = c_ztac ).

if sy-subrc ne c_zero.
message e007(zp_abap).
endif. "// No existe dados no parmetro indicado.

* Obtem os tipos de documentos (ordem ou contrato).


select vbeln erdat erzet ernam vbtyp kunnr vkgrp
from vbak
into table i_vbak
for all entries in i_vbap_aux
where vbeln = i_vbap_aux-vbeln.

if sy-subrc ne c_zero.
message e007(zp_abap).
endif. "// No existe dados no parmetro indicado.

* Obtem a descrio do cliente.


select kunnr name1
from kna1
into table i_kna1
for all entries in i_vbak
where kunnr = i_vbak-kunnr.

if sy-subrc ne c_zero.
message e007(zp_abap).
endif. "// No existe dados no parmetro indicado.

* Obtem o nome do usurio que criou a ordem.


select bname name_first
from user_addr
into table i_user_addr
for all entries in i_vbak
where bname = i_vbak-ernam.

if sy-subrc ne c_zero.
message e007(zp_abap).

171
ABAP Training
endif. "// No existe dados no parmetro indicado.

* Obtem os itens a serem especificados.


select *
from zptes_especif
into table i_zptes_especif.

perform f_carregar_caracteristicas. "// Carrega a tabela i_cabn.

ENDFORM. "// f_seleciona_dados

172
ABAP Training
Performance Ruim Lgica errada

* Corte externo ao - I_T320_ACO.


DATA: BEGIN OF I_T320_ACO OCCURS 100,
WERKS LIKE T320-WERKS, "// Material.
LGORT LIKE T320-LGORT. "// Depsito.
DATA: END OF I_T320_ACO.

** Corte externo ao - I_T320_NACO.


*DATA: BEGIN OF I_T320_NACO OCCURS 100,
* WERKS LIKE T320-WERKS, "// Material.
* LGORT LIKE T320-LGORT. "// Depsito.
*DATA: END OF I_T320_NACO.

* Quanto ao - I_LQUA_ACO.
DATA: BEGIN OF I_LQUA_ACO OCCURS 100,
LGNUM LIKE LQUA-LGNUM, "// Sist de depsito
MATNR LIKE LQUA-MATNR, "// Material
WERKS LIKE LQUA-WERKS, "// Centro
CHARG LIKE LQUA-CHARG, "// N lote de produo
LGTYP LIKE LQUA-LGTYP, "// Tipo de Depos.
LGPLA LIKE LQUA-LGPLA, "// Pos.Depos.
LGORT LIKE LQUA-LGORT. "// Depsito.
DATA: END OF I_LQUA_ACO.

* Totalizador1 AO - MSLB + S692


DATA: BEGIN OF I_TOTALIZADOR1_ACO OCCURS 100,
MATNR LIKE MARA-MATNR, "// Material.
MATKL LIKE MARA-MATKL, "// Centro.
MTART LIKE MARA-MTART, "// Tipo de Material.
WERKS_MSLB LIKE MSLB-WERKS, "// Centro.
CHARG_MSLB LIKE MSLB-CHARG, "// Lote.
LIFNR LIKE MSLB-LIFNR, "// Depsito.
LBLAB LIKE MSLB-LBLAB, "// Lote.
LBINS LIKE MSLB-LBINS, "// Utilizao Livre.
VBELN_S692 LIKE S692-VBELN, "// Em contr.qualid.
POSNR_S692 LIKE S692-POSNR, "// Bloqueado
EBELN LIKE S692-EBELN, "// Devoluo
ENSAIO TYPE C. "// Ensaio
DATA: END OF I_TOTALIZADOR1_ACO.

* Totalizador2 AO - MARA + MSKA


DATA: BEGIN OF I_TOTALIZADOR2_ACO OCCURS 100,
MATNR LIKE MARA-MATNR, "// Material.
MATKL LIKE MARA-MATKL, "// Centro.
MTART LIKE MARA-MTART, "// Tipo de Material.
WERKS_MCHB LIKE MCHB-WERKS, "// Centro.
LGORT_MCHB LIKE MCHB-LGORT, "// Depsito.
CHARG_MCHB LIKE MCHB-CHARG, "// Lote.
CLABS LIKE MCHB-CLABS, "// Utilizao livre
CINSM LIKE MCHB-CINSM, "// Em contr.Qualid.
CSPEM LIKE MCHB-CSPEM, "// Bloqueado
CRETM LIKE MCHB-CRETM, "// Devoluo
CHARG_MSKA LIKE MSKA-CHARG, "// Lote.
WERKS_MSKA LIKE MSKA-WERKS, "// Centro.
LGORT_MSKA LIKE MSKA-LGORT, "// Depsito.
VBELN_MSKA LIKE MSKA-VBELN, "// Ordem.
POSNR_MSKA LIKE MSKA-POSNR, "// Item.
KALAB LIKE MSKA-KALAB, "// Estq.aval de utilizao livre
KAINS LIKE MSKA-KAINS, "// Estq.em controle de qualidade
KASPE LIKE MSKA-KASPE, "// Estoque bloqueado
LGTYP LIKE LQUA-LGTYP, "// Tipo de depsito
LGPLA LIKE LQUA-LGPLA, "// Posio no depsito
LGNUM LIKE LQUA-LGNUM, "// Sistema de depsito
TPTAB(4) TYPE C. "// Tabela de origem dos dados

173
ABAP Training
DATA: END OF I_TOTALIZADOR2_ACO.

*----------------------------------------------------------------------*
* Form F_SELECIONA_DADOS_ACO
*----------------------------------------------------------------------*
* Seleciona os dados para os parmetros indicados na tela - ao.
*----------------------------------------------------------------------*
FORM F_SELECIONA_DADOS_ACO.

* Seleo dos materiais


* Seleo dos dados de material - Ao
* MARA
select matnr
matkl
mtart
from mara
into table i_mara_aco
where matkl between c_500 and c_504.

*--------------------------------------------
* Seleo dos lotes
* Seleo dos lotes de material - Ao
* MCHB
if not i_mara_aco[] is initial.
select matnr
werks
lgort
charg
clabs
cinsm
cspem
cretm
from mchb
into table i_mchb_aco
for all entries in i_mara_aco
where matnr = i_mara_aco-matnr
and ( clabs <> c_zero
or cinsm <> c_zero
or cspem <> c_zero ).
endif.

*------------------------------------------------
* Seleo dos Estoque de ordens-cliente
* Dados ordem/itens para os materiais - Ao
* MSKA
if not i_mara_aco[] is initial.
select matnr
charg
werks
lgort
vbeln
posnr
kalab
kains
kaspe
from mska
into table i_mska_aco
for all entries in i_mara_aco
where matnr = i_mara_aco-matnr
and ( kalab <> c_zero
or kains <> c_zero
or kaspe <> c_zero ).
endif.

*---------------------------------------------------
* Seleo dos estoques especiais junto ao fornecedor

174
ABAP Training
* Estoques especiais junto ao fornecedor - Ao
* MSLB
if not i_mara_aco[] is initial.
select matnr
werks
charg
lifnr
lblab
lbins
from mslb
into table i_mslb_aco
for all entries in i_mara_aco
where matnr = i_mara_aco-matnr
and ( lblab <> c_zero
or lbins <> c_zero ).
endif.

*-----------------------------------------------------
* Corte Externo
* Corte Externo - Ao
* S692
if not i_mslb_aco[] is initial.
select matnr
charg
vbeln
posnr
ebeln
from s692
into table i_s692_aco
for all entries in i_mslb_aco
where matnr = i_mslb_aco-matnr
and charg = i_mslb_aco-charg.
endif.
*------------------------------------------------------
* Atribuio depsito IM a sistema de depsito WM
* Atribuio depsito IM a sistema de depsito WM - Ao T320 - mchb
if not i_mchb_aco[] is initial.
select werks
lgort
from t320
into table i_t320_aco
for all entries in i_mchb_aco
where werks = i_mchb_aco-werks
and lgort = i_mchb_aco-lgort.
endif.

* Seleo da t320 - mska


if not i_mska_aco[] is initial.
select werks
lgort
from t320
appending table i_t320_aco
for all entries in i_mska_aco
where werks = i_mska_aco-werks
and lgort = i_mska_aco-lgort.
endif.

* Ordena a tabela
sort i_t320_aco by werks lgort.

* Deleta os itens adjacentes.


delete adjacent duplicates from i_t320_aco comparing werks lgort.

*-----------------------------------------------------------

175
ABAP Training
* Quanto - Ao
* Seleo do sistema de depsito
* LQUA
refresh i_lqua_aco.
if not i_t320_aco[] is initial.
select lgnum
matnr
werks
charg
lgtyp
lgpla
lgort
from lqua
into table i_lqua_aco
for all entries in i_t320_aco
where werks = i_t320_aco-werks
and lgort = i_t320_aco-lgort
and mgewi ne 0.
endif.

ENDFORM. " F_SELECIONA_DADOS

*----------------------------------------------------------------------*
* Form F_BUSCA_MATERIAL_ACO
*----------------------------------------------------------------------*
* Grava os dados para material ao.
*----------------------------------------------------------------------*
* Monta os Totalizadores - (Corte Externo)
* Servios Externos
* Seleo das Ordens de Venda
FORM F_BUSCA_MATERIAL_ACO.

* Declara as variveis locais


data : v_code like qapp-vcode,
v_flag type c.

* Seleo do totalizador 1 - ms lb + s692 - i_totalizador1_aco


* -----------------------------------------------------------
clear i_totalizador1_aco.
loop at i_mslb_aco.
* limpa as variaveis
clear v_code.
clear v_flag.

read table i_s692_aco with key matnr = i_mslb_aco-matnr


charg = i_mslb_aco-charg.
if sy-subrc eq c_zero.
i_totalizador1_aco-matnr = i_mslb_aco-matnr.
i_totalizador1_aco-werks_mslb = i_mslb_aco-werks.
i_totalizador1_aco-charg_mslb = i_mslb_aco-charg.
i_totalizador1_aco-lifnr = i_mslb_aco-lifnr.
i_totalizador1_aco-lblab = i_mslb_aco-lblab.
i_totalizador1_aco-lbins = i_mslb_aco-lbins.
i_totalizador1_aco-vbeln_s692 = i_s692_aco-vbeln.
i_totalizador1_aco-posnr_s692 = i_s692_aco-posnr.
i_totalizador1_aco-ebeln = i_s692_aco-ebeln.

* Verifica se o lote e de uma bobina - comea com nmero


if i_totalizador1_aco-charg_mslb+0(1) CO '0123456789'.
select single
vcode
from
qapp
into v_code
where usern1 = i_totalizador1_aco-charg_mslb.
if sy-subrc eq c_zero.

176
ABAP Training
v_flag = 'T'.
else.
v_flag = 'F'.
endif.
else. " placa
select single
vcode
from
qapp
into v_code
where userc1 = i_totalizador1_aco-charg_mslb.
if sy-subrc eq c_zero.
v_flag = 'T'.
else.
v_flag = 'F'.
endif.
endif.
else.
i_totalizador1_aco-matnr = i_mslb_aco-matnr.
i_totalizador1_aco-werks_mslb = i_mslb_aco-werks.
i_totalizador1_aco-charg_mslb = i_mslb_aco-charg.
i_totalizador1_aco-lifnr = i_mslb_aco-lifnr.
i_totalizador1_aco-lblab = i_mslb_aco-lblab.
i_totalizador1_aco-lbins = i_mslb_aco-lbins.
i_totalizador1_aco-vbeln_s692 = ''.
i_totalizador1_aco-posnr_s692 = ''.
i_totalizador1_aco-ebeln = i_s692_aco-ebeln.

* Verifica se o lote e de uma bobina - comea com nmero


if i_totalizador1_aco-charg_mslb+0(1) CO '0123456789'.
select single
vcode
from
qapp
into v_code
where usern1 = i_totalizador1_aco-charg_mslb.
if sy-subrc eq c_zero.
v_flag = 'T'.
else.
v_flag = 'F'.
endif.
else. " placa
select single
vcode
from
qapp
into v_code
where userc1 = i_totalizador1_aco-charg_mslb.
if sy-subrc eq c_zero.
v_flag = 'T'.
else.
v_flag = 'F'.
endif.
endif.
endif.

* Verifica se achou a lote ou no.


if v_flag = 'T'.
if v_code is initial.
i_totalizador1_aco-ensaio = 'S'.
else.
i_totalizador1_aco-ensaio = 'N'.
endif.
else.

177
ABAP Training
i_totalizador1_aco-ensaio = 'N'.
endif.

* Acrescenta os dados da mara ao totalizador 1


read table i_mara_aco with key matnr = i_mslb_aco-matnr.
if sy-subrc eq c_zero.
i_totalizador1_aco-matkl = i_mara_aco-matkl.
i_totalizador1_aco-mtart = i_mara_aco-mtart.
endif.
append i_totalizador1_aco.
endloop. loop at i_mslb_aco.

clear i_totalizador2_aco.
* Seleo do totalizador2 - juno da mchb + mska - i_totalizador2_aco
* ---------------------------------------------------------------------
loop at i_mska_aco.
i_totalizador2_aco-matnr = i_mska_aco-matnr.
i_totalizador2_aco-charg_mska = i_mska_aco-charg.
i_totalizador2_aco-werks_mska = i_mska_aco-werks.
i_totalizador2_aco-lgort_mska = i_mska_aco-lgort.
i_totalizador2_aco-vbeln_mska = i_mska_aco-vbeln.
i_totalizador2_aco-posnr_mska = i_mska_aco-posnr.
i_totalizador2_aco-kalab = i_mska_aco-kalab.
i_totalizador2_aco-kains = i_mska_aco-kains.
i_totalizador2_aco-kaspe = i_mska_aco-kaspe.
i_totalizador2_aco-tptab = 'MSKA'.
append i_totalizador2_aco.
endloop.

clear i_totalizador2_aco.
loop at i_mchb_aco.
i_totalizador2_aco-matnr = i_mchb_aco-matnr.
i_totalizador2_aco-charg_mchb = i_mchb_aco-charg.
i_totalizador2_aco-werks_mchb = i_mchb_aco-werks.
i_totalizador2_aco-lgort_mchb = i_mchb_aco-lgort.
i_totalizador2_aco-clabs = i_mchb_aco-clabs.
i_totalizador2_aco-cinsm = i_mchb_aco-cinsm.
i_totalizador2_aco-cspem = i_mchb_aco-cspem.
i_totalizador2_aco-cretm = i_mchb_aco-cretm.
i_totalizador2_aco-tptab = 'MCHB'.
append i_totalizador2_aco.
endloop.

clear i_totalizador2_aco.
* Seleciona os depsitos do i_totalizador2_aco
* ---------------------------------------------------------
* Seleo dos depsitos - i_totalizador2_aco + i_t320_aco
loop at i_totalizador2_aco.
* Atribui o ndice da tabela i_totalizador2_aco
v_indice = sy-tabix.

* Acrescenta os dados da mara ao totalizador 2


read table i_mara_aco with key matnr
= i_totalizador2_aco-matnr.
if sy-subrc eq c_zero.
i_totalizador2_aco-matkl = i_mara_aco-matkl.
i_totalizador2_aco-mtart = i_mara_aco-mtart.
endif.

* Se a tabela for MSKA


if i_totalizador2_aco-tptab = 'MSKA'.
read table i_t320_aco with key
werks = i_totalizador2_aco-werks_mska
lgort = i_totalizador2_aco-lgort_mska.
* Se achou dados no sistema de depsito WM
if sy-subrc eq c_zero.

178
ABAP Training
loop at i_lqua_aco where
matnr = i_totalizador2_aco-matnr and
charg = i_totalizador2_aco-charg_mska.

i_totalizador2_aco-lgtyp = i_lqua_aco-lgtyp.
i_totalizador2_aco-lgpla = i_lqua_aco-lgpla.
i_totalizador2_aco-lgnum = i_lqua_aco-lgnum.

i_total_final_aco = i_totalizador2_aco.
append i_total_final_aco.
endloop. loop at i_lqua_aco
else.
i_total_final_aco = i_totalizador2_aco.
append i_total_final_aco.
endif.
else. " MCHB
read table i_t320_aco with key
werks = i_totalizador2_aco-werks_mchb
lgort = i_totalizador2_aco-lgort_mchb.
* Se achou dados no sistema de depsito WM
if sy-subrc eq c_zero.
* Busca o sistema de depsito, caso tenha movimento de WM
loop at i_lqua_aco where
matnr = i_totalizador2_aco-matnr and
charg = i_totalizador2_aco-charg_mchb.

i_totalizador2_aco-lgtyp = i_lqua_aco-lgtyp.
i_totalizador2_aco-lgpla = i_lqua_aco-lgpla.
i_totalizador2_aco-lgnum = i_lqua_aco-lgnum.

i_total_final_aco = i_totalizador2_aco.
append i_total_final_aco.
endloop. loop at i_lqua_aco
else.
i_total_final_aco = i_totalizador2_aco.
append i_total_final_aco.
endif.
endif.
endloop. " i_totalizador2_aco

i_totalizador2_aco[] = i_total_final_aco[].

clear i_totalizador2_aco.
clear i_aco.
* Seleciona os dados com sistema de depsito <> 900
loop at i_totalizador2_aco.
if i_totalizador2_aco-lgnum <> c_900.

* Se for tipo de depsito 905 e for FERT, desconsidera


if i_totalizador2_aco-lgnum = c_905 and
i_totalizador2_aco-mtart = c_fert.
continue.
endif.

i_aco-matnr = i_totalizador2_aco-matnr.
i_aco-matkl = i_totalizador2_aco-matkl.
i_aco-mtart = i_totalizador2_aco-mtart.

clear v_code.
clear v_flag.

* Se a tabela for MCHB


if i_totalizador2_aco-tptab = 'MCHB'.
i_aco-werks = i_totalizador2_aco-werks_mchb.
i_aco-lgort = i_totalizador2_aco-lgort_mchb.
i_aco-charg = i_totalizador2_aco-charg_mchb.

179
ABAP Training
i_aco-clabs = i_totalizador2_aco-clabs.
i_aco-cinsm = i_totalizador2_aco-cinsm.
i_aco-cspem = i_totalizador2_aco-cspem.

* Verifica se o lote e de uma bobina - comea com nmero


if i_totalizador2_aco-charg_mchb+0(1) CO '0123456789'.
select single
vcode
from
qapp
into v_code
where usern1 = i_totalizador2_aco-charg_mchb.
if sy-subrc eq c_zero.
v_flag = 'T'.
else.
v_flag = 'F'.
endif.
else. " placa
select single
vcode
from
qapp
into v_code
where userc1 = i_totalizador2_aco-charg_mchb.
if sy-subrc eq c_zero.
v_flag = 'T'.
else.
v_flag = 'F'.
endif.
endif.
else. " MSKA
i_aco-werks = i_totalizador2_aco-werks_mska.
i_aco-charg = i_totalizador2_aco-charg_mska.
i_aco-lgort = i_totalizador2_aco-lgort_mska.
i_aco-clabs = i_totalizador2_aco-kalab.
i_aco-cinsm = i_totalizador2_aco-kains.
i_aco-cspem = i_totalizador2_aco-kaspe.

* Verifica se o lote e de uma bobina - comea com nmero


if i_totalizador2_aco-charg_mska+0(1) CO '0123456789'.
select single
vcode
from
qapp
into v_code
where usern1 = i_totalizador2_aco-charg_mska.
if sy-subrc eq c_zero.
v_flag = 'T'.
else.
v_flag = 'F'.
endif.
else. " placa
select single
vcode
from
qapp
into v_code
where userc1 = i_totalizador2_aco-charg_mska.
if sy-subrc eq c_zero.
v_flag = 'T'.
else.
v_flag = 'F'.
endif.
endif.
endif.
i_aco-cretm = i_totalizador2_aco-cretm.

180
ABAP Training
i_aco-vbeln = i_totalizador2_aco-vbeln_mska.
i_aco-posnr = i_totalizador2_aco-posnr_mska.
i_aco-lgtyp = i_totalizador2_aco-lgtyp.
i_aco-lgpla = i_totalizador2_aco-lgpla.
i_aco-lgnum = i_totalizador2_aco-lgnum.

* Verifica se achou a lote ou no.


if v_flag = 'T'.
if v_code is initial.
i_aco-ensaio = 'S'.
else.
i_aco-ensaio = 'N'.
endif.
else.
i_aco-ensaio = 'N'.
endif.

* Acerta valores com sinal a esquerda


shift: i_aco-clabs right circular,
i_aco-cinsm right circular,
i_aco-cspem right circular,
i_aco-cretm right circular.
condense: i_aco-clabs no-gaps,
i_aco-cinsm no-gaps,
i_aco-cspem no-gaps,
i_aco-cretm no-gaps.
shift: i_aco-clabs right deleting trailing space,
i_aco-cinsm right deleting trailing space,
i_aco-cspem right deleting trailing space,
i_aco-cretm right deleting trailing space.
* Grava os valores
append i_aco.
endif.
endloop. loop at i_totalizador2_aco.

clear i_totalizador1_aco.
clear i_aco.

* Acrescenta ao i_aco os valores do


* i_totalizador1_aco
loop at i_totalizador1_aco.
i_aco-matnr = i_totalizador1_aco-matnr.
i_aco-matkl = i_totalizador1_aco-matkl.
i_aco-mtart = i_totalizador1_aco-mtart.
i_aco-werks = i_totalizador1_aco-werks_mslb.
i_aco-charg = i_totalizador1_aco-charg_mslb.
i_aco-lifnr = i_totalizador1_aco-lifnr.
i_aco-lblab = i_totalizador1_aco-lblab.
i_aco-lbins = i_totalizador1_aco-lbins.
i_aco-vbeln = i_totalizador1_aco-vbeln_s692.
i_aco-posnr = i_totalizador1_aco-posnr_s692.
i_aco-ebeln = i_totalizador1_aco-ebeln.
i_aco-ensaio = i_totalizador1_aco-ensaio.
shift: i_aco-lbins right circular,
i_aco-lblab right circular.
condense: i_aco-lbins no-gaps,
i_aco-lblab no-gaps.
shift: i_aco-lbins right deleting trailing space,
i_aco-lblab right deleting trailing space.

append i_aco.
endloop.
ENDFORM. " F_BUSCA_MATERIAL_ACO

181
ABAP Training
Performance Melhorada Lgica correta

* Corte externo ao - I_T320_ACO.


DATA: BEGIN OF I_T320_ACO_MSKA OCCURS 50,
WERKS LIKE T320-WERKS, "// Material.
LGORT LIKE T320-LGORT. "// Depsito.
DATA: END OF I_T320_ACO_MSKA.

DATA: BEGIN OF I_T320_ACO_MCHB OCCURS 50,


WERKS LIKE T320-WERKS, "// Material.
LGORT LIKE T320-LGORT. "// Depsito.
DATA: END OF I_T320_ACO_MCHB.

* Quanto ao - I_LQUA_ACO.

DATA: BEGIN OF I_LQUA_ACO_MSKA OCCURS 100000,


LGNUM LIKE LQUA-LGNUM, "// Sist de depsito
MATNR LIKE LQUA-MATNR, "// Material
WERKS LIKE LQUA-WERKS, "// Centro
CHARG LIKE LQUA-CHARG, "// N lote de produo
LGTYP LIKE LQUA-LGTYP, "// Tipo de Depos.
LGPLA LIKE LQUA-LGPLA, "// Pos.Depos.
LGORT LIKE LQUA-LGORT. "// Depsito.
DATA: END OF I_LQUA_ACO_MSKA.

DATA: BEGIN OF I_LQUA_ACO_MCHB OCCURS 100000,


LGNUM LIKE LQUA-LGNUM, "// Sist de depsito
MATNR LIKE LQUA-MATNR, "// Material
WERKS LIKE LQUA-WERKS, "// Centro
CHARG LIKE LQUA-CHARG, "// N lote de produo
LGTYP LIKE LQUA-LGTYP, "// Tipo de Depos.
LGPLA LIKE LQUA-LGPLA, "// Pos.Depos.
LGORT LIKE LQUA-LGORT. "// Depsito.
DATA: END OF I_LQUA_ACO_MCHB.

* Totalizador1 AO - MSLB + S692


DATA: BEGIN OF I_TOTALIZADOR1_ACO OCCURS 10000,
MATNR LIKE MARA-MATNR, "// Material.
MATKL LIKE MARA-MATKL, "// Centro.
MTART LIKE MARA-MTART, "// Tipo de Material.
WERKS_MSLB LIKE MSLB-WERKS, "// Centro.
CHARG_MSLB LIKE MSLB-CHARG, "// Lote.
LIFNR LIKE MSLB-LIFNR, "// Depsito.
LBLAB LIKE MSLB-LBLAB, "// Lote.
LBINS LIKE MSLB-LBINS, "// Utilizao Livre.
VBELN_S692 LIKE S692-VBELN, "// Em contr.qualid.
POSNR_S692 LIKE S692-POSNR, "// Bloqueado
EBELN LIKE S692-EBELN, "// Devoluo
ENSAIO TYPE C. "// Ensaio
DATA: END OF I_TOTALIZADOR1_ACO.

* Totalizador2 AO - MARA + MSKA


DATA: BEGIN OF I_TOTALIZADOR2_ACO OCCURS 100000,
MATNR LIKE MARA-MATNR, "// Material.
MATKL LIKE MARA-MATKL, "// Centro.
MTART LIKE MARA-MTART, "// Tipo de Material.
WERKS_MCHB LIKE MCHB-WERKS, "// Centro.
LGORT_MCHB LIKE MCHB-LGORT, "// Depsito.
CHARG_MCHB LIKE MCHB-CHARG, "// Lote.
CLABS LIKE MCHB-CLABS, "// Utilizao livre
CINSM LIKE MCHB-CINSM, "// Em contr.Qualid.

182
ABAP Training
CSPEM LIKE MCHB-CSPEM, "// Bloqueado
CRETM LIKE MCHB-CRETM, "// Devoluo
CHARG_MSKA LIKE MSKA-CHARG, "// Lote.
WERKS_MSKA LIKE MSKA-WERKS, "// Centro.
LGORT_MSKA LIKE MSKA-LGORT, "// Depsito.
VBELN_MSKA LIKE MSKA-VBELN, "// Ordem.
POSNR_MSKA LIKE MSKA-POSNR, "// Item.
KALAB LIKE MSKA-KALAB, "// Estq.aval de utilizao livre
KAINS LIKE MSKA-KAINS, "// Estq.em controle de qualidade
KASPE LIKE MSKA-KASPE, "// Estoque bloqueado
LGTYP LIKE LQUA-LGTYP, "// Tipo de depsito
LGPLA LIKE LQUA-LGPLA, "// Posio no depsito
LGNUM LIKE LQUA-LGNUM, "// Sistema de depsito
TPTAB(4) TYPE C. "// Tabela de origem dos dados
DATA: END OF I_TOTALIZADOR2_ACO.

*----------------------------------------------------------------------*
* Form F_SELECIONA_DADOS_ACO
*----------------------------------------------------------------------*
* Seleciona os dados para os parmetros indicados na tela - ao.
*----------------------------------------------------------------------*
FORM F_SELECIONA_DADOS_ACO.

* Seleo dos materiais


* Seleo dos dados de material - Ao
* MARA
SELECT MATNR
MATKL
MTART
FROM MARA
INTO TABLE I_MARA_ACO
WHERE MATKL BETWEEN C_500 AND C_504.

*--------------------------------------------
* Seleo dos lotes
* Seleo dos lotes de material - Ao
* MCHB
IF NOT I_MARA_ACO[] IS INITIAL.
SELECT MATNR
WERKS
LGORT
CHARG
CLABS
CINSM
CSPEM
CRETM
FROM MCHB
INTO TABLE I_MCHB_ACO
FOR ALL ENTRIES IN I_MARA_ACO
WHERE MATNR = I_MARA_ACO-MATNR
AND ( CLABS <> C_ZERO
OR CINSM <> C_ZERO
OR CSPEM <> C_ZERO ).
ENDIF.

*------------------------------------------------
* Seleo dos Estoque de ordens-cliente
* Dados ordem/itens para os materiais - Ao
* MSKA
IF NOT I_MARA_ACO[] IS INITIAL.
SELECT MATNR
CHARG
WERKS
LGORT
VBELN
POSNR

183
ABAP Training
KALAB
KAINS
KASPE
FROM MSKA
INTO TABLE I_MSKA_ACO
FOR ALL ENTRIES IN I_MARA_ACO
WHERE MATNR = I_MARA_ACO-MATNR
AND ( KALAB <> C_ZERO
OR KAINS <> C_ZERO
OR KASPE <> C_ZERO ).
ENDIF.

*---------------------------------------------------
* Seleo dos estoques especiais junto ao fornecedor
* Estoques especiais junto ao fornecedor - Ao
* MSLB
IF NOT I_MARA_ACO[] IS INITIAL.
SELECT MATNR
WERKS
CHARG
LIFNR
LBLAB
LBINS
FROM MSLB
INTO TABLE I_MSLB_ACO
FOR ALL ENTRIES IN I_MARA_ACO
WHERE MATNR = I_MARA_ACO-MATNR
AND ( LBLAB <> C_ZERO
OR LBINS <> C_ZERO ).
ENDIF.

*-----------------------------------------------------
* Corte Externo
* Corte Externo - Ao
* S692
IF NOT I_MSLB_ACO[] IS INITIAL.
SELECT MATNR
CHARG
VBELN
POSNR
EBELN
FROM S692
INTO TABLE I_S692_ACO
FOR ALL ENTRIES IN I_MSLB_ACO
WHERE MATNR = I_MSLB_ACO-MATNR
AND CHARG = I_MSLB_ACO-CHARG.
ENDIF.
*------------------------------------------------------
* Atribuio depsito IM a sistema de depsito WM
* Atribuio depsito IM a sistema de depsito WM - Ao T320 - mchb

IF NOT I_MCHB_ACO[] IS INITIAL.


SELECT WERKS
LGORT
FROM T320
INTO TABLE I_T320_ACO_MCHB
FOR ALL ENTRIES IN I_MCHB_ACO
WHERE WERKS = I_MCHB_ACO-WERKS
AND LGORT = I_MCHB_ACO-LGORT.
ENDIF.

* Seleo da t320 - mska


IF NOT I_MSKA_ACO[] IS INITIAL.
SELECT WERKS
LGORT

184
ABAP Training
FROM T320
INTO TABLE I_T320_ACO_MSKA
FOR ALL ENTRIES IN I_MSKA_ACO
WHERE WERKS = I_MSKA_ACO-WERKS
AND LGORT = I_MSKA_ACO-LGORT.
ENDIF.

* Ordena a tabela
SORT I_T320_ACO_MCHB BY WERKS LGORT.
SORT I_T320_ACO_MSKA BY WERKS LGORT.

* Deleta os itens duplicados.


DELETE ADJACENT DUPLICATES FROM I_T320_ACO_MCHB COMPARING WERKS LGORT.
DELETE ADJACENT DUPLICATES FROM I_T320_ACO_MSKA COMPARING WERKS LGORT.

*-----------------------------------------------------------
* Quanto - Ao
* Seleo do sistema de depsito
* LQUA

REFRESH I_LQUA_ACO_MCHB.
REFRESH I_LQUA_ACO_MSKA.

IF NOT I_T320_ACO_MCHB[] IS INITIAL.


SELECT LGNUM
MATNR
WERKS
CHARG
LGTYP
LGPLA
LGORT
FROM LQUA
INTO TABLE I_LQUA_ACO_MCHB
FOR ALL ENTRIES IN I_T320_ACO_MCHB
WHERE WERKS = I_T320_ACO_MCHB-WERKS
AND LGORT = I_T320_ACO_MCHB-LGORT
AND MGEWI NE 0.
ENDIF.

IF NOT I_T320_ACO_MSKA[] IS INITIAL.


SELECT LGNUM
MATNR
WERKS
CHARG
LGTYP
LGPLA
LGORT
FROM LQUA
INTO TABLE I_LQUA_ACO_MSKA
FOR ALL ENTRIES IN I_T320_ACO_MSKA
WHERE WERKS = I_T320_ACO_MSKA-WERKS
AND LGORT = I_T320_ACO_MSKA-LGORT
AND MGEWI NE 0.
ENDIF.

* Seleciona dados da QAPP


SELECT USERC1
USERN1
VCODE
FROM QAPP
INTO TABLE I_QAPP.

DELETE ADJACENT DUPLICATES FROM I_QAPP.

185
ABAP Training
ENDFORM. " F_SELECIONA_DADOS

*----------------------------------------------------------------------*
* Form F_BUSCA_MATERIAL_ACO
*----------------------------------------------------------------------*
* Grava os dados para material ao.
*----------------------------------------------------------------------*
* Monta os Totalizadores - (Corte Externo)
* Servios Externos
* Seleo das Ordens de Venda
FORM F_BUSCA_MATERIAL_ACO.

* Declara as variveis locais


DATA : V_CODE LIKE QAPP-VCODE,
V_FLAG TYPE C.

* ordena a tabela i_mara


sort i_mara_aco by matnr.

* Seleo do totalizador 1 - ms lb + s692 - i_totalizador1_aco


* -----------------------------------------------------------
CLEAR I_TOTALIZADOR1_ACO.
LOOP AT I_MSLB_ACO.
* limpa as variaveis
CLEAR V_CODE.
CLEAR V_FLAG.

READ TABLE I_S692_ACO WITH KEY MATNR = I_MSLB_ACO-MATNR


CHARG = I_MSLB_ACO-CHARG.
IF SY-SUBRC EQ C_ZERO.
I_TOTALIZADOR1_ACO-MATNR = I_MSLB_ACO-MATNR.
I_TOTALIZADOR1_ACO-WERKS_MSLB = I_MSLB_ACO-WERKS.
I_TOTALIZADOR1_ACO-CHARG_MSLB = I_MSLB_ACO-CHARG.
I_TOTALIZADOR1_ACO-LIFNR = I_MSLB_ACO-LIFNR.
I_TOTALIZADOR1_ACO-LBLAB = I_MSLB_ACO-LBLAB.
I_TOTALIZADOR1_ACO-LBINS = I_MSLB_ACO-LBINS.
I_TOTALIZADOR1_ACO-VBELN_S692 = I_S692_ACO-VBELN.
I_TOTALIZADOR1_ACO-POSNR_S692 = I_S692_ACO-POSNR.
I_TOTALIZADOR1_ACO-EBELN = I_S692_ACO-EBELN.

* Verifica se o lote e de uma bobina - comea com nmero


IF I_TOTALIZADOR1_ACO-CHARG_MSLB+0(1) CO '0123456789'.

READ TABLE I_QAPP WITH KEY


USERN1 = I_TOTALIZADOR1_ACO-CHARG_MSLB.

IF SY-SUBRC EQ C_ZERO.
V_FLAG = 'T'.
ELSE.
V_FLAG = 'F'.
ENDIF.
ELSE. " placa

READ TABLE I_QAPP WITH KEY


USERC1 = I_TOTALIZADOR1_ACO-CHARG_MSLB.

IF SY-SUBRC EQ C_ZERO.
V_FLAG = 'T'.
ELSE.
V_FLAG = 'F'.
ENDIF.
ENDIF.
ELSE.
I_TOTALIZADOR1_ACO-MATNR = I_MSLB_ACO-MATNR.

186
ABAP Training
I_TOTALIZADOR1_ACO-WERKS_MSLB = I_MSLB_ACO-WERKS.
I_TOTALIZADOR1_ACO-CHARG_MSLB = I_MSLB_ACO-CHARG.
I_TOTALIZADOR1_ACO-LIFNR = I_MSLB_ACO-LIFNR.
I_TOTALIZADOR1_ACO-LBLAB = I_MSLB_ACO-LBLAB.
I_TOTALIZADOR1_ACO-LBINS = I_MSLB_ACO-LBINS.
I_TOTALIZADOR1_ACO-VBELN_S692 = ''.
I_TOTALIZADOR1_ACO-POSNR_S692 = ''.
I_TOTALIZADOR1_ACO-EBELN = I_S692_ACO-EBELN.

* Verifica se o lote e de uma bobina - comea com nmero


IF I_TOTALIZADOR1_ACO-CHARG_MSLB+0(1) CO '0123456789'.

READ TABLE I_QAPP WITH KEY


USERN1 = I_TOTALIZADOR1_ACO-CHARG_MSLB.

IF SY-SUBRC EQ C_ZERO.
V_FLAG = 'T'.
ELSE.
V_FLAG = 'F'.
ENDIF.
ELSE. " placa

READ TABLE I_QAPP WITH KEY


USERC1 = I_TOTALIZADOR1_ACO-CHARG_MSLB.

IF SY-SUBRC EQ C_ZERO.
V_FLAG = 'T'.
ELSE.
V_FLAG = 'F'.
ENDIF.
ENDIF.
ENDIF.

* Verifica se achou a lote ou no.


IF V_FLAG = 'T'.
IF V_CODE IS INITIAL.
I_TOTALIZADOR1_ACO-ENSAIO = 'S'.
ELSE.
I_TOTALIZADOR1_ACO-ENSAIO = 'N'.
ENDIF.
ELSE.
I_TOTALIZADOR1_ACO-ENSAIO = 'N'.
ENDIF.

* Acrescenta os dados da mara ao totalizador 1


READ TABLE I_MARA_ACO WITH KEY MATNR = I_MSLB_ACO-MATNR binary search.
IF SY-SUBRC EQ C_ZERO.

I_TOTALIZADOR1_ACO-MATKL = I_MARA_ACO-MATKL.

I_TOTALIZADOR1_ACO-MTART = I_MARA_ACO-MTART.

ENDIF.

APPEND I_TOTALIZADOR1_ACO.
ENDLOOP. loop at I_MSLB_ACO

CLEAR I_TOTALIZADOR2_ACO.
* Seleo do totalizador2 - juno da mchb + mska - i_totalizador2_aco
* ---------------------------------------------------------------------
LOOP AT I_MSKA_ACO.
I_TOTALIZADOR2_ACO-MATNR = I_MSKA_ACO-MATNR.
I_TOTALIZADOR2_ACO-CHARG_MSKA = I_MSKA_ACO-CHARG.
I_TOTALIZADOR2_ACO-WERKS_MSKA = I_MSKA_ACO-WERKS.

187
ABAP Training
I_TOTALIZADOR2_ACO-LGORT_MSKA = I_MSKA_ACO-LGORT.
I_TOTALIZADOR2_ACO-VBELN_MSKA = I_MSKA_ACO-VBELN.
I_TOTALIZADOR2_ACO-POSNR_MSKA = I_MSKA_ACO-POSNR.
I_TOTALIZADOR2_ACO-KALAB = I_MSKA_ACO-KALAB.
I_TOTALIZADOR2_ACO-KAINS = I_MSKA_ACO-KAINS.
I_TOTALIZADOR2_ACO-KASPE = I_MSKA_ACO-KASPE.
I_TOTALIZADOR2_ACO-TPTAB = 'MSKA'.
APPEND I_TOTALIZADOR2_ACO.
ENDLOOP.

CLEAR I_TOTALIZADOR2_ACO.
LOOP AT I_MCHB_ACO.
I_TOTALIZADOR2_ACO-MATNR = I_MCHB_ACO-MATNR.
I_TOTALIZADOR2_ACO-CHARG_MCHB = I_MCHB_ACO-CHARG.
I_TOTALIZADOR2_ACO-WERKS_MCHB = I_MCHB_ACO-WERKS.
I_TOTALIZADOR2_ACO-LGORT_MCHB = I_MCHB_ACO-LGORT.
I_TOTALIZADOR2_ACO-CLABS = I_MCHB_ACO-CLABS.
I_TOTALIZADOR2_ACO-CINSM = I_MCHB_ACO-CINSM.
I_TOTALIZADOR2_ACO-CSPEM = I_MCHB_ACO-CSPEM.
I_TOTALIZADOR2_ACO-CRETM = I_MCHB_ACO-CRETM.
I_TOTALIZADOR2_ACO-TPTAB = 'MCHB'.
APPEND I_TOTALIZADOR2_ACO.
ENDLOOP.

CLEAR I_TOTALIZADOR2_ACO.

* Seleciona os depsitos do i_totalizador2_aco


SORT I_TOTALIZADOR2_ACO BY TPTAB
MATNR
CHARG_MSKA.
SORT I_LQUA_ACO_MSKA BY MATNR
CHARG.

V_INDEX = 1.

LOOP AT I_TOTALIZADOR2_ACO.

IF I_TOTALIZADOR2_ACO-TPTAB = 'MSKA'.
* Atribui o ndice da tabela i_totalizador2_aco
V_INDICE = SY-TABIX.

* Acrescenta os dados da mara ao totalizador 2


READ TABLE I_MARA_ACO WITH KEY MATNR = I_TOTALIZADOR2_ACO-MATNR
binary search.
IF SY-SUBRC EQ C_ZERO.

I_TOTALIZADOR2_ACO-MATKL = I_MARA_ACO-MATKL.

I_TOTALIZADOR2_ACO-MTART = I_MARA_ACO-MTART.

ENDIF.

* Se achou dados no sistema de depsito WM


READ TABLE I_T320_ACO_MSKA WITH KEY
WERKS = I_TOTALIZADOR2_ACO-WERKS_MSKA
LGORT = I_TOTALIZADOR2_ACO-LGORT_MSKA.

* Se achou dados no sistema de depsito WM


IF SY-SUBRC EQ C_ZERO.

* Busca o ndice correto para leitura da tabela i_lqua_aco_mska


READ TABLE I_LQUA_ACO_MSKA
WITH KEY MATNR = I_TOTALIZADOR2_ACO-MATNR
CHARG = I_TOTALIZADOR2_ACO-CHARG_MSKA binary search.

188
ABAP Training
IF SY-SUBRC EQ C_ZERO.
V_INDEX = SY-TABIX.
ENDIF.

LOOP AT I_LQUA_ACO_MSKA FROM V_INDEX.

IF I_LQUA_ACO_MSKA-MATNR <> I_TOTALIZADOR2_ACO-MATNR or


I_LQUA_ACO_MSKA-CHARG <> I_TOTALIZADOR2_ACO-CHARG_MSKA.

V_INDEX = SY-TABIX.
EXIT.
ENDIF.

I_TOTALIZADOR2_ACO-LGTYP = I_LQUA_ACO_MSKA-LGTYP.
I_TOTALIZADOR2_ACO-LGPLA = I_LQUA_ACO_MSKA-LGPLA.
I_TOTALIZADOR2_ACO-LGNUM = I_LQUA_ACO_MSKA-LGNUM.

I_TOTAL_FINAL_ACO = I_TOTALIZADOR2_ACO.
APPEND I_TOTAL_FINAL_ACO.
ENDLOOP.
ELSE.
I_TOTAL_FINAL_ACO = I_TOTALIZADOR2_ACO.
APPEND I_TOTAL_FINAL_ACO.

ENDIF. " Se achou dados no sistema de depsito WM


ENDIF. " if i_totalizador2_aco-tptab = 'MSKA'.
ENDLOOP. LOOP AT I_TOTALIZADOR2_ACO.

SORT I_TOTALIZADOR2_ACO BY TPTAB


MATNR
CHARG_MCHB.

SORT I_LQUA_ACO_MCHB BY MATNR


CHARG.

V_INDEX = 1.

*MCHB
LOOP AT I_TOTALIZADOR2_ACO.

IF I_TOTALIZADOR2_ACO-TPTAB <> 'MSKA'.

READ TABLE I_T320_ACO_MCHB WITH KEY


WERKS = I_TOTALIZADOR2_ACO-WERKS_MCHB
LGORT = I_TOTALIZADOR2_ACO-LGORT_MCHB.
* Se achou dados no sistema de depsito WM
IF SY-SUBRC EQ C_ZERO.

* Busca o ndice correto para leitura da tabela i_lqua_aco_mchb


READ TABLE I_LQUA_ACO_MCHB
WITH KEY MATNR = I_TOTALIZADOR2_ACO-MATNR
CHARG = I_TOTALIZADOR2_ACO-CHARG_MCHB binary search.
IF SY-SUBRC EQ C_ZERO.
V_INDEX = SY-TABIX..
ENDIF.

* Busca o sistema de depsito, caso tenha movimento de WM


LOOP AT I_LQUA_ACO_MCHB FROM V_INDEX.
IF I_LQUA_ACO_MCHB-MATNR <> I_TOTALIZADOR2_ACO-MATNR or
I_LQUA_ACO_MCHB-CHARG <> I_TOTALIZADOR2_ACO-CHARG_MCHB.
V_INDEX = SY-TABIX.
EXIT.
ENDIF.

I_TOTALIZADOR2_ACO-LGTYP = I_LQUA_ACO_MCHB-LGTYP.

189
ABAP Training
I_TOTALIZADOR2_ACO-LGPLA = I_LQUA_ACO_MCHB-LGPLA.
I_TOTALIZADOR2_ACO-LGNUM = I_LQUA_ACO_MCHB-LGNUM.
I_TOTAL_FINAL_ACO = I_TOTALIZADOR2_ACO.
APPEND I_TOTAL_FINAL_ACO.
ENDLOOP.
ELSE.
I_TOTAL_FINAL_ACO = I_TOTALIZADOR2_ACO.
APPEND I_TOTAL_FINAL_ACO.

ENDIF.
ENDIF. " if i_totalizador2_aco-tptab <> 'MSKA'.
ENDLOOP. " i_totalizador2_aco

ENDFORM. " F_BUSCA_MATERIAL_ACO

190
ABAP Training

5. BDC Session

ABAP/4 tem uma tcnica de programao para a colocao de dados dentro do SAP
conhecida como Batch Data Communication Session ou BDC Session.

5.1. Passos para criao de uma BDC Session

Identificar as telas que a transao processar


Escrever o programa em ABAP para gerar a tabela de BDC que submeter os
dados na transao
Submeter a tabela de BDC para o sistema em modo batch ou atravs do
comando CALL TRANSACTION

5.2. Identificando telas em uma transao

Quando um usurio entra com dados no SAP utiliza transaes. Cada transao tem
vrias telas identificadas por um nome de programa e um nmero de tela. As
informaes sobre a tela atual obtida atravs no menu System, item Status.

(Tela Status)

Alm de identificar o nome do programa e nmero da tela, deve-se tambm


identicar o(s) campo(s) que se deseja entrar com o dados. Para conseguir saber o
nome da tabela/estrutura e o nome do campo deve-se clicar sobre o campo que
entraria com o dado e teclar <F1> seguido do boto Informaes Tcnicas.

<Tela Informao Tcnica>

Nesta tela consegue-se quase todos os dados para a sesso de BDC. O nome do
programa, o nmero da tela e o nome do campo para a sesso de Batch input.

Alm destes dados deve-se saber quais as teclas/funes de movimentao entres


as telas. Por exemplo, se para passar para a prxima tela da transao deve-se
teclar <Enter>, o cdigo para a BDC /0.

De modo geral, deve-se pensar na transao sem a utilizao do mouse. Se um


boto deve ser clicado pelo mouse deve-se descobrir qual o nome da funo deste
boto e passar este cdigo para a tabela BDC.

191
ABAP Training
5.3. Gerando a tabela BDC

A tabela BDC uma tabela interna com uma estrutura especfica no qual
preenchida para ser enviada para a sesso batch input. Esta estrutura se chama
BDCDATA e tem os seguintes campos:

Campo Tipo Descrio


program Char(40) Nome do programa da transao
dynpro Numc(4) Nmero da tela da transao
dynbegin Char(1) Indicador de uma nova tela
Fnam Char(132 Nome do campo da tela
)
Fval Char(132 Valor a ser colocado no campo
)

Exemplo de uma tabela com estrutura BDCDATA com dados:

program dynpro dynbegin fnam fval


SAPMF02K 0100 X
RF02K- 0010010
LIFNR
RF02K- CNTL
EKORG
SAPMF02K 0200 X

O cdigo em ABAP para isto seria:

REPORT ZXXXXXXX.

DATA: BEGIN OF TBDC OCCURS 100.


INCLUDE STRUCTURE BDCDATA.
DATA: END OF TBDC.

* Incio do programa principal

MOVE SAPMF02K TO TBDC-PROGRAM.


MOVE 0100 TO TBDC-DYNPRO.

192
ABAP Training
MOVE X TO TBDC-DYNBEGIN.
APPEND TBDC.

MOVE RF02K-LIFNR TO TBDC-FNAM.


MOVE 0010010 TO TBDC-FVAL.
APPEND TBDC.

MOVE RF02K-EKORG TO TBDC-FNAM.


MOVE CNTL TO TBDC-FVAL.
APPEND TBDC.

* E assim por diante at que a tabela esteja completa

claro que existir uma repetio muito grande de linhas para a criao de uma
tabela BDC e por isso mesmo deve-se criar forms para agilizar esta movimentao.

Para facilitar o trabalho de mapeamento dos campos, o SAP dispe de uma


ferramenta que faz isso para o programador. a transao SHDB. Essa transao
monitora todos os passos que o usurio faz quando utiliza uma transao e a
resposta do SHDB uma lista com os campos e telas que foram utilizados,
permitindo que o programador crie as tabelas BDC. H ainda um recurso que gera
automaticamente o cdigo do programa para a criao da tabela BDC, facilitando
ainda mais o trabalho, mas a lista j suficiente e s vezes prefervel, para
mantermos os mesmos padres nos cdigos.

193
ABAP Training
Essa transao funciona da seguinte forma:

Na primeira tela, informa-se um nome e a transao para o mapeamento que se


deseja efetuar:

A transao ento chamada. Deve-se fazer o processamento normal nesta


transao. Quando terminar (salvar ou cancelar), o SHDB exibe a seguinte tela, com
a lista dos campos e telas utilizados:

194
ABAP Training

Caso esses dados satisfaam o programador, pode-se salv-los. Para a nova


consulta, deve-se informar na primeira tela o nome com o qual o mapeamento foi
salvo e clicar em sntese. Uma tela aparecer com os mapeamentos
correspondentes (pode-se criar mais de um com o mesmo nome):

Nela, teremos os seguintes botes:

Eles permitem que se crie uma pasta de Batch Input, um programa, dados de teste
e ainda um mdulo de funo, com base no mapeamento feito.

5.4. Enviando uma tabela BDC para o sistema

Como foi citado no incio, existem duas formas de se enviar uma tabela BDC para o
sistema. Via CALL TRANSACTION ou via Batch Input.

195
ABAP Training
5.5. Processando dados com CALL TRANSACTION

O comando CALL TRANSACTION possibilita o processamento de uma tabela BDC


imediatamente pelo sistema. Os dados da tabela BDC so utilizados para executar a
transao e o return code deste comando nos mostra se a transao foi executada
com sucesso ou no.

A sintaxe deste comando :

CALL TRANSACTION trans [USING bdctab MODE mode].


Os modos para executar este comando so:

A Mostra todas as telas


E Mostra apenas telas com erros
N No mostra as telas

Em adio ao return code, podemos utilizar as variveis de sistema para recuperar


a mensagem que o SAP enviou ao trmino do processamento. As variveis mais
utilizadas so: SY-MSGID, SY-MSGV1, SY-MSGV2, SY-MSGV3 e SY-MSGV4.

5.6. Processando dados com BDC_INSERT

A segunda maneira para processar uma sesso de BDC submetendo-a ao sistema


via processamento batch. Com este mtodo, vrias transaes podem ser
executadas pelo SAP mas, ao contrrio do CALL TRANSACTION, estas transaes
no sero executadas imediatamente, sero colocadas em uma pasta de Batch
Input que pode ser executada na transao SM35 ou schedulada para rodar em um
dia e uma hora desejada.

Existem trs mdulos de funes que devem ser executados para este tipo de
processamento.

BDC_OPEN_GROUP
Esta funo abre a sesso de BDC e necessita ser chamada antes de qualquer
processamento.

BDC_INSERT
Esta funo chamada para cada transao no processamento Batch.

BDC_CLOSE_GROUP
Esta funo deve ser chamada aps todo processamento para que a pasta de
processamento Batch seja criada.

196
ABAP Training

Funo BDC_OPEN_GROUP

Os seguintes parmetros so passados para a funo:

CLIENT Cliente do SAP que ser processada a sesso


GROUP Nome para a pasta de Batch input (no precisa ser nico)
HOLDDATE Suspende o processamento da pasta de Batch input at a
data especificada
KEEP Mantem a pasta de Batch Input aps o processamento
USER Nome de usurio que executar o Batch Input.

Funo BDC_INSERT

Os seguintes parmetros so passados para a funo:

TCODE Cdigo da transao na qual ser executada a tabela BDC


DYNPROTAB Nome da tabela interna utilizada para gerar a pasta de
Batch

Funo BDC_CLOSE_GROUP

No existem parmetros a serem passados para esta funo.

197
ABAP Training
5.7. Exemplo

Exemplo 1:

* Envio de dados para a transao FD01 atravs de Batch Input ou Call


* Transaction (a escolha do usurio).
* Ao final do programa um relatrio emitido com a tabela de BDC
* feita.
* Ao executar o programa escolha a variante criada para que os dados
* sejam preenchidos.
*
* Se algum erro ocorrer na transao/dados via Call Transaction uma
* pasta de erro ser gerada para posterior execuo atravs da transa-
* o SM35.
*
PROGRAM ZZBDCXX1 LINE-SIZE 255
MESSAGE-ID ZZ.

DATA: BEGIN OF T_BDC OCCURS 0.


INCLUDE STRUCTURE BDCDATA.
DATA: END OF T_BDC.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE T1.


PARAMETERS: P_BUKRS LIKE KNB1-BUKRS, "Empresa
P_KTOKD LIKE KNA1-KTOKD, "Grupo de contas
P_NAME1 LIKE KNA1-NAME1, "Nome
P_SORTL LIKE KNA1-SORTL, "Termo de busca
P_ORT01 LIKE KNA1-ORT01, "Cidade
P_LAND1 LIKE KNA1-LAND1, "pas
P_PSTLZ LIKE KNA1-PSTLZ, "Caixa postal
P_LIFNR LIKE KNA1-LIFNR, "Fornecedor
P_AKONT LIKE KNB1-AKONT, "Conta de reconciliao
P_FDGRV LIKE KNB1-FDGRV,
P_VZSKZ LIKE KNB1-VZSKZ,
P_ZTERM LIKE KNB1-ZTERM,
P_TOGRU LIKE KNB1-TOGRU,
P_XZVER AS CHECKBOX DEFAULT 'X',
P_XVERR AS CHECKBOX DEFAULT 'X'.

SELECTION-SCREEN END OF BLOCK B1.

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE T2.


PARAMETERS: P_BATCH RADIOBUTTON GROUP R1, "via Batch input
P_CALL RADIOBUTTON GROUP R1, "via Call Transaction
P_MODE(1) TYPE C DEFAULT 'N'. "modo call transaction
SELECTION-SCREEN END OF BLOCK B2.

198
ABAP Training

INITIALIZATION.
T1 = 'Dados para a sesso BDC'.
T2 = 'Tipo processamento da sesso BDC'.

START-OF-SELECTION.

* Cria os registros na tabela de BDC


PERFORM F_WRITE_RECORDS.

* Envia a sesso BDC


PERFORM F_SUBMIT_BDC.

* Gera um relatrio de auditoria


PERFORM F_WRITE_LOG.

END-OF-SELECTION.

FORM F_WRITE_RECORDS.

* programa SAPMF02D - tela 105


PERFORM F_BDC_SCREEN TABLES T_BDC
USING 'SAPMF02D' '0105'.

PERFORM F_BDC_FIELD TABLES T_BDC:


USING 'RF02D-BUKRS' P_BUKRS,
USING 'RF02D-KTOKD' P_KTOKD,
USING 'BDC_OKCODE' '/0'.

* programa SAPMF02D - tela 110


PERFORM F_BDC_SCREEN TABLES T_BDC
USING 'SAPMF02D' '0110'.

PERFORM F_BDC_FIELD TABLES T_BDC:


USING 'KNA1-NAME1' P_NAME1,
USING 'KNA1-SORTL' P_SORTL,
USING 'KNA1-SPRAS' SY-LANGU,
USING 'KNA1-PSTLZ' P_PSTLZ,
USING 'KNA1-ORT01' P_ORT01,
USING 'KNA1-LAND1' P_LAND1,
USING 'BDC_OKCODE' '/0'.

* programa SAPMF02D - tela 120


PERFORM F_BDC_SCREEN TABLES T_BDC
USING 'SAPMF02D' '0120'.

199
ABAP Training
PERFORM F_BDC_FIELD TABLES T_BDC:
USING 'KNA1-LIFNR' P_LIFNR,
USING 'BDC_OKCODE' '/0'.

* programa SAPMF02D - tela 130


PERFORM F_BDC_SCREEN TABLES T_BDC
USING 'SAPMF02D' '0130'.

PERFORM F_BDC_FIELD TABLES T_BDC:


USING 'BDC_OKCODE' '/0'.

* programa SAPMF02D - tela 210


PERFORM F_BDC_SCREEN TABLES T_BDC
USING 'SAPMF02D' '0210'.

PERFORM F_BDC_FIELD TABLES T_BDC:


USING 'KNB1-AKONT' P_AKONT,
USING 'KNB1-FDGRV' P_FDGRV,
USING 'KNB1-VZSKZ' P_VZSKZ,
USING 'BDC_OKCODE' '/0'.

* programa SAPMF02D - tela 215


PERFORM F_BDC_SCREEN TABLES T_BDC
USING 'SAPMF02D' '0215'.

PERFORM F_BDC_FIELD TABLES T_BDC:


USING 'KNB1-ZTERM' P_ZTERM,
USING 'KNB1-TOGRU' P_TOGRU,
USING 'KNB1-XZVER' P_XZVER,
USING 'KNB1-XVERR' P_XVERR,
USING 'BDC_OKCODE' '/11'.

ENDFORM.

FORM F_SUBMIT_BDC.

* Verificao do tipo de processamento


IF P_BATCH EQ 'X'.

* "Abre a pasta de Batch Input


CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT
GROUP = 'FD01-EX01'
KEEP = 'X'
USER = SY-UNAME.

* Insere a tabela de BDC na pasta

200
ABAP Training
CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = 'FD01'
TABLES
DYNPROTAB = T_BDC.

IF SY-SUBRC NE 0.
MESSAGE E000 WITH 'Erro na funo BDC_INSERT'.
ENDIF.

* Fecha a pasta de batch Input


CALL FUNCTION 'BDC_CLOSE_GROUP'.

ELSE.

* Chama o mtodo CALL TRANSACTION para inserir os dados


CALL TRANSACTION 'FD01' USING T_BDC
MODE P_MODE
UPDATE 'S'.

IF SY-SUBRC NE 0.
IF P_MODE NE 'N'.
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT
GROUP = 'FD01-ERR01'
KEEP = 'X'
USER = SY-UNAME.

* Insere a tabela de BDC na pasta


CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = 'FD01'
TABLES
DYNPROTAB = T_BDC.
* Fecha a pasta de batch Input
CALL FUNCTION 'BDC_CLOSE_GROUP'.
ENDIF.

MESSAGE E000 WITH 'Erro no CALL TRANSACTION'.


ENDIF.
ENDIF.

ENDFORM.

FORM F_BDC_SCREEN TABLES P_BDC STRUCTURE BDCDATA


USING P_PROGRAM P_SCREEN.

201
ABAP Training
CLEAR P_BDC.

MOVE: P_PROGRAM TO P_BDC-PROGRAM,


P_SCREEN TO P_BDC-DYNPRO,
'X' TO P_BDC-DYNBEGIN.

APPEND P_BDC.

ENDFORM.

FORM F_BDC_FIELD TABLES P_BDC STRUCTURE BDCDATA


USING P_NAME P_VALUE.

CASE P_VALUE.
WHEN SPACE.

WHEN OTHERS.
CLEAR P_BDC.

MOVE: P_NAME TO P_BDC-FNAM,


P_VALUE TO P_BDC-FVAL.

APPEND P_BDC.

ENDCASE.

ENDFORM.

FORM F_WRITE_LOG.

ULINE.
WRITE: /01 '| Program | Dynpro | Dynbegin | Field Name | Value',
255 '|'.
ULINE.

LOOP AT T_BDC.

WRITE: /01 '|', T_BDC-PROGRAM, '|'.


IF T_BDC-DYNPRO NE '0000'.
WRITE: 15 T_BDC-DYNPRO, ' |'.
ELSE.
WRITE: 15 ' ', ' |'.
ENDIF.

WRITE: 28 T_BDC-DYNBEGIN,
32 '|', T_BDC-FNAM,

202
ABAP Training
46 '|', T_BDC-FVAL,
255 '|'.

ENDLOOP.

IF SY-SUBRC NE 0.
MESSAGE E000 WITH 'Nenhum registro foi gravado na tabela de BDC'.
ENDIF.

ULINE.

ENDFORM.

203
ABAP Training

5.8. Exerccios
* Exerccio proposto:
* Desenvolver um programa em ABAP que envie dados para a transao FS01
* atravs de CALL TRANSACTION ou BATCH INPUT de acordo com o desejado
* pelo usurio seguinto o seguinte mapeamento da transao:
*
* Programa Tela Incio Campo Valor
* SAPMF02H 0402 X
* RF02H-SAKNR '41XXCC'
* RF02H-BUKRS 'AC25'
* BDC_OKCODE '/0'
* SAPMF02H 0310 X
* SKAT-TXT20 '41XXCC - TESTE CC'
* SKA1-GVTYP 'X '
* SKA1-KTOKS '04'
* BDC_OKCODE '/0'
* SAPMF02H 0110 X
* SKB1-WAERS 'BRL '
* SKB1-MWSKZ 'A0'
* SKB1-FSTAG 'AC25'
* BDC_OKCODE '/11'
*
* Onde: XX o nmero de sua estao
* CC o contador da quantidade de contas includas
*
* Ao final do processamento deve ser feito um relatrio de auditoria
* com o nome dos campos e respectivos valores
*
* Como opo, pode-se criar um boto para fazer um download deste
* relatrio para o HD Local ou para o diretrio /tmp/ do servidor
* UNIX
*
* 2a. parte:
* Rodar o programa em modo CALL TRANSACTION e se algum erro ocorrer
* com a transao/dados, colocar os registros errados um uma pasta
* de batch input para que possa rodar o processo novamente sem perder
* os dados. Forar o erro.

* Resoluo:
PROGRAM ZZBDCXX2 LINE-SIZE 255
MESSAGE-ID ZZ.

204
ABAP Training

DATA: BEGIN OF T_BDC OCCURS 0.


INCLUDE STRUCTURE BDCDATA.
DATA: END OF T_BDC.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE T1.


PARAMETERS: P_BUKRS LIKE RF02H-BUKRS,
P_SAKNR LIKE RF02H-SAKNR,
P_TXT20 LIKE SKAT-TXT20,
P_GVTYP LIKE SKA1-GVTYP,
P_KTOKS LIKE SKA1-KTOKS,
P_WAERS LIKE SKB1-WAERS,
P_MWSKZ LIKE SKB1-MWSKZ,
P_FSTAG LIKE SKB1-FSTAG.
SELECTION-SCREEN END OF BLOCK B1.

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE T2.


PARAMETERS: P_BATCH RADIOBUTTON GROUP R1, "via Batch input
P_CALL RADIOBUTTON GROUP R1. "via Call Transaction
SELECTION-SCREEN END OF BLOCK B2.

INITIALIZATION.
T1 = 'Dados para a sesso BDC'.
T2 = 'Tipo processamento da sesso BDC'.

START-OF-SELECTION.

* Cria os registros na tabela de BDC


PERFORM F_WRITE_RECORDS.

* Envia a sesso BDC


PERFORM F_SUBMIT_BDC.

* Gera um relatrio de auditoria


PERFORM F_WRITE_LOG.

END-OF-SELECTION.

FORM F_WRITE_RECORDS.

* programa SAPMF02H - tela 402


PERFORM F_BDC_SCREEN TABLES T_BDC
USING 'SAPMF02H' '0402'.

PERFORM F_BDC_FIELD TABLES T_BDC:


USING 'RF02H-BUKRS' P_BUKRS,

205
ABAP Training
USING 'RF02H-SAKNR' P_SAKNR,
USING 'BDC_OKCODE' '/0'.

* programa SAPMF02H - tela 310


PERFORM F_BDC_SCREEN TABLES T_BDC
USING 'SAPMF02H' '0310'.

PERFORM F_BDC_FIELD TABLES T_BDC:


USING 'SKAT-TXT20' P_TXT20,
USING 'SKA1-GVTYP' P_GVTYP,
USING 'SKA1-KTOKS' P_KTOKS,
USING 'BDC_OKCODE' '/0'.

* programa SAPMF02H - tela 110


PERFORM F_BDC_SCREEN TABLES T_BDC
USING 'SAPMF02H' '0110'.

PERFORM F_BDC_FIELD TABLES T_BDC:


USING 'SKB1-WAERS' P_WAERS,
USING 'SKB1-MWSKZ' P_MWSKZ,
USING 'SKB1-FSTAG' P_FSTAG,
USING 'BDC_OKCODE' '/11'.

ENDFORM.

FORM F_SUBMIT_BDC.

* Verificao do tipo de processamento


IF P_BATCH EQ 'X'.
* "Abre a pasta de Batch Input
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT
GROUP = 'FS01-RESOL'
KEEP = 'X'
USER = SY-UNAME.
* Insere a tabela de BDC na pasta
CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = 'FS01'
TABLES
DYNPROTAB = T_BDC.

IF SY-SUBRC NE 0.
MESSAGE E000 WITH 'Erro na funo BDC_INSERT'.
ENDIF.

206
ABAP Training
* Fecha a pasta de batch Input
CALL FUNCTION 'BDC_CLOSE_GROUP'.

ELSE.

* Chama o mtodo CALL TRANSACTION para inserir os dados


CALL TRANSACTION 'FS01' USING T_BDC
MODE 'A'
UPDATE 'S'.

IF SY-SUBRC NE 0.
MESSAGE E000 WITH 'Erro no CALL TRANSACTION'.
ENDIF.
ENDIF.

ENDFORM.

FORM F_BDC_SCREEN TABLES P_BDC STRUCTURE BDCDATA


USING P_PROGRAM P_SCREEN.

CLEAR P_BDC.

MOVE: P_PROGRAM TO P_BDC-PROGRAM,


P_SCREEN TO P_BDC-DYNPRO,
'X' TO P_BDC-DYNBEGIN.

APPEND P_BDC.

ENDFORM.

FORM F_BDC_FIELD TABLES P_BDC STRUCTURE BDCDATA


USING P_NAME P_VALUE.

CASE P_VALUE.
WHEN SPACE.
WHEN OTHERS.
CLEAR P_BDC.

MOVE: P_NAME TO P_BDC-FNAM,


P_VALUE TO P_BDC-FVAL.

APPEND P_BDC.

ENDCASE.

ENDFORM.

207
ABAP Training
FORM F_WRITE_LOG.

ULINE.
WRITE: /01 '| Program | Dynpro | Dynbegin | Field Name | Value',
255 '|'.
ULINE.

LOOP AT T_BDC.

WRITE: /01 '|', T_BDC-PROGRAM, '|'.


IF T_BDC-DYNPRO NE '0000'.
WRITE: 15 T_BDC-DYNPRO, ' |'.
ELSE.
WRITE: 15 ' ', ' |'.
ENDIF.
WRITE: 28 T_BDC-DYNBEGIN,
32 '|', T_BDC-FNAM,
46 '|', T_BDC-FVAL,
255 '|'.

ENDLOOP.

IF SY-SUBRC NE 0.
MESSAGE E000 WITH 'Nenhum registro foi gravado na tabela de BDC'.
ENDIF.

ULINE.

ENDFORM.

Criar um programa que leia um arquivo e crie ordens de venda para os


clientes de acordo com as especificaes no arquivo.
A transao para criao de ordem de venda a VA01.

Para se criar uma ordem de venda, deve-se seguir o seguinte fluxo:

Chamar a transao VA01.

Na primeira tela:
preencher Tipo da Ordem
<ENTER>

Na segunda tela:
preencher Emissor da Ordem
preencher Recebedor da Mercadoria
preencher Data do documento do Faturamento
preencher Material

208
ABAP Training
preencher Quantidade Prevista
<SALVAR>
<VOLTAR>

O arquivo est no seguinte formato:

Tipo da Ordem
Emissor da Ordem
Recebedor da Mercadoria
Material
Quantidade Prevista

OBS: Os campos esto separados por ponto-e-vrgula (;)


Preencher a data do documento com a data de hj.

ARQUIVO

VEF;15;15;10010;1
VEF;14;14;10011;1
VEF;13;13;10001;3
VEF;15;14;10001;5

209
ABAP Training

Resoluo:
************************************************************************
* *
* ******************************************** *
* * Confidencial e Proprietrio * *
* * Copyright 2001, Accenture * *
* * Todos os direitos reservados * *
* ******************************************** *
* *
* Nome do Shell: Z_TEMPLATE_REPORT Verso do Shell: v1.03 *
* *
************************************************************************
* Nome do Programa : Z_TEMPLATE_REPORT *
* Ttulo do Programa : Z_EXC_BDC01_AL14_D *
* Programador : Aluno do curso de ABAP *
* Data : 02/04/2001 *
* ltima atualizao : 02/04/2001 *
* *
* Descrio : Este um programa para importar dados de um arquivo *
* e criar ordens de venda no SAP, atravs da transao *
* VA01 *
* Include : *
* *
* Calls : VA01 *
* *
* Mdulos de Funes: *
* *
*----------------------------------------------------------------------*
* Lista de Modificaes: *
* Data Autor Corr. # Descrio *
* 02/04/2001 ABAPDEV1 AFIK900013 Desenvolvimento inicial do prg *
* *
************************************************************************
report Z_EXC_BDC01_AL14_D
no standard page heading "No mostra o cabealho padro SAP
line-size 170 "Largura do report de 170 caracteres
line-count 58 "Comprimento do report de 58 caracteres
message-id zabap. "Classe de mensagens ZABAP

*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>"
* " SESSO DE DECLARAO DE DADOS "
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>"
************************************************************************
* Includes *
************************************************************************

************************************************************************
* Tabelas *
************************************************************************

210
ABAP Training

************************************************************************
* Dados: *
* Constantes (C_...) *
* Variaveis (V_...) *
* Tabelas Internas (I_...) *
************************************************************************
*- Constantes ---------------------------------------------------------*
*DATA:
* C_..

*- Variveis ---------------------------------------------------------*
*DATA:
* v_..

** Variavel Com Data do Sistema Concatenada


data: v_data(8) type n.

* atribui a data do sistema varivel no formato ddmmaaaa


concatenate sy-datum+6(2) sy-datum+4(2) sy-datum+(4) into v_data.
*- Tabela Interna -----------------------------------------------------*

** Tabela com unico campo para receber arquivo com delimitador ';'
DATA: BEGIN OF i_reg OCCURS 100,
lreg(200) type c .
DATA: END OF I_reg.

** Tabela com campos provenientes do arquivo texto .

data: begin of i_parm OCCURS 100,


auart like vbak-auart ,
kunnr like vbak-kunnr ,
kunnra like kuwev-kunnr ,
mabnr like rv45a-mabnr ,
zmeng(16) type c.
data: end of i_parm.

* Tabela com os dados do BDC


data: bdcdata like bdcdata occurs 100 with header line.

************************************************************************
* Parmetros de entrada : *
* Select Options (S_...) *
* Parameters (P_...) *
************************************************************************

selection-screen begin of block b1 with frame title t1.


parameter: p_arq1 like rlgrap-filename . "** Nome do Arquivo
selection-screen end of block b1.

"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>"
" SESSO DE PROCESSAMENTO "

211
ABAP Training
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>"
*----------------------------------------------------------------------*
initialization. "Logica para defaults "inteligentes"
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
t1 = 'Interface Ordem Vendas'.

*----------------------------------------------------------------------*
at selection-screen. "Tratamento de Erros e lgica para tela de seleo
*----------------------------------------------------------------------*
at selection-screen on value-request for p_arq1.
perform f_selec_arqdos using p_arq1.

*----------------------------------------------------------------------*
start-of-selection. "Processamento principal
*----------------------------------------------------------------------*
perform f_select_data.
perform f_gerabdc.

*----------------------------------------------------------------------*
end-of-selection. "Fim do processamento principal
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
top-of-page. "Cabealho (Aparece sempre no topo da tela.)
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
end-of-page. "Rodap
*----------------------------------------------------------------------*

"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>"
" SESSO DE FORMS "
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>"

*&---------------------------------------------------------------------*
*& Form F_SELECT_DATA
*&---------------------------------------------------------------------*
* Seleciona dados e armazena-os na tabela interna *
*----------------------------------------------------------------------*
form f_select_data.

* Upload do arquivo texto .

CALL FUNCTION 'WS_UPLOAD'


EXPORTING
FILENAME = p_arq1
FILETYPE = 'ASC'
TABLES

212
ABAP Training
DATA_TAB = i_reg
EXCEPTIONS
CONVERSION_ERROR =1
FILE_OPEN_ERROR =2
FILE_READ_ERROR =3
INVALID_TYPE =4
NO_BATCH =5
UNKNOWN_ERROR =6
INVALID_TABLE_WIDTH =7
GUI_REFUSE_FILETRANSFER =8
CUSTOMER_ERROR =9
OTHERS = 10.

IF SY-SUBRC <> 0.
MESSAGE e005.
ENDIF.

** Cria tabela interna com campos separados .


loop at i_reg.

split i_reg at ';' into i_parm-auart


i_parm-kunnr
i_parm-kunnra
i_parm-mabnr
i_parm-zmeng.

append i_parm.

endloop.

endform. " F_SELECT_DATA

*&---------------------------------------------------------------------*
*& Form F_geraBDC
*&---------------------------------------------------------------------*
* Gera Registros no BDC *
*----------------------------------------------------------------------*
form f_gerabdc.

** Atualiza tabela DBCDATA com dados da tabela interna


loop at i_parm .

perform bdc_dynpro using 'SAPMV45A' '0101'.


perform bdc_field using 'BDC_CURSOR'
'VBAK-AUART'.
perform bdc_field using 'BDC_OKCODE'
'=ENT2'.
perform bdc_field using 'VBAK-AUART'
i_parm-AUART.
perform bdc_dynpro using 'SAPMV45A' '4001'.
perform bdc_field using 'BDC_OKCODE'
'SICH'.

213
ABAP Training
perform bdc_field using 'KUAGV-KUNNR'
i_parm-KUNNR.
perform bdc_field using 'KUWEV-KUNNR'
i_parm-KUNNRa.
perform bdc_field using 'RV45A-MABNR(01)'
i_parm-MABNR.
perform bdc_field using 'VBAP-ZMENG(01)'
i_parm-ZMENG.
perform bdc_field using 'VBKD-FKDAT'
v_data.

** Chama Funcao para gerar ordem de vendas

call transaction c_transacao using bdcdata


mode c_mode
update c_update.

** Limpa dados da ordem gerada


clear bdcdata.
refresh bdcdata.

endloop .

endform. " F_GERABDC

*----------------------------------------------------------------------*
* Start new screen *
*----------------------------------------------------------------------*
form bdc_dynpro using program dynpro.
clear bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
append bdcdata.
endform.

*----------------------------------------------------------------------*
* Insert field *
*----------------------------------------------------------------------*
form bdc_field using fnam fval.
if fval <> ''.
clear bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
append bdcdata.
endif.
endform.

*----------------------------------------------------------------------*
* FORM F_SELEC_ARQDOS *
*----------------------------------------------------------------------*
* Permite seleo de arquivo no DOS. *
*----------------------------------------------------------------------*

214
ABAP Training
form f_selec_arqdos using p_arq1 like rlgrap-filename.

* Captura o arquivo de entrada via DOS.


call function 'WS_FILENAME_GET'
exporting
def_filename =''
def_path = 'C:\'
mask = ',Textos,*.txt,doc,*.doc,Todos,*.*.'
importing
filename = p_arq1
exceptions
inv_winsys =1
no_batch =2
selection_cancel = 3
selection_error = 4
others =5
.

endform. "Fim do 'Form f_selec_arqdos'

215
ABAP Training

6. OnLine

6.1. Introduo:
Online so tipos de programas que, como o prprio nome indica, funcionam online,
ou seja, instantaneamente. Por isso, eles so dotados de uma maior capacidade de
customizao das telas e maior flexibilidade para criarem uma interface mais
amigvel com o usurio.
Eles so especialmente teis na criao de aplicaes que necessitem de subtelas
ou quando necessrio fornecer informaes aos usurios de outra maneira que
no um relatrio. Na maioria dos casos, os programas standard funcionam assim.

6.2. Estrutura do Programa OnLine

Mdulos PAI tela


Screen 1 1

Mdulos PBO tela


1

GUI-01

Mdulos PAI tela


Programa
Principal Screen 2 2

Mdulos PBO tela


2

GUI-02

Mdulos PAI tela


Screen 3 3

Mdulos PBO tela


3 216
ABAP Training
6.3. Programa Principal

Definio de Variveis e Tabelas

DATA:
V_CAMPO(4) type c.

* Declarao de Tabelas
TABLES:
VBAK,
MARA.

Cdigo ABAP dos mdulos PBO e PAI


*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* Mdulo PBO *
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'TELA100'.
SET TITLEBAR 'Z10'.
ENDMODULE. " STATUS_0100 OUTPUT
*&-------------------------------------------
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* Mdulo PAI *
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
CASE SY-UCOMM.
WHEN 'EXIT'.
SET SCREEN 0.
LEAVE SCREEN.
ENDCASE.
ENDIF.
ENDMODULE. " USER_COMMAND_0100 INPUT

6.4. Screen

- Desenho da Tela (Definio dos Campos)


- Lista de campos para tratamento de erros
- Definio dos mdulos PBO e PAI relacionados com a tela

6.5. GUI Status e GUI Title

Definio dos comandos de boto e menus disponveis:

- Definio do ttulo de tela

217
ABAP Training
- Habilitao dos comandos standards existentes
- Criao de novos comandos necessrios

6.6. Evento PBO

Evento executado antes da exibio da tela para o usurio:

- Definio do GUI Status e GUI Title para a tela correspondente


- Seleo inicial de dados e atribuio de valores a serem exibidos na tela

*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* Mdulo PBO *
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'TELA100'.
SET TITLEBAR 'Z10'.
ENDMODULE. " STATUS_0100 OUTPUT

6.7. Evento PAI

Evento executado aps um comando do usurio (enter, click de um boto,


etc...)

- Verificao do cdigo de comando executado (definido no GUI Status)


- Cdigo ABAP para execuo da lgica do comando

*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* Mdulo PAI *
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
CASE SY-UCOMM.
WHEN 'EXIT'.
SET SCREEN 0.
LEAVE SCREEN.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT

218
ABAP Training
Atividade
Criar um programa online para dar manuteno na tabela de dados adicionais de
nota de crdito criada no curso de Dicionrio de Dados.
Criao do programa.
Entrar na transao SE80.
Colocar um nome para o programa (ZSOAXXX) e clicar em exibir. Escolher
SIM na tela Create Program.
Deixar o flag de top include e clicar avanar
Colocar um ttulo (Dados adicionais para nota de crdito), Tipo ( 1 Online)
e application ( * - Nenhuma aplicao especfica)
Clicar em Gravar.
Informar a classe de desenvolvimento ZTRN e clicar em Gravar
novamente.
Selecionar a Request Correta e clicar Enter.
Clicar em Voltar (O programa foi criado sem nenhum objeto)
Layout das telas do programa
Menu Objeto de desenvolvimento -> Criar ou F5
Selecionar Tela , colocar o nmero da tela (por exemplo: 9000) e Clicar em
Criar novamente
Colocar um ttulo para a tela (por exemplo: Tela de Seleo do documento) e
clicar Gravar
Utilizar a mesma change request utilizada na criao do programa e clicar
Enter.
Clicar em Voltar ( A nova tela aparece como objeto do programa)
Expandir o tem Screen e dar um duplo clique na tela criada (9000).
Clicar no boto LAYOUT para desenhar o layout da tela como abaixo:

219
ABAP Training

Repetir os passos acima para criar uma segunda tela (9100 Dados
adicionais para nota de crdito) com o seguinte layout associando aos
respectivos campos na tabela.

220
ABAP Training
6.8. Criao de menu
Na tela do Object Browser selecionar Objeto de Desenvolvimento -> Criar ou
F5.
Selecionar Status GUI e colocar o nome MAIN para o menu e clicar em
criar novamente.
Colocar uma descrio: Menu Principal e clicar em Continuar
Colocar botes para Enter, Voltar, Sair, Criar, Modificar e Exibir como abaixo:

Obs: Este identificadores criados para os botes sero utilizados no programa para
identificar os eventos do usurio.

Criar o menu Documento como abaixo e Salvar

221
ABAP Training

Definir os atributos de cada funo dando um duplo clique sobre ele. Por exemplo
para a funo Criar preencher a tela como segue.

222
ABAP Training
Repetir o processo para criar o Status GUI DETAIL

6.9. Definindo ttulo para a tela.


Clicar em criar na tela do Objet Browser.
Escolher Ttulo GUI e colocar o nome 9000 ( Este ttulo ser utilizado na
tela 9000)

Escolher Gravar
Repetir o processo para criar o ttulo 9100 Dados adicionais para nota de
crdito.

6.10. Associar menus e ttulos s telas


No Object Browser, duplo clique na tela 9000
Clicar em modificar e retirar o smbolo de comentrio (*) do module
status_9000.
Duplo clique sobre o modulo Status_9000. Uma tela se abre para que voce
confirme a criao do mdulo. Clique em SIM e Avanar
Tirar os comentrios dos comandos SET e informar o menu e o ttulo da tela
como segue:

SET PF-STATUS 'MAIN'.


SET TITLEBAR '9000'.
Repetir o processo para a tela 9100 como segue:
SET PF-STATUS 'DETAIL'.
SET TITLEBAR '9100.

6.11. Criao de uma transao para o programa


Clicar em Criar no Object Browser
Selecionar Transao , colocar um nome (ZSXX) e clicar em Criar.
Na tela Create transaction escolher continuar.
Preencher descrio, programa e tela como segue:

223
ABAP Training

Escolher a change request ( A mesma utilizada na criao do programa) e


precionar ENTER.

6.12. Gerao do programa


No Object Broswser clicar sobre o programa e selecionar Objeto Desenvolvimento
Gerar/Ativar.

Obs: Neste ponto j possvel executar o programa atravs da transao criada.


Definio de Variveis Globais

Clicar em Criar
Escolher Campo Global
Clicar em Criar e declarar os seguintes dados:

data: ok_code(4). "Cdigo de retorno.

tables: zs008. "Tabela de dados adicionais de nota de


crdito

OBS: O seguinte comando deve tambm estar na sesso de declarao do


programa

report ZBRDC message-id za.

224
ABAP Training

6.13. Definio do fluxo do programa (PAI e PBO)

Primeiramente deve-se criar uma varivel para armazenar o cdigo de


retorno do usurio.
Data: OK_CODE(4). Cdigo de retorno do usurio

Duplo clique na tela 9000 e clicar em Lista de Campos e colocar varivel


OK_CODE como segue:

Salvar e voltar.
Retire o comentrio do mdulo user_command_9000.
Duplo clique sobre o mdulo user_command_9000 e colocar o seguinte
cdigo:
Duplo clique na tela 9000 e retire o comentrio do mdulo
user_command_9000.

case ok_code.
when 'ENTE'.
when 'BACK'.
leave program.
when 'LEAV'.
leave program.
when 'CRIA'.

225
ABAP Training
leave to screen '9100'.
when 'MODI'.
when 'VISI'.
when others.
Leave program.
endcase.

Repetir o processo acima para a tela 9100 colocando o seguinte cdigo no


mdulo user_command_9100.

case ok_code.
when 'ENTE'.
when 'BACK'.
leave to screen '9000'.
when 'LEAV'.
leave program.
when 'SAVE'.
insert zs008.
if sy-subrc = 0.
message i003.
else.
message e004.
endif.
when others.
leave program.
endcase.

Utilizando os conceitos vistos at agora, faa o cdigo para os botes


Modificar e Visualizar.

226
ABAP Training

6.14. Criao de Tabstrips

Para criar uma nova tela para um programa

Siga o caminho no menu Tools->ABAP Workbench, click no boto Screen


Painter.
Preencha o nmero da tela a ser criada bem como o programa associado
Preencha os atributos para a nova tela e ento salve o editor de tela
Click em Full Screen para chamar o editor do Screen Painter

Para determinar as bordas dos Tabstrips:


Click no cone Tabstrip na barra de ferramentas
Defina a area do tabstrip na tela clicando e arrastando sobre a tela.
Especifique o nome do campo para o novo elemento da tela. Esse nome
(Field Name) o mesmo que voc deve utilizar nos controle de ABAP.

Defina os ttulos das TABs

Por default, ao novo Tabstrip contm 2 ttulos (Tab1 e Tab2). Quando voc der um
duplo click no ttulo da TAB, uma tela de atributos se abrir. Para cada ttulo da TAB,
preencher os campos:
field name,
field text,

227
ABAP Training
function code.
Definir a rea da subtela
Cada Tab deve estar alocado em uma rea de uma subtela (subscreen).
Voc consegue fazer isso da seguinte maneira:
Selecione um mais tabs
Clique no cone da subtela
Clique e arraste para definir uma area de subtela.
( Nota: Voc tambm pode alocar uma subtela entrando com o nome da
rea da subtela no campo de referncia da tela de atributos).

Lgica do Fluxo do programa (Flow Logic)

Para cada tela que voc cria, voc pode definir uma lgica de fluxo. A lgica
dividida em duas sesses conhecidas como enventos. Os eventos so dos tipos:
PBO (Process Before Output) Evento de uma tela que processado antes da
tela ser exibida
PAI (Process After Input) Evento de uma tela a ser processado depois que o
usurio fizer alguma ao (ie. pressionando um boto de funo,
pressionando a tecla <ENTER> ou clicando-se um boto).

No ambiente de processamento, existem dois processadores que cuidam do cdigo,


o processador OnLINE e o processador ABAP. O processador Online cuida do fluxo do
programa Online (executa a lgica de fluxo). O processador ABAP controla o
componente ABAP de um programa Online (executa o mdulo).

228
ABAP Training

O controle passado ida e volta entre os dois processadores at que o usurio


termine a execuo do programa. O controle se inicia no processador Online e
passado ao processador ABAP assim que um modulo chamado. Aps o trmino do
modulo, o controle devolvido ao processador Online at que outro evento ocorra.

229
ABAP Training
A seguir, esto a lgica, a explicao e telas de exemplo.

Controlado pelo processador Online Controlado pelo processador ABAP

Screen Painter Main Program


Flow Logic Main PROGRAM ZABAP40TRN_TABSTRIP.

Screen TABLES: SFLIGHT.

PROCESS BEFORE OUTPUT. CONTROLS: MYTABSTRIP TYPE TABSTRIP.


MODULE SET_PAGE.
CALL SUBSCREEN SUB1 INCLUDING DATA: MODUL LIKE SY-REPID VALUE
MODUL DYNNBR.
'ZABAP40TRN_TABSTRIP_DYNAMIC',
1

PROCESS AFTER INPUT. DYNNBR LIKE SY-DYNNR,


CALL SUBSCREEN SUB1. OK_CODE LIKE SY-UCOMM.
MODULE USER_COMMAND.

Screen Painter *-------------------------------------------


MODULE SET_PAGE OUTPUT.
Flow Logic IF DYNNBR IS INITIAL.
DYNNBR = '0101'.
Field Tab MYTABSTRIP-ACTIVETAB = 'F2'.
PROCESS BEFORE OUTPUT. ENDIF.

PROCESS AFTER INPUT. ENDMODULE. " SET_PAGE OUTPUT


*--------------------------------------------
MODULE GET_DATA. MODULE USER_COMMAND INPUT.
Screen Painter CASE OK_CODE.
Flow Logic WHEN 'F2'.
DYNNBR = '0101'.
Details Tab MYTABSTRIP-ACTIVETAB = OK_CODE.
CLEAR OK_CODE.
PROCESS BEFORE OUTPUT. WHEN 'F3'.
DYNNBR = '0102'.
PROCESS AFTER INPUT. MYTABSTRIP-ACTIVETAB = OK_CODE.
CLEAR OK_CODE.
ENDCASE.

ENDMODULE. " USER_COMMAND INPUT


*----------------------------------------------------
MODULE GET_DATA INPUT.
(Dependendo da entrada do usurio)
SELECT PRICE CURRENCY PLANETYPE SEATSMAX
SEATSOCC PAYMENTSUM
INTO CORRESPONDING FIELDS OF SFLIGHT
FROM SFLIGHT
WHERE CARRID = SFLIGHT-CARRID
AND CONNID = SFLIGHT-CONNID
AND FLDATE = SFLIGHT-FLDATE.
ENDSELECT.

ENDMODULE.

230
ABAP Training
Passos do Programa

Process Before Output (PBO)


1. Coloca a Tab de Flight como ativa.
2. Chama a tela SUB1.

Process After Input (PAI)


3. Chama a subtela SUB1 .
4. O commando Case determinar qual tab o usurio selecionou. F2 e F3
so os cdigos de funo das TABs Flight e Detail respectivamente
5. Depois que o usurio entrar com a informao na Tab Flight, o
commando SELECT busca os dados da tabela SFLIGHT .

231
ABAP Training

232
ABAP Training
Criando ajuda de pesquisa (Matchcode)

Para se criar uma ajuda de pesquisa no SAP, utiliza-se a transao SE11.

Nela, deve ser preenchido o nome da ajuda de pesquisa e apertar a tecla


<CRIAR>

Em seguida, deve-se entrar os seguintes campos:

Descrio da ajuda de pesquisa


Mtodo de Seleo (tabela ou viso que contm os dados)
O tipo da ajuda de pesquisa (se ser uma lista tipo dropdown ou uma outra
tela)
Os parmetros que devero constar da ajuda de pesquisa, com os seus
respectivos elementos de dados (OBS: para uma ajuda de pesquisa, necessrio
que um elemento de dados para o parmetro em questo exista).
Preenchimento dos campos PosL e ISel. Estes campos indicam a posio na lista
de acertos da ajuda de pesquisa que os parmetros aparecero e o se eles
devem aparecer na listagem ou no. Em muitos casos, um parmetro serve
apenas para ajudar na seleo de outro e portanto no deve ser exibido.
Devemos informar ainda qual campo sera importado/exportado quando a ajuda
de pesquisa for ativada. Essa informao indicada atravs de 2 boxes junto aos
parmetros de ajuda de pesquisa.

Exemplo:

233
ABAP Training

No exemplo acima, uma ajuda de pesquisa criada para o parmetro CODAL

(cd. do aluno), que ser importado e exportado (lido e devolvido para tela de

seleo aps a escolha do usurio). Para auxiliar o usurio, o nome do aluno

dever aparecer tambm (parmetro NOMEA), porm, ele no ser lido e nem

devolvido para a tela.

Com isso, obtemos uma ajuda de pesquisa da seguinte forma:

234
ABAP Training

235
ABAP Training

6.15. Criando TABLE CONTROL

Uma ferramenta particularmente til quando trabalhamos com programas do tipo


online o chamado Table Control. Ele permite que os dados sejam mostrados e
manipulados na forma de uma tabela (como os programas gerados
automaticamente para manuteno de tabelas).

Para se criar um Table Control, deve-se seguir os seguintes passos:

Criar o Table Control na tela. Primeiro seleciona-se o cone do table control e o


arrasta na tela.
Inserir os campos e os ttulos de cada coluna dentro do Table Control. No
momento que um campo inserido, uma coluna automaticamente criada.
Definir os tipos do campo (se s para exibio ou permite alterao)
Declarar o nome dos campos igual ao nome na tabela i_tab-nome. que conter
os dados a serem exibidos

Declarar o Table Control no include TOP, indicando a tela. Exemplo:


*- Controles ----------------------------------------------------------*

236
ABAP Training
controls:
tcinfo type tableview using screen 2000. "Tabela

No PBO da tela, deve-se dar um loop na tabela contendo os dados para carreg-
los no Table Control. Exemplo:

process before output.

* Definies de Layout de Tela


module status_2000.

* Atualiza o Table Control


loop at i_info with control tcinfo
cursor tcinfo-current_line.
endloop.

No PAI da tela, deve-se dar um loop na tabela para inserir os registros alterados
(caso necessrio). Exemplo:
process after input.

* Comandos de Fim de Processamento


module encerra_processamento_2000 at exit-command.

* Atualiza os Dados da Tabela Interna


loop at i_info.

module m_atualiza_info.
endloop.

* Processamento do Comando do Usurio


module user_command_2000.

*&---------------------------------------------------------------------*
*& Module M_ATUALIZA_INFO INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module m_atualiza_info input.
check not i_info-carac is initial .

* Atualiza dados da tabela.


modify i_info index tcinfo-current_line.
if sy-subrc ne c_sucesso.
append i_info.
endif.

endmodule. " M_ATUALIZA_INFO INPUT

Para se criar o Table Control com o nmero de registros da tabela interna, inserir
o seguinte comando dentro do Module Status do PBO:
* Libera as linhas do Table Control
describe table i_info lines v_lines.
tcinfo-lines = v_lines.

237
ABAP Training

238
ABAP Training
Criando Transaes

Diferentemente dos Reports, que podem ser executados diretamente (apesar de, na
prtica, a criao de transaes ser obrigatria), os programas online tem que
possuir, obrigatoriamente, uma transao.

Para cri-la, utilizamos a transao SE93. Nela, devemos digitar o nome da


transao a ser criada (lembrando sempre os padres de nomenclatura adotados) e
clicar em <CRIAR>.

Em seguida, aparecer uma tela com diversos tipos de transaes a serem criadas,
onde deve-se preencher uma descrio para a transao e selecionar o tipo
adequado. Para Reports, selecionar:

239
ABAP Training
Em seguida, preencher o nome do programa e o nmero da tela que dever ser
chamada e salvar a transao que ela estar criada.

240
ABAP Training
Exerccio

EXERCCIO 1

Criar uma transao ON-LINE para criar uma calculadora no SAP


R/3.

Obs: Nome do programa: Z_EXC_ONLINE_01_AL##, onde ## o


nmero do aluno;
Dica: Utilizar o comando CASE para tratar as condies do
programa;

241
ABAP Training

RESOLUO 1
Os botes foram criados e foram atribudos cdigos de funo a cada um deles.
Desta maneira, podemos tratar no programa cada ao do usurio. O cdigo abaixo
possui uma lgica mais complexa, tratando de situaes desejveis em uma
calculadora, porm, no essenciais. No entanto, o princpio para tudo o mesmo,
para cada ao do usurio, responder de uma maneira especfica.

Cdigo da Tela:

242
ABAP Training

process before output.


module status_0100.

process after input.


module user_command_0100.

PBO:

*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* customiza a o menu da tela a ser exibida
*----------------------------------------------------------------------*
module status_0100 output.
set pf-status 'RESULTADO'. customiza o menu
set titlebar 'RESULTADO'. customiza o ttulo

endmodule. " STATUS_0100 OUTPUT

PAI:

*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* processa os comandos do usurio
*----------------------------------------------------------------------*
module user_command_0100 input.

case sy-ucomm.
when '1'.
if v_contador >= 2.
clear v_resultado.
if v_status = '='.
clear v_resultado.
clear v_status.
endif.
endif.
concatenate v_resultado '1' into v_resultado.
when '2'.
if v_contador >= 2.
clear v_resultado.
if v_status = '='.
clear v_resultado.
clear v_status.
endif.
endif.
concatenate v_resultado '2' into v_resultado.
when '3'.
if v_contador >= 2.
clear v_resultado.
if v_status = '='.
clear v_resultado.
clear v_status.
endif.
endif.
concatenate v_resultado '3' into v_resultado.

243
ABAP Training
when '4'.
if v_contador >= 2.
clear v_resultado.
if v_status = '='.
clear v_resultado.
clear v_status.
endif.
endif.
concatenate v_resultado '4' into v_resultado.
when '5'.
if v_contador >= 2.
clear v_resultado.
if v_status = '='.
clear v_resultado.
clear v_status.
endif.
endif.
concatenate v_resultado '5' into v_resultado.
when '6'.
if v_contador >= 2.
clear v_resultado.
if v_status = '='.
clear v_resultado.
clear v_status.
endif.
endif.
concatenate v_resultado '6' into v_resultado.
when '7'.
if v_contador >= 2.
clear v_resultado.
if v_status = '='.
clear v_resultado.
clear v_status.
endif.
endif.
concatenate v_resultado '7' into v_resultado.
when '8'.
if v_contador >= 2.
clear v_resultado.
if v_status = '='.
clear v_resultado.
clear v_status.
endif.
endif.
concatenate v_resultado '8' into v_resultado.
when '9'.
if v_contador >= 2.
clear v_resultado.
if v_status = '='.
clear v_resultado.
clear v_status.
endif.
endif.
concatenate v_resultado '9' into v_resultado.
when '0'.
if v_contador >= 2.
clear v_resultado.
if v_status = '='.

244
ABAP Training
clear v_resultado.
clear v_status.
endif.
endif.
concatenate v_resultado '0' into v_resultado.
when ','.
if v_status = '='.
clear v_resultado.
clear v_status.
endif.
concatenate v_resultado '.' into v_resultado.
when 'VOLTAR'.
v_tamanho = strlen( v_resultado ) - 1.
if v_tamanho > 0.
v_resultado = v_resultado(v_tamanho).
else.
clear v_resultado.
endif.
when 'BACK'.
leave program.
when 'CANC'.
leave program.
when 'LIMPA'.
clear v_contador.
clear v_operando_1.
clear v_operando_2.
clear v_resultado.
when '+'.
v_contador = ( v_contador + 1 ).
if v_contador >= 2.
v_resultado = ( v_resultado + v_operando_1 ).
move v_resultado to v_operando_1.
else.
move v_resultado to v_operando_1.
clear v_resultado.
move '+' to v_ult_oper.
endif.
when '-'.
v_contador = ( v_contador + 1 ).
if v_contador >= 2.
v_resultado = ( v_operando_1 - v_resultado ).
move v_resultado to v_operando_1.
else.
move v_resultado to v_operando_1.
clear v_resultado.
move '-' to v_ult_oper.
endif.
when 'A'.
v_contador = ( v_contador + 1 ).
if v_contador >= 2.
v_resultado = ( v_operando_1 / v_resultado ).
move v_resultado to v_operando_1.
else.
move v_resultado to v_operando_1.
clear v_resultado.
move '/' to v_ult_oper.
endif.
when '*'.

245
ABAP Training
v_contador = ( v_contador + 1 ).
if v_contador >= 2.
v_resultado = ( v_resultado * v_operando_1 ).
move v_resultado to v_operando_1.
else.
move v_resultado to v_operando_1.
clear v_resultado.
move '*' to v_ult_oper.
endif.
when 'IGUAL'.
perform calculo.
when others.
endcase.

leave to screen 0100.

endmodule. " USER_COMMAND_0100 INPUT

*&---------------------------------------------------------------------*
*& Form CALCULO
*&---------------------------------------------------------------------*
* realiza o clculo
*----------------------------------------------------------------------*
form calculo.
case sy-ucomm.
when 'IGUAL'.
move '=' to v_status.
if v_ult_oper = '+'.
move v_resultado to v_operando_2.
v_resultado = ( v_operando_1 + v_operando_2 ).
elseif v_ult_oper = '-'.
move v_resultado to v_operando_2.
v_resultado = ( v_operando_1 - v_operando_2 ).
clear v_operando_1.
clear v_operando_2.
elseif v_ult_oper = '/'.
move v_resultado to v_operando_2.
v_resultado = ( v_operando_1 / v_operando_2 ).
clear v_operando_1.
clear v_operando_2.
elseif v_ult_oper = '*'.
move v_resultado to v_operando_2.
v_resultado = ( v_operando_1 * v_operando_2 ).
clear v_operando_1.
clear v_operando_2.
endif.
when others.
endcase.
endform. " CALCULO

246