Você está na página 1de 141

Colaboradores

Daniela Cristina Guerra


Flavio Alves Pereira
DICE
1. SYSTEM OVERVIEW.........................................................................................................................03
1.1. Funes Bsicas do SAP ERP....................................................................................................03
1.1.1. Logon..............................................................................................................................................03
1.1.2. Elementos de Tela..........................................................................................................................04
1.1.3. ABAP Editor......................................................................................................................................06
1.1.3.1 Opes do ABAP editor .................................................................................................................06

2. Arquitetura do Sistema SAP ERP....................................................................................................... 08

3. ABAP Dictionary..........................................................................................................................10
3.1 Categoria de tabelas do ABAP Dictionary........................................................................................10
3.2 1 Objetos que formam uma tabela......................................................................................................12
3.2.1.1. Atributo do elemento de dados......................................................................................................12
3.3 Configuraes tcnicas da tabela....................................................................................................... 14
3.4 Tabelas de verificao........................................................................................................................ 15
3.4.1. Consulta.........................................................................................................................................15
3.4.1.1. Pesquisar tabelas com chave estrangeira.................................................................................... 16
3.5 ndices.................................................................................................................................................17
3.5.1. Rotina interna de indexao e pesquisa..........................................................................................17
3.5.2 Consultando ndices..........................................................................................................................17
3.6. Operadores relacionais .......................................................................................................................18
3.7.Estruturas..............................................................................................................................................18
3.8 Views ..................................................................................................................................................19
3.9 Criando tabela.......................................................................................................................................20
3.9.1 atualizao de opes tcnicas.........................................................................................................28
3.9.2 consultando objetos criados..............................................................................................................30
4. Reports............................................................................................................................................... 31
4.1. Eventos Utilizados............................................................................................................................31
4.1.2. Controle de nvel na tabela interna.................................................................................................. 32
4.1.3. Comando Message ..........................................................................................................................33
4.1.4. Alguns Comandos ABAP................................................................................................................. 34
4.1.5. Formatos de sada............................................................................................................................43
4.1.6. Hotspots............................................................................................................................................43
4.1.7. Programa Report Simples.................................................................................................................43
4.2 ALV...................................................................................................................................................... 49

5. Dialog............................................................................................................................................... 56
5.1. Module Pool...................................................................................................................................56
5.2. Tabstrip..........................................................................................................................................72
5.2.1. Criando Tabstrip com assistente.....................................................................................................72
5.3. Table Control................................................................................................................................ 77
5.3.1 Criando table control com o assistente...........................................................................................77
5.3.2 Loop at screen................................................................................................................................82
6. SHDB................................................................................................................................................ 84
7. RFC................................................................................................................................................... 86
8. Batch input ........................................................................................................................................87
9. Call transaction.................................................................................................................................. 98
10. BAPI.................................................................................................................................................108
10.1 Programa BAPI.............................................................................................................................108
11. Field Exit...................................................................................................................................117
12. Screen Exit...............................................................................................................................118
13. Badi.......................................................................................................................................119
14. SAPSCRIPT..........................................................................................................................122
15. SMART FORM .....................................................................................................................127
15.1 Criando Smartform...................................................................................................................127
15.2 Programa para Smartform........................................................................................................137

2
1. SYSTEM OVERVIEW

1.1. Funes Bsicas do SAP ERP

1.1.1. Logon

Assim que a janela SAP Logon for exibida, escolha o ambiente e d um duplo clique na
linha.

Ser exibida a tela de logon do SAP ERP.

3
Na tela de logon, informe mandante, usurio e sua senha e pressione [Enter].

A tela inicial ser apresentada.

1.1.2 Elementos de Tela

Menu bar
System function bar
Title Bar
Application tool bar

Dympro Area

Status Bar

4
Menu bar

Contm as ferramentas para configurao do ambiente.

System Function Bar

Neste campo podemos utilizar transaes Standard do SAP ERP como MM01 e VA01,
transaes customizadas para o cliente que iniciam com a letra Z ou Y, tambm podemos
encerrar o processamento do SAP GUI, abrir outras instncias do SAP GUI, entrar em
modo de depurao ABAP etc.

/n Retorna a tela anterior


/o Abre novas instncias
/h Depurao
/nex Fecha todas as instncias do SAP

Title bar

Exibe ttulos dos programas do SAP.

Status Bar

Nesta barra so apresentadas informaes gerais do SAP ERP, sendo que no extremo
esquerdo so apresentadas s mensagens do sistema e no estremo direito informaes
como: Sistema, Client, User, Program, Transaction etc.

5
1.1.3 ABAP Editor

Plataforma para desenvolvimento de programas e relatrios do SAP ERP.


Para acessar o ABAP Editor utilizamos a transao SE38 ou SE80.

Informar nome do programa

1.1.3.1 Opes do ABAP Editor

Menu Bar Utilitrios Opes...

6
TAB Editor

O usurio pode configurar se o editor vai trabalhar em modo frontend,


backend (verses mais antigas) Para ambas pode-se configurar:

Converses de Maiscula/Minscula em modo de exibio


Exibir todos erros de sintaxe
Limitao de 72 colunas na edio

TAB Pretty Printer

Opo padro Identar para organizar adequadamente a tabulao de linhas.

Efetuar converso Maiusc/Minusc.

Minsculas;
Maisculas;
Palavras chaves em maisculas (Comandos);
Palavras chaves em minsculas (Comandos).

TAB Tela Dividida

Configura a disposio de telas e opes de comparao.

TAB Depurao

Habilita depurao externa.

7
P WORKBENCH
2.1. Arquitetura do Sistema SAP ERP

O SAP ERP desenvolvido com tecnologia client/Server de trs camadas.

Presentation Layer

Onde apresentado o SAPGUI e onde o usurio interage com o sistema SAP ERP

Aplication Layer

Onde as solicitaes do usurio so processadas (relatrios, telas etc...).

Database Layer

Onde esto armazenadas as informaes em forma de dados, estes dados ficam


distribudos em vrias tabelas do sistema, sendo que na grande maioria delas ocorre
relacionamento de informaes .

8
Dispatcher

Efetua o gerenciamento de alocao de Work Process quando h uma solicitao


do presentation para o application.

Work Process

So atravs deles que as aplicaes SAP ERP so executadas. Cada Work


Process utiliza uma rea de memria que contm o contexto da aplicao em
execuo.

Tipos:
Dialog Pedidos de um usurio para execuo de dialog steps;

Update Executa pedidos de atualizao de bancos de dados;

Background Executa programas em background, sem interao


em tempo real com o usurio;

Enqueue Administra o bloqueio de tabela na memria compartilhada;

Spool Gerencia impresso ou arquivamento ptico.


9
3. ABAP DICTIONARY

O ABAP Dictionary permite um gerenciamento central de todas as definies de dados


usada no sistema R/3.

A SE11 principal transao para manuteno do dicionrio de dados do SAP ERP.

Tela principal

Tabelas
Estruturas
Vises
Elemento de dados
Categoria tabela
Grupo de tipos
Domnios
Ajuda de pesquisa
Objetos de bloqueio
Documentao

3.1 Categoria de Tabelas do ABAP Dictionary

Tabelas transparentes
As tabelas transparentes so criadas na SE11, atravs da opo de criao de
tabelas. Quando ativadas, so criadas no sistema de banco de dados com os
mesmos nomes e caractersticas tcnicas informadas no ABAP Dictionary.

Tabelas utilizadas pelo SAP:

Pooled table
So tabelas agrupadas, ou seja, um conjunto de tabelas no dicionrio de
dados que so representadas por apenas uma tabela no sistema de banco
de dados.

Cluster table
Tambm so tabelas agrupadas, porm so utilizadas para armazenar grandes
quantidades de informao.

NOTA: Podemos utilizar ABAP JOIN nas tabelas Cluster e Pooled table

10
Restries nas Pooled e Cluster tables:

ndices secundrios no so suportados;


Algumas clusulas do Open SQL no so suportadas;
SQL nativo no suportado e no h como o DBA acessar os dados dessas
tabelas.

3.2. Estrutura de Tabelas

Campo: Indica o nome do campo de uma tabela. O Campo MANDT indica a que
mandante pertencem os dados da tabela

Chave primria: Indica que s ser permitida uma ocorrncia para uma linha ou um
conjunto de linhas de uma tabela.

Valores iniciais: No permite entrada de dados com valores nulos.

Elemento de dados: Descreve um tipo elementar de dado ou uma referncia. O elemento


de dados tem em seu menor nvel de definio o Domnio.

Categoria: Descreve o formato de dados na interface de usurio.

Comprimento: Nmero das posies vlidas de um campo sem caracteres de edio


(por exemplo, vrgulas ou pontos).

Casa decimal: Nmero das posies vlidas de um campo sem caracteres de edio
(por exemplo, vrgulas ou pontos).

Descrio: A descrio breve utilizada como texto explicativo na criao de listas e de


documentao (Ajuda F1).

Grupo: Nome de grupo em includes denominados.

11
3.2.1. Objetos que formam uma Tabela

3.2.1.1 Atributos do Elemento de Dados

Elemento de Dados: Nome tcnico

Descrio breve: Descrio para o Elemento de Dados

TAB - Caractersticas

ltima modificao: Usurio e Data


Pacote
Idioma

TAB - Categoria de dados

Domnio: Campo onde atribudo o Domain

Tipo instalado: Opo onde as caractersticas so informadas diretamente atravs


da Categoria de Dados

Tipo de referncia: Opo onde as caractersticas so informadas por referncia

TAB Caractersticas adicionais

Ajuda de pesquisa (Search Help): Permite que sejam associadas ajudas de


pesquisa diretamente no Elemento de Dados.

ID parmetro: Campo que permite informa um ID para o SAP Memory (comandos


Set/Get)

12
Nome componente default: possvel atribuir um nome default ingls ao
elemento de dados neste campo.

TAB Denominao do campo

Permite que sejam informados quatro comprimentos de descrio para o campo

3.2.1.2 Atributos do Domnio

Domnio: Nome tcnico.

Descrio breve: Descrio para o Domnio.

TAB - Caractersticas

ltima modificao: Usurio e Data


Pacote
Idioma

TAB Definio

Formato -Quadro onde so informados:

Categoria de dados: (Char, Dats, Cuky, Int1, Lang, Quan, Numc etc...).

Nmero de posies: Nmero das posies vlidas de um campo sem caracteres


de edio (por exemplo, vrgulas ou pontos).

Decimais: Nmero das casas decimais admitidas de um valor.

13
Caractersticas de sada - Quadro onde so informados:

Comprim. Sada: Comprimento de campo mximo, inclusive caracteres de edio


(por exemplo, vrgulas ou pontos), para entrar e sair valores.

Rotina converso: Rotina utilizada para converso de campos

Sinal +/-: Permite sinais negativos se estiver marcado

Letr. minsculas: Distingue maisculas e minsculas (Case Sensitive ) se o campo


estiver marcado.

TAB Interv. Vals.

Local onde podem ser inseridos valores individuais, intervalo de valores ou uma tabela
de valores.

3.3 Configuraes tcnicas da tabela

Parmetros de memria lgicos (SE11)

Tipo de dados: Determinar a nvel lgico, em que rea fsica d o DB a tabela ser
arquivada:

APPL0 - Dados mestres (Alta ocorrncia de leitura e baixa ocorrncia de


gravao);

APPL1 - Dados de movimento (Atualizao freqente, consulta freqente);

APPL2 - Dados organizacionais e de customizing (Raramente modificados);

Tambm existem dois tipos para usurio USR e USR1;

Categor.Tamanho: Determinao da necessidade de espao prevista em uma


tabela do banco de dados

14
3.4 Tabelas de Verificao
As tabelas de verificao servem para validao de dados no sistema, onde s permitida
a entrada de uma informao em um campo que referencie uma tabela de verificao.

3.4.1 Consulta

Para consultar a tabela de verificao entrar na SE16 colocar o nome da tabela e exibir.
Na tela clicar em Tabela de verificao,

Outra forma de consultar a tabela de verificao atravs do grfico de relacionamento de


tabelas

15
Duplo clique
Chama SE16
para a tabela
da Entidade.

3.4.1.1 Pesquisar Tabelas com chave estrangeira

Na exibio dos grficos de relacionamento, podemos consultar as tabelas com chave


estrangeira atravs do boto Tabela de chave externa.

3.5 ndices

16
So utilizados para acelerar a pesquisa de dados em uma tabela, porm a gravao
lenta.

Um arquivo de ndice formado pelos campos de pesquisa da tabela, campos


indicados na criao do ndice.

Os campos podem ser uma chave primria ou campos onde haver grandes
quantidades de pesquisa, por parte do sistema.

Quando os campos da tabela so selecionados, o ndice criado e ao arquivo


adicionado um campo de ponteiro. Este campo indica qual o a seqncia da linha
da tabela.

O ndice de uma chave primria chamado de ndice primrio os demais ndice


da tabela sero chamados de ndices secundrios.

3.5.1 Rotina interna de indexao e pesquisa

Quando um ndice criado as rotinas internas do banco de dados encarregam


de utilizar a melhor lgica de indexao do arquivo.

Quando efetuada uma pesquisa na tabela, o sistema de banco de dados se


encarrega de escolher o melhor ndice para a pesquisa.

3.5.2 Consultando ndices

Para consultar se uma tabela contm ndices utilizar a transao SE11.

Na tela clicar no boto ndices.

Ser apresentada a tabela de ndices para a tabela, ou uma mensagem indicando que no
foram criados ndices para a tabela.

17
Na tela de listagem de ndices, d um duplo clique em um dos ndices para exibir os
atributos.

3.6 Operadores Relacionais

Inner join

Recupera todos pares correspondentes de registros em duas tabelas, descartando os


registros sem correspondncia.
Relao entre chave estrangeira e a chave primria.

Outer join

Recupera todos os registros correspondentes e no correspondentes entre a chave


primria e chave estrangeira.

18
3.7. Estruturas

Declarada no ABAP Dictionary, o agrupamento de campos sem a propriedade de


armazenamento dos dados, como nas tabelas.

Uma estrutura, quando chamada em um programa, cria uma rea de memria no ABAP
para armazenamento de uma linha de informao.

Essa linha de informao fica na memria virtual e no gravada no banco de dados,


portando, ao trmino da execuo do programa os dados da estrutura so apagados da
rea de memria.

3.8 Views (Vises)

Utilizamos vises quando precisamos unir campos de varias tabelas em uma nica
visualizao.

TAB Tabelas /condies join

Nesta TAB temos duas colunas, tabelas e condies join.


19
Na coluna tabelas so declaradas as tabelas que sero utilizadas na View
Na coluna de condies de unio (Join) so declarados os campos e unies.

TAB - Cpos. Viso

Local onde so declarados os campos que formar a estrutura da viso.

TAB Condies de seleo

Local onde informada as condies de seleo da View

TAB - Status at.

Acesso S Ler ou Ler e modificar.


A opo modificar s valida para Views de uma tabela.
Permisses de exibio e atualizao.

3.9 Criando Uma tabela

1. Criar um Domnio

Entrar na transao SE11.

20
Campo Domnio, informe o nome tcnico.

Clique em Criar;

No campo Descrio Breve, informar descrio.

TAB Definio Quadro Formato, informar:

Campo Categoria dados;


Nm. Posies;
Decimais;

Informe o pacote e a ordem, salve e ative o objeto de domnio;

21
2. Criar elemento de Dados

Entrar na transao SE11.

Na TAB categoria de dados

campo domnio informar nome tcnico.

Clique em Criar.

22
Selecione Elemento de Dados no Radio Button.

Informar: Descrio breve.

TAB Definies.

Campo domnio Informe o nome do Domnio criado.

23
TAB Denomin.

Campo breve: informar nome abreviado.


Campo Mdio: informar nome.
Campos Longa e Ttulo: informar nome completo.

Tecle [ Enter] e os comprimentos aparecero.

24
Salve o objeto no pacote e informe a ordem utilizada.

25
3. Criar tabela

Entrar na Transao SE11.

Informar nome da tabela e clicar em Criar.

26
Campos: informar nome do campo
Chave primaria: Flegar se for a chave primaria
Tipo de Campo: Informar elemento de dados

TAB Campos Moeda/Quantidade

Para os campos do tipo moeda ou quantidade, tem que informar uma tabela de
Referncia.

27
Campos: informar Tabelas de referncia.

Clicar em salvar.

Verifique que o status da tabela, informado ao lado do nome tcnico da tabela,


ainda est como novo.

3.9.1. Atualizao de opes tcnicas

28
Na tela de atualizao da tabela, clique em Configuraes tcnicas;

Parmetros de memria lgicos;

Tipo de dados = APPL0;

Categor. Tamanho = 0;

Salvar;
Menu  Configuraes  Verificar;
Veja o log de ativao, se existir, e proceda com as correes.

Ative a tabela.

29
3.9.1 Consultando objetos criados

Para consultar os objetos criados entrar na SE80.

30
4. REPORTS

Reports so programas executveis no SAP.


H trs tipos de listas: Simple Lists, Interactive Lists e SAP Grid Control (ALV, ALV Tree).

4.1 Simple List

O comando WRITE ir indicar a gerao de uma lista para o buffer. Quando a sada da
lista j foi construda no buffer, o sistema gera a imagem de tela do buffer da lista

4.1.1 Eventos Utilizados

Os principais eventos para processamento de relatrios so:

Evento para inicializar as variveis. Deve ser o primeiro evento a


INITIALIZATION ser colocado no programa. No um evento obrigatrio.

TABLES ....
DATA .....
.....
INITIALIZATION.

31
Evento usado para marcar o inicio de um conjunto de selees
START-OF-SELECTION de dados.

START-OF-SELECTION.

SELECT marc~matnr marc~werks t001w~name1 makt~maktx


INTO TABLE t_marc
FROM marc
INNER JOIN t001w ON marc~werks = t001w~werks
INNER JOIN makt ON marc~matnr = makt~matnr
and makt~spras = sy-langu
WHERE t001w~werks IN S_CENTRO
AND marc~matnr IN S_MATERI.

END-OF-SELECTION.

END-OF-SELECTION Evento usado para marcar o fim das selees de dados.

START-OF-SELECTION.
SELECT marc~matnr marc~werks t001w~name1 makt~maktx
INTO TABLE t_marc
FROM marc
INNER JOIN t001w ON marc~werks = t001w~werks
INNER JOIN makt ON marc~matnr = makt~matnr
and makt~spras = sy-langu
WHERE t001w~werks IN S_CENTRO
AND marc~matnr IN S_MATERI.
END-OF-SELECTION.

4.1.2 Controle de nivel na tabela interna

Ao processar tabelas internas com o comando LOOP, voc pode executar


processamentos.
com nvel de controle, utilizando tais parmetros:

AT FIRST Comando dentro do Loop, identifica o primeiro


registro de uma tabela percorrida. (quebra)
SORT BY campo.
LOOP AT t_tabela.
AT FIRST. .
ENDAT.
...
ENDDLOOP.

32
AT NEW campo Comando dentro do LOOP, identifica o primeiro
registro de uma seqncia (quebra)
SORT BY campo.
LOOP AT t_tabela.
AT NEW campo.
.
ENDAT.
...
ENDDLOOP.

AT LAST Comando dentro do Loop, identifica o ultimo registro


de uma tabela percorrida. (quebra)
SORT BY campo.
LOOP AT t_tabela.
....
AT LAST. .
ENDAT.
ENDDLOOP.

AT END OF Comando dentro do Loop, identifica o ultimo registro


de uma seqncia. (quebra)
SORT BY campo.
LOOP AT t_tabela.
.
AT END of campo
ENDAT.
ENDDLOOP.

4.1.3 Comando Message

MESSAGE-ID Comando usado para definir classe de mensagens.


MESSAGE Comando usado para chamar mensagens.

* MESSAGE-ID nnn deve ser usado junto com o comando REPORT, no inicio do
programa.
Tipo de mensagens:
E - Erro
A - Aborta
W - Aviso
I - Informao
S - Sucesso

REPORT LINE-COUNT 80 LINE-SIZE 60 MESSAGE-ID Z01.


MESSAGE W001. Mensagem com avisos (warnings)
MESSAGE E002. Mensagem com erros.
33
MESSAGE S003. Mensagem de sucesso.

* Tambm podemos passar parmetros para as mensagens.


* Na criao da mensagem na classe de mensagens devemos colocar o smbolo & para
indicar a passagem de um parmetro.
MESSAGE S003 WITH text-001.

4.1.4 Alguns comandos ABAP

AT LINE-SELECTION Ao selecionar a linha no relatrio


AT LINE-SELECTION.
SELECT SINGLE maktx
FROM makt
INTO s_maktx
WHERE spras = sy-langu
AND matnr = s_matnr-low.
CHECK sy-subrc NE 0.
CLEAR s_maktx.
MESSAGE e208(00) WITH text-004.

AT SELECTION-SCREEN Verifica o resultado de uma varivel de seleo


SELECTION-SCREEN BEGIN OF BLOCK b_janela WITH FRAME TITLE text-001.
SELECT-OPTIONS s_material FOR T_MARC-MATNR.
SELECTION-SCREEN END OF BLOCK b_janela.
AT SELECTION-SCREEN ON s_material.

AT USER-COMMAND Ao comando do usurio


SET PF-STATUS BOTAO.
IITIALIZATION.
AT USER-COMMAND.
IF SY-UCOMM = DOWNLOAD.
PERFORM ZF_DOW_NOVO.
ENDIF.

APPEND Gravar em tabela interna


APPEND t_tabela.

CASE WHEN ENDCASE Tratamento de casos

34
CASE okcode.
WHEN 'SIM'.
...
WHEN 'NAO'.
...
WHEN OTHERS.
...
ENDCASE.

Se a condio forverdadeira continua logo aps a


CHECK
verificao, se no aborta a execuo.
CHECK SY-SUBRC = 0.

CLEAR Limpa o contedo de uma varivel ou tabela


CLEAR var.
CLEAR t_tabela.

Organiza a tabela interna com todas as descries a


COLLECT esquerda totalizando os campos numricos com a
mesma chave.
COLLECT t_tabela.

COMMIT WORK Efetiva as alteraes no Banco de dados


COMMIT WORK.

CONSTANTS Criar constantes que podem ser usadas em todo o


programa
CONSTANTS c_tipo TYPE C VALUE ;.

CONCATENATE Agrupa varias variveis em uma nica varivel


CONCATENATE abc XXX INTO var3. var3 = abcXXX

END-OF-PAGE Marca o final de um cabealho de relatrio

35
TOP-OF-PAGE.
WRITE NOVO CABECALHO DEFINIDO PELO PROGRAMA.
END-OF-PAGE.

FORMAT COLOR Usado para formatar a sada do comando WRITE


FORMAT COLOR COL_TOTAL.
WRITE 'QUALQUER COISA'.
FORMAT COLOR COL_KEY.
WRITE / 'QUALQUER COISA'.
FORMAT COLOR COL_BACKGROUND. " VOLTA AO PADRO

FREE Libera espao utilizado por uma tabela interna na


memria
FREE t_tabela.

HIDE Usado para definir campos para uma segunda janela


em relatrios.
SORT T_MARC BY matnr werks lgort.
LOOP AT T_MARC.
WRITE /5 T_MARC-MATNR.
WRITE 18 T_MARC-MAKTX.
WRITE 60 T_MARC-WERKS.
WRITE 80 T_MARC-NAME1.
HIDE :T_MARC-MATNR,T_MARC-MAKTX,T_MARC-WERKS, T_MARC-NAME1.
ENDLOOP.

IF .. ELSE .. ENDIF. Comando de deciso


IF var = A.
....
ELSE.
....
ENDIF.

IF NOT .. IS INITIAL Verifica se uma varivel ou tabela interna esta vazia.

36
IF NOT var IS INITIAL.
....
ENDIF.

INSERT Insere o contedo de uma varivel em uma tabela


transparente
INSERT tabela.

LEAVE PROGRAM Comando usado para sair de um programa on-line.


LEAVE PROGRAM.

LEAVE TO SCREEN Comando usado para mudar de tela dentro de


programas on-line.

LEAVE TO SCREEN 9000. 9000 , numero da tela

LINE-SIZE Numero de colunas por pagina.


LINE-COUNT Numero de linhas por pagina.

* Estes comandos so usados dentro do comando REPORT no inicio do programa.


REPORT LINE-COUNT 60 LINE-SIZE 130.

LOOP AT Comando usado para ler uma tabela interna.

LOOP AT t_tabela.
.
.
ENDDLOOP.

MODIFY Comando usado para modificar uma tabela interna.

MODIFY t_tabela. modifica toda a linha da tabela

MOVE Move todo o contedo de uma tabela para outra.

37
Os campos devem ser os mesmos.

MOVE tabela TO tabela.


MOVE wa TO wa.

MOVE-CORRESPONDING Move apenas os campos correspondente entre 2


tabelas.
LOOP AT t_tabela.
MOVE-CORRESPONDING t_tabela TO tabela.
INSERT tabela.
ENDLOOP.
COMMIT WORK.

NO STANDARD PAGE HEADING Ignora o cabealho STD do R/3


* Deve ser usado em conjunto com o comando REPORT
REPORT LINE-COUNT 80 LINE-SIZE 60 MESSAGE-ID Z01 NO STANDARD PAGE HEADING.

PARAMETERS Cria parmetros de seleo para janelas.


PARAMETERS P_WERKS TYPE T_001W-WERKS. com os mesmos atributos do campo
PARAMETERS CODIGO(3) TYPE C.
* para criar radio-button
PARAMETERS p_bot1 RADIOBUTTON GROUP g1.
PARAMETERS p_bot2 RADIOBUTTON GROUP g1.
* faz com que o parmetro seja obrigatrio.
PARAMETERS p_matnr TYPE T_MARA-MATNR OBLIGATORY.
* RLGRAP-FILENAME valor padro para receber nomes de arquivos a importar e
exportar arquivos
PARAMETERS P_ARQ TYPE RLGRAP-FILENAME. " OBLIGATORY.
* PARA CRIAR VARIANTS DE EXIBIO PARA RELATRIOS ALV

READ TABLE Usado para ler um registro especifico.


SORT t_tabela1 BY campo.
LOOP AT t_tabela1.
* com o comando BINARY SEARCH a pesquisa fica mais rpida.
READ TABLE t_tabela2 WITH KEY campo = t_tabela1-campo BINARY SEARCH.
* aps o READ TABLE devemos verificar o resultado
IF SY-SUBRC EQ 0.
.... verdadeiro ( encontrou o dado )
ELSE.
ENDIF.

38
ENDLOOP.

REFRESH Limpa o contedo de uma tabela.


REFRESH t_tabela.

REPORT Comando para iniciar um programa.


REPORT.

SELECT
Select Single vbeln , erdat
From vbak
Into wa_vbak
Where vbeln = p_vbeln

*Utilizar somente com a chave primaria

Select vbeln erdat ernan


From vbap
Up to 1 row
Into wa_vbap *into table t_vbap
Where ernan = p_ernan
Endselect. somente no Up to Row

*Trs o primeiro registro da tabela


* Utilizar somente quando no tiver a chave primaria

Select vbeln
From vbak
Into table t_vbak
Where vbeln in s_vbeln

* Sempre que for utilizar For all Entries utilizar If SY-SUBRC ou CHECK
Select campo
From vbap
Into table t_vbap
For all entries in t_vbak
Where vbeln = t_vbak-vebln

Select A~vbeln A~erdat B~posnr


Into table t_rel
39
From vbak as A inner join vbap as B
On A~vbeln = B~vbeln
Where A~vbeln in s_vbeln.

SELECTION-OPTIONS Comando usado para colocar opes de seleo.


SELECTION-SCREEN BEGIN OF BLOCK b_janela WITH FRAME TITLE text-001.
SELECT-OPTIONS S_MATERI FOR T_MARC-MATNR.
SELECT-OPTIONS S_CENTRO FOR T_MARC-WERKS.
SELECTION-SCREEN END OF BLOCK b_janela.

SELECTION-SCREEN Cria um BOX na janela


* PARA CRIAR UM BOX NA JANELA
* SELECTION-SCREEN BEGIN OF BLOCK nome_do_bloco WITH FRAME TITLE
* nome_do_elemento_de_texto
* -> DEPOIS COLOCAR OS SELECT-OPTIONS ( variveis )
* FECHAR COM : SELECTION-SCREEN END OF BLOCK nome_do_bloco
* clicar duas vezes sobre o nome_do_bloco para colocar o nome
* que ira aparecer na tela
SELECTION-SCREEN BEGIN OF BLOCK b_janela WITH FRAME TITLE text-001.
SELECT-OPTIONS S_MATERI FOR T_MARC-MATNR.
SELECT-OPTIONS S_CENTRO FOR T_MARC-WERKS.
PARAMETERS P_BOT1 RADIOBUTTON GROUP b1.
PARAMETERS P_BOT2 RADIOBUTTON GROUP b1.
SELECTION-SCREEN END OF BLOCK b_janela.

SET PF-STATUS Comando usado para criar botes para serem


exibidos em relatrios.
* depois dar dublo click sobre o nome do boto para criar o objeto.
SET PF-STATUS nome_do_boto.

SET TITLEBAR Comando usado para criar TITULOS de janelas.


* depois dar dublo click sobre o nome do titulo para criar o objeto.
SET TITLEBAR NNN.

SET PARAMETERS Usado para passar parmetros para chamada de


funes.
* SET PARAMETER ID NN FILED valor do campo para chamar transaes passando
* parmetros
SET PARAMETERS ID VF' FIELD t_alv-vbeln.
CALL TRANSACTION 'VF03' AND SKIP FIRST SCREEN.

40
SKIP Comando usado para pular linhas em relatrio.
WRITE IMPRIME UMA LINHA.
SKIP 2. Pular duas linhas.

SORT Comando usado ordenar tabelas internas


SORT t_tabela BY campo.

SPLIT .. AT .. INTO Usado para ler um arquivo externo e gravar na tabela.


LOOP AT t_tabela.
CLEAR t_tempo.
* SPLIT tabela_interna AT delimitador_do_arquivo INTO campos que iro receber os
dados na
* sequncia do arquivo
* c_tipo o delimitardor do arquivo texto
SPLIT t_tabela-texto01 AT c_tipo INTO T_TEMPO-BUKRS
T_TEMPO-EKORG
T_TEMPO-KTOKK
T_TEMPO-NAME1
T_TEMPO-SORTL
T_TEMPO-ORT01
T_TEMPO-PSTLZ
T_TEMPO-LAND1
T_TEMPO-REGIO.
APPEND t_tempo.
ENDLOOP.

TABLES Usado para abertura de tabelas Standard

TABLES : tabela1, tabela2, tabela3.

TOP-OF-PAGE Marca o inicio de um cabealho de relatrio


TOP-OF-PAGE.
WRITE NOVO CABECALHO DEFINIDO PELO PROGRAMA.
END-OF-PAGE.

TYPES Define os tipos de variveis e pode ser usado para


definir dados de tabela interna.
DATA var1 TYPE I. define uma varivel do tipo inteiro
* define um tipo com os campos da tabela
TYPES:
BEGIN OF tipo_tabela
vbeln TYPE vbrk-vbeln,
41
kdgrp TYPE vbrk-kdgrp,
netwr TYPE vbrk-netwr,
END OF tipo_tabela.
* cria a tabela definindo com o tipo criado acima usando o header line.
DATA t_tabela TYPE tipo_vbrk OCCURS 0 WITH HEADER LINE.

ULINE Server para colocar uma linha continua em relatrios


para fazer separaes.
ULINE imprime uma linha continua

UPDATE Atualiza um tabela transparente


UPDATE tabela.

WRITE Comando usado para sada de impressora ou tela


WRITE ESTA LINHA SERA IMPRESSSA.
WRITE ESTA LINHA SERA COLOCADA NA MESMA LINHA QUE A PRIMEIRA.
WRITE / COM A / FAZ UMA QUEBRA E O TEXTO SERA IMPRESSA NA LINHA DE BAIXO.
WRITE 5 IMPRIME NA POSIO 5.

SY-DATUM Retorna a data do sistema


SY-LANGU Retorna o idioma de logon do usurio
SY-MANDT Retorna o mandante do sistema
SY-PAGNO Retorna a pagina atual de um relatrio
SY-SUBRC Retorna o valor de uma pesquisa ou condio
SY-TABIX Retorna o ndice de uma tabela em loop
SY-UCOMM Retorna o nome de um boto precionado
SY-UNAME Retorna o nome do usurio
SY-VLINE Efetua a fechamento de bordas em um relatrio
SY-TCODE Cdigo da transao

Formato de Sada Cores


Podemos exibir cores na sada de um relatrio
Atravs do comando WRITE, podemos definir a cor da linha ou coluna do relatrio.

42
Hotspots

Hotspots so reas especiais para relatrios. Se o usurio clicar no campo que esteja
preparado com o hotspots, o evento acionado (Evento AT LINE-SELECTION).

Abaixo Uma lista com um campo Hotspot ficaria assim:

Programa Report Simples

*&---------------------------------------------------------------------*
*& Report Z_SD_ORDENSVENDA_37
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT z_sd_ordensvenda_37 NO STANDARD PAGE HEADING.

*Tabelas

TABLES: vbak,vbap,vbuk,makt.

43
*Tipos

TYPES: BEGIN OF y_vbap,


matnr TYPE vbap-matnr,
vbeln TYPE vbap-vbeln, " Documento de vendas
posnr TYPE vbap-posnr, " Item do documento de vendas
waerk TYPE vbap-waerk, " Moeda do documento SD
netwr TYPE vbap-netwr, " Valor lquido da ordem na moeda do documento
kwmeng TYPE vbap-kwmeng, " Quantidade da ordem acumulada em unidade de
venda
END OF y_vbap,

BEGIN OF y_vbak,
vbeln TYPE vbak-vbeln, " Documento de vendas
erdat TYPE vbak-erdat, " Data de criao do registro
netwr TYPE vbak-netwr, " Valor lquido da ordem na moeda do documento
waerk TYPE vbak-waerk, " Moeda do documento SD
bstnk TYPE vbak-bstnk, " N pedido do cliente
END OF y_vbak,

BEGIN OF y_vbuk,
vbeln TYPE vbuk-vbeln, " Documento de vendas
gbstk TYPE vbuk-gbstk, " Status Global Processamento de Vendas
END OF y_vbuk,

BEGIN OF y_makt,
matnr TYPE makt-matnr, " N do material
maktx TYPE makt-maktx, " Texto breve de material
END OF y_makt,

BEGIN OF y_vtotal,
netwr TYPE vbak-netwr, " Valor lquido da ordem na moeda do documento
END OF y_vtotal.

* Tabelas Transparentes

DATA: t_vbap TYPE TABLE OF y_vbap,


t_vbak TYPE TABLE OF y_vbak,
t_vbuk TYPE TABLE OF y_vbuk,
t_makt TYPE TABLE OF y_makt,
* t_relat TYPE TABLE OF y_relat,
* t_relat1 TYPE TABLE OF y_relat1.
t_vtotal TYPE TABLE OF y_vtotal.

* Work Areas

DATA: wa_vbap TYPE y_vbap,


wa_vbak TYPE y_vbak,
wa_vbuk TYPE y_vbuk,
wa_makt TYPE y_makt,
wa_vtotal TYPE y_vtotal.

*Variaveis

DATA: vtotal TYPE i VALUE 0.

44
DATA: v_bot(1) TYPE c .
DATA: cor TYPE c.

*Constantes

* Eventos

* Tela de Seleo

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

SELECT-OPTIONS s_vbeln FOR vbap-vbeln. " Pesquisa n Documento


SELECT-OPTIONS s_erdat FOR vbak-erdat. " Pesquisa Data de Criao

SELECTION-SCREEN BEGIN OF LINE.


SELECTION-SCREEN COMMENT 1(28) text-003.
SELECT-OPTIONS s_matnr FOR vbap-matnr NO-EXTENSION
NO INTERVALS.
PARAMETER s_maktx TYPE makt-maktx.
* SELECT-OPTIONS s_maktx FOR makt-maktx NO-EXTENSION
* NO INTERVALS.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF BLOCK b_janela1 WITH FRAME TITLE text-002.


PARAMETERS p_bot1 RADIOBUTTON GROUP b1.
PARAMETERS p_bot2 RADIOBUTTON GROUP b1.
PARAMETERS p_bot3 RADIOBUTTON GROUP b1.
SELECTION-SCREEN END OF BLOCK b_janela1.

SELECTION-SCREEN END OF BLOCK d_janela.

INITIALIZATION.

AT SELECTION-SCREEN OUTPUT.

LOOP AT SCREEN.
CHECK screen-name = 'S_MAKTX'.
screen-input = 0.
screen-output = 1.
screen-display_3d = ' '.
MODIFY SCREEN.
ENDLOOP.

AT LINE-SELECTION.
SELECT SINGLE maktx
FROM makt
INTO s_maktx
WHERE spras = sy-langu
AND matnr = s_matnr-low.

45
CHECK sy-subrc NE 0.
CLEAR s_maktx.
MESSAGE e208(00) WITH text-004.

START-OF-SELECTION.

PERFORM zf_seleciona_dados.
PERFORM zf_imprime_dados.
PERFORM zf_imprime_dados1.

*&---------------------------------------------------------------------*
*& Form zf_seleciona_dados
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zf_seleciona_dados .

IF p_bot1 = 'X'.
v_bot = 'A'.
ELSEIF
p_bot2 = 'X'.
v_bot = 'B'.
ELSE.
p_bot3 = 'X'.
v_bot = 'C'.
ENDIF.

SELECT vbeln erdat netwr waerk bstnk


FROM vbak
INTO TABLE t_vbak
WHERE vbeln IN s_vbeln AND erdat IN s_erdat.

SELECT vbeln gbstk


FROM vbuk
INTO TABLE t_vbuk
FOR ALL ENTRIES IN t_vbak

46
WHERE vbeln = t_vbak-vbeln AND gbstk = v_bot.

ENDFORM. " zf_seleciona_dados


*&---------------------------------------------------------------------*
*& Form zf_imprime_dados
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zf_imprime_dados .

ULINE.
WRITE:/ sy-vline,
(10) text-008, sy-vline,
(10) text-009, sy-vline,
(28) text-010, sy-vline,
(05) text-011, sy-vline,
(10) text-012, sy-vline.
ULINE.
LOOP AT t_vbak INTO wa_vbak.
IF cor IS INITIAL.
FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
cor = 'x'.
ELSE.
FORMAT COLOR COL_KEY INTENSIFIED OFF.
CLEAR cor.
ENDIF.

LOOP AT t_vbak INTO wa_vbak.


READ TABLE t_vbuk INTO wa_vbuk WITH KEY vbeln = wa_vbak-vbeln.
IF sy-subrc = 0.
WRITE: / sy-vline,
(10) wa_vbak-vbeln HOTSPOT USING EDIT MASK'__________', sy-vline,
(10) wa_vbak-erdat DD/MM/YYYY, sy-vline,
(30) wa_vbak-bstnk, sy-vline,
(03) wa_vbak-waerk, sy-vline,
(10) wa_vbak-netwr, sy-vline.
HIDE wa_vbak-vbeln.
ENDIF.
ENDLOOP.
ULINE.

ENDLOOP.

47
ENDFORM. " zf_imprime_dados
*&---------------------------------------------------------------------*
*& Form zf_imprime_dados1
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zf_imprime_dados1 .

LOOP AT t_vbap INTO wa_vbap.


AT NEW vbeln.
REFRESH t_vtotal.
WRITE: / text-007,
wa_vbap-vbeln.
ULINE.
ENDAT.

READ TABLE t_makt INTO wa_makt WITH KEY matnr = wa_vbap-matnr.


WRITE: / sy-vline,

(05) wa_vbap-posnr, sy-vline,


(22) wa_makt-maktx, sy-vline,
(16) wa_vbap-matnr, sy-vline,
(10) wa_vbap-waerk, sy-vline,
(10) wa_vbap-netwr, sy-vline.

wa_vtotal-netwr = wa_vbap-netwr.
COLLECT wa_vtotal INTO t_vtotal.

AT END OF vbeln.
ULINE.
LOOP AT t_vtotal INTO wa_vtotal.

WRITE: / text-006 COLOR COL_NORMAL,


wa_vtotal-netwr.
ENDLOOP.
ENDAT.

ENDLOOP.

ENDFORM. " zf_imprime_dados1

4.2 ALV

48
O Abap List Viewer (ALV) uma ferramenta que padroniza e simplifica o uso de listas e
relatrios no sistema R/3 tanto para o desenvolvedor tanto para o usurio que interage
com o relatrio.
O ALV atravs de suas funes e estruturas torna o desenvolvimento mais simples na
medida que economiza significativas linhas de cdigo como por exemplo no tratamento de
quebras, totais, subtotais, cores e outras vantagens que veremos a seguir.

*&---------------------------------------------------------------------*
*& Report ZSD_ALV1_37
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZSD_ALV1_37.
*Declarao do grupo de tipos SLIS que contm as definies necessrias
*para interagir com as funes ALV
TYPE-POOLS: slis.

*Declarao da tabela para uso na tela de seleo


TABLES: MAKT.

TYPES:BEGIN OF y_cabecalho,
matnr TYPE mara-matnr, " N do material
ersda TYPE mara-ersda, " Data de criao
mtart TYPE mara-mtart, " Tipo de material
matkl TYPE mara-matkl, " Grupo de mercadorias
ntgew TYPE mara-ntgew, " Peso lquido
maktx TYPE makt-maktx,
box(1) TYPE c,

END OF y_cabecalho.

*Declarao da tabela interna de sada


DATA: t_cabecalho TYPE TABLE OF y_cabecalho,

*Tabela interna com a definio da estrutura


t_fieldcat TYPE slis_t_fieldcat_alv,
t_sort TYPE slis_t_sortinfo_alv.

*Tabela interna com o Cabealho


DATA: t_listheader TYPE slis_t_listheader.

*Declarao de estrutura de Layout


DATA: w_layout TYPE slis_layout_alv.

*Tela de seleo com a ordem de venda


SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_mara FOR makt-matnr.
SELECTION-SCREEN END OF BLOCK b1.

49
*----------------------------------------------------------------------
* INITIALIZATION *
*----------------------------------------------------------------------*
INITIALIZATION.
*Declarao da varivel que armazenar o nome do programa e ser
*enviada para a funo de chamada do ALV
DATA: v_repid TYPE sy-repid. "Nome do Programa

*Passagem do nome do programa para a varivel criada


v_repid = sy-repid.

*----------------------------------------------------------------------*
* START-OF-SELECTION *
*----------------------------------------------------------------------*
START-OF-SELECTION.
*Chamada da rotina para carregar a tabela interna
PERFORM zf_buscar_dados.

PERFORM zf_top_of_page.
PERFORM zf_cabecalho.
*Indicao de campos para exibio na lista
PERFORM zf_fieldcat_init.
*Definio dos parmetros de layout que sero utilizados

PERFORM zf_ordenar_lista.

PERFORM zf_layout_build.

PERFORM zf_list_display.

*----------------------------------------------------------------------*
* END-OF-SELECTION *
*----------------------------------------------------------------------*
END-OF-SELECTION.
*Chamada da rotina para construo da lista ALV Grid

FORM zf_layout_build.

*No mostrar descrio das colunas


* w_layout-no_colhead = 'X'.

*Imprimir linha clara e escura alternadamente


w_layout-zebra = 'X'.

*No imprimir divises entre colunas


* w_layout-no_vline = 'X'.

*Permite edio em todos os campos


* w_layout-edit = 'X'.

50
*Abre a lista com as colunas do tamanho necessrio para mostragem
w_layout-colwidth_optimize = 'X'.

*Escreve na barra de ttulo


w_layout-window_titlebar = text-002.

*No permite mostragem da linha de total


* w_layout-no_totalline = 'X'.

*No permite mostragem de subtotais


* w_layout-no_subtotals = 'X'.

*Mostra os totais na parte de cima da lista


* w_layout-totals_before_items = 'X'.

*Permitir mudana de nves de quebra para subtotais


* w_layout-group_change_edit = 'X'.

*Declarao de campo check box


w_layout-box_fieldname = 'BOX'.
w_layout-box_tabname = 'T_CABECALHO'.

ENDFORM. " zf_layout_build

*&---------------------------------------------------------------------*
*& Form ZF_LIST_DISPLAY
*&---------------------------------------------------------------------*
* Chamada da funo de abertura do ALV com todas as informaes
*----------------------------------------------------------------------*
FORM zf_list_display.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER = ' '
* I_BUFFER_ACTIVE = ' '
i_callback_program = v_repid
* I_CALLBACK_PF_STATUS_SET = ' '
* I_CALLBACK_USER_COMMAND = 'USER COMMAND'
i_callback_top_of_page ='ZF_TOP_OF_PAGE'
* I_CALLBACK_HTML_TOP_OF_PAGE =
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
is_layout = w_layout "Variao de Layout
it_fieldcat = t_fieldcat "Estrutura utilizada
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
IT_SORT = t_sort
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
i_save = 'A' "Permite salvar layouts
* IS_VARIANT =
* IT_EVENTS =

51
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP = 0
* I_HTML_HEIGHT_END = 0
* IT_ALV_GRAPHICS =
* IT_HYPERLINK =
* IT_ADD_FIELDCAT =
* IT_EXCEPT_QINFO =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = t_cabecalho "Tabela Interna
EXCEPTIONS
program_error = 1
OTHERS = 2.

*Verifica retorno da funo


IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form zf_ordenar_lista
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form zf_ordenar_lista .

*Estrutura de ordenao inicial para lista


DATA: w_sort TYPE slis_sortinfo_alv.

*Montar estrutura
CLEAR w_sort.
w_sort-spos = 1. " Seqncia de ordenao
w_sort-fieldname = 'MATNR'. " Nome do campo
w_sort-tabname = 'T_CABECALHO'. " Nome da tabela de lista
w_sort-up = 'X'. " Ordenao crescente
w_sort-expa = 'X'. " Expandir lista
APPEND w_sort TO t_sort.

CLEAR w_sort.
w_sort-spos = 2. " Seqncia de ordenao
w_sort-fieldname = 'NTGEW'. " Nome do campo
w_sort-tabname = 'T_CABECALHO'. " Nome da tabela de lista
w_sort-up = 'X'. " Ordenao crescente

52
* w_sort-expa = 'X'. " Expandir lista
w_sort-subtot = 'X'. " Subtotal
*
APPEND w_sort TO t_sort.

endform. " zf_ordenar_lista


*&---------------------------------------------------------------------*
*& Form zf_buscar_dados
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form zf_buscar_dados .

SELECT a~matnr a~ersda a~mtart a~matkl a~ntgew t~maktx

INTO TABLE t_cabecalho


FROM mara as a inner join makt as t on a~matnr = t~matnr
WHERE a~matnr in s_mara and spras = sy-langu.

endform. " zf_buscar_dados


*&---------------------------------------------------------------------*
*& Form zf_fieldcat_init
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form zf_fieldcat_init .
*Estrutura
DATA: w_fieldcat TYPE slis_fieldcat_alv.

*Limpar tabela
CLEAR t_fieldcat.

*Cd. doc. venda


CLEAR w_fieldcat.
w_fieldcat-fieldname = 'MATNR'.
w_fieldcat-ref_tabname = 'MARA'.
APPEND w_fieldcat TO t_fieldcat.

*Data de Criao
CLEAR w_fieldcat.
w_fieldcat-fieldname = 'ERSDA'.
w_fieldcat-ref_tabname = 'MARA'.
APPEND w_fieldcat TO t_fieldcat.

*Criado por
CLEAR w_fieldcat.
w_fieldcat-fieldname = 'MTART'.
w_fieldcat-ref_tabname = 'MARA'.
APPEND w_fieldcat TO t_fieldcat.

*Tipo de Ordem

53
CLEAR w_fieldcat.
w_fieldcat-fieldname = 'MATKL'.
w_fieldcat-ref_tabname = 'MARA'.
APPEND w_fieldcat TO t_fieldcat.

*Valor lq. da ordem


CLEAR w_fieldcat.
w_fieldcat-fieldname = 'NTGEW'.
w_fieldcat-do_sum = 'X'.
w_fieldcat-ref_tabname = 'MARA'.

APPEND w_fieldcat TO t_fieldcat.

*Canal de distribuio
CLEAR w_fieldcat.
w_fieldcat-fieldname = 'MAKTX'.
w_fieldcat-ref_tabname = 'MAKT'.
APPEND w_fieldcat TO t_fieldcat.
endform. " zf_fieldcat_init
*&---------------------------------------------------------------------*
*& Form zf_cabecalho
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form zf_cabecalho .

DATA: w_listheader TYPE slis_listheader.

CLEAR t_listheader[].

CLEAR w_listheader.
w_listheader-typ = 'H'.
w_listheader-info = text-013.
APPEND w_listheader TO t_listheader.

CLEAR w_listheader.
w_listheader-typ = 'S'.
w_listheader-info = text-012.
APPEND w_listheader TO t_listheader.

CLEAR w_listheader.
w_listheader-typ = 'A'.
w_listheader-info = text-014.
APPEND w_listheader TO t_listheader.

endform. " zf_cabecalho


*&---------------------------------------------------------------------*
*& Form zf_top_of_page
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text

54
*----------------------------------------------------------------------*
FORM zf_top_of_page .

CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'


EXPORTING
it_list_commentary = t_listheader
i_logo = 'ENJOYSAP_LOGO'.
* I_END_OF_LIST_GRID =
* I_ALV_FORM =

ENDFORM. " zf_top_of_page

55
5. DIALOG

5.1 Module Pool

Cada tela tem um evento que ocorre antes da apresentao da tela e um evento que
ocorre depois do usurio fazer alguma ao na tela gerada.

Esses eventos so

PBO (Process Before Output)


PAI (Process After Input)

Para ciar programas Module Pool utilizar a transao SE80.

Padro de nome de um Module Pool:


SAPMZ........ Sempre iniciado por essas cinco letras.

Module Pool (Transao SE80)

56
Informar o nome do programa a ser criado no campo em destaque abaixo:

Selecionar:

E Informar o nome da
aplicao e clicar no boto
ENTER.
Clicar em sim! (Desejo criar o objeto).

Confirmar utilizando o boto ENTER do teclado.

Ele pergunta se iremos querer o include TOP, que o include onde iremos declarar todas
as nossas variveis globais. Devemos marcar que iremos utilizar o include TOP.

57
Informar O Ttulo do programa e clicar no boto gravar.

Informar a request a ser gravada ou objeto local.

Criar uma tela para o programa:


Clicar com o boto direito sobre o nome do programa e selecionar Tela.

58
Informar descries das telas:

E clicar em .

59
Informar o Nome OK_CODE, que
ser responsvel por armazenar o
cdigo do comando efetuado pelo
usurio, seguindo a Idia do SY-
UCOOM.

Clicar em Layout ser Exibido o modo de edio de tela.

60
Utilizar o F6 para localizar os campos das tabelas:

Informar o nome da tabela com


campo ou somente o nome da
tabela a ser localizado. Apertar o
ENTER e ser exibido os campos.

Selecionar os campos que deseja que seja exibido em sua tela:

61
E apertar Enter. S posicionar os campos na tela e pronto.
Obs: Para mais opes com o design da tela, utilizar Barra de ferramentas ao lado
esquerdo.

62
Para checar os detalhes de cada campo, apertar o f2 em cima do mesmo, ser exibida a
tela:

Criar transao para o programa.


Clicar com o boto direito sobre o nome do programa e selecionar transao.

Informar o cdigo da transao (campo a escolha), uma descrio. Apertar ENTER.


63
Tipo do programa
a ser utilizado.

Informar o nome do programa, nome da tela e todos as Capacidades de Gui.

Para testar se a tela est Ok. Executar a o nome da transao na barra com o /o para abrir
uma nova janela .
64
A tela dever seguir o modelo abaixo:

Dever ser retirado o comentrio dos INCLUDE e dar um clique duplo sobre eles, ser
solicitado pra criar o include no programa!

PROCESS BEFORE OUTPUT aonde ocorre todos os processamentos antes da tela


ser exibida.
PROCESS AFTER INPUT aonde ocorre o processamento aps a interao com o
usurio.

65
Dica: Sempre que ocorre a interao do usurio com o programa, o sistema executa as
instrues do PAI (PROCESS AFTER INPUT) e depois carrega o PBO (PROCESS
BEFORE OUTPUT).

66
Retirar o comentrio do MODULE STATUS_1000. Dar um duplo clique e criar o objeto.

O Objeto dever ser associado ao include com final O01. Include PBO.

67
Tirar o comentrio de linha dos dois itens e substituir xxxxx por um nome.

E dar um duplo clique para criar os objetos. Dever associar ao PBO.

68
69
Atribuir nomes aos botes da barra Application tool bar.

Ao salvar a tela ser exibida a tela

70
Tirar o comentrio do USER_COMMAND_1000. E dar um duplo clique para criar o objeto.

Associar ao modulo PAI.

5.2. TABSTRIP

71
um componente disponvel para criar uma diviso por abas, cada aba tendo o seu
prprio contedo.

5.2.1 Criando Tabstrip com Assistente.

Marcar a ferramenta do Tabstrip com o


Assistente e delimitar a rea da tela
que ser usada.

72
Definir o nome
do Tabstrip

73
Indicar quantas abas
E quais os nomes a
Serem utilizados

Ser criada automaticamente uma subtela para cada aba


indicada. Os nomes so sugeridos pelo sistema, mas podem ser
alterados.

74
Os cdigos gerados, sero includos nos
includes indicados. recomendado no
alterar essas opes.

75
Criado o Tabstrip pelo wizard, uma srie de cdigos so inseridos nos includes para
fazer todo o tratamento das abas e chamadas das subtelas.

Para inserir dados dentro das subtela, basta abrir a subtela no editor grfico e
inserir o que deseja.

Cada subtela possui seu prprio PBO e PAI que chamado a cada seleo de aba.
Podemos codificar apenas para a aba utilizando essas chamadas locais.

76
5.3. TABLE CONTROL

um componente de tela utilizado para apresentar uma srie de dados em linhas e


colunas, semelhante a uma planilha.
Alm de visualizar dados, bastante utilizado na insero da dados em maior quantidade,
pois facilita para o usurio.

5.3.1 Criando Table Control com o Assistente

77
Definir o nome
do Table Control

78
Definir se utilizar os campos de uma
<TT> ou de uma <TI>. Caso seja de
uma <TI>, esta j dever estar declarada
no programa.

Marcar quais campos da <TI>


devero aparecer no Table
Control.

79
Definir se o TC permitir a entrada de
dados ou se ser somente de
visualizao.

Para habilitar a marcao de linhas, deve


ser criado um campo do tipo char(1) na <TI>
e selecion-lo nessa opo.

Paginar gera os botes e o cdigo para


mudana de pginas.

Cria os botes para inserir e eliminar linhas


quando for habilitada a marcao de linhas.

Cria os botes para marcar e desmarcar


todas linhas quando for habilitada a
marcao de linhas.

80
Os cdigos gerados, sero includos nos includes indicados.
recomendado no alterar essas opes.

81
O resultado do Table Control com os
botes de paginao.
Os ttulos das colunas devem ser
alteradas.

Criado o Table Control pelo wizard, uma srie de cdigos so inseridos nos includes
para fazer todo o tratamento das linhas e colunas, e relao com a tabela interna.

Para que os dados apaream no Table Control, basta inseri-los na tabela interna
correspondente. Porm depois de criado o Table Control, se adicionarmos um
campo na tabela interna, deveremos adicion-lo manualmente no Table Control.

Quando utilizado o campo para marcao, para verificar se a linha est marcada
basta checar se o contedo do campo de marcao recebeu o valor X.

5.3.2 Loop at Screen

SCREEN uma tabela do sistema que contm todos os objetos da tela atual. Com
isso podemos percorrer essa tabela e alterar algumas das propriedades dos
campos existentes.

Algumas opes que podemos alterar so: visibilidade do campo, habilitao para
insero de dados, enfatizar, etc...

O loop at screen deve ser feito sempre no PBO da tela que pretendemos alterar.

82
Sintaxe:

loop at screen.
if screen-name eq nome_campo.
screen-input = 0. desabilita para escrita
screen-invisible = 1. torna o campo invisvel
modify screen.
endif.
endloop.

83
6. SHDB

Mapeamento das telas

O mapeamento das telas feito atravs da transao SHDB. Normalmente o funcional ir


entregar o mapeamento j pronto, mas pode ser necessrio mapear uma transao por
conta prpria.

Na SHDB, a transao ser executada em um modo especial, que grava todos os


comandos e informaes digitadas em uma transao.

Para efetuar o mapeamento selecionar Nova gravao, informar transao

84
Para visualizar resultado do mapeamento, duplo clique no registro.

Na tela ser exibido todas as telas,campos e aes do usurio na transao.

85
7. RFC

Funo RFC nada mais do que um mdulo de funo que est habilitado a ser
executado de fora do SAP.
Por exemplo, utilizando um conector.net para o SAP podemos chamar uma funo
RFC do SAP de dentro de um programa em VB. O mesmo ocorre para outras
linguagens como o PHP.

Como habilitar uma funo para RFC?

No mdulo de funo, em Caractersticas, marcar a opo Mdulo de Acesso


Remoto.

Obs.: Todos os campos de importao, exportao e modificao devero ter o flag


Transfer. Valor marcado.

86
8. BATCH INPUT

O que Batch Input

Batch Input ou BDC (Batch Data Communication) um procedimento automtico


para transferncia de dados para o sistema SAP sem a interferncia do usurio (tela do
usurio). Uma tela de usurio simulada para este procedimento de modo que as
mesmas checagens e atualizaes possam ser executadas.
Um componente central deste processamento uma fila de arquivo. Este arquivo recebe
os dados via programas do Batch Input e agrupa os dados juntos em uma pasta.
Para carregar os dados para as bases de dados do SAP, voc processa as pastas com a
funo de Batch Input utilizar a Transao SM35

Criao do Programa

Estrutura da Tabela BDC

o Antes de voc escrever um programa Batch Input, voc tem que executar a
transao e anotar o nmero da tela, seqncia de telas e os nomes dos
campos da tela para serem endereados mais tarde no programa. Voc entra
com estes dados na tabela BDC.
o O nome do campo para o OK-code o mesmo para todas as telas:
BDC_OKCODE. O valor para o OK-code consiste de uma barra / e o
nmero da tecla de funo (ex: /11).

87
1. Declarar Tabelas, Types, Work reas e tabelas internas para utilizao.
*&---------------------------------------------------------------------*
*& Report ZMM_FORNBI_23
*&
*&---------------------------------------------------------------------*
*& Descrio : Programa para Batch Input
*& Autor : Daniela Cristina Guerra
*&---------------------------------------------------------------------*

REPORT zmm_fornbi_23.

*&Tabelas--------------------------------------------------------------*

TABLES: bdcdata.

*&Types----------------------------------------------------------------*

TYPES: BEGIN OF y_upload,


lifnr TYPE rf02k-lifnr,
bukrs TYPE rf02k-bukrs,
ekorg TYPE rf02k-ekorg,
kotkk TYPE rf02k-ktokk,
name1 TYPE lfa1-name1,
sortl TYPE lfa1-sortl,
land1 TYPE lfa1-land1,
spras TYPE lfa1-spras,
waers TYPE lfm1-waers,
END OF y_upload.

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

DATA: t_upload TYPE TABLE OF y_upload,


t_bdc_data TYPE TABLE OF bdcdata.

*&Work areas-----------------------------------------------------------*

DATA: wa_upload TYPE y_upload,


wa_bdc_data TYPE bdcdata.

2. Criar tela de seleo.


*&Tela de Seleo------------------------------------------------------*

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


PARAMETER p_arq TYPE string.
SELECTION-SCREEN END OF BLOCK b1.

*&Inicializao--------------------------------------------------------*

INITIALIZATION.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_arq.

88
PERFORM zf_abrir_busca_arquivo.

*&Inicio do Processamento ----------------------------------------------*

START-OF-SELECTION.

PERFORM zf_upload_arquivo.

PERFORM zf_loop.

2. Buscar o arquivo texto usando a funo WS_FILENAME_GET e ler o arquivo com


GUI_UPLOAD, passando os dados carregados para uma tabela Interna, com a
mesma estrutura e campos do arquivo de layout.

*&---------------------------------------------------------------------*
*& Form zf_abrir_busca_arquivo
*&---------------------------------------------------------------------*
* Descrio: Inicia a tela para buscar arquivo
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zf_abrir_busca_arquivo.

CALL FUNCTION 'WS_FILENAME_GET'


EXPORTING
* def_filename = ' '
* DEF_PATH = ' '
* MASK = ' '
MODE = 'O'
TITLE = Text-011
IMPORTING
filename = p_arq nome da tabela para carregar dados
* RC =
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5
.
IF sy-subrc <> 0.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno


WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDFORM. " zf_abrir_busca_arquivo


*&---------------------------------------------------------------------*
*& Form zf_upload_arquivo
*&---------------------------------------------------------------------*

89
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zf_upload_arquivo .

CALL FUNCTION 'GUI_UPLOAD'


EXPORTING
filename = p_arq
* FILETYPE = 'ASC'
* HAS_FIELD_SEPARATOR = ' '
* HEADER_LENGTH = 0
* READ_BY_LINE = 'X'
* DAT_MODE = ' '
* CODEPAGE = ' '
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* CHECK_BOM = ' '
* VIRUS_SCAN_PROFILE =
* NO_AUTH_CHECK = ' '
* IMPORTING
* FILELENGTH =
* HEADER =
TABLES
data_tab = t_upload
* 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.

ENDIF.

ENDFORM. " zf_upload_arquivo

90
*&---------------------------------------------------------------------*
*& Form zf_loop
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form zf_loop .

LOOP AT t_upload INTO wa_upload.

AT FIRST.

PERFORM zf_open.
ENDAT.

PERFORM zf_parametros_doc.

PERFORM zf_insert.

CLEAR t_bdc_data.

AT LAST.
PERFORM zf_close.
ENDAT.

ENDLOOP.

IF sy-subrc = 0.
message i208(00) with text-008.
ENDIF.

ENDFORM. " zf_loop

1. Preencher uma itab com a mesma estrutura da BDCDATA, passando o


mapeamento gerado na transao SHDB.

*&---------------------------------------------------------------------*
*& Form zf_monta_t_upload
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zf_monta_t_upload USING begin TYPE any
prog TYPE any
value TYPE any.

CLEAR wa_bdc_data.

IF begin = 'X'.

91
wa_bdc_data-dynbegin = begin.
wa_bdc_data-program = prog.
wa_bdc_data-dynpro = value.
append wa_bdc_data to t_bdc_data.

ELSE.

wa_bdc_data-fnam = prog.
wa_bdc_data-fval = value.
append wa_bdc_data to t_bdc_data.
ENDIF.

ENDFORM. " zf_monta_t_upload

*&---------------------------------------------------------------------*
*& Form zf_parametros_doc
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zf_parametros_doc.

PERFORM zf_monta_t_upload USING:

'X' 'SAPMF02K' '0100',

' ' 'BDC_OKCODE' '/00',


' ' 'RF02K-LIFNR' wa_upload-
lifnr,
' ' 'RF02K-BUKRS' wa_upload-
bukrs,
' ' 'RF02K-EKORG' wa_upload-
ekorg,
' ' 'RF02K-KTOKK' wa_upload-
kotkk,
'X' 'SAPMF02K' '0110',

' ' 'BDC_OKCODE' '/00',


' ' 'LFA1-NAME1' wa_upload-
name1,
' ' 'LFA1-SORTL' wa_upload-
sortl,
' ' 'LFA1-LAND1' wa_upload-
land1,
' ' 'LFA1-SPRAS' wa_upload-
spras,

92
'X' 'SAPMF02K' '0120',

' ' 'BDC_OKCODE' '=VW',

'X' 'SAPMF02K' '0130',

' ' 'BDC_OKCODE' '=VW',

'X' 'SAPMF02K' '0380',

' ' 'BDC_OKCODE' '=VW',

'X' 'SAPMF02K' '0210',

' ' 'BDC_OKCODE' '=VW',

'X' 'SAPMF02K' '0215',

' ' 'BDC_OKCODE' '=VW',

'X' 'SAPMF02K' '0220',

' ' 'BDC_OKCODE' '=VW',

'X' 'SAPMF02K' '0215',

' ' 'BDC_OKCODE' '=VW',

'X' 'SAPMF02K' '0220',

' ' 'BDC_OKCODE' '=VW',

'X' 'SAPMF02K' '0610',

' ' 'BDC_OKCODE' '=VW',

'X' 'SAPMF02K' '0310',

' ' 'BDC_OKCODE' '=VW',


' ' 'LFM1-WAERS' wa_upload-
waers,

'X' 'SAPMF02K' '0320',

' ' 'BDC_CURSOR' 'RF02K-LIFNR',


' ' 'BDC_OKCODE' '=VW'.

93
ENDFORM. " zf_parametros_doc

Mdulo de Funo BDC_OPEN_GROUP

Com o mdulo de funo BDC_OPEN_GROUP abre uma sesso.

Voc recebe vrios valores de retorno via EXCEPTIONS. Voc pode ler
esses valores com SY-SUBRC.

USER sempre deve ser especificado. O tipo do usurio seria BDC.

Num processamento on-line, o usurio que estiver processando o on-line


(e no o nome do usurio especificado) usado para as checagens de
autorizao.

*&---------------------------------------------------------------------*
*& Form zf_open
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zf_open .

CALL FUNCTION 'BDC_OPEN_GROUP'


EXPORTING
client = sy-mandt
* dest = filler8
GROUP = 'pasta23'
* HOLDDATE = FILLER8
keep = 'X'
USER = sy-uname
* RECORD = FILLER1
* PROG = SY-CPROG
* DCPFM = '%'
* DATFM = '%'
EXCEPTIONS
client_invalid = 1
destination_invalid = 2
group_invalid = 3
group_is_locked = 4
holddate_invalid = 5
internal_error = 6
queue_error = 7

94
running = 8
system_lock_error = 9
user_invalid = 10
OTHERS = 11
.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

ENDFORM. " zf_open

Mdulo de Funo BDC_INSERT

Voc usa o mdulo de funo BDC_INSERT para inserir dados de uma


transao numa pasta.
Para transferir os dados, voc precisa de uma tabela interna (tabela
BDC).

*&---------------------------------------------------------------------*
*& Form zf_insert
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form zf_insert .

CALL FUNCTION 'BDC_INSERT'


EXPORTING
TCODE = 'XK01'
* POST_LOCAL = NOVBLOCAL
* PRINTING = NOPRINT
* SIMUBATCH = ' '
* CTUPARAMS = ' '
TABLES
dynprotab = t_bdc_data
EXCEPTIONS
INTERNAL_ERROR = 1
NOT_OPEN = 2
QUEUE_ERROR = 3
TCODE_INVALID = 4
PRINTING_INVALID = 5
POSTING_INVALID = 6
OTHERS = 7
.

95
IF sy-subrc = 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

endform. " zf_insert

Mdulo de Funo BDC_CLOSE_GROUP

Voc fecha uma pasta Batch Input com o mdulo de funo


BDC_CLOSE_GROUP.
Voc recebe diversos valores de retorno via EXCEPTIONS. Voc pode ler
estes com SY-SUBRC.

*&---------------------------------------------------------------------*
*& Form zf_close
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form zf_close .

CALL FUNCTION 'BDC_CLOSE_GROUP'


EXCEPTIONS
NOT_OPEN = 1
QUEUE_ERROR = 2
OTHERS = 3
.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

endform. " zf_close

96
Funcionalidades da Transao SM35

Voc pode processar pastas com a funo Batch Input (escolher System
 Services  Batch Input, ou acessar a transao SM35). A informao
fornecida no status, seqncia de telas, contedo das telas, o usurio
que est fazendo o processamento, o modo de processamento, o
servidor, bem como o usurio que usa a checagem de autorizao.

OBS:

Chamadas a funes sem uso do EXCEPTION ou sem tratamento de erro posterior.

Caso no sejam usados os EXCEPTIONs, uma execuo que eventualmente encontre


uma
condio de erro poder gerar um ABAP Dump, e caso o cdigo no seja tratado pode-se
utilizar as tabelas e parmetros de retorno (vazios) no processamento. A verificao
apenas
dos parmetros e tabelas retornados pode no ser suficiente para determinar se a funo
foi
executada com sucesso.

97
9. CALL TRANSACTION

um procedimento automtico para carregar dados em uma determinada transao,


porm no no cria nenhuma pasta . A transferncia automtica.

9.1 Programa Call Transaction

*&-------------------------------------------------------------------------*
*& Report ZSD_CLIENTE_CT_23
*&
*&-------------------------------------------------------------------------*
*& Descrio: Programa de CALL TRANSACTION
*& Autor: Daniela Guerra
*&-------------------------------------------------------------------------*

REPORT zsd_cliente_ct_23 NO STANDARD PAGE HEADING.

*&Types--------------------------------------------------------------------*
TYPES:
BEGIN OF y_arq,
line(1000) TYPE c, " tipo para upload do arquivo com ';'
END OF y_arq,

BEGIN OF y_final,
bukrs TYPE rf02d-bukrs, " Empresa
ktokd TYPE rf02d-ktokd, " Grupo de contas do cliente
name1 TYPE kna1-name1, " Nome 1
sortl TYPE kna1-sortl, " Nome 2
stras TYPE kna1-stras, " Rua e n
ort01 TYPE kna1-ort01, " Local
pstlz TYPE kna1-pstlz, " Cdigo postal
ort02 TYPE kna1-ort02, " Bairro
land1 TYPE kna1-land1, " Chave do pas
regio TYPE kna1-regio, " Regio (pas, estado, provncia, condado)
spras TYPE kna1-spras, " Cdigo de idioma
txjcd TYPE kna1-txjcd, " Domiclio fiscal
akont TYPE knb1-akont, " Cta.de reconciliao na contabilidade geral
zterm TYPE knb1-zterm, " Chave de condies de pagamento
zwels TYPE knb1-zwels, " Lista de formas de pagamentos a considerar
END OF y_final,

BEGIN OF y_log,
msg(100) TYPE c, " Tipo para tabela de log de erros
log TYPE y_arq,

98
END OF y_log.

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

DATA: t_arq TYPE TABLE OF y_arq, " Tabela para upload do arquivo
t_final TYPE TABLE OF y_final, " Tabela final para separao dos dados
t_log TYPE TABLE OF y_log, " Tabela de log de erros
t_msgn TYPE TABLE OF bdcmsgcoll, " Tabela de msgs para log de erros
t_bdc_data TYPE TABLE OF bdcdata.

*&Work Areas----------------------------------------------------------------*

DATA: wa_arq TYPE y_arq,


wa_final TYPE y_final,
wa_log TYPE y_log,
wa_msgn TYPE bdcmsgcoll,
wa_bdc_data TYPE bdcdata.

*&Variveis----------------------------------------------------------------*

DATA: v_msg1 TYPE balm-msgv1, " variaveis utilizadas na CALL FUNCTION


'MESSAGE_PREPARE'
v_msg2 TYPE balm-msgv2,
v_msg3 TYPE balm-msgv3,
v_msg4 TYPE balm-msgv4,

valor type c.

*&Constantes--------------------------------------------------------------*

CONSTANTS spaces VALUE ';'. " Constante para separao dos dados no
loop_monta_tabela_final

*&Tela de Seleo---------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-012.


PARAMETER p_arq TYPE string.
SELECTION-SCREEN END OF BLOCK b1.

*&Inicializao ----------------------------------------------------------*

INITIALIZATION.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_arq. " Utilizado para selecionar


arquivo para upload

PERFORM zf_busca_arquivo.

*&Inicio do Processamento------------------------------------------------*

START-OF-SELECTION.

PERFORM zf_importa_arquivo.

99
PERFORM zf_loop_monta_tabela_final.
PERFORM zf_loop_dbc_dados.

*&----------------------------------------------------------------------*
*& Form zf_busca_arquivo
*&----------------------------------------------------------------------*
* Descrio: funo para buscar arquivo para Upload
*-----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*-----------------------------------------------------------------------*
FORM zf_busca_arquivo .

CALL FUNCTION 'WS_FILENAME_GET' "#EC *


EXPORTING
* DEF_FILENAME = ' '
* DEF_PATH = ' '
* MASK = ' '
mode = 'O'
title = text-001
IMPORTING
filename = p_arq
* RC =
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. " zf_busca_arquivo

*&---------------------------------------------------------------------*
*& Form zf_importa_arquivo
*&---------------------------------------------------------------------*
* Descrio: Funo que efetua o upload do Arquivo
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zf_importa_arquivo .
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = p_arq
* FILETYPE = 'ASC'
* HAS_FIELD_SEPARATOR = ' '
* HEADER_LENGTH = 0
* READ_BY_LINE = 'X'

100
* DAT_MODE = ' '
* CODEPAGE = ' '
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* CHECK_BOM = ' '
* VIRUS_SCAN_PROFILE =
* NO_AUTH_CHECK = ' '
* IMPORTING
* FILELENGTH =
* HEADER =
TABLES
data_tab = t_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 SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

ENDFORM. " zf_importa_arquivo


*&---------------------------------------------------------------------*
*& Form zf_loop_monta_tabela_final
*&---------------------------------------------------------------------*
* Descrio: Loop para montar tabela final sem ';'
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zf_loop_monta_tabela_final.

LOOP AT t_arq INTO wa_arq.


SPLIT wa_arq AT spaces INTO :
wa_final-bukrs
wa_final-ktokd
wa_final-name1
wa_final-sortl
wa_final-stras

101
wa_final-ort01
wa_final-pstlz
wa_final-ort02
wa_final-land1
wa_final-regio
wa_final-spras
wa_final-txjcd
wa_final-akont
wa_final-zterm
wa_final-zwels.

APPEND wa_final TO t_final.

ENDLOOP.

ENDFORM. " zf_loop_monta_tabela_final


*&---------------------------------------------------------------------*
*& Form loop_Dbc_dados
*&---------------------------------------------------------------------*
* Descrio: Loop para montar tabela bdcdata
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zf_loop_dbc_dados .

LOOP AT t_final INTO wa_final .

PERFORM zf_parametros_shdb.

PERFORM zf_insert.

CLEAR t_bdc_data.

ENDLOOP.

ENDFORM. " zf_loop_dbc_dados


*&---------------------------------------------------------------------*
*& Form zf_parametros_shdb
*&---------------------------------------------------------------------*
* Descrio: Parametros do 'shdb' para montar bdcdata
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zf_parametros_shdb .

PERFORM zf_monta_tabela_bdc USING:

'X' 'SAPMF02D' '0100',

102
' ' 'BDC_OKCODE' '/00',
' ' 'RF02D-BUKRS' wa_final-bukrs,
' ' 'RF02D-KTOKD' wa_final-ktokd,

'X' 'SAPMF02D' '0110',

' ' 'BDC_OKCODE' '/00',


' ' 'KNA1-NAME1' wa_final-name1,
' ' 'KNA1-SORTL' wa_final-sortl,
' ' 'KNA1-STRAS' wa_final-stras,
' ' 'KNA1-ORT01' wa_final-ort01,
' ' 'KNA1-PSTLZ' wa_final-pstlz,
' ' 'KNA1-ORT02' wa_final-ort02,
' ' 'KNA1-LAND1' wa_final-land1,
' ' 'KNA1-REGIO' wa_final-regio,
' ' 'KNA1-SPRAS' wa_final-spras,

'X' 'SAPMF02D' '0120',


' ' 'BDC_OKCODE' '/00',
' ' 'KNA1-TXJCD' wa_final-txjcd,

'X' 'SAPMF02D' '0125',


' ' 'BDC_OKCODE' '/00',

'X' 'SAPMF02D' '0360',


' ' 'BDC_OKCODE' '=ENTR',

'X' 'SAPMF02D' '0210',

' ' 'BDC_OKCODE' '/00',


' ' 'KNB1-AKONT' wa_final-akont,

'X' 'SAPMF02D' '0215',

' ' 'BDC_OKCODE' '/00',


' ' 'KNB1-ZTERM' wa_final-zterm,
' ' 'KNB1-ZWELS' wa_final-zwels,

'X' 'SAPMF02D' '0220',


' ' 'BDC_OKCODE' '/00',

'X' 'SAPMF02D' '0610',


' ' 'BDC_OKCODE' '/00'.

ENDFORM. " zf_parametros_shdb


*&---------------------------------------------------------------------*
*& Form zf_monta_tabela_bdc
*&---------------------------------------------------------------------*
* Descrio: Busca parametros para montar BDCDATA
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zf_monta_tabela_bdc USING: begin TYPE any
prog TYPE any

103
value TYPE any.

IF begin = 'X'.
CLEAR wa_bdc_data.
MOVE : begin TO wa_bdc_data-dynbegin,
prog TO wa_bdc_data-program,
value TO wa_bdc_data-dynpro.

APPEND wa_bdc_data TO t_bdc_data.


ELSE.
CLEAR wa_bdc_data.
MOVE : begin TO wa_bdc_data-dynbegin,
prog TO wa_bdc_data-fnam,
value TO wa_bdc_data-fval.

APPEND wa_bdc_data TO t_bdc_data.


ENDIF.

ENDFORM. " zf_monta_tabela_bdc


*&---------------------------------------------------------------------*
*& Form zf_insert
*&---------------------------------------------------------------------*
* Descrio: Funo para inserir dados
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zf_insert .

CALL TRANSACTION 'XD01' USING t_bdc_data MODE 'N' UPDATE 'S' MESSAGES INTO
t_msgn.

CHECK sy-subrc NE 0.
MOVE wa_arq TO wa_log-log.

READ TABLE t_msgn INTO wa_msgn WITH KEY msgtyp = 'E'.


IF sy-subrc EQ 0.
PERFORM zf_message_erro.
APPEND wa_log TO t_log.
PERFORM zf_message_confirm.
if valor = '1'.
PERFORM zf_download_log .
endif.
ENDIF.

104
ENDFORM. " zf_insert

**&---------------------------------------------------------------------*
*& Form zf_message_erro
*&----------------------------------------------------------------------*
* Descrio: Funo para menssagens de erro
*-----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*-----------------------------------------------------------------------*
FORM zf_message_erro .

MOVE: wa_msgn-msgv1 TO v_msg1,


wa_msgn-msgv2 TO v_msg2,
wa_msgn-msgv3 TO v_msg3,
wa_msgn-msgv4 TO v_msg4.

CALL FUNCTION 'MESSAGE_PREPARE'


EXPORTING
language = sy-langu
msg_id = wa_msgn-msgid
msg_no = wa_msgn-msgnr
msg_var1 = v_msg1
msg_var2 = v_msg1
msg_var3 = v_msg1
msg_var4 = v_msg1
IMPORTING
msg_text = wa_log-msg
EXCEPTIONS
function_not_completed = 1
message_not_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. " zf_message_erro

*&---------------------------------------------------------------------*
*& Form zf_download_log
*&---------------------------------------------------------------------*
* Descrio: Funo para download do log de erro
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zf_download_log .

CALL FUNCTION 'GUI_DOWNLOAD'


EXPORTING
* BIN_FILESIZE =
filename = 'Z:\LOG_23.TXT'
* FILETYPE = 'ASC'

105
* APPEND = ' '
* WRITE_FIELD_SEPARATOR = ' '
* HEADER = '00'
* TRUNC_TRAILING_BLANKS = ' '
* WRITE_LF = 'X'
* COL_SELECT = ' '
* COL_SELECT_MASK = ' '
* DAT_MODE = ' '
* CONFIRM_OVERWRITE = ' '
* NO_AUTH_CHECK = ' '
* CODEPAGE = ' '
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* WRITE_BOM = ' '
* TRUNC_TRAILING_BLANKS_EOL = 'X'
* WK1_N_FORMAT = ' '
* WK1_N_SIZE = ' '
* WK1_T_FORMAT = ' '
* WK1_T_SIZE = ' '
* WRITE_EOL = ABAP_TRUE
* IMPORTING
* FILELENGTH =
TABLES
data_tab = t_log
* FIELDNAMES =
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
.
IF sy-subrc = 0.

MESSAGE s208(00) WITH text-003.

ELSE.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

106
ENDFORM. " zf_download_log
*&---------------------------------------------------------------------*
*& Form zf_message_confirm
*&---------------------------------------------------------------------*
* Descrio: Funo para popup de confirmao de download do arquivo de
* log de erro.
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zf_message_confirm .

CALL FUNCTION 'POPUP_TO_CONFIRM'


EXPORTING
* TITLEBAR = ' '
* DIAGNOSE_OBJECT =
text_question = text-004
text_button_1 = text-001
* ICON_BUTTON_1 = ' '
text_button_2 = text-002
* ICON_BUTTON_2 = ' '
* DEFAULT_BUTTON = '1'
display_cancel_button = text-005
* USERDEFINED_F1_HELP = ' '
* START_COLUMN = 25
* START_ROW = 6
* POPUP_TYPE =
* IV_QUICKINFO_BUTTON_1 = ' '
* IV_QUICKINFO_BUTTON_2 = ' '
IMPORTING
ANSWER = valor
* TABLES
* PARAMETER =
EXCEPTIONS
TEXT_NOT_FOUND = 1
OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. " zf_message_confirm

107
10. BAPI

As BAPIs so funes que fazem acessos ao banco de dados fazendo


modificaes, como incluses, alteraes e delees. Com elas fazemos alteraes
sem precisar mapear telas de transaes (SHDB).
Para trabalharmos com elas, basta declararmos as estruturas que iremos preencher
com a mesma estrutura utilizada para declarao na BAPI e passar para a BAPI
como parmetro de entrada e obter o resultado e as mensagens de erro ou de
sucesso.

Para acess-las, basta entrar na transao BAPI

Podemos usar as BAPIs para realizar cargas de dados, bastando para tal verificar a
existncia de uma BAPI para a carga que se quer fazer.
Depois de fazermos a chamada da BAPI, colocar uma verificao do sy-subrc,
se ele for initial, chamar a bapi abaixo: CALLFUNCTION 'BAPI_TRANSACTION_COMMIT'
10.1 Programa BAPI

108
*&---------------------------------------------------------------------*
*& Report ZMM_BAPI_PO_CREATE_23
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT zmm_bapi_po_create_23.

*&Types--------------------------------------------------------------------*
TYPES:
BEGIN OF y_arq,
line(1000) TYPE c, " tipo para upload do arquivo com ';'
END OF y_arq,

BEGIN OF y_table,
tipo(1) TYPE c,
comp_code TYPE bapimepoheader-comp_code,
doc_type TYPE bapimepoheader-doc_type,
creat_date TYPE bapimepoheader-creat_date,
vendor TYPE bapimepoheader-vendor,
purch_org TYPE bapimepoheader-purch_org,
pur_group TYPE bapimepoheader-pur_group,
currency TYPE bapimepoheader-currency,
currency_iso TYPE bapimepoheader-currency_iso,
exch_rate(9) TYPE c,
doc_date TYPE bapimepoheader-doc_date,
incoterms1 TYPE bapimepoheader-incoterms1,
incoterms2 TYPE bapimepoheader-incoterms2,
po_item TYPE bapimepoitem-po_item,
material TYPE bapimepoitem-material,
plant TYPE bapimepoitem-plant,
quantity(13) TYPE c,
po_unit TYPE bapimepoitem-po_unit,
po_unit_iso TYPE bapimepoitem-po_unit_iso,
net_price(28) TYPE c,
price_unit(5) TYPE c,
END OF y_table.

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

DATA: t_arq TYPE TABLE OF y_arq,


t_table TYPE TABLE OF y_table,
t_header TYPE TABLE OF bapimepoheader,
t_headerx TYPE TABLE OF bapimepoheaderx,
t_item TYPE TABLE OF bapimepoitem,
t_itemsx TYPE TABLE OF bapimepoitemx,
t_return TYPE TABLE OF bapiret2.

109
*&Work Areas----------------------------------------------------------------*

DATA: wa_arq TYPE y_arq,


wa_table TYPE y_table,
wa_header TYPE bapimepoheader,
wa_headerx TYPE bapimepoheaderx,
wa_item TYPE bapimepoitem,
wa_itemsx TYPE bapimepoitemx,
wa_return TYPE bapiret2.

*&Variavel----------------------------------------------------------------*

DATA: n_pedido(10) TYPE c.

*&Constantes--------------------------------------------------------------*

CONSTANTS spaces VALUE ';'. " Constante para separao dos dados no
loop_monta_tabela_final

*&Tela de Seleo---------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-012.


PARAMETER p_arq TYPE string.
SELECTION-SCREEN END OF BLOCK b1.

*&Inicializao ----------------------------------------------------------*

INITIALIZATION.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_arq. " Utilizado para selecionar


arquivo para upload

PERFORM zf_busca_arquivo.

*&Inicio do Processamento------------------------------------------------*

START-OF-SELECTION.

PERFORM zf_importa_arquivo.
PERFORM zf_loop_monta_tabela_table.
PERFORM zf_move_campos.
PERFORM zf_chama_funcao_create.

*&----------------------------------------------------------------------*
*& Form zf_busca_arquivo
*&----------------------------------------------------------------------*
* Descrio: funo para buscar arquivo para Upload
*-----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text

110
*-----------------------------------------------------------------------*
FORM zf_busca_arquivo .

CALL FUNCTION 'WS_FILENAME_GET' "#EC *


EXPORTING
* DEF_FILENAME = ' '
* DEF_PATH = ' '
* MASK = ' '
mode = 'O'
title = text-001
IMPORTING
filename = p_arq
* RC =
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. " zf_busca_arquivo

*&---------------------------------------------------------------------*
*& Form zf_importa_arquivo
*&---------------------------------------------------------------------*
* Descrio: Funo que efetua o upload do Arquivo
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zf_importa_arquivo .
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = p_arq
* FILETYPE = 'ASC'
* HAS_FIELD_SEPARATOR = ' '
* HEADER_LENGTH = 0
* READ_BY_LINE = 'X'
* DAT_MODE = ' '
* CODEPAGE = ' '
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* CHECK_BOM = ' '
* VIRUS_SCAN_PROFILE =
* NO_AUTH_CHECK = ' '
* IMPORTING
* FILELENGTH =
* HEADER =
TABLES
data_tab = t_arq

111
* 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 SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

ENDFORM. " zf_importa_arquivo


*&---------------------------------------------------------------------*
*& Form zf_loop_monta_tabela_f
*&---------------------------------------------------------------------*
* Descrio: Loop para montar tabela final sem ';'
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zf_loop_monta_tabela_table.

LOOP AT t_arq INTO wa_arq.

IF wa_arq-line(01) = 'H'.

SPLIT wa_arq AT spaces INTO :


wa_table-tipo
wa_table-comp_code
wa_table-doc_type
wa_table-creat_date
wa_table-vendor
wa_table-purch_org
wa_table-pur_group
wa_table-currency
wa_table-currency_iso
wa_table-exch_rate
wa_table-doc_date
wa_table-incoterms1
wa_table-incoterms2.
ELSE.

112
SPLIT wa_arq AT spaces INTO: wa_table-tipo
wa_table-po_item
wa_table-material
wa_table-plant
wa_table-quantity
wa_table-po_unit
wa_table-po_unit_iso
wa_table-net_price
wa_table-price_unit.

ENDIF.

APPEND wa_table TO t_table.

ENDLOOP.

ENDFORM. " zf_loop_monta_tabela_final


*&---------------------------------------------------------------------*
*& Form zf_move_campos
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zf_move_campos .

LOOP AT t_table INTO wa_table.

IF wa_table-tipo = 'H'.

MOVE:
wa_table-comp_code TO wa_header-comp_code,
wa_table-doc_type TO wa_header-doc_type,
wa_table-creat_date TO wa_header-creat_date,
wa_table-vendor TO wa_header-vendor,
wa_table-purch_org TO wa_header-purch_org,
wa_table-pur_group TO wa_header-pur_group,
wa_table-currency TO wa_header-currency,
wa_table-currency_iso TO wa_header-currency_iso,
wa_table-exch_rate TO wa_header-exch_rate,
wa_table-doc_date TO wa_header-doc_date,
wa_table-incoterms1 TO wa_header-incoterms1,
wa_table-incoterms2 TO wa_header-incoterms2.

APPEND wa_header TO t_header.

MOVE:
'X' TO wa_headerx-comp_code,
'X' TO wa_headerx-doc_type,
'X' TO wa_headerx-creat_date,
'X' TO wa_headerx-vendor,

113
'X' TO wa_headerx-purch_org,
'X' TO wa_headerx-pur_group,
'X' TO wa_headerx-currency,
'X' TO wa_headerx-currency_iso,
'X' TO wa_headerx-exch_rate,
'X' TO wa_headerx-doc_date,
'X' TO wa_headerx-incoterms1,
'X' TO wa_headerx-incoterms2.

APPEND wa_headerx TO t_headerx.

IF sy-tabix NE 1.

PERFORM zf_chama_funcao_create.

CLEAR:
t_headerx,
t_item,
t_itemsx.
ENDIF.

ELSE.

MOVE:
wa_table-po_item TO wa_item-po_item,
wa_table-material TO wa_item-material,
wa_table-plant TO wa_item-plant,
wa_table-quantity TO wa_item-quantity,
wa_table-po_unit TO wa_item-po_unit,
wa_table-po_unit_iso TO wa_item-po_unit_iso,
wa_table-net_price TO wa_item-net_price,
wa_table-price_unit TO wa_item-price_unit.

APPEND wa_item TO t_item.

MOVE:
wa_table-po_item TO wa_itemsx-po_item,
'X' TO wa_itemsx-po_itemx,
'X' TO wa_itemsx-material,
'X' TO wa_itemsx-plant,
'X' TO wa_itemsx-quantity,
'X' TO wa_itemsx-po_unit,
'X' TO wa_itemsx-po_unit_iso,
'X' TO wa_itemsx-net_price,
'X' TO wa_itemsx-price_unit.

APPEND wa_itemsx TO t_itemsx.

ENDIF.

AT LAST .

114
PERFORM zf_chama_funcao_create.

ENDAT.

ENDLOOP.

IF n_pedido IS NOT INITIAL.

PERFORM grava_pedido.

ENDIF.

ENDFORM. " zf_move_campos


*&---------------------------------------------------------------------*
*& Form zf_chama_funcao_create
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM zf_chama_funcao_create .

CALL FUNCTION 'BAPI_PO_CREATE1'


EXPORTING
poheader = wa_header
poheaderx = wa_headerx
* POADDRVENDOR =
* TESTRUN =
* MEMORY_UNCOMPLETE =
* MEMORY_COMPLETE =
* POEXPIMPHEADER =
* POEXPIMPHEADERX =
* VERSIONS =
* NO_MESSAGING =
* NO_MESSAGE_REQ =
* NO_AUTHORITY =
* NO_PRICE_FROM_PO =
IMPORTING
exppurchaseorder = n_pedido
* EXPHEADER =
* EXPPOEXPIMPHEADER =
TABLES
return = t_return
poitem = t_item
poitemx = t_itemsx
* POADDRDELIVERY =

115
* POSCHEDULE =
* POSCHEDULEX =
* POACCOUNT =
* POACCOUNTPROFITSEGMENT =
* POACCOUNTX =
* POCONDHEADER =
* POCONDHEADERX =
* POCOND =
* POCONDX =
* POLIMITS =
* POCONTRACTLIMITS =
* POSERVICES =
* POSRVACCESSVALUES =
* POSERVICESTEXT =
* EXTENSIONIN =
* EXTENSIONOUT =
* POEXPIMPITEM =
* POEXPIMPITEMX =
* POTEXTHEADER =
* POTEXTITEM =
* ALLVERSIONS =
* POPARTNER =
* POCOMPONENTS =
* POCOMPONENTSX =
* POSHIPPING =
* POSHIPPINGX =
* POSHIPPINGEXP =
.

ENDFORM. " zf_chama_funcao_creat


*&---------------------------------------------------------------------*
*& Form grava_pedido
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM grava_pedido .
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'
* IMPORTING
* RETURN =
.

IF sy-subrc = 0.

MESSAGE i001(00) WITH text-010.


ENDIF.

ENDFORM. " grava_pedido

116
11. FIELD EXIT

Field exit utilizado, geralmente, para consistncia de campo;


Ele uma funo, isto , recebe um valor e retorna uma mensagem na maioria das
vezes;
Para utilizar outros valores importantes para a consistncia, utilizar o comando get
parameter;
Field exit criado atravs da transao CMOD ;
O Field Exit criado com base no elemento de dados do dicionrio de dados, portanto
necessrio amarrar a consistncia ao programa e tela desejados, caso contrrio a
consistncia fica ativa para todas as telas onde o elemento de dados utilizado;
No se consegue debugar o field exit em tempo de execuo, apenas executando a
funo pela transao SE37;

As User Exits foram desenvolvidas originalmente para o Mdulo SD, com o propsito de
permitir ao usurio modificar o sistema sem, no entanto, modificar o cdigo fonte.

Consistem basicamente de sub-rotinas (rotinas FORM) em includes especiais,


criados em um Pool de Mdulo ou Grupo de Funo, onde chamar essas sub-rotinas nos
pontos do programa no qual ser permitida alterao pelo usurio.

 Essas sub-rotinas devem satisfazer a nomenclatura: USEREXIT_<nome>.


 A SAP nunca altera os includes.
 Se novas User Exits so adicionadas em uma nova verso, elas so colocadas em
um novo programa include.
 A chamada da sub-rotina j est implementada nos programas dos mdulos
Standard (SD, MM, FI, etc.).
 Normalmente, sub-rotinas desse tipo s trabalham com variveis globais.

Obs: Como exemplo, podemos verificar os includes MV45AFZB e MV45AFZZ,


referente ao programa SAPMV45A.

Para encontrarmos User Exits em um determinado programa, podemos utilizar a


transao SE38, em Utilitrios, na opo Encontrar na Fonte, e userexit_ como texto
de procura. O resultado ser uma lista de todas as User Exits do programa, e onde elas
foram chamadas em todas as telas do Pool de Mdulo.

117
12. SCREEN EXIT

So desvios no cdigo standard que quando codificados so executados sem a


necessidade de modificao no programa original.

Utilizadas para criar novas abas em transaes standard.

118
13. BADI

BADIs funcionam no mesmo formato das exits.


So desvios no cdigo standard que quando codificados so executados sem a
necessidade de modificao no programa original.
A grande diferena para as Exits que as BADIs so classes, e devemos codificar
os mtodos dessas classes.

Para utilizarmos uma BADI, devemos entrar na transao SE18 e escolher a BADI que
iremos utilizar.

Dentro da BADI, devemos criar uma implementao para nossa codificao.

119
Nessa implementao poderemos ver os mtodos disponveis para trabalharmos.

Ao duplo clique no mtodo, podemos implementar o cdigo que desejamos. Temos


que verificar tambm quais as variveis de importao e exportao disponveis.

120
121
14. Sapscript

SAPscript a ferramenta do SAP para criao de formulrios.

Transao SE71.

122
Formatos de Elementos de Texto

* Pargrafo Padro
= Linha longa
( Linha Bruta
/ Avano de Linha
/= Avano de Linha e Linha Longa
/( Avano de Linha e Linha Bruta
/: Linha de Comando
/* Linha de Comentrio
/E Elemento de Texto

Estrutura do programa SAPSCRIPT

Abertura de formulrio
O primeiro passo para a impresso de um SAPscript atravs de um programa a abertura
de um formulrio para que se possa fazer o povoamento.
Utilizamos a seguinte funo para abrir:

CALL FUNCTION 'OPEN_FORM'


EXPORTING
* APPLICATION = 'TX'
* ARCHIVE_INDEX =
* ARCHIVE_PARAMS =
device = 'PRINTER'
dialog = 'X'
form = 'ZORDEM_23' NOME DO FORMULARIO
language = SY-LANGU IDIOMA DO FORMULARIO
* OPTIONS =
* MAIL_SENDER =
* MAIL_RECIPIENT =
* MAIL_APPL_OBJECT =
* RAW_DATA_INTERFACE = '*'
* SPONUMIV =
* IMPORTING
* LANGUAGE =
* NEW_ARCHIVE_PARAMS =
* RESULT =
EXCEPTIONS
canceled = 1
device = 2
form = 3
OPTIONS = 4
unclosed = 5
mail_options = 6
archive_error = 7
invalid_fax_number = 8
more_params_needed_in_batch = 9
spool_error = 10
codepage = 11

123
OTHERS = 12
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
Os parmetros mais importantes a serem passados para a funo so:

DEVICE - Dispositivo onde ser gerado o formulrio (geralmente PRINTER)


FORM - Nome do formulrio a ser aberto
LANGUAGE - Idioma a ser utilizado
DIALOG - Indica-se a caixa de dilogo para confirmao da impresso deve ou
no
Ser apresentado.

Inicializao de um formulrio

Utilizado para quebra e criao de vrios formulrios para uma s seleo de dados.

Utilizamos a seguinte Funo:

CALL FUNCTION 'START_FORM'


EXPORTING
* ARCHIVE_INDEX =
FORM = 'ZORDEM_23' NOME DO FORMULARIO
LANGUAGE = SY-LANGU IDIOMA DO FORMULARIO
* STARTPAGE = ' '
* PROGRAM = ' '
* MAIL_APPL_OBJECT =
* IMPORTING
* LANGUAGE =
EXCEPTIONS
FORM = 1
FORMAT = 2
UNENDED = 3
UNOPENED = 4
UNUSED = 5
SPOOL_ERROR = 6
CODEPAGE = 7
OTHERS = 8
.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

A funo muito similar funo OPEN_FORM, e novamente mais importante so o


nome (FORM) e o idioma (LANGUAGE) do formulrio.
124
Para que se possa utilizar um comando START_FORM obrigatrio que um comando de
OPEN_FORM tenha sido executado.

Seleo dos dados

A seleo dos dados feita normalmente com comando SELECT e demais comandos
ABAP, como j foi visto em tpicos anteriores.

Impresso dos dados nas janelas

A impresso dos dados nas janelas na maioria das vezes feita simultaneamente com a
seleo dos dados, ou seja, a medida que os dados so selecionados, so enviados
imediatamente para o formulrio.
Utilizamos a seguinte funo:
CALL FUNCTION 'WRITE_FORM'
EXPORTING
element = 'ITEM'
* FUNCTION = 'SET'
* TYPE = 'BODY'
window = 'MAIN'
* IMPORTING
* PENDING_LINES =
EXCEPTIONS
element = 1
function = 2
type = 3
unopened = 4
unstarted = 5
window = 6
bad_pageformat_for_print = 7
spool_error = 8
codepage = 9
OTHERS = 10
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

Dois parmetros so os mais importantes:


ELEMENT - Determina qual Data Element ser utilizado dentro do SAPscript
WINDOW - janela na qual os dados devem ser impressos

125
Funo que finaliza um Sapscript:
Obs.: No obrigatria.

CALL FUNCTION 'END_FORM'


* IMPORTING
* RESULT =
* EXCEPTIONS
* UNOPENED = 1
* BAD_PAGEFORMAT_FOR_PRINT = 2
* SPOOL_ERROR = 3
* CODEPAGE = 4
* OTHERS = 5
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

Funo que fecha um Sapscript:

CALL FUNCTION 'CLOSE_FORM'


* IMPORTING
* RESULT =
* RDI_RESULT =
* TABLES
* OTFDATA =
EXCEPTIONS
unopened = 1
bad_pageformat_for_print = 2
send_error = 3
spool_error = 4
codepage = 5
OTHERS = 6
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

126
15. SMARTFORM

Smartform o sucessor do Sapscript, com ele possvel criar relatrios para impresso,
inserir imagens e utilizar cores.
A organizao pode ser feita de forma simplificada, atravs do ambiente grfico, definindo
pginas e janelas para separar as informaes.
O relatrio criado sem a necessidade de codificao e formatao, pois uma
Ferramenta Visual.

15.1. Criando SMARTFORM

Inicie o ambiente pela transao SMARTFORMS

Especifique o nome do Formulrio e clique em criar.

127
Abrir uma tela para que sejam feitas as configuraes.

No item Interface de Formulrio, na aba Tabelas, defina o nome da tabela que ser
utilizada e o seu tipo.

128
Devemos retornar a tela inicial e criar um estilo para o Formulrio.

Clique com o boto direito no item de


Pargrafo e selecione Criar Ns.

Defina os parmetros de fonte para o


pargrafo.

129
Defina os parmetros de fonte para o pargrafo.

Faa o mesmo procedimento para criar um estilo de Caractere.

130
Agora devemos definir o pargrafo padro para o estilo. Aps, salvamos, ativamos e
retornamos para o Formulrio.

Devemos definir o estilo que criamos no Formulrio, no item Atributos do Formulrio.

Criaremos uma janela para cada item do relatrio. No nosso caso o Cabealho.

131
Criaremos um objeto Grfico para inserir o Logotipo

Nas propriedades do Grfico digite o nome do arquivo ou aperte F4 caso queira localizar.

Clique no boto Form Painter para definir o tamanho e organizao das janelas.

132
Organize o layout do relatrio e defina o tamanho e a margem dos campos.

Dentro da Janela Main criaremos uma Tabela para listar os dados da Tabela de Origem.

133
Nas propriedades da Tabela, clique no boto Detalhes para definirmos os campos desta
Tabela.

Definiremos o tamanho de cada campo para o relatrio.

Dentro da rea de Cabealho devemos criar uma Entrada tabela para definir os campos
do cabealho.

134
Selecione o Tipo de linha da tabela que foi criada e as colunas automaticamente
aparecero dentro da rea do Cabealho.

Crie um Texto para cada Coluna.

Faa o mesmo procedimento para a rea Principal.

135
Para inserir os dados da tabela, clique no boto Inserir Campo
e digite o nome da varivel entre &.

Crie um texto tambm para a janela de cabealho.

Voltamos nos dados da tabela e definimos os dados do loop.

136
15.2 Programa para Smartform

*&-----------------------------------------------------------------*
*& Report Z_SMARTFORM_23
*&
*&-----------------------------------------------------------------*
*&
*&
*&-----------------------------------------------------------------*

REPORT z_smartform_23.

*Tabelas-----------------------------------------------------------*

TABLES: ekko, ekpo, kna1, makt.

*&Tipos------------------------------------------------------------*

TYPES:
BEGIN OF y_ekko,
ebeln TYPE ekko-ebeln, "
bstyp TYPE ekko-bstyp, "
kunnr TYPE ekko-kunnr, "
END OF y_ekko,

BEGIN OF y_kna1,
name1 TYPE kna1-name1, "
kunnr TYPE ekko-kunnr, "
END OF y_kna1,

BEGIN OF y_makt,
maktx TYPE makt-maktx, " Descrio
matnr TYPE ekpo-matnr, " Material
END OF y_makt,

BEGIN OF y_ekpo,
ebelp TYPE ekpo-ebelp, " Item
matnr TYPE ekpo-matnr, " Material
werks TYPE ekpo-werks, " Centro
menge TYPE ekpo-menge, " Quantidade
meins TYPE ekpo-meins, "
netwr TYPE ekpo-netwr, "
ebeln TYPE ekpo-ebeln, "
END OF y_ekpo.

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

DATA:
t_ekko TYPE TABLE OF y_ekko,
t_kna1 TYPE TABLE OF y_kna1,
t_ekpo TYPE TABLE OF y_ekpo,
t_makt TYPE TABLE OF y_makt,
t_itens TYPE TABLE OF zitens_23.

137
*&Work Areas-------------------------------------------------------*

DATA: wa_ekko TYPE y_ekko,


wa_kna1 TYPE y_kna1,
wa_ekpo TYPE y_ekpo,
wa_makt TYPE y_makt,
wa_cabec TYPE Zcabec_23,
wa_itens TYPE ZITENS_23.

*&Variaveis--------------------------------------------------------*

DATA: v_smart type tdsfname.

*&Tela de Seleo--------------------------------------------------*

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


PARAMETER s_ordem TYPE ekko-ebeln .
SELECTION-SCREEN END OF BLOCK b1.

*&Inicializao----------------------------------------------------*

INITIALIZATION.

*&Inicio do Processamento------------------------------------------*

START-OF-SELECTION.

PERFORM zf_seleciona_dados_A.
PERFORM zf_seleciona_dados_B.
PERFORM zf_monta_cabec_itens.
PERFORM zf_name_smartform.
PERFORM zf_chama_smartform.

*&-----------------------------------------------------------------*
*& Form zf_seleciona_dados_A
*&-----------------------------------------------------------------*
* text
*------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*------------------------------------------------------------------*
FORM zf_seleciona_dados_A.

SELECT SINGLE ebeln bstyp kunnr


FROM ekko
INTO wa_cabec
WHERE ebeln = s_ordem.

IF sy-subrc = 0.

SELECT SINGLE name1 kunnr


FROM kna1
INTO wa_cabec
WHERE kunnr = wa_ekko-kunnr.

ENDIF.

ENDFORM. " zf_seleciona_dados_A

138
*&-----------------------------------------------------------------*
*& Form zf_seleciona_dados_B
*&-----------------------------------------------------------------*
* text
*------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*------------------------------------------------------------------*
FORM zf_seleciona_dados_B .

SELECT ebelp matnr werks menge meins netwr ebeln


FROM ekpo
INTO TABLE t_ekpo
WHERE ebeln = s_ordem.

CHECK sy-subrc = 0.

SELECT maktx matnr


FROM makt
INTO TABLE t_makt
FOR ALL ENTRIES IN t_ekpo
WHERE matnr = t_ekpo-matnr AND spras = sy-langu.

ENDFORM. " zf_seleciona_dados_B

*&-----------------------------------------------------------------*
*& Form zf_monta_cabec_itens
*&-----------------------------------------------------------------*
* text
*------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*------------------------------------------------------------------*
FORM zf_monta_cabec_itens .

SORT: t_ekpo BY ebeln,


t_makt BY matnr.

LOOP AT t_ekpo INTO wa_ekpo.

READ TABLE t_makt INTO wa_makt WITH KEY matnr = wa_ekpo-matnr BINARY SEARCH.

MOVE:
wa_ekpo-ebelp TO wa_itens-ebelp, " Item
wa_ekpo-matnr TO wa_itens-matnr, " Material
wa_makt-maktx TO wa_itens-maktx, " Descrio
wa_ekpo-werks TO wa_itens-werks, " Centro
wa_ekpo-menge TO wa_itens-menge, " Quantidade
wa_ekpo-meins TO wa_itens-meins, " Unidade
wa_ekpo-netwr TO wa_itens-netwr. " Valor Liquido
APPEND wa_itens TO t_itens.

ENDLOOP.
ENDFORM. " zf_monta_cabec_itens

139
*&-----------------------------------------------------------------*
*& FORM zf_name_smartform
*&-----------------------------------------------------------------*
* text
*------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*------------------------------------------------------------------*
FORM zf_name_smartform .

CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'


EXPORTING
formname = 'ZMM_SPED_23'
* VARIANT = ' '
* DIRECT_CALL = ' '
IMPORTING
FM_NAME = v_smart
* EXCEPTIONS
* NO_FORM = 1
* NO_FUNCTION_MODULE = 2
* OTHERS = 3
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

ENDFORM. " zf_name_smartform

*&-----------------------------------------------------------------*
*& FORM zf_chama_smartform
*&-----------------------------------------------------------------*
* text
*------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*------------------------------------------------------------------*
FORM zf_chama_smartform .

CALL FUNCTION V_SMART


EXPORTING
* ARCHIVE_INDEX =
* ARCHIVE_INDEX_TAB =
* ARCHIVE_PARAMETERS =
* CONTROL_PARAMETERS =
* MAIL_APPL_OBJ =
* MAIL_RECIPIENT =
* MAIL_SENDER =
* OUTPUT_OPTIONS =
* USER_SETTINGS = 'X'
wa_cabec = wa_cabec
* IMPORTING

140
* DOCUMENT_OUTPUT_INFO =
* JOB_OUTPUT_INFO =
* JOB_OUTPUT_OPTIONS =
tables
t_itens = t_itens
EXCEPTIONS
FORMATTING_ERROR = 1
INTERNAL_ERROR = 2
SEND_ERROR = 3
USER_CANCELED = 4
OTHERS = 5
.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

endform. " zf_chama_smartform

141

Você também pode gostar