Você está na página 1de 52

APRENDENDO ABAP no MINISAP – NetWeaver 7.

Tela Inicial

Onde se digitam as transações

Dentro da SE11 marque Database table e coloque o


Criando tabelas nome da tabela que quer criar no campo

ZMARA e a ZMAKT

Transação: SE11 – Dicionário de dados

Clique
em
Create.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 1
Na tela que se abrirá, na “ABA” Delivery and Maintenance preencha:

Descrição da tabela

Display/Maintenanc
Classe de aplicação e Allowed para
permitir a
manutenção da
tabela sem restrição

Na “ABA” Fields repita a Descrição da tabela, e preencha os nomes dos campos como abaixo

O mandante deve
existir como
primeiro campo de
qualquer tabela e
sempre será chave

No campo “Número de Material” coloque o elemento


de dados ZMATNR e dê duplo clique para criá-lo

Clique em Local Object


Clique em Yes
para salvar a
tabela.

Confirme a
criação do
Elemento de Desconsiderar essa telinha,
Dados apenas confirme.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 2
O Elemento de Dados carrega a descrição do campo e do domínio (características).

Coloque a descrição breve

preencha o nome do
domínio a ser criado

Na “ABA” Field Label, coloque as descrições possíveis O preenchimento dos tamanhos


para os campos e clique ENTER é automático

Voltando para “ABA” Data Type dê duplo clique no nome do Domínio

Clique em Yes

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 3
Confirme a
criação do
Elemento de
Clique em Dados
Local Object

Desconsiderar essa telinha,


simplesmente confirme.

Descrição
O Domínio carrega as características do breve
campo, como tamanho e tipo; e neste caso o
tipo como
CHAR e o tamanho 18.

3 passos obrigatórios:

Salvar
Verificar
Inconsistências
Ativar

Somente após esses passos o objeto funciona. Clique em BACK para voltar.
Para salvar o domínio após o clique, marque o popup como objeto local, verifique e ative.
Voltando, salve, verifique e ative também o Elemento de Dados.

Campo Elmto Dd Descrições 1, 2, 3, e, 4 Domínio Tipo Tamanho


Crie os outros
MATNR ZMATNR 1- N. Matnr ZMATNR CHAR 18 elementos de
2- N. Mater. dados e
3- N. do Mater domínios/nse11
4- N. do Material conforme as
ERSDA ZERSDA 1- Criado DATUM DATS 8 especificações e
2- Criado em
3- Data criação da mesma forma
4- Data da criação do que foram criados
material o Elemento de
MTART ZMTART 1- Tp. Material ZMTART CHAR 4 Dados e o
2- Tipo material Domínio do
3- Tipo de Material
4- Tipo de Mateiral MATNR.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 4
Crie também a tabela ZMAKT de acordo com as especificações abaixo.

ZMAKT – Descrição: Textos breves de material


Campo Elmto Dd Descrições 1, 2, 3, e, 4 Domínio Tipo Tamanho
MATNR ZMATNR 1- N. Matnr ZMATNR CHAR 18
2- N. Mater.
3- N. do Mater
4- N. do Material
SPRAS ZSPRAS 1- Idioma CHAR2 CHAR 2
2- Idioma
3- Código do Idioma
4- Código do Idioma do Material
MAKTX ZMAKTX 1- Tx mat TEXT40 CHAR 40
2- Texto material
3- Texto breve material
4- Texto breve de material

Clique Technical Settings


para ativar a tabela.

Clique em Yes

Escolha APPL0 para Classe


de Dados e 0 para Categoria

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 5
Clique em
Salvar e
depois em
Voltar Salvar,
Verificar e
Ativar a tabela

Manutenção das tabelas


- Transação: SE11 –
Dicionário de dados.

Entrar na tabela ativada


Utilities  Table
Maintenace Generator

Preencha essa tela


com “Grupo de
Autorização”
Clique em criar. &NC&, e no
“Grupo de Funções”
coloque o mesmo
nome da tabela.

Marque one step em


“Maintenance type”
e coloque 1 em
“overview screen”.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 6
Para testar a
manutenção de tabela
gerada, vá para a
transação SM30.

Preencha o nome da
tabela no campo
Table/View
(VIEWNAME) e clique
em Maintain (Update).

Para entrar Entre com


com novos os dados
dados do ex. e
salve

Criando uma transação para manutenção de tabela - Transação: SE93 – Criação de transação.

Como a SM30 não é uma transação disponível para o usuário, criar uma transação para a manutenção
da tabela na transação SE93.

Coloque o nome
da transação, no
ex. ZMARA e
clique em
“Create”

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 7
Preencha a
descrição breve,
marque a opção
“Transação com
Parâmetros” e
confirme.

Marque as 3 opções
de interface

Preencha com a
transação SM30
Marque “Pular a
Tela Inicial”
Preencha os campos e os conteúdos da
primeira tela da transação SM30.

No topo da página, clique em Salvar.

Para criar a transação não é necessário ativar,


basta salvar como Objeto Local.
Faça tudo para as duas tabelas
Preencha a tabela ZMAKT com as linhas:

MATNR SPRAS MAKTX


100001 BR CANETA
100002 BR LAPIZ
100003 BR BORRACHA
100005 BR CADERNO

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 8
Criando um REPORT, relatório simples - Transação: SE38 – Editor de programa ABAP

Preencha o nome do
programa clique em
Create, todo objeto
customizado, ou que
não seja Standard
começa com Z.

Preencha o campo
Title com o nome do
relatório, o Type
como “Executable
program” e o Status
como “SAP Standard
Prodution Program”.
Salve como Objeto
Local.
O sistema abrirá o
editor de programa
ABAP; complete o
código como no
modelo abaixo:

*---------------------------------------------------------------------*
* Report ZRELMARA
*
*---------------------------------------------------------------------*
* Autor: Responsável:
* Data: Módulo:
*---------------------------------------------------------------------*
REPORT zrelmara.
*---------------------------------------------------------------------*
* Declaração
*---------------------------------------------------------------------*
* Tabelas transparentes do dicionário de dados que serão usadas no código.
TABLES: zmara,
zmakt.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 9
* Tipos de referências para declarações das tabelas internas.
TYPES: BEGIN OF ty_zmara,
matnr TYPE zmara-matnr,
ersda TYPE zmara-ersda,
mtart TYPE zmara-mtart,
END OF ty_zmara.

TYPES: BEGIN OF ty_zmakt,


matnr TYPE zmakt-matnr,
spras TYPE zmakt-spras,
maktx TYPE zmakt-maktx,
END OF ty_zmakt.

* Tipo de referência que vai receber os dados gerais do relatório.


TYPES: BEGIN OF ty_saida,
matnr TYPE zmara-matnr,
ersda TYPE zmara-ersda,
mtart TYPE zmara-mtart,
spras TYPE zmakt-spras,
maktx TYPE zmakt-maktx,
END OF ty_saida.

* Tabelas Internas que vão receber os dados vindos do banco de dados;


* elas são temporárias e só existem durante o processamento do código.
DATA: ti_zmara TYPE STANDARD TABLE OF ty_zmara,
ti_zmakt TYPE STANDARD TABLE OF ty_zmakt,
ti_saida TYPE STANDARD TABLE OF ty_saida.

* Work áreas são iguais a 1 linha de cada tabela interna referente;


* é na work área que os dados são trabalhados.
DATA: wa_zmara LIKE LINE OF ti_zmara,
wa_zmakt LIKE LINE OF ti_zmakt,
wa_saida LIKE LINE OF ti_saida.

* Variáveis, quando necessário.

* Tela com os parâmetros de entrada que servirão de filtro para a


* busca dos dados do relatório.

* Parâmetro de tela que recebe um único valor


PARAMETERS: p_spras TYPE zmakt-spras.

* Parâmetro de tela que recebe um período `de até' (ranger).


SELECT-OPTIONS: s_matnr FOR zmara-matnr.

*---------------------------------------------------------------------*
* Processamento
*---------------------------------------------------------------------*
* Busca Dados---------------------------
* para organizar o processamento neste bloco utiliza-se forms, com a chamada
* pelo comando perform.
* para criar o form referente basta clicar duas vezes no nome do perform.
* Busca ZMARA - Busca dados da tabela zmara.
PERFORM busca_zmara.

* Busca ZMAKT - Busca dados da tabela zmakt


PERFORM busca_zmakt.

* Processa dados-----------------------
PERFORM processa_dados.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 10
* Saida--------------------------------
PERFORM imprime_saida.

*---------------------------------------------------------------------*
* Subrotinas
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
* Form busca_zbseg
*---------------------------------------------------------------------*
FORM busca_zmara .
* Seleciona os dados matnr ersda mtart
SELECT matnr ersda mtart
* para dentro da tabela interna ti_zmara
INTO TABLE ti_zmara
* vindo da tatela transparente zmara
FROM zmara
* com a condição de acordo com a tela de seleção
WHERE matnr IN s_matnr. " ranger é com 'IN'

* Para testar se houve erro no select.


* Sy-subrc = 0 = ZERO ERRO , retornou pelo menos 1 registro.
* Sy-subrc <> 0 = HOUVE ERRO , não retornou nada
IF sy-subrc <> 0 .
* Se não retornar nada vai dar mensagem de erro.
MESSAGE i000(su) WITH 'DEU ERRO'.
* Pára o processamento e retorna para a tela de parâmetros de entrada
STOP.
ELSE.
* Se a busca não deu erro, a tabela tem algum registro então sorteia.
SORT ti_zmara BY matnr.
ENDIF.

ENDFORM. " busca_zmara


*---------------------------------------------------------------------*
* Form busca_zbxt
*---------------------------------------------------------------------*
FORM busca_zmakt .

* sempre que for fazer um select relacionado com uma tabela transparente
* tem que garantir que isso não será feito com uma tabela vazia.

IF NOT ti_zmara[] IS INITIAL.


* Seleciona os dados matnr spras maktx
SELECT matnr spras maktx
* para dentro da tabela interna ti_zmakt
INTO TABLE ti_zmakt
* vindo da tatela transparente zmakt
FROM zmakt
* para cada entrada da tabela ti_zmara
FOR ALL ENTRIES IN ti_zmara
* com a condição de acordo com a tela de seleção
* e com a tabela de comparação.
WHERE matnr = ti_zmara-matnr
AND spras = p_spras. "Parameters é com =

* Para testar se houve erro no select.


* Sy-subrc = 0 = ZERO ERRO , retornou pelo menos 1 registro.
* Sy-subrc <> 0 = HOUVE ERRO , não retornou nada

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 11
IF sy-subrc = 0 .
* Neste caso pode testar se não houve erro
* e se a tabela foi preenchida então sorteia, indexa.
SORT ti_zmakt BY matnr.
ENDIF.
ENDIF.

ENDFORM. " busca_zmakt


*---------------------------------------------------------------------*
* Form processa_dados
*---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM processa_dados .

* Para preencher a tabela com os dados de saída


* Para cada registro da tabela ti_mara.
LOOP AT ti_zmara INTO wa_zmara.
* move o conteúdo da wa_mara para wa_saida.
wa_saida-matnr = wa_zmara-matnr.
wa_saida-ersda = wa_zmara-ersda.
wa_saida-mtart = wa_zmara-mtart.

* Para carregar com os dados relacionados da ti_makt


* Tem que ler a ti_makt onde o campo chave matnr é o mesmo
* Cláusula Binary Serach faz uma pesquisa binária e mais rápida
READ TABLE ti_zmakt INTO wa_zmakt WITH KEY matnr = wa_zmara BINARY SEARCH.
* Para economizar processamento o valor da ti_zmakt para ti_saida
* só será trasportado se a leitura com o comando read table tiver dado
* resultado.
IF sy-subrc = 0 .
wa_saida-spras = wa_zmakt-spras.
wa_saida-maktx = wa_zmakt-maktx.
ENDIF.
* No final do processamento o valor da wa_saida é movido para ti_saida pelo
* comando APPEND.
APPEND wa_saida TO ti_saida.

ENDLOOP.

ENDFORM. " processa_dados

*---------------------------------------------------------------------*
* Form imprime_saida
*---------------------------------------------------------------------*
FORM imprime_saida .

* Para cada registro da tabela ti_saida


LOOP AT ti_saida INTO wa_saida.
* Imprime cada campo da tabela.

WRITE:/ wa_saida-matnr,
wa_saida-ersda,
wa_saida-mtart,
wa_saida-spras,
wa_saida-maktx.
ENDLOOP.

ENDFORM. " imprime_saida

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 12
Após a finalização do relatório,

Salvar
Verificar
Inconsistências
Ativar
Clicar em Direct Processing (F8)
para rodar o programa.

O resultado será uma tela


de entrada. Preenchendo
com BR e clicando em
executar...

O Relatório é impresso na tela.

Clicando em Voltar, retorna-se


ao código e serão permitidas as
alterações nos nomes dos
campos.

Preencher com a
Clicando em Goto  descrição dos campos,
Text Elements 
Selections Texts. Salvar , Ativar e
Voltar .

O resultado será a tela de


entrada com os nomes
corretos dos campos e não
como apresentados no
código.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 13
Criando uma Função - Transação: SE80 – Objeto de Navegação

Para criar uma função, primeiro cria-se o grupo de função

Clique em Yes

Selecione Function Group ,


coloque o nome do grupo de
função e tecle Enter. Preencha a descrição breve e clique em Save;
como objeto local. O grupo está criado.
Criar a função.

Fazendo uma Função – calculadora simples - Transação: SE37 – Construtor de função ABAP.

Coloque o nome da
função e clique em
Create

Desconsidere esta tela e


Preencha o grupo de função e confirme.
a descrição breve e Salve.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 14
Uma função IMPORTA parâmetros (variáveis, works áreas, tabelas internas) executa um
processamento e EXPORTA um parâmetro de resultado .

Preencha os parâmetros de importação como o modelo e use elementos de dados já existentes.

Preencha o parâmetro de exportação que receberá o resultado, usando um elemento já existente.

Em Source code, a
tela trará os
parâmetros declarados
anteriormente.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 15
Escreva o código e clique:

Salvar
Verificar
Preencha os parâmetros
Ativar
de entrada e dê F8.
Segue o resultado.
Para testar a função dê F8

Caso o sinal seja um inválido, verifique


a mensagem de erro tipo ‘I’.

Usando uma função no código - Crie o programa ZCALCSP na SE38, com o código abaixo.

*---------------------------------------------------------------------*
* Report ZCALSP
*---------------------------------------------------------------------*
REPORT zcalcsp.
*---------------------------------------------------------------------*
* Declaração
*---------------------------------------------------------------------*
* Variáveis
DATA: v_result(10) TYPE n.

* Tela com os parâmetros de entrada que servirão de filtro para a


* busca dos dados do relatório.
* Parâmetro de tela que recebe o endereço de exportação do TXT.
PARAMETERS: p_valor1(5) TYPE n,
p_sinal(1) TYPE c,
p_valor2(5) TYPE n.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 16
*---------------------------------------------------------------------*
* Processamento
*---------------------------------------------------------------------*
* para organizar o processamento neste bloco utiliza-se forms, com a chamada
* pelo comando perform.
* para criar o form referente basta clicar duas vezes no nome do perform.
* Processa dados-----------------------
PERFORM chama_funcao.

* Saída--------------------------------
* Imprime os dados da tabela ti_saida na tela.
PERFORM imprime_saida.

*---------------------------------------------------------------------*
* Subrotinas
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
* Form chama_funcao
*---------------------------------------------------------------------*
FORM chama_funcao .

Para chamar o corpo


da função, localize o
cursor no local onde a
função deve constar
no código e clique em
Pattern.

Preencha o nome da
função no campo ende
o CALL FUNCTION
estiver flegado e
confirme.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 17
Vai aparecer a função para completar com os parâmetros do código.

CALL FUNCTION 'ZCLCSP'


EXPORTING
p_valor1 = p_valor1
p_sinal = p_sinal
p_valor2 = p_valor2
IMPORTING
p_result = v_result.

ENDFORM. " chama_funcao


*---------------------------------------------------------------------*
* Form imprime_saida
*---------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM imprime_saida .

WRITE:/ 'Primeiro valor: ', p_valor1,


/ 'Sinal : ', p_sinal,
/ 'Segundo valor : ', p_valor2,
/ 'Resultado : ', v_result.

ENDFORM. " imprime_saida


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

Teste clicando em F8;


os parâmetros são
como os declarados.
Para adequar o texto Clique em Goto 
aos usuários, retorne Text Elements 
ao código... Selection Texts

Preencher com
o texto que os
usuários irão
ver: Execute
novamente
Salvar,
Ativar e
Voltar.

Criando uma Interface de remessa - Transação: SE38 – Editor de programa ABAP.

O programa de interface tem o objetivo de troca de dados com outro sistema.


Agora vamos fazer uma interface de remessa, onde selecionamos dados no SAP e exportamos
um arquivo PONTO TXT, para um local disponível para outro sistema importar.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 18
Crie um programa na SE38 com o nome de ZREMESSA e cole o código do relatório ZRELMARA
fazendo as alterações abaixo.

* Tela com os parâmetros de entrada que servirão de filtro para a


* busca dos dados do relatório.

* Parâmetro de tela que recebe o endereço de exportação do TXT.


PARAMETERS: p_path(128) TYPE c. “<<<<<<<<<<<<<<<

* Parâmetro de tela que recebe um único valor


PARAMETERS: p_spras TYPE zmakt-spras.

* Parâmetro de tela que recebe um período `de até' (ranger).


SELECT-OPTIONS: s_matnr FOR zmara-matnr.
*---------------------------------------------------------------------*
* Processamento
*---------------------------------------------------------------------*
* Busca Dados---------------------------
* para organizar o processamento neste bloco utiliza-se forms, com a chamada
* pelo comando perform.
* para criar o form referente basta clicar duas vezes no nome do perform.
* Busca ZMARA - Busca dados da tabela zmara.
PERFORM busca_zmara.

* Busca ZMAKT - Busca dados da tabela zmakt


PERFORM busca_zmakt.

* Processa dados-----------------------
PERFORM processa_dados.

* Saida--------------------------------
* Imprime os dados da tabela ti_saida na tela.
PERFORM imprime_saida.

* Exporta o txt baseado na ti_saida para o local c:/temp


Perform exporta_saida. “<<<<<<<<<<<<<<

*---------------------------------------------------------------------*
* Subrotinas
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
* Form exporta_saida
*---------------------------------------------------------------------*
FORM exporta_saida .

* Essa variável local tipo string é compatível com a função


DATA l_path TYPE string.
* O tipo do p_path não é compatível com a função
* mas, se o valor do que não é compatível for transportado para uma
* variável (no ex. variável local)compatível o valor passa a ser útil
l_path = p_path.

* A função GUI_DOWLOAD exporta o conteúdo de uma tabela interna para


* um endereço local pré-definido.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = l_path
TABLES
data_tab = ti_saida

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 19
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
OTHERS = 22.

* para toda função com EXCEPTIONS seve-se testar o subrc.


* Se houver erro, o comando message da forma abaixo, apresentará na tela
* mensagem standard.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. " exporta_saida

Criando um online - Transação: SE80


Um programa online é usado quando é necessário customizar uma tela fora do padrão de Report e
normalmente serve para dar manutenções e entrada de dados, funciona em módulos dentro de includes.

Selecione Program, coloque o nome que


deve começar com SAPMZ , tecle ENTER.
Abrirá um popup para criar o objeto

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 20
Os próximos popups sugerem a criação
do objeto com o include TOP e o nome
a ser utilizado. Basta confirmar todas
as telas e salvar como Objeto Local.

Clique 2 X no nome do programa e


tire os asteríscos de todos os
includes sugeridos no programa.

A organização do programa deve ficar separada em blocos como em um report, porém tudo acontece
dentro dos respectivos includes.
Onde:
*---------------------------------------------------------------------*
* Module Pool SAPMZ1ONL no include TOP ficam todas as declarações.
no include O01 ficam os processamentos
*---------------------------------------------------------------------*
* Declarações da tela. PBO – Process Before
INCLUDE MZ1ONLTOP. " global Data Output
no include I01 ficam os processamentos após
* Processamento
INCLUDE MZ1ONLO01. " PBO-Modules um comando de tela.
INCLUDE MZ1ONLI01. " PAI-Modules PAI - Process After Input
no include F01 ficam todos os forms dos
* Subrotinas. processamentos.
INCLUDE MZ1ONLF01. " FORM-Routines

Os includes foram sugeridos, mas devem ser criados, faça assim para cada um, (menos o TOP, que
já foi criado junto com o online). Clique 2 X no nome do include a ser criado.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 21
Clique em Yes nas telas que se abrirão e por último, salve
como Objeto Local.
Para criar os outros includes, clique 2 X no nome do
programa e clique 2 X no nome de outro include que será
criado, faça isso para os 3 includes: O01, I01 e F01.

O include estará pronto para


receber código. Sempre que for
sugerido salvar .... salve.

Neste ponto a estrutura do Online está pronta para receber qualquer processamento, tela, botões,
códigos, lógica, declarações, etc. Os includes são “programinhas” externos e lincados ao código
principal, tudo acontece neles. Não é necessário usar mais do que os 4 includes inicialmente
sugeridos, mesmo que outros venham a ser sugeridos pelo SAP.
Para esse online, vamos fazer a importação, na primeira tela, do TXT exportado pelo último report
e apresentar o resultado em um TABLE CONTROL em uma segunda tela.

Cole no include TOP as declarações que serão usadas neste processamento.


*---------------------------------------------------------------------*
* Include MZ1ONLTOP Module Pool SAPMZ1ONL
*---------------------------------------------------------------------*
PROGRAM sapmz1onl.

* Tabelas Transparentes
TABLES: zmara, zmakt.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 22
* Tipos
* A linha de Mil caracteres, receberá todo o conteúdo do txt.
* Os campos de saída serão declarados com seus respectivos tamanhos.
TYPES: BEGIN OF ty_txt,
linha(1000) TYPE c,
END OF ty_txt.

TYPES: BEGIN OF ty_saida,


matnr(18) TYPE c,
ersda(08) TYPE c,
mtart(04) TYPE c,
spras(02) TYPE c,
maktx(30) TYPE c,
END OF ty_saida.

* Tabelas Internas
DATA: ti_txt TYPE STANDARD TABLE OF ty_txt,
ti_saida TYPE STANDARD TABLE OF ty_saida.

* Work Áreas
DATA: wa_txt LIKE LINE OF ti_txt,
wa_saida LIKE LINE OF ti_saida.

* Variáveis
DATA: v_path(128) TYPE c,
okcode TYPE sy-ucomm,
v_okcode TYPE sy-ucomm.
-----------------------------------------------------------------------------------

Para os demais includes, uma


ordem deve ser seguida. Primeiro
crie a primeira tela com o número
de 0100.

Clique no nome do programa


com o botão da direita do mouse.
Clique em Create
Clique em Screen

Coloque um
número ( 0100,
5000 ou 9000 )
Clique em Yes para identificar a
tela e confirme.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 23
Na ABA Atributes,
preencha a descrição
da tela

Na ABA Element list,


preencha OKCODE

Na ABA Flow logic, existem os módulos de


processamento PBO, o que acontece antes da
tela e o PAI, o processamento que acontece
após o comando dado na tela.

No PBO descomente o module STATUS_0100


e dê duplo clique no nome.

Clique em Yes

Para os modules do PBO


escolha o include O01

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 24
O module será criado dentro do include escolhido, descomente a linha SET TITLEBAR, coloque
o número da tela entre as aspas e clique 2 X para criar o título da tela na barra de botões.

Clique em Yes para criar o objeto;


Clique em Yes para salvar o programa e
na tela seguinte, coloque o Title (título) e
confirme.

Repita a sequência para o


PF_STATUS ‘0100’.

Clique em Yes para criar o


objeto;
Clique em Yes para salvar o
programa e
na tela seguinte, coloque o
Short Text (Descrição
Breve) e confirme.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 25
A tela a seguir apresenta diversos botões para se formar as telas desejadas. Clique no terceiro nível,
Functions Keys, onde ficam os botões padrões de tela.

Na barra de Standard Toolbar,


preencha os botões ENTE e
Duplo clique BACK.
em ENTE NOTA: são possíveis apenas
4 caracteres.

Preencha o
Function text
Com Enter e
Confirme Confirme.

Confirme e repita a
Seqüência para o
BACK e demais
botões que sejam
necessário criar.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 26
A tela a seguir é usada para customização de botões: Application Toolbar

Preencha o espaço com o


botão EXEC, dê duplo
clique e confirme no
popup que se abrirá.

Preencha os textos Function text


e Info. Text. Para os botões da
barra customizada é necessário a
representação por um ícone.
No campo Icon name, através do
matchcode, selecione o que
melhor se enquadra no padrão
SAP, de acordo com o costume
dos usuários.

Confirme. Os botões desta


Salvar primeira tela já
existem, volte
Verificar para a lógica de
Ativar processamento.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 27
Nesta tela, crie o Module USER_COMMAND_0100,
descomentando-o e clicando 2 X sobre o nome.

Neste módulo, vamos colocar funcionalidade


nos botões, escolha o include relativo ao PAI
da tela, I01. Confirme e cole o código abaixo.

*---------------------------------------------------------------------*
* Include MZ1ONLI01
*---------------------------------------------------------------------*
* Module USER_COMMAND_0100 INPUT
*---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
* o sy-ucomm recebe o nome do botão clicado,
* o okcode é um elemento de tela que vai receber o sy-ucomm
* para asegurar que o valor do botão não vai se perder
* o v_okcode recebe o valor é usado para o teste no CASE.
okcode = sy-ucomm.
v_okcode = okcode.
CLEAR okcode.

* Para cada comando vamos criar um form e evitar processamentos


* dentro do CASE. Os forms vão para o include com o final F01.
CASE v_okcode.
WHEN 'ENTE'.
PERFORM f_importa_txt.
WHEN 'EXEC'.
PERFORM f_importa_txt.
WHEN 'BACK'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT

Clicando 2 X no nome do perform, crie o


form no Include próprio. Clique em Yes,
escolha o include F01, confirme e salve.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 28
Cole o código abaixo dentro do form criado.
*---------------------------------------------------------------------*
* Include MZ1ONLF01
*---------------------------------------------------------------------*
* Form f_importa_txt
*---------------------------------------------------------------------*
FORM f_importa_txt .
clear ti_txt[].
* A variável local l_path é necessária pois o v_path que recebe o
* endereço do arquivo txt na tela, é do tipo char de 128 e não é
* compatível com a função 'GUI_UPLOAD'.
* Então cria-se uma variável compatível ( type string ) que vai
* receber o valor da v_path.
DATA l_path TYPE string.
l_path = v_path.

* Na função passamos o endereço o arquivo txt no parâmetro filename


* e a tabela interna que vai receber o conteúdo do TXT, neste caso
* a ti_txt, já está declarada no include TOP.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = l_path
TABLES
data_tab = ti_txt
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. " f_importa_txt

Neste ponto o código já importou o arquivo txt para dentro da tabela interna it_txt.
Agora vamos mostrar este conteúdo em uma segunda tela, porém a tabela ti_txt tem apenas um
único campo que é uma linha de 1000 caracteres; pouco funcional no processamento.
Temos que quebrar essa linha campo a campo e depois chamar a próxima tela para exibi-los;
então temos que criar outro form onde vamos quebrar as linhas da ti_txt em uma tabela interna
mais apropriada, a ti_saida e incluir a chamada da próxima tela de exibição.

Altere o módulo USER_COMMAND_0100 do include I01 para que fique como abaixo.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 29
*---------------------------------------------------------------------*
* Include MZ1ONLI01
*---------------------------------------------------------------------*
* Module USER_COMMAND_0100 INPUT
*---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

* o sy-ucomm recebe o nome do botão clicado,


* o okcode é um elemento de tela que vai receber o sy-ucomm
* para asegurar que o valor do botão não vai se perder
* o v_okcode recebe o valor é usado para o teste no CASE.
okcode = sy-ucomm.
v_okcode = okcode.
CLEAR okcode.

* Para cada comando vamos criar um form e evitar processamentos


* dentro do CASE. Os forms vão para o include com o final F01.
CASE v_okcode.
WHEN 'ENTE'.
* Importa arquivo TXT via função GUI_UPLOAD
PERFORM f_importa_txt.
* Quebra linha do TXT para tabela interna ti_saida.
PERFORM f_quebra_txt.
* Chama a tela de exibição da ti_saida em TABLE CONTROL
CALL SCREEN '0110'.
WHEN 'EXEC'.
* Importa arquivo TXT via função GUI_UPLOAD
PERFORM f_importa_txt.
* Quebra linha do TXT para tabela interna ti_saida.
PERFORM f_quebra_txt.
* Chama a tela de exibição da ti_saida em TABLE CONTROL
CALL SCREEN '0110'.
WHEN 'BACK'.
LEAVE PROGRAM.

ENDCASE.

ENDMODULE. " USER_COMMAND_0100 INPUT

Clicando 2 X no perform f_quebra_txt,


crie o form no Include próprio. Clique
em Yes, escolha o include F01, confirme
e salve.

Cole o código abaixo.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 30
*---------------------------------------------------------------------*
* Form f_quebra_txt
*---------------------------------------------------------------------*
FORM f_quebra_txt .
clear ti_saida[].
* Para cada linha da ti_txt, carrega sua Work Area.
LOOP AT ti_txt INTO wa_txt.

* Move o trecho da linha referente a cada campo da wa_saida.


* Onde +XX = posição e o (XX) = o trecho.
wa_saida-matnr = wa_txt-linha+00(18).
wa_saida-ersda = wa_txt-linha+18(08).
wa_saida-mtart = wa_txt-linha+26(04).
wa_saida-spras = wa_txt-linha+30(02).
wa_saida-maktx = wa_txt-linha+32(30).

* Carrega a ti_saida com o conteúdo de sua Work Area.


APPEND wa_saida TO ti_saida.
ENDLOOP.

ENDFORM. " f_quebra_txt

Para criar o desenho da tela, clique em LAYOUT. A ferramenta Screen Painter se abrirá.

Primeiro, vamos fazer uma moldura com a ferramenta BOX; desenhe


clicando na ferramenta e arrastando na área de desenho, coloque um nome
para o objeto criado e um texto que aparecerá no topo da moldura.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 31
Com a ferramenta de texto, crie o campo que vai receber o endereço digitado.
Pra isso, clique na ferramenta, arraste para onde o texto ficará e depois
preencha os campos Name e Text conforme especificado.

Para colocar o campo que receberá o endereço ( V_PATH, declarado no TOP), clique no quadrinho
vermelho no topo da tela. No popup que se abrirá, clique em Get from Program e todas as declarações
do TOP aparecerão no grid; escolha a variável V_PATH e confirme.

Localize o campo
V_PATH e
confirme o
próximo popup.

Salve e volte.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 32
O processamento da primeira tela (0100) está
completo, antes de criarmos a segunda tela
(0110), vamos ativar todos os código de uma
maneira geral.
Clique 2 X no nome do programa principal,
clique com o botão da direita do mouse e clique
em ativar.

Confirme

Para criar a segunda tela (0110), clique com o


botão da direita do mouse no nome do
programa principal, escolha Create e Screen.

Na ABA Attributes coloque a descrição da tela.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 33
Na ABA Element list Na ABA Flow
preencha o OKCODE logic, descomente
o Module
STAUS_0110
para criar a barra
de botões da tela.

Clique 2 X no nome
STATUS_0110. Para esta tela,
que só vai mostrar os dados,
vamos colocar somente o botão
Voltar. Confirme o primeiro
popup, escolha o include de PBO
com o final O01 e confirme.

Perceba que o novo módulo da tela 0110 foi


criado logo abaixo do módulo da tela 0100.
Crie o TITLEBAR da tela 0110, como nome
110, clique 2 X no nome, confirme a criação do
objeto em YES, salve o programa em Yes e no
próximo popup, coloque o título.
Confirme.

Preencha o PF-STATUS com a tela 0110,


clique 2 X sobre o nome, confirme a criação
do objeto em YES, salve o programa em Yes e
no próximo popup, coloque o título.

Confirme

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 34
Clique no terceiro nível,
Functions Keys, onde
ficam os botões padrões de
tela. Escreva BACK no
botão voltar, clique no
nome 2 X e confirme o
próximo popup. Salve e
volte para o código de
processamento da tela.

Descomente o módulo
USER_COMMAND Confirme a criação do objeto em YES,
_0110 e clique 2 X escolha o include I01 e confirme.
para criá-lo.

O módulo USER_COMMAND_0110 se abrirá no include I01 abaixo do


USER_COMMAND_0100. Cole o código abaixo:

*---------------------------------------------------------------------*
* Module USER_COMMAND_0110 INPUT
*---------------------------------------------------------------------*
MODULE user_command_0110 INPUT.
okcode = sy-ucomm.
v_okcode = okcode.
CLEAR okcode.

* Se o comando escolhido for Voltar, volta para primeira tela.


IF v_okcode = 'BACK'.
LEAVE TO SCREEN '0100'.
ENDIF.

ENDMODULE. " USER_COMMAND_0110 INPUT

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 35
Para desenhar o layout desta
tela, vamos aproveitar o
recurso automático da Sreen
Painter.
Salve, volte e clique em
Layout.

Clique em
Table Control
(With Wizard)

Faça um quadro no meio da área de desenho onde o


table control será gerado. O Wizard será aberto.
Siga conforme as marcas das telas.

Preencha com o nome


TC_SAIDA e continue.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 36
Escolha Internal program table
e coloque o nome ti_saida,
marque com Table work área e
coloque a wa_saida Marque todos os
campos e continue.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 37
O table control estará criado, mas
como os campos da tabela não são
type a elementos de dados do
dicionário de dados, não veio
nenhum título e sim o nome dos
campos, o que pode ser trocado,
clicando em cima e alterando o
Conteúdo do Text.

Salve e volte. O código vai estar cheio de coisas novas que com tempo merecem estudos, pois o
ideal de um table control é que ele seja feito “à mão”. Ative o Código de maneira GERAL.

Dê duplo clique no nome


do programa principal;
Clique com o botão
direito do mouse
novamente no nome e em
Activate.
Todos os objetos que
devem ser ativados
aparecerão na tela.
Confirme.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 38
O Programa está pronto, mas para rodar um Online, a transação deve ser criada.
O programa é stardado por sua transação.

Na SE93, preencha o nome do


programa e clique em Create.

Preencha a descrição breve,


marque a opção Program and
screen e confirme.

Use a transação ZONLINE


pra chamar o código gerado.
Preencha o endereço do
arquivo e execute.

Preencha o nome do
programa e o número
da tela.
Marque as 3 opções de
GUI suport e salve
como objeto local.

Segue o resultado:

Os botões criados
nas telas, são os
únicos ativos.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 39
Criando um relatório ALV - Transação: SE38 – ABAP Editor.
O ALV é um relatório dinâmico no sentido de que após impresso na tela pode ser manipulado de várias
formas, pelo usuário, obedecendo uma padrão standard, lembrando uma tabela do excel.

Cole o programa abaixo.


*&---------------------------------------------------------------------*
*& Report ZRELALV
*&
*&---------------------------------------------------------------------*
REPORT zrelalv.
*---------------------------------------------------------------------*
* Declaracões
*---------------------------------------------------------------------*
* Tabelas transparentes do dicionário de dados que serão usadas no código.
TABLES: zmara,
zmakt.

* Tipos de referências para declarações das tabelas internas.


TYPES: BEGIN OF ty_zmara,
matnr TYPE zmara-matnr,
ersda TYPE zmara-ersda,
mtart TYPE zmara-mtart,
END OF ty_zmara.

TYPES: BEGIN OF ty_zmakt,


matnr TYPE zmakt-matnr,
spras TYPE zmakt-spras,
maktx TYPE zmakt-maktx,
END OF ty_zmakt.

* Tipo de referência que vai recerber os dados gerais do relatório


TYPES: BEGIN OF ty_saida,
matnr TYPE zmara-matnr,
ersda TYPE zmara-ersda,
mtart TYPE zmara-mtart,
spras TYPE zmakt-spras,
maktx TYPE zmakt-maktx,
END OF ty_saida.

*Tabelas Internas que vão receber os dados vindos do banco de dados


* elas são temporárias e só existem durante o processamento do código.
DATA: ti_zmara TYPE STANDARD TABLE OF ty_zmara,
ti_zmakt TYPE STANDARD TABLE OF ty_zmakt,
ti_saida TYPE STANDARD TABLE OF ty_saida.

*Work areas são iguais a 1 linha de cada tabela interna referente,


*é na wrk area que os dados são trabalhados.
DATA: wa_zmara LIKE LINE OF ti_zmara,
wa_zmakt LIKE LINE OF ti_zmakt,
wa_saida LIKE LINE OF ti_saida.

*Variaveis, quando necessário.

*Declaração para o ALV------------------------------------------------

*Pool de declarações do ALV.


TYPE-POOLS: kkblo.

*Variáveis do AVL
DATA: v_repid LIKE sy-repid,
v_save TYPE c.

*Tabelas internas do ALV.


DATA: it_fcat TYPE slis_t_fieldcat_alv,
it_fieldcat TYPE kkblo_t_fieldcat,
it_header TYPE kkblo_t_listheader,

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 40
it_sort TYPE slis_t_sortinfo_alv .

*Works Area do AVL


DATA: wa_variant TYPE disvariant,
wa_afield TYPE kkblo_fieldcat,
wa_colinfo TYPE kkblo_specialcol,
wa_layout TYPE kkblo_layout,
wa_header TYPE kkblo_listheader,
wa_lay TYPE slis_layout_alv,
wa_sort LIKE LINE OF it_sort.

*---------------------------------------------------------------------*
*Tela com os parâmetros de entrada que servirão de filtro para a
* busca dos dados do relatório.
*---------------------------------------------------------------------*

**Parâmetro de tela que recebe o endereço de exportação do TXT.


*PARAMETERS: p_path(128) TYPE c.

*Parâmetro de tela que recebe um único valor


PARAMETERS: p_spras TYPE zmakt-spras.

*Parâmetro de tela que recebe um períoo `de até' (ranger).


SELECT-OPTIONS: s_matnr FOR zmara-matnr.

*Escolha do tipo de relatório de saída


PARAMETERS: p_sim RADIOBUTTON GROUP said,
p_alv RADIOBUTTON GROUP said DEFAULT 'X'.

*---------------------------------------------------------------------*
* Processamento
*---------------------------------------------------------------------*
*Busca Dados---------------------------
*para organizar o processamento neste bloco utiliza-se forms, com a chamada
*pelo comando perform.
*para criar o form referente basta clicar duas vezes no nome do perform.
START-OF-SELECTION.
*Busca ZMARA - Busca dados da tabela zmara.
PERFORM busca_zmara.

*Busca ZMAKT - Busca dados da tabela zmakt


PERFORM busca_zmakt.

*Processa dados-----------------------
PERFORM processa_dados.

*Saída--------------------------------
*Imprime os dados da tabela ti_saida na tela.
IF p_sim = 'X'.
*Imprime o relatório com o comando WRITE
PERFORM imprime_simples.
ELSE.
*Imprime o relatório com o processo de AVL
PERFORM imprime_alv.
ENDIF.

END-OF-SELECTION.
*Limpa todas as estruturas
PERFORM limpa_tudo.

*---------------------------------------------------------------------*
* Subrotinas
*---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form busca_zmara
*&---------------------------------------------------------------------*
FORM busca_zmara .
*Seleciona os dados matnr ersda mtart

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 41
SELECT matnr ersda mtart
* para dentro da tabela interna ti_zmara
INTO TABLE ti_zmara
* vindo da tatela transparente zmara
FROM zmara
* com a condição de acordo com a tela de seleção
WHERE matnr IN s_matnr. " ranger é com 'IN'

* Para testar se houve erro no select.


* Sy-subrc = 0 = ZERO ERRO , retornou ao menos 1 resgistro.
* Sy-subrc <> 0 = HOUVE ERRO , não retornou nada
IF sy-subrc <> 0 .
* Se não retornar nada vai dar mensagem de erro.
MESSAGE i000(su) WITH 'DEU ERRO'.
* Para o processamento e retorna para tela de parâmetros de entrada
STOP.
ELSE.
* Se a busca não deu erro, a tabela tem algum registro então sortea.
SORT ti_zmara BY matnr.
ENDIF.

ENDFORM. " busca_zmara


*&---------------------------------------------------------------------*
*& Form busca_zbxt
*&---------------------------------------------------------------------*
FORM busca_zmakt .

*sempre que for fazer um select relacionado com uma tabela transparente
*tem que garantir que isso não será feito com uma tabela vazia
IF NOT ti_zmara[] IS INITIAL.

*Seleciona os dados matnr spras maktx


SELECT matnr spras maktx
* para dentro da tabela interna ti_zmakt
INTO TABLE ti_zmakt
* vindo da tatela transparente zmakt
FROM zmakt
* para cada entrada da tabela ti_zmara
FOR ALL ENTRIES IN ti_zmara
* com a condição de acordo com a tela de seleção
* e com a tabela de comparação.
WHERE matnr = ti_zmara-matnr
AND spras = p_spras. "Parameters é com =

* Para testar se houve erro no select.


* Sy-subrc = 0 = ZERO ERRO , retornou ao menos 1 registro.
* Sy-subrc <> 0 = HOUVE ERRO , não retornou nada
IF sy-subrc = 0 .
* Neste caso pode testar se não houve erro
* e se a tabela foi preenchida então sorteia, indexa.
SORT ti_zmakt BY matnr.
ENDIF.
ENDIF.

ENDFORM. " busca_zmakt


*&---------------------------------------------------------------------*
*& Form processa_dados
*&---------------------------------------------------------------------*
FORM processa_dados .

*Para preencher a tabela com os dados de saída


*Para cada registro da tabela ti_mara.
LOOP AT ti_zmara INTO wa_zmara.
*move o conteúdo da wa_mara para wa_saida.
wa_saida-matnr = wa_zmara-matnr.
wa_saida-ersda = wa_zmara-ersda.
wa_saida-mtart = wa_zmara-mtart.
*Para carregar com os dados relacionados da ti_makt

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 42
*Tem que ler a ti_makt onde o campo chave matnr é o mesmo
*Cláusula Binary Serach faz uma pesquisa binária e mais rápida
READ TABLE ti_zmakt INTO wa_zmakt WITH KEY matnr = wa_zmara BINARY SEARCH.
*Para economizar processamento o valor da ti_zmakt para ti_saida
*só será transportado se a leitura com o comando read table tiver dado
*resultado.
IF sy-subrc = 0 .
wa_saida-spras = wa_zmakt-spras.
wa_saida-maktx = wa_zmakt-maktx.
ENDIF.
*No final do processamento o valor da wa_saida é movido para ti_saida pelo
*comando APPEND.
APPEND wa_saida TO ti_saida.
ENDLOOP.

ENDFORM. " processa_dados


*&---------------------------------------------------------------------*
*& Form imprime_simples
*&---------------------------------------------------------------------*
FORM imprime_simples.
*Para cada registro da tabela ti_saida
LOOP AT ti_saida INTO wa_saida.
ULINE. "Imprime um linha contínua
*Imprime cada campo da tabela.
WRITE:/ '|', wa_saida-matnr, '|',
wa_saida-ersda, '|',
wa_saida-mtart, '|',
wa_saida-spras, '|',
wa_saida-maktx.
ENDLOOP.
ULINE.
ENDFORM. " imprime_simples
*&---------------------------------------------------------------------*
*& Form imprime_alv
*&---------------------------------------------------------------------*
FORM imprime_alv .

*Carrega dados do cabeçalho


PERFORM: f_alv_header.
*Define a indexação da impressão
PERFORM: f_alv_sort.
*Define as características dos campos
PERFORM: f_alv_fildcat.
*Imprime o relatório
PERFORM: f_alv_imprime.

ENDFORM. " imprime_alv


*&---------------------------------------------------------------------*
*& Form f_alv_header
*&---------------------------------------------------------------------*
FORM f_alv_header .

*A tabela it_header, é carregada com dados e características que serão


*usadas na impressão do cabeçalho do relatório

*Carrega uma linha com um fonte maior para título, tipo 'H'.
CLEAR wa_header.
wa_header-typ = 'H'.
wa_header-info = 'Listagem de Impressão ALV'(001).
APPEND wa_header TO it_header.

*Carrega uma linha com um fonte média para sub-títulos, tipo 'S'.
CLEAR wa_header.
wa_header-typ = 'S'.
wa_header-key = 'Materiais'(002). "imprime uma parte em negrito
wa_header-info = 'Dados Mestres Materiais'. "imprime outra parte normal
APPEND wa_header TO it_header.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 43
DATA: l_linha(40) TYPE c.
l_data(10) TYPE c.

*Carrega uma linha com um fonte menor para detalhes, tipo 'A'.
WRITE sy-datum TO l_data.
CONCATENATE 'Data:' l_data INTO l_linha.
CLEAR wa_header.
wa_header-typ = 'A'.
wa_header-info = l_linha.
APPEND wa_header TO it_header.

ENDFORM. " f_alv_header


*&---------------------------------------------------------------------*
*& Form f_alv_sort
*&---------------------------------------------------------------------*
FORM f_alv_sort .

* A tabela it_sorte carrega a ordem dos campos


* na seguência que deve ser impressa
DATA i TYPE i.

i = i + 1.
CLEAR wa_sort.
wa_sort-spos = i. "Sequência da ordem
wa_sort-fieldname = 'MATNR'. "Campo da tabela interna - Cx alta.
wa_sort-subtot = 'X'. "Quebra e subtotaliza valores por este campo
wa_sort-up = 'X'. "Sort descendente
APPEND wa_sort TO it_sort.

i = i + 1.
CLEAR wa_sort.
wa_sort-spos = i.
wa_sort-fieldname = 'ERSDA'.
APPEND wa_sort TO it_sort.

i = i + 1.
CLEAR wa_sort.
wa_sort-spos = i.
wa_sort-fieldname = 'MTART'.
wa_sort-subtot = 'X'. "Outro quebra de subtotal por este campo.
wa_sort-up = 'X'.
APPEND wa_sort TO it_sort.

ENDFORM. " f_alv_sort


*&---------------------------------------------------------------------*
*& Form f_alv_fildcat
*&---------------------------------------------------------------------*
FORM f_alv_fildcat .

* A tabela it_fieldcat guarda todos os campos e suas características


* que deverão ser impressos no relatório, somente estes campos serão
* impressos, mesmo que haja outros campos na tabela interna de saída.
* se forem para imprimir, eles devem estar carregados na it_fieldcat.
DATA i TYPE i.

i = i + 1.
CLEAR wa_afield.
wa_afield-col_pos = i. "Ordem do fieldcat
wa_afield-fieldname = 'MATNR'. "Nome do campo da tb. de saída
wa_afield-ref_fieldname = 'MATNR'. "Campo de refrência para herdar características
wa_afield-ref_tabname = 'ZMARA'. "Tabela transparente que tem o campo acima
wa_afield-key = 'X'. "Marca como chave
APPEND wa_afield TO it_fieldcat.

i = i + 1.
CLEAR wa_afield.
wa_afield-col_pos = i.
wa_afield-fieldname = 'ERSDA'.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 44
wa_afield-ref_fieldname = 'ERSDA'.
wa_afield-ref_tabname = 'ZMARA'.
wa_afield-key = 'X'.
APPEND wa_afield TO it_fieldcat.

i = i + 1.
CLEAR wa_afield.
wa_afield-col_pos = i.
wa_afield-fieldname = 'MTART'.
wa_afield-ref_fieldname = 'MTART'.
wa_afield-ref_tabname = 'ZMARA'.
wa_afield-key = 'X'.
APPEND wa_afield TO it_fieldcat.

i = i + 1.
CLEAR wa_afield.
wa_afield-col_pos = i.
wa_afield-fieldname = 'SPRAS'.
wa_afield-ref_fieldname = 'SPRAS'.
wa_afield-ref_tabname = 'ZMARA'.
APPEND wa_afield TO it_fieldcat.

i = i + 1.
CLEAR wa_afield.
wa_afield-col_pos = i.
wa_afield-fieldname = 'MAKTX'.
wa_afield-ref_fieldname = 'MAKTX'.
wa_afield-ref_tabname = 'ZMARA'.
APPEND wa_afield TO it_fieldcat.

ENDFORM. " f_alv_fildcat


*&---------------------------------------------------------------------*
*& Form f_alv_imprime
*&---------------------------------------------------------------------*
FORM f_alv_imprime .
* Depois que as tabelas auxiliares de impressão são carregadas...
* Os dados do Fieldcat, dever ser configurados na função abaixo,
* para outra tabela auxiliar, neste caso a it_fcat.
* A estrutura wa_layout carrega as características do layout de
* impressão como por exemplo a otimização das colunas ou se
* as linhas serão zebradas. Ela também será configurada para w_lay.

*Transfere dados-----------------------------------
wa_layout-colwidth_optimize = 'X'.
CALL FUNCTION 'REUSE_ALV_TRANSFER_DATA_BACK'
EXPORTING
it_fieldcat = it_fieldcat
is_layout = wa_layout
IMPORTING
et_fieldcat = it_fcat
es_layout = wa_lay.

*Imprime dados--------------------------------
MOVE sy-repid TO v_repid.
MOVE v_repid TO wa_variant-report.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'


EXPORTING
i_callback_program = v_repid
is_layout = wa_lay
it_fieldcat = it_fcat
i_callback_top_of_page = 'F_TOP_OF_PAGE'
i_background_id = 'ALV_BACKGROUND'
it_sort = it_sort[]
i_save = v_save
is_variant = wa_variant
TABLES
t_outtab = ti_saida[]

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 45
EXCEPTIONS
program_error = 1
OTHERS = 2.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
STOP.
ENDIF.

ENDFORM. " f_alv_imprime


*---------------------------------------------------------------------*
* Form f_top_of_page
*---------------------------------------------------------------------*
FORM f_top_of_page .

CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'


EXPORTING
it_list_commentary = it_header
i_logo = 'ENJOYSAP_LOGO'.

ENDFORM. " f_top_of_page


*&---------------------------------------------------------------------*
*& Form limpa_tudo
*&---------------------------------------------------------------------*
FORM limpa_tudo .

CLEAR: ti_zmara[], ti_zmakt[], ti_saida[],


wa_zmara , wa_zmakt , wa_saida ,
v_repid , v_save , it_fcat[],
it_fieldcat[], it_header[], it_sort[],
wa_variant , wa_afield , wa_colinfo ,
wa_layout , wa_header , wa_lay , wa_sort .

ENDFORM. " limpa_tudo

__________________________________________________________________________________

Criando um processo de Batch Input - Transação: SE38 – ABAP Editor.

O Processo de Batch Input tem o objetivo de dar carga nas tabelas transparentes do SAP, porém
obedecendo todas as consistências e integridades geradas pelas regras de negócio de cada transação.
Nenhuma carga no SAP é efetuada diretamente no Banco de Dados (‘direct input’ tem que ser bem
estudado). O processo se divide em Mapeamento e Programa de Carga.

Transação: SHDB / Mapeamento – Gravador de Transação.

Clique em
Nova Gravação

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 46
Dê um nome para Gravação, coloque o nome da
Transação que será gravada e confirme. Estude bem a transação que será gravada, porque a
cada comando dado será gravado o programa, a tela
e os dados de tela do momento. A gravação deve ser
a mais limpa e completa possível, sem telas
desnecessárias ao processo e chegando até o
momento de salvar ou encerrar completamente; logo
após, o mapeamento será apresentado em uma
tabela. Salve.

Não utilize matchcode. Pode colar e copiar mas


saiba exatamente quais os dados e os campos que
serão utilizados. ENTER é comando igual botão.

Mandando processar, será apresentado passo a


passo cada tela preenchida, somente aguardando a
confirmação dos comandos.

No final será apresentado um relatório com todas


as mensagens de Sucesso ou Erro dadas durante o
processo.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 47
Programa de Carga básico de Batch Input.
A tela de parâmetros de seleção ficará assim:

Cole o programa abaixo.


*&---------------------------------------------------------------------*
*& Report ZBATCH1
*&
*&---------------------------------------------------------------------*
REPORT zbatch1 LINE-SIZE 140 NO STANDARD PAGE HEADING.

*---------------------------------------------------------------------*
* Declarações
*---------------------------------------------------------------------*
* Tabelas transparentes
TABLES : zmara.

* Tipos
* Receber os dados importados para o SAP pela função GUI_UPLOAD.
TYPES: BEGIN OF ty_arq,
matnr(18) TYPE c,
ersda(8) TYPE c,
mtart(4) TYPE c,
spras(2) TYPE c,
maktx(40) TYPE c,
END OF ty_arq.

* Tabelas internas
DATA: ti_arq TYPE STANDARD TABLE OF ty_arq.

* Work areas
DATA: wa_arq LIKE LINE OF ti_arq.

* Declarações para o Batch Input---------------


* Tipos:
* Recebe os dados configurados de ERRO do Batch Input + campos chaves.
TYPES: BEGIN OF ty_log,
matnr(18) TYPE c,
ersda(8) TYPE c,
tipo(1) TYPE c,
msg_erro(100) TYPE c,
END OF ty_log.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 48
* Tabelas Internas auxiliares no processo de batch input.
DATA: ti_bdcdata TYPE STANDARD TABLE OF bdcdata , "Guarda o mapeamento
ti_bdcmsgcoll TYPE STANDARD TABLE OF bdcmsgcoll, "Guarda as mensagens
ti_log TYPE STANDARD TABLE OF ty_log. "Relatório de mensagens

* Work Areas
DATA: wa_bdcdata LIKE LINE OF ti_bdcdata ,
wa_bdcmsgcoll LIKE LINE OF ti_bdcmsgcoll,
wa_log LIKE LINE OF ti_log.

*Variáveis
DATA: v_msg LIKE t100-text,
v_msgv1 LIKE balm-msgv1,
v_msgv2 LIKE balm-msgv2,
v_msgv3 LIKE balm-msgv3,
v_msgv4 LIKE balm-msgv4.

*---------------------------------------------------------------------*
* Tela
*---------------------------------------------------------------------*
* Endereço do Txt.
* Batch Input

SELECTION-SCREEN BEGIN OF BLOCK b001 WITH FRAME TITLE text-001.


PARAMETERS: p_path(128) TYPE c, "Endereço de importação do arquivo TXT.
p_mode(1) TYPE C DEFAULT 'N' . "Modo de execução do batch input.
*O modos modos são: A - Passo a passo N - Background E - Erro.
SELECTION-SCREEN END OF BLOCK b001.

*Define Saída
SELECTION-SCREEN BEGIN OF BLOCK b002 WITH FRAME TITLE text-002.
*Grupo de botões que vão definir a maneira que o log será impresso.
PARAMETERS: p_spl RADIOBUTTON GROUP impr, " Impressão simples
p_alv RADIOBUTTON GROUP impr. " Impressão em ALV
SELECTION-SCREEN END OF BLOCK b002.

*---------------------------------------------------------------------*
* Processamento
*---------------------------------------------------------------------*
START-OF-SELECTION.
* Busca dados
PERFORM busca_dados.
* Processa Dados
PERFORM executa_shdb.
* Saída
PERFORM imprime_log.

END-OF-SELECTION.

*Limpa todas as estruturas


PERFORM limpa_tudo.

*---------------------------------------------------------------------*
* Subrotinas
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
* Form busca_dados
*---------------------------------------------------------------------*

FORM busca_dados .

* A busca de dados (TXT) é feita pela função GUI_UPLOAD


DATA l_path TYPE string.
l_path = p_path.

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 49
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = l_path
TABLES
data_tab = ti_arq
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
STOP.
ENDIF.

ENDFORM. " busca_dados

*---------------------------------------------------------------------*
* Form executa_shdb
*---------------------------------------------------------------------*
FORM executa_shdb .

CLEAR ti_log[].
* Para cada registro retornado pela importação do TXT.
LOOP AT ti_arq INTO wa_arq.
* Monta o SHDB da transação
PERFORM f_monta_bdc_data.
* Executa a transação
PERFORM f_call_trasaction.
* Tratamento de log de mensagens
PERFORM f_trata_log.
ENDLOOP.

ENDFORM. " executa_shdb

*---------------------------------------------------------------------*
* Form f_monta_bdc_data
*---------------------------------------------------------------------*
FORM f_monta_bdc_data .
CLEAR ti_bdcdata[].
* O Mapeamento feito no SHDB é passado para o Código no formato abaixo.
* O parâmetro USING transporta cada conteúdo pra dentro do form f_bdc_data.
PERFORM f_bdc_data USING:
'SAPLZMARA' '0001' 'X' '' '',
'' '' '' 'BDC_OKCODE' '=NEWL',
'SAPLZMARA' '0001' 'X' '' '',
'' '' '' 'BDC_OKCODE' '=SAVE',
'' '' '' 'ZMARA-MATNR(01)' wa_arq-matnr,
'' '' '' 'ZMARA-ERSDA(01)' wa_arq-ersda,
'' '' '' 'ZMARA-MTART(01)' wa_arq-mtart.

ENDFORM. " f_monta_bdc_data

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 50
*---------------------------------------------------------------------*
* Form f_call_trasaction
*---------------------------------------------------------------------*
FORM f_call_trasaction .

CLEAR ti_bdcmsgcoll[].

CALL TRANSACTION 'ZMARA'


USING ti_bdcdata
MODE p_mode
UPDATE 'S'
MESSAGES INTO ti_bdcmsgcoll.

ENDFORM. " f_call_trasaction

*---------------------------------------------------------------------*
* Form f_trata_log
*---------------------------------------------------------------------*
FORM f_trata_log .

wa_log-matnr = wa_arq-matnr.
wa_log-ersda = wa_arq-ersda.
* Monta mensagem standard
LOOP AT ti_bdcmsgcoll INTO wa_bdcmsgcoll.

v_msgv1 = wa_bdcmsgcoll-msgv1.
v_msgv2 = wa_bdcmsgcoll-msgv2.
v_msgv3 = wa_bdcmsgcoll-msgv3.
v_msgv4 = wa_bdcmsgcoll-msgv4.

CALL FUNCTION 'MESSAGE_PREPARE'


EXPORTING
language = wa_bdcmsgcoll-msgspra
msg_id = wa_bdcmsgcoll-msgid
msg_no = wa_bdcmsgcoll-msgnr
msg_var1 = v_msgv1
msg_var2 = v_msgv2
msg_var3 = v_msgv3
msg_var4 = v_msgv4
IMPORTING
msg_text = v_msg
EXCEPTIONS
function_not_completed = 1
message_not_found = 2
OTHERS = 3.

IF sy-subrc <> 0 .
CLEAR wa_log-tipo.
v_msg = 'Não houve mensagem'.
ENDIF.
wa_log-tipo = wa_bdcmsgcoll-msgtyp.
wa_log-msg_erro = v_msg.
APPEND wa_log TO ti_log.

ENDLOOP.

ENDFORM. " f_trata_log

*---------------------------------------------------------------------*
* Form F_BDC_DATA
*---------------------------------------------------------------------*
* -->P_program programa
* -->P_dynpro tela
* -->P_start define a tela
* -->P_fnam nome do campo ou comando
* -->P_fval conteúdo do campo ou comando
*----------------------------------------------------------------------*

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 51
FORM f_bdc_data USING p_program p_dynpro p_start p_fnam p_fval.
* Este form recebe cada conteúdo passado em ordem para os parâmetros de
* entrada e abaixo preenche a wa_bdcdata que por sua vez carrega a ti_bdcdata.
CLEAR wa_bdcdata.
wa_bdcdata-program = p_program.
wa_bdcdata-dynpro = p_dynpro.
wa_bdcdata-dynbegin = p_start.
wa_bdcdata-fnam = p_fnam.
wa_bdcdata-fval = p_fval.
APPEND wa_bdcdata TO ti_bdcdata.

ENDFORM. " F_BDC_DATA

*---------------------------------------------------------------------*
* Form imprime_log
*---------------------------------------------------------------------*
FORM imprime_log .

IF NOT p_spl IS INITIAL.


ULINE.
LOOP AT ti_log INTO wa_log.
WRITE: / '|', wa_log-matnr, '|',
wa_log-ersda, '|',
wa_log-tipo, '|',
wa_log-msg_erro, '|'.
ULINE.
ENDLOOP.
ELSE.

*********EXERCÏCIO*************
* COMPLETAR O PROGRAMA COM UM PROCESSO DE IMPRESSÃO
* EM ALV UTILIZANDO A ti_log COMO SAÍDA.
ENDIF.

ENDFORM. " imprime_log

*---------------------------------------------------------------------*
* Form limpa_tudo
*---------------------------------------------------------------------*
FORM limpa_tudo .

CLEAR: ti_arq[], wa_arq, ti_bdcdata[], ti_bdcmsgcoll[],


ti_log[], wa_bdcdata, wa_bdcmsgcoll, wa_log, v_msg ,
v_msgv1 , v_msgv2 , v_msgv3 , v_msgv4 .

ENDFORM. " limpa_tudo

Autores: Emmanuel de Souza Lima – emmanuel.cebola@gmail.com


Ângela Cristina Junqueira – angelacristina.junqueira@gmail.com Página 52

Você também pode gostar