Você está na página 1de 80

ABAP Training

Report

1
ABAP Training

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


de Report dentro do SAP. Apesar do nome indicar que são relatórios, Report tem uma
abrangência maior do que isso. Devemos entendê-los como programas, que são capazes
de fazer muito mais coisas do que exibir relatórios.

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


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

Códigos das transações associadas às opções do ABAP Workbench:

Opção Transação
Repository Browser SE80
Dictionary SE11
Editor ABAP SE38
Function Builder SE37
Screen Painter SE51
Menu Painter SE41

2
ABAP Training
Editor ABAP (SE38)

3
ABAP Training

No editor ABAP, além de digitar o código fonte do programa, é possível também efetuar outras
tarefas e adicionar outros objetos inerentes à sua execução.

Na janela de “Objetos parciais” há 5 opções básicas de objetos associados a um programa


ABAP:

Texto fonte: Através desta opção acionamos o editor de programas ABAP.

Variantes: Definem-se os valores pré-definidos para os parâmetros de execução de um


programa ABAP. Os parâmetros de um programa são definidos pelos comandos Parameters e
Select-options do ABAP.

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


categoria, status, aplicação, etc.

Documentação: Texto com uma descrição breve do que o programa executa e as suas
condições necessárias para execução.

Elementos de texto: Definem-se os textos que serão relacionados às mensagens, rótulos de


parâmetros do programa e títulos e nome de colunas para o relatório gerado pelo programa.

Barra de botões da transação:

Debug do programa

Atualiza os parâmetros com os valores de uma variante

Renomeia o programa

Cria um novo programa baseado no programa selecionado

Exclui o programa selecionado

Mostra os objetos do sistema que estão sendo utilizados pelo programa

Lista de utilizações de programa

Ativar a versão do programa

Verificação da sintaxe do programa

4
ABAP Training

Barra de botões do editor ABAP

Marca linha para


salto no editor

Desloca a linha
para a direita

Duplica a linha
selecionada

Concatena a linha abaixo


à linha selecionada

Insere no editor o modelo de


sintaxe de um comando ABAP

Exibe as marcas efetuadas para navegação no editor

Marca um break-point no programa para debug

Ajuda do help do ABAP

Desfazer última alteração

Marcar bloco

Colar
Copiar buffer

Cortar (envia as linhas selecionadas para o buffer)

Inserir nova linha

Lista de utilizações

Verificação da sintaxe do programa

Modificação/Exibição do programa

5
ABAP Training

* Com o comando REPORT são definidas as características básicas para um


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

REPORT Z_CURSO_ABAP
NO STANDARD PAGE HEADING “ não exibe o cabeçalho padrão de Report
LINE-SIZE 170 “ define o tamanho da linha em 170 caracteres
LINE-COUNT 65 “ define o número de linhas por página
MESSAGE-ID ZSADUP “ define a classe de mensagens
RESERVE 8 LINES. “ pelo menos 8 linhas serão impressas na últ. pág

*----------------------------------------------------------------------*
* Inserção de comentário
* ou assim
" é outra forma de comentar um programa
*----------------------------------------------------------------------*
* Nome: Z_curso_abap
* Descrição: Meu primeiro programa ABAP
* data: 21/08/2000
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
* Declaração de tabelas do sistema
*----------------------------------------------------------------------*
* Com o comando TABLES são definidas as tabelas do dicionário de dados
* que serão utilizadas no programa

TABLES: T001W, " Tabela de centros


J_1BAGT. "Descrição de CFOP

*----------------------------------------------------------------------*
* Declaração dos tipos de campos
*----------------------------------------------------------------------*
* Na declaração de tipos de campos são definidas as características de
* para um campo de uma estrutura que irá compor a estrutura de uma tabe-
* la interna. Usa-se isso qdo declaramos várias tabelas internas com a mesma estrutura

TYPES: BEGIN OF T_T001W,


CENTRO LIKE T001W-WERKS, "Centro
DESCRICAO LIKE T001W-NAME1, "Descrição centro

6
ABAP Training
END OF T_T001W.

*----------------------------------------------------------------------*
* Declaração de tabelas Internas
*----------------------------------------------------------------------*
* Tabelas internas são objetos que somente existem durante a execução do
* programa. Elas servem para armazenar os dados selecionados a partir do
* banco de dados e assim manusear os dados selecionados dentro do progr.

DATA: I_T001W TYPE TABLE OF T_T001W


WITH NON-UNIQUE KEY CENTRO
WITH HEADER LINE.

DATA: I_TAPP TYPE TABLE OF T_T001W


WITH NON-UNIQUE KEY CENTRO
WITH HEADER LINE.

DATA: BEGIN OF I_CFOP OCCURS 100, “ o comando OCCURS indica o número esperado
CFOP LIKE J_1BAGT-CFOP, “ de registros na tabela interna. É usado para
DESCCFOP LIKE J_1BAGT-CFOTXT, ” reservar esse espaço na memória e otimizá-la
END OF I_CFOP.
*----------------------------------------------------------------------*
* Declaração de parâmetros
*----------------------------------------------------------------------*
* Com o comando SELECT-OPTIONS podemos montar parâmetros com lista de
* valores a partir de campos do banco de dados

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


“ centro

* Com o comando PARAMETERS, cria-se parâmetros de seleção que permitem a entrada de


* apenas um valor. Eles podem receber um valor, como o Select-Option, mas também podem
* ser Radiobuttos e também checkbox
PARAMETERS:
P_1 RADIOBUTTON GROUP CURS, “ Com o comando Radiobutton, cria-se
P_2 RADIOBUTTON GROUP CURS, “ botões para a seleção de 1 ou outro
“ parâmetro. O comando GROUP XXX
“ identifica quais parâmetros fazem parte
“ do grupo. Neste exemplo, temos 2 grupos
“ distintos, o CURS e o SRUC
P_3 RADIOBUTTON GROUP SRUC,
P_4 RADIOBUTTON GROUP SRUC,

7
ABAP Training
P_5 AS CHECKBOX.

*----------------------------------------------------------------------*
* Constantes
*----------------------------------------------------------------------*
CONSTANTS: C_X(1) TYPE C VALUE 'X'. "Constante X

*----------------------------------------------------------------------*
* Variáveis
*----------------------------------------------------------------------*
DATA: v_cfop like j_1bagt-cfop, “Declara uma variável do tipo Código de CFOP
v_nome(15) type c, “Nome
v_contador type n. “Contador de linhas

*----------------------------------------------------------------------*
* Na tela de seleção
*----------------------------------------------------------------------*
* neste momento, podemos inserir uma lógica de verificação para os parâmetros inseridos
* pelo usuário na tela de seleção
AT SELECTION-SCREEN.
IF S_CENTRO IS INITIAL. “ Se o centro estiver vazio
MESSAGE E001(ZA). “ exibe mensagem de erro. Todas as mensagens de erro dentro
“ da lógica da tela de seleção, fazem com que o programa fique
“ parado na tela de seleção. Nas demais partes do programa, a
“ mensagem de erro faz com que o programa termine a sua
“ execução. Neste caso, utilizamos uma classe de mensagem
“ diferente da especificada no comando REPORT. Se não
“especificar a classe de mensagens, ele assuma a classe definida
“no Report. Se nenhuma classe de mensagens estiver definida, dá
“ erro.
ENDIF.

*----------------------------------------------------------------------*
* Qdo o usuário selecionar uma linha
*----------------------------------------------------------------------*
AT LINE-SELECTION.

*----------------------------------------------------------------------*
* Qdo o usuário apertar um botão
*----------------------------------------------------------------------*
AT USER-COMMAND.

*----------------------------------------------------------------------*
* Cabeçalho do relatório

8
ABAP Training
*----------------------------------------------------------------------*
* inserir aqui as informações que se deseja que apareçam no cabeçalho do relatório
TOP-OF-PAGE.

WRITE:/ 10 ‘Cabeçalho do meu primeiro programa ABAP’. “escreve na posição 10


ULINE at 10(40). “ linha começando na posição 10 e com tamanho 40.

*----------------------------------------------------------------------*
* Rodapé do relatório
*----------------------------------------------------------------------*
* inserir aqui as informações que se deseja que apareçam no rodapé do relatório
* OBS: essas informações só aparecerão se o tamanho da página estiver definido no comando
* REPORT e somente qdo houver quebra de página. Caso contrário, não aparecerá
END-OF-PAGE.

ULINE.
WRITE:/ ‘ As informações continuam na próxima página’.

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

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


* inicia neste ponto, sua utilização é obrigatória.

START-OF-SELECTION.

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

*Com o comando SELECT buscamos a informações do banco de dados a partir dos


parâmetros de seleção
SELECT WERKS “ cód do centro
NAME1 “ descrição
FROM T001W “ da tabela T001W
INTO TABLE I_T001W “ inserindo na tabela interna I_T001W
WHERE WERKS IN S_CENTRO. “ onde o centro esteja dentro dos parâmetros
“ informados

* Testando se a execução do comando SELECT foi bem sucedida


IF SY-SUBRC NE 0.
* Com a variável de sistema SY-SUBRC sempre poderemos testar se o
* comando ABAP foi executado com sucesso ou não.

9
ABAP Training
MESSAGE I015 WITH 'Erro no comando SELECT'.
* Com o comando EXIT neste ponto termina-se a execução do programa
EXIT.
ENDIF.

IF P_1 EQ C_X.
MESSAGE I015 WITH 'Ensinando a fazer mensagens' 'de informação'.
ELSEIF P_2 EQ C_X.
MESSAGE E015 WITH 'Ensinando a fazer mensagens' 'de erro'.
ENDIF.

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


* utilizar o comando LOOP que fará a leitura seqüencial dos registros na
* tabela interna
LOOP AT I_T001W.

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


TEXT-042, I_T001W-DESCRICAO. " HEADER LINE (Campo descrição)

* Como modificar o conteúdo de um campo de uma tabela interna durante a


* execução de um programa
* Primeiro: Alterar o conteúdo do campo
i_t001w-descricao = 'Texto de alteração'.
* Segundo: Utilizar o comando MODIFY para gravar a alteração na tabela
* interna
MODIFY i_t001w.

ENDLOOP.

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


* pelo valor de uma chave específica
READ TABLE I_T001W WITH KEY CENTRO = '1700' BINARY SEARCH.
IF SY-SUBRC NE 0.
MESSAGE I015 WITH 'Registro não encontrado'.
ELSE.
* Insere uma linha de traços na tela.
ULINE.
* Ao usar ":" no comando WRITE o comando entende que serão impressas
* várias strings na mesma linha, a "/" que aparece após o comando
* indica salto de linha antes de escrever os dados na tela/relatório.
WRITE: / I_T001W.
ULINE.
ENDIF.

10
ABAP Training
* Acessando um determinado registro na tabela interna baseado no índice
* do mesmo
READ TABLE I_T001W INDEX 8.
IF SY-SUBRC NE 0.
MESSAGE I015 WITH 'Registro não encontrado'.
ELSE.
ULINE.
WRITE I_T001W.
ULINE.
ENDIF.

* Comando para limpar o HEADER LINE


CLEAR I_T001W.

* Apendando (anexando) registros em outra tabela interna

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

WHEN '1650'.

* Com o comando MOVE-CORRESPONDING movemos os campos correspondentes em


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

* Insere um BREAK-POINT fixo no código do programa.


BREAK-POINT.

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


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

11
ABAP Training
* A instrução IS INITIAL no comando IF, testa se a tabela interna esta
* vazia
*
* Se testar usando apenas o nome da tabela i_tapp sem os colchetes
* estarei testando o conteúdo do HEADER LINE
IF I_TAPP[] IS INITIAL.
WRITE: / 'Tabela esta vazia'.
ENDIF.

* Sorteando (classificando) os registros da tabela interna


SORT I_T001W BY DESCRICAO DESCENDING.

WRITE: / 'Saindo do programa.'.

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

*----------------------------------------------------------------------*
* Sessão de Forms
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
* Definição da sub-rotina ACESSANDO_CFOP
*----------------------------------------------------------------------*

FORM ACESSANDO_CFOP.

SELECT CFOP CFOTXT FROM J_1BAGT


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

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

ENDFORM. “ Fim do Form ACESSANDO_CFOP

*----------------------------------------------------------------------*
* Definição da sub-rotina acessando_cfop_com_comando_at
* Essa sub-rotina utiliza um parâmetro que é passado qdo ela é
* Chamada. Portanto, existe o comando USING.
*----------------------------------------------------------------------*

12
ABAP Training

FORM acessando_cfop_com_comando_at USING v_cfop.


“v_cfop não precisa mais ser declarada, pois está na declaração da sub-rotina. Se
especificarmos “um tipo (FORM acessando_cfop_com_comando_at USING v_cfop LIKE
J_1BAGT-CFOP ), “essa sub-rotina só aceitará parâmetros desse tipo. Se não especificarmos,
aceita qq parâmetro.
“ se esse parâmetro tiver que ser alterado, usa-se o comando CHANGING.
LOOP AT i_t001w.

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


* dados para montar um listagem dos dados

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

AT NEW WERKS.
*Sempre que o valor do campo mudar acionará esta ação
WRITE: / ‘Mudança do valor campo’, WERKS.
ENDAT.

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

ENDFORM.

13
ABAP Training

Processo Geral de Programação

Nome e Descrição do
Programa

Declaração de
Variáveis

Montagem da
Tela de
Input

Montagem e
Impressão do
Relatório ou outra lógica

14
ABAP Training

Template Detalhado

Nome do Programa.
e Descrição

No. de linhas e colunas


classe de mensagem

Declaração de dados
(variáveis, ctes e tabelas
internas)

Parâmetros de input
(parameters e select
options)

Lógica da tela de
seleção

Ao comando do
usuário (caso
haja algum botão)

15
ABAP Training

Seleção e Impressão
de Dados ou outra lóg.
(performs na ordem)

Cabeçalho e Rodapé

Seção das Sub-rotinas

16
ABAP Training

Descrição do Template

Nome do Programa e Descrição:

• Name do “Shell”
• Nome do Programa
• Data
• Última atualização
• Descrição
• Include
• Calls
• Function Modules
• Histórico de Modificações

No. de Linhas, Colunas e Classe de Mensagem:

• No Standard Page Heading


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

Declaração de Dados:

17
ABAP Training

• Include ZZIHEADR
• Tabelas
• Constantes e Variáveis
• Tabelas Internas

Parâmetros de Entrada:

• Select-Option
• Parameters

Lógica da Tela de Seleção:

• Initialization
• At Selection-Screen
Ao Comando do Usuário:

• At User-Command

Seleção e Impressão de Dados:

• Start-of-Selection
• End-of-Selection

Cabeçalho e Rodapé

• Top-of-page

18
ABAP Training

• End-of-page

Seção das Sub-rotinas

• Forms Section

Comando “Select”

O comando select é usado para acessar e selecionar dados de tabelas


internas do SAP. Por existirem diversas variações do mesmo comando, é
fundamental que o programador saiba o mecanismo de funcionamento de
cada uma delas pois só assim poderá dar ao programa uma performance
satisfatória.

Variações :
1-) SELECT * FROM dbtab.
....
ENDSELECT.

Seleciona dados de uma tabela do banco de dados num processo de “loop”


que começa no select e termina no endselect. A cada pasagem pelo “loop”
temos um elemento lido e selecionado.
É necessário que se coloque após o ENDSELECT uma condição de
checagem de dados selecionados:

19
ABAP Training

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

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

Se sy-subrc = 4 : nenhum dado foi lido

EXEMPLO:

SELECT * FROM BSEG.



ENDSELECT.

Adições:

1a-)…WHERE Condition

Seleciona apenas os dados que satisfazem a condição estipulada.

EXEMPLO:

SELECT * FROM T001 WHERE BUKRS EQ ‘0001’.



ENDSELECT.

1b-)…ORDER BY f1…fn
…ORDER BY PRIMARY KEY

Organiza os dados em ordem ascendente de acordo com os campos


especificados (f1,…fn).

20
ABAP Training

EXEMPLO:

SELECT * FROM T001 ORDER BY MSGNR DESCENDING ARBGB


ASCENDING.

ENDSELECT.

1c-)…UP TO n ROWS

Seleciona um número máximo de dados.

EXEMPLO:

SELECT * UP TO 100 ROWS FROM T001 WHERE…



ENDSELECT.

2-) SELECT * FROM dbtab INTO TABLE itab.

Os dados são selecionados e colocados na tabela interna itab de uma só


vez. Não há mais o processo de loop e portanto não há mais ENDSELECT.
Os dados novos da tabela interna são gravados por cima dos antigos.
É importante ressaltar que o * pode ser substituído pelos nomes dos
campos da tabela, agilizando assim o processo e melhorando a
performance (não pode ser usado para tabelas “pooled” e “clustered”).

21
ABAP Training

EXEMPLO:

SELECT * FROM T001 INTO TABLE TAUX.

Adições :

2a-) WHERE
2b-) ORDER BY
2c-) UP TO n ROWS

3-) SELECT * FROM dbtab APPENDING TABLE itab.

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

EXEMPLO:

SELECT * FROM T100 APPENDING TABLE TAUX.

3a-) WHERE
3b-) ORDER BY
3c-) UP TO n ROWS

4-) SELECT SINGLE * FROM dbtab WHERE f1 = g1 AND … AND fn +

Seleciona apenas um único dado que satisfaça as condições do where.

EXEMPLO:

22
ABAP Training

SELECT SINGLE * FROM T100 WHERE BUKRS=’02’.

5-) SELECT * FROM dbtab APPENDING CORRESPONDING FIELDS


OF TABLE itab.

Mecanismo semelhante ao do item 2-) e deve ser usado quando a sintaxe


do item 2-) não puder ser usada. Há diferenças de performance.

EXEMPLO:

SELECT * FROM T100 APPENDING CORRESPONDING FIELDS OF


TABLE TAUX.

Onde TAUX recebeu a estrutura da tabela T100 (comando INCLUDE


STRUCTURE).

6-) SELECT * FROM dtab FOR ALL ENTRIES in itab where…

Usado quando selecionamos dados de uma tabela e precisamos de dados


de outra tabela para compôr as condições do where.

EXEMPLO:

SELECT * FROM BSEG FOR ALL ENTRIES IN T_BKPF


WHERE BUKRS = T_BKPF-BUKRS

23
ABAP Training

AND BELNR = T_BKPF-BELNR


AND BELNR = T_BKPF-BELNR.

Onde T_BKPF é uma tabela interna que recebeu a tebela BKPF.

NOTA: se itab estiver vazia, esse comando selecionará todo o conteúdo da


tabela, pois nenhuma restrição está sendo colocada. Uma maneira de fazer
essa verificação é a seguinte:

IF NOT ( itab[] IS INITIAL ). “ se itab não está vazia


SELECT * FROM dtab FOR ALL ENTRIES in itab
where campo = itab-campo …
ENDIF. “ fim do: se itab não está vazia

24
ABAP Training

Considerações sobre os diferentes tipos de select:

1 - SELECT * FROM …<tabela>


(Quando não se impõe nenhum tipo de restrição, ocorre uma varredura sequencial dos
registros da tabela. Quando se utiliza grandes tabelas, isso obviamente afeta o runtime.

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


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

2 - SELECT * FROM <tabela> WHERE <campo> eq <conteúdo>.


(Lê todos os registros da tabela especificada onde o campo é igual ao conteúdo
especificado)

Performance: Select * Where - seleciona todas as colunas de uma tabela de acordo com a
condição de where. É melhor sempre especificar as colunas, pois em caso de tabelas
com muitas colunas, prejudicará a performance.

3 - SELECT * FROM <table> WHERE <table field> BETWEEN <field1> and <field2>.
Ex.: field1 = 100 e field2 = 500. Pega inclusive 100 e 500. Você trabalha com o range.

4 - SELECT * FROM <table> WHERE <table field> LIKE ….’_R%’.


_ = a primeira letra não importa o que virá
a segunda deverá ser R (eu defini)
% = não importa a sequência de caracteres que virá.

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


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

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


Exemplo:
DATA : begin of ITAB occurs 10,

25
ABAP Training
sign(1), option(2), low like sflight-price, high like sflight-price,
end of ITAB.
* RANGES: ITAB for sflight-table
Move: ’I’ to itab-sign, ‘bt’to itab-option, ‘500’ to itab-low, ‘1000’ to itab-high.
Append itab. Move: ’I’ to itab-sign, ‘bt’to itab-option, ‘440’ to itab-low.
Append itab.

7 - SELECT * FROM <table> ORDER BY <field1> <field2> … PRIMARY KEY.


Obs.: Classifica a tabela interna numa área auxiliar, sem afetar a tabela original. Evitar
o uso de sorts dentro de um select. Consome mais tempo que descarregar os dados em
uma tabela interna e classificá-los.

8 - SELECT * FROM <table> BYPASSING BUFFER.


(Usado para ler diretamente da tabela original, e não do buffer).

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


Abap/4
Select * - procurar evitar. Informar as colunas que serão necessárias, apenas.
Uso de comando extract (insert header, details) – para relatórios

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


(Lê os registros e os inclui - não sobrepõe - em um internal table).

10 - SELECT …FROM <table> INTO TABLE <INTERNAL TABLE> .


(A estrutura da tabela interna deve corresponder à estrutura da tabela que está sendo
acessada. O sistema lê os registros em conjunto, não individualmente, e os coloca
dentro de uma internal table. Este processo é mais rápido que ler individualmente
através de um LOOP e ir gravando os registros, um a um).

11 - SELECT …. INTO CORRESPONDING FIELDS OF TABLE <itab>.


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

26
ABAP Training

12 - SELECT ….. APPENDING CORRESPONDING FIELDS OF TABLE <itab>.


( Lê e grava (não sobrepõe) os dados em uma internal table que possua nomes idênticos
aos nomes da tabela que está sendo lida).

13 - SELECT SINGLE * FROM SPFLI WHERE …..<campo>….. EQ … <conteúdo>


(Toda vez que se usa select single * a chave primária completa deve ser especificada. Se
a chave especificada não é qualificada, você receberá uma mensagem de warning e a
performance ficará prejudicada).
No caso de haver a necessidade de acessar um único registro via select, as opções são:
select * ….. seguido de comando exit OU select * … up to 1 row.
Neste caso não é necessário especificar a chave completa.

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


WHERE …… .
Lê as colunas especificada (a1, a2). Após INTO deverão ser especificadas as áreas de
trabalho auxiliares (f1, f2). O número de colunas lidas deverá ser igual ao número de
work-areas especificadas.

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

AVG e SUM: somente para campos numéricos.


Não se usa endselect.
Mais rápido fazer uma rotina “à mão” que utilizar este comando.

16 - SELECT * FROM SFLIGHT WHERE PRICE IN ITAB.

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


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

27
ABAP Training
Parameters: tabname(10) default ‘SPFLI’. *** especificando o nome da tabela em tempo
dinamicamente no select statement sempre consome mais tempo de CPU que
especificando estaticamente no programa ***

Select * from (tabname) into WA


Write ….
Endselect.

18-SELECT * FROM <table> FOR ALL ENTRIES IN <internal table> WHERE


campo1 = <conteúdo> and
campo2 = <conteúdo>
Defino uma tabela interna. Alimento os campos desta tabela interna. (move e append).
No meu select campo1 e campo2 serão os campos definidos e alimentados na tabela
interna.

19 - SELECT carrid MIN( price ) max (price ) INTO (carrid, minimum, maximum)
FROM sflight GROUP BY carrid.
(Todos os campos que eu quero que apareçam na minha lista eu preciso especificar
após a cláusula GROUP BY)
(carrid, maximum e minimum são campos auxiliares).
(Se o nome do database não é conhecido até runtime não se pode especificar a cláusula
GROUP BY).

28
ABAP Training

Especificação Técnica:

A Especificação Técnica tem como função principal, auxiliar o programador


durante o desenvolvimento (codificação) de um produto. Na especificação são descritos
todas as etapas de um programa, assim como todas as tabelas que deverão ser
acessadas, as variáveis e constantes que deverão ser declaradas, as tabelas internas que
deverão ser criadas, descrição detalhada dos tipos de selects a serem utilizados,
visando performance, e o layout com a distribuição dos campos a serem listados.

29
ABAP Training
Exercício:

Modelo de Tecnologia Especificação Técnica de Relatório

About this Prerequisites... How to Following Method R/3


Deliverable... Complete... Completion... Tasks...

Desenhado por:» Status:» 05 Produto Entregue


Aprovado por:» Data de Aprov.: 20/05/98
Assinatura Eletrônica

Definição do Relatório
Projeto: Andersen Prioridade: 01-Alta
Time: Vendas & Distribuição Ref. WBS: Relatório

Título do Relatório: Listagem de Notas Fiscais

Utilização do Relatório: Necessário criar

Informação de Desenvolvimento

Descrição resumida:

Designado para:» Curso ABAP/4 Telefone:

Horas previstas: Horas realizadas:

Data Prevista p/ Produção:

Outras Aplicações Afetadas:»

Atributos Principais do Programa


Nome: ZSRA0001

Título: Listagem de Notas Fiscais.


Tipo do Programa:» 1 – Online Program Aplicação:» V - Sales
Banco de Dados Lógico: Classe de Desenvolvimento: ZEM2
Grupo de Autorização: Transação(ões) SAP: VA03

30
ABAP Training
Outros Programas:

Desenho
Fluxo:

Descrição Técnica do Relatório:

Este relatório deve listar todas as Notas Fiscais a partir dos parâmetros de seleção informados
pelo usuário. O programa deve permitir ao usuário optar em vizualizar o relatório em tela ou enviar
os dados diretamente para a impressora. Deverá ter uma linha de total geral no final do relatório, em
destaque, com a somatória dos montante para cada nota fiscal.

Nota: Uma nota fiscal pode conter vários ítens, mas o relatório deverá conter apenas uma linha
por nota fiscal, portanto devemos prever na lógica do programa uma somatória dos montantes de
cada item para que possamos obter o montante total da nota fiscal.

Utilizar o programa ZZIHEADR para o cabeçalho do relatório.

Critério de Seleção.

Selecionar todas as notas fiscais que tenham tipo de nota fiscal igual ao informado pelo
usuário na tela de parâmetros e que tenham sido criadas no mês e ano que também serão
informados pelo usuário.

Parametros:

Tipo de Nota Fiscal (J_1BNFDOC-NTYPE)


Mês (Type C de 2 posições)
Ano (Type C de 4 posições)

Descrição Técnica do Relatório:

1. Tabelas:

Deverão ser acessadas as seguintes tabelas:

j_1bnfdoc, "Cabeçalho da nota fiscal


j_1bnflin, "Partidas individuais da nota fiscal
j_1bnfstx, "Nota fiscal: imposto por item
vbak, "Documento de vendas: dados de cabeçalho
vbrp, "Documento de faturamento: dados de item
lips. "Documento VD: remessa: dados de item

31
ABAP Training

2. Constantes:

Deverãos ser declaradas as seguintes contantes iniciais:

c_bukrs tipo c de 4 carac. com valor 100, Código da companhia


c_zero tipo c de 1 carac. com valor 0, Valor zero
c_ipi tipo c de 4 carac. com valor IPI1, Tipo de Impostos
c_um tipo c de 1 carac. com valor 1, Valor 1
c_flag tipo c de 1 carac. com valor X, Valor X
c_printer tipo c de 4 carac. com valor ZP01. Código da Impressora

3. Variáveis

Deverão ser declaradas as seguintes variáveis iniciais:

v_ipi declarar como j_1bnfstx-taxval, "Montante do imposto


v_total declarar como j_1bnflin-netwr, "Totalização dos valores
v_data1 declarar como sy-datum, "Data de início do mês
v_data2 declarar como sy-datum. "Data de fim do mês
v_vgbel declarar como vbrp-vgbel, “ Número do documento de faturamento
v_vgbel1 declarar como lips-vgbel, “ Número do documento de remessa
v_vbeln declarar como vbak-vbeln. “ Número do documento de compra

4. Tabelas Internas:

Tabela Interna para dados de cabeçalho da Nota Fiscais.

Criar a tabela interna i_j_1bnfdoc, com os seguintes campos:

docnum (j_1bnfdoc-docnum), "Nº documento


nfnum (j_1bnfdoc-nfnum), "Nº nota fiscal
parid (j_1bnfdoc-parid), "Identificação do parceiro
candat (j_1bnfdoc-candat). "Data de cancelamento da NF

Tabela de ítens para Notas Fiscais.

Criar a tabela interna i_j_1bnflin, com os seguintes campos:

32
ABAP Training
docnum (j_1bnflin-docnum), "Nº documento
itmnum (j_1bnflin-itmnum), "Nº item do documento
refkey (j_1bnflin-refkey), "Referência ao doc de origem
netwr (j_1bnflin-netwr), "Montante líquido
netfre (j_1bnflin-netfre), "Montante líquido de frete
netins (j_1bnflin-netins), "Montante líquido do seguro
netoth (j_1bnflin-netoth), "Despesas líquidas
netdis (j_1bnflin-netdis). "Montante do desconto líquido

Tabela Interna pra as taxas dos ítens das notas.

Criar a tabela interna i_j_1bnfstx, com os seguintes campos:

docnum (j_1bnfstx-docnum), "Nº documento


itmnum (j_1bnfstx-itmnum), "Nº item do documento
taxtyp (j_1bnfstx-taxtyp), "Tipo de imposto
taxval (j_1bnfstx-taxval). "Montante do imposto

Tabela interna final com os dados a serem impressos.

Criar a tabela interna i_final, com os seguintes campos:

parid (j_1bnfdoc-parid), "Código do Cliente


nfnum (j_1bnfdoc-nfnum), "Número da Nota Fiscal
total (j_1bnflin-netwr), "Valor Total da Nota Fiscal
refkey (j_1bnflin-refkey), "Chave de referência
vbeln (vbak-vbeln). "Número da ordem

5. Parâmetros de Seleção

5.1. Select-Options:

so_tipo (j_1bnfdoc-nftype)

5.2. Parameter:

p_mes tipo N de 2 caracteres “Mês


p_ano tipo N de 4 caracteres “ANo
p_tela como radiobutton default X “Visualizar na tela
p_imoressora como radiobutton “Visualizar na Impressora

33
ABAP Training

6. Seleção dos dados:

Selecionar os campos docnum nfnum parid da tabela J_1BNFDOC com as seguintes


chaves:
Bukrs = c_bukrs
Docdat entre v_data1 e v_data2 (estas datas contem o primeiro e o último dia do mês
indicado)
Nftype in so_tipo
E armazenar estes dados na tabela interna I_j_1bnfdoc.
(Utilizar o comando select into table).

**Testar a variável sy-subrc para chevar se os dados foram selecionados, caso contrário
exibir uma mensagem ao usuário informando que não existem dados para os parâmetros de
selação.

Selecionar os campos docnum itmnum refkey netwr netfre netins netoth netdis da
tabela J_1BNFLIN com a seguinte chave:
Docnum = i_j_bnfdoc-docnum
E armazenar estes dados na tabela interna I_j_1bnflin.
(Utilizar o comando select into table for all entries I_j_1bnfdoc).

Selecionar os campos docnum itmnum taxtyp taxval da tabela J_1BNFSTX com as


seguintes chaves:
Docnum = i_j_bnflin-docnum
Itmnum = I_j_1bnflin-itmnum
Taxtyp = c_ipi
E armazenar estes dados na tabela interna I_j_1bnfstx.
(Utilizar o comando select into table for all entries I_j_1bnflin).

Construção da tabela que armazenará todos os dados para as notas fisacis


selecionadas (I_final);

Loop na (J_1bnfdoc) para selecionar

Seleciona i_j_1bnfdoc-nfnum e armazena em i_final-nfnum.


Seleciona i_j_1bnfdoc-parid e armazena em i_final-parid.

Loop at i_j_1bnflin
com a chave docnum = i_j_1bnfdoc-docnum.

34
ABAP Training

seleciona i_j_1bnflin-refkey e armazena em i_final-refkey.

Seleciona as taxas para IPI.


read na tabela i_j_1bnfstx
com as seguintes chaves docnum = i_j_1bnflin-docnum
itmnum = i_j_1bnflin-itmnum
taxtyp = c_ipi.

Seleciona i_j_1bnfstx-taxval e armazena em v_ipi.

Faz o calculo do valor total da nota somando os tipos de condições e


taxas de juros para cada ítem.

i_final-total = i_final-total + i_j_1bnflin-netwr


+ v_ipi + i_j_1bnflin-netdis
+ i_j_1bnflin-netfre + i_j_1bnflin-netins
+ i_j_1bnflin-netoth.

Fim do loop da I_j_1bnflin.

Grava os dados de Notas Fiscais na tabela i_final


append na i_final.

Limpar o campo de valor total da tabela I_final e a variável v_ipi.

i_final-total,
v_ipi.

Fim do loop na tabela I_j-1bnfdoc.

Seleção do Número da Ordem de Venda que deu origem a Nota Fiscal:

Loop na I_final

Seleciona a Remessa que gerou o faturamento em questão.


Seleciona o campo vgbel da tabela Vbrp com as seguintes chaves:
Vbeln = I_final-refkey e armazena na variável v_vgbel.
(Utilizar o comando select up to 1 rows into ‘variável’)

Seleciona a Ordem de Venda que gerou a remessa em questão.


Seleciona o campo vgbel da tabela Lips com as seguintes chaves:

35
ABAP Training
vbeln = v_vgbel e armazena na variável v_vgbel1
(Utilizar o comando select up to 1 rows into ‘variável’)

Seleciona dados da tabela vbak de acordo com a encontrados na tabela


vbfa
Seleciona o campo vbeln da tabela Vbak com as seguintes chaves:
vbeln = v_vgbel1 e armazena na variável v_vbeln
(Utilizar o comando select single into v_vbeln)

Carrega I_final-vbeln com o valor da variável v_vbeln.


Modifica a tabela interna I_final indexada por tabix

Final do loop da tabela interna I_final.

7. Impressão do Relatório.

Loop na tabela I_final

Verificar se o parametro p_tela está flegado, se estiver exibir na tela os seguintes


campos:

i_final-parid,
i_final-vbeln,
i_final-nfnum,
i_final-total,

Fazer a seguinte somatória para imprimir o valor total


v_total = v_total + i_final-total.

Caso contrário utilizar o comando NEW PRINT ON / NEW PRINT OFF para enviar os
dados diretamente para a impressora.

i_final-parid,
i_final-vbeln,
i_final-nfnum,
i_final-total,

Fazer a seguinte somatória para imprimir o valor total


v_total = v_total + i_final-total.

Fim do loop na tabela I_final.

Imprimir o Valor de V_total.

36
ABAP Training

Layout(s) do Relatório:

Código Número do Pedido Nota Fiscal Valor da Nota Fiscal

Título: Listagem de Notas Fiscais

Subtítulo:

Totais: Somatória de todas as notas fiscais

Ordenação: Por Nota Fiscal

Quebras: Não tem.

Características de Interatividade:

Lista dos Objetos a serem Alterados ou Criados:

Requerimentos de Segurança:

Especificações Operacionais

Freqüência:

Dependências:

Instruções de Restart/Recover:

Duração estimada:

Contato Responsável: Telefone:

Critério de Teste
Condições de Teste:

Testar o programa com as seguintes condições:

Tipo de Nota Fiscal N1

37
ABAP Training
Mês de Criação da Nota 5
Ano de Criação da Nota 1998

Tela X
Impresora X

Follow-up
Questões:
Levantada por Issue Data prev. Data conclusão Resolvido por

Andersen Consulting Proprietary.

Original Author: AC_DV04 ABAP4/EMBRACO/BR 28/05/98 10:45


Edit Marcelo 14/07/98 11:18
History: Zambrana/EMBRACO/BR 13/07/98 12:16

* Only past five edits are shown

38
ABAP Training

Criando Transações:
Para os usuários poderem utilizar os programas desenvolvidos, é necessário criarmos
transações para eles, pois, normalmente, por questão de segurança, os usuários não possuem
acesso à transação SE38.

Para a criação de transações, utilizamos a transação SE93.

Nela, devemos digitar o nome da transação a ser criada (lembrando sempre os padrões de
nomenclatura adotados) e clicar em <CRIAR>.

Em seguida, aparecerá uma tela com diversos tipos de transações a serem criadas, onde deve-
se preencher uma descrição para a transação e selecionar o tipo adequado. Para Reports,
selecionar:

39
ABAP Training

40
ABAP Training

Em seguida, preencher o nome do programa e salvar a transação que ela estará criada.

41
ABAP Training

EXERCÍCIOS
REPORT

42
ABAP Training

43
ABAP Training

EXERCÍCIO 1

Desenvolver um programa Z_EXC_REP_1_AL## que mostre os códigos


dos Materiais, os tipos e o centro.
Ordenar a exibição por centro, tipo e material

Tabelas: MARA
MARC

Opcional:
1) fazer a quebra do relatório por centro (Pode-se usar os seguintes
comandos para fazer isso: ON CHANGE, AT END ou AT NEW.
Atenção às peculiaridades de cada comando)
2) Ao clicar sobre a linha do material, chamar a transação de exibição de
materiais para que o usuário possa ver detalhes do mesmo (utilizar o
comando AT LINE-SELECTION e o comando HIDE. Leia o Help
desses comandos).
3) Inserir a descrição do Material – campo MAKTX da tabela MAKT

44
ABAP Training

EXERCÍCIO 2

Desenvolver um programa Z_EXC_REP_2_AL## que armazene e imprima


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

• Tipo de Documento da tabela BKPF (campo BLART),


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

Os campos : No. do documento contábil e Exercicício contábil (ambos


existem nas 2 tabelas) devem ser digitados como parâmetros pelo usuário.

Caso o usuário digite algum parâmetro inexistente nas tabelas, o programa


deve avisá-lo e não processar a informação.

Sugestão : Usar transação SE16 para comparar o conteúdo da tabela com o


resultado informado. Na transação SE11, analisar as estruturas da tabelas
para identificar os campos necessários.
Usar “select xxx into table i_xxx”.

45
ABAP Training

46
ABAP Training

47
ABAP Training

RESOLUÇÃO 1

************************************************************************************
* *
* ******************************************** *
* * Confidencial e Proprietário * *
* * Copyright 2001, Accenture * *
* * Todos os direitos reservados * *
* ******************************************** *
* *
* Nome do Shell: YTRP0010 Versão do Shell: v1.01 *
* *
*************************************************************************************
* Nome do Programa : Z_R_EXERCIO1 *
* Título do Programa : Shell - ABAP/4 List Report *
* Programador : ZEZINHO *
* Data : 21/03/2001 *
* Última atualização : dd/mm/aa *
* *
* Descrição : Este é um programa report para exibir os códigos de *
* materiais e tipo por centro *
* *
* *
* Include : ZZIHEADR *
* *
* Calls : *
* *
* Módulos de Funções: *
* *
*-----------------------------------------------------------------------------------------------*
* Lista de Modificações: *
* Data Autor Corr. # Descrição *
* 21/03/2001 ACPROGR1 AF1K901210 Desenvolv. inicial do prg. *
* *
************************************************************************************
REPORT Z_R_EXERCIO1
NO STANDARD PAGE HEADING "Não mostra o cabeçalho padrão SAP
LINE-SIZE 170 "Largura do report de 170 caracteres
LINE-COUNT 58 "Comprimento do report de 58 caracteres
MESSAGE-ID ZM. "Classe de mensagens é ZM

RESERVE 8 LINES. "Pelo menos n linhas serão impressas na última página

48
ABAP Training
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>"
" SESSÃO DE DECLARAÇÃO DE DADOS "
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>"
************************************************************************
* Includes *
************************************************************************
INCLUDE:
ZZIHEADR. "Cabeçalho padrão de report

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

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

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

DATA: BEGIN OF T_MARA OCCURS 3000,


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

DATA: BEGIN OF T_MARC OCCURS 10000,


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

DATA: BEGIN OF T_FINAL OCCURS 10000,


MATNR LIKE MARA-MATNR, " código do material
MTART LIKE MARA-MTART, " tipo do material

49
ABAP Training
WERKS LIKE MARC-WERKS. " centro
DATA: END OF T_FINAL.

************************************************************************
* Parâmetros de entrada : *
* Select Options (S_...) *
* Parameters (P_...) *
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE T1.
SELECT-OPTIONS:
SO_MATNR FOR MARA-MATNR, “cód material
SO_WERKS FOR MARC-WERKS. “centro
SELECTION-SCREEN END OF BLOCK B1.

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


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

"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>"
" SESSÃO DE PROCESSAMENTO "
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>"
*----------------------------------------------------------------------*
INITIALIZATION. "Logica para defaults "inteligentes"
*----------------------------------------------------------------------*
T1 = 'Selecione um Material'.
T2 = 'Selecione um tipo de Material'.
*----------------------------------------------------------------------*
AT SELECTION-SCREEN. "Tratamento de Erros e lógica para tela de seleção
*----------------------------------------------------------------------*
* atribui valor ao parâmetro da transação MM03 de acordo com seu ID

set parameter id 'MAT' field t_final-matnr.

* Chamada transacao MM03 (Consulta Materiais), pulando a primeira tela. Para pular essa tela.
* a informação TEM que ser passada ao parâmetro antes

call transaction 'MM03' and skip first screen .

*----------------------------------------------------------------------*
START-OF-SELECTION. "Processamento principal

50
ABAP Training
*----------------------------------------------------------------------*
PERFORM F_SELECT_DATA.
PERFORM F_PRINT_REPORT.

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

*----------------------------------------------------------------------*
TOP-OF-PAGE. "Cabeçalho (Aparece sempre no topo da tela.)
*----------------------------------------------------------------------*

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

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

"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>"
" SESSÃO DE FORMS "
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>"

*&---------------------------------------------------------------------*

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

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

if sy-subrc ne 0.
message e100. “ não existem materiais
endif.

if not ( T_MARA[] IS INITIAL ). “ se a tabela não estiver vazia


“ esse commando é redundante pois já foi feita
“ a verificação do sy-subrc, mas serve para
“ exemplificar o seu uso

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

endif.

ENDFORM. " F_SELECT_DATA

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

ULINE.
FORMAT COLOR COL_HEADING.

52
ABAP Training
WRITE: /02 'Material',
25 'Tipo de Material',
40 'Centro'.
FORMAT COLOR COL_BACKGROUND.

FORMAT COLOR COL_NORMAL.

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

SORT T_MARA BY MATNR.


SORT T_MARC BY MATNR.

LOOP AT T_MARC.

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


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

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

ENDLOOP.

* Ordena a tabela final por centro, tipo e material


SORT T_FINAL BY WERKS MTART MATNR

v_color = 1. " Inicia variavel de cor .

LOOP AT T_FINAL.

* lógica para alternar as cores de impressão a cada centro, para facilitar a visualização
on change of t_final-werks. “ a cada mudança de centro
if v_color = 1. “ verifica a última cor utilizada e usa a outra
v_color = 2.
format color 2.
else.
v_color = 1.
format color 4.
endif.
endon.

WRITE: /

53
ABAP Training
02 T_FINAL-MATNR HOTSPOT, “ o comando hotspot facilita a seleção da linha
25 T_FINAL-MTART, “ pelo usuário, necessitando apenas um
clique.
40 T_FINAL-WERKS.

hide: t_final-matnr. " armazena a variável para o comando at line-selection

ENDLOOP.

FORMAT COLOR COL_BACKGROUND.

DESCRIBE TABLE T_FINAL LINES V_TOTAL.

FORMAT COLOR COL_TOTAL.


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

ENDFORM. " F_PRINT_REPORT

54
ABAP Training

RESOLUÇÃO 2
************************************************************************
*
* ********************************************
* * Confidencial e Proprietário *
* * Copyright 2001, Accenture *
* * Todos os direitos reservados *
* ********************************************
*
* Nome do Shell: Z_TEMPLATE_REPORT Versão do Shell: v1.03
*
************************************************************************
* Nome do Programa : Z_TEMPLATE_REPORT
* Título do Programa : Shell - ABAP/4 List Report
* Programador : Aluno do curso de ABAP
* Data : 02/04/2001
* Última atualização : 03/04/2001
*
* Descrição : Este é um programa para exibição dos documentos contá-
* beis, o tipo do documento, seu valor, fornecedor e
* tipo
* Include :
*
* Calls :
*
* Módulos de Funções:
*
*----------------------------------------------------------------------*
* Lista de Modificações:
* Data Autor Corr. # Descrição
* 02/04/2001 ABAPDEV1 AF1K900023 Desenvolvimento inicial do prg
*
************************************************************************
REPORT Z_EXC_REPORT_2_AL06_D
no standard page heading "Não mostra o cabeçalho padrão SAP
line-size 170 "Largura do report de 170 caracteres
line-count 58 "Comprimento do report de 58 caracteres
message-id zabap. "Classe de mensagens é ZABAP
*RESERVE 8 LINES. "Pelo menos n linhas serão impressas na última
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
* " SESSÃO DE DECLARAÇÃO DE DADOS "
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
************************************************************************
* Includes *
************************************************************************
*INCLUDE:
*

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

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

*- Variáveis ---------------------------------------------------------*

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

* TABELA DOS CABEÇALHOS DOS DOCUMENTOS


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

* TABELA DOS ITENS DOS DOCUMENTOS


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

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

56
ABAP Training
************************************************************************
* Parâmetros de entrada :
* Select Options (S_...)
* Parameters (P_...)
************************************************************************
selection-screen begin of block b1.
select-options:
s_belnr for bkpf-belnr obligatory,
s_gjahr for bseg-gjahr obligatory.
selection-screen end of block b1.

"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
" SESSÃO DE PROCESSAMENTO "
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
*----------------------------------------------------------------------*
initialization. "Logica para defaults "inteligentes"

*----------------------------------------------------------------------*
T1 = 'Entre com os parâmetros de seleção'.

*----------------------------------------------------------------------*
at selection-screen. "Tratamento de Erros e lógica para tela de seleção
*----------------------------------------------------------------------*
* verifica se o ano é válido
select belnr up to 1 rows
from bkpf
into bkpf-belnr
where belnr in s_belnr.
endselect.

if sy-subrc ne 0.
message e013. " não existem documentos para esse exercício
endif.

* verifica se o documento é válido


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

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

* verifica se o documento é válido para aquele exercício contábil


select belnr up to 1 rows
from bkpf
into bkpf-belnr

57
ABAP Training
where belnr in s_belnr
and gjahr in s_gjahr.
endselect.

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

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

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

*----------------------------------------------------------------------*
top-of-page. "Cabeçalho (Aparece sempre no topo da tela.)
*----------------------------------------------------------------------*

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

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

"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
" SESSÃO DE FORMS "
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"

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

select bukrs
belnr
gjahr
blart
from bkpf
into table i_bkpf

58
ABAP Training
where belnr in s_belnr
and gjahr in s_gjahr.

select bukrs
belnr
gjahr
wrbtr
lifnr
from bseg
into table i_bseg
for all entries in i_bkpf
where bukrs eq i_bkpf-bukrs
and belnr eq i_bkpf-belnr
and gjahr eq i_bkpf-gjahr.

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

endform. " F_SELECT_DATA

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

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

format color 1.

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

59
ABAP Training

Exemplo 1:
O exemplo abaixo é um programa de impressão de etiquetas com código de barras que
mostra a flexibilidade que o programador tem para criar uma tela de seleção sem
precisar utilizar Online. No caso abaixo, a tela de seleção muda e é preenchida de
acordo com os parâmetros informados pelo usuário.
************************************************************************
* * Dados para controle de spool da impressora definida
* ******************************************** DATA: C_COPIAS TYPE I VALUE '1', " Número de cópias
* * Confidencial e Proprietário V_FLAG_IMED VALUE 'X', " Flag de impressão
* * Copyright 2001, Accenture V_FLAG_KEEP VALUE 'X', " Deixa no spool
* * Todos os direitos reservados C_DIAS TYPE I VALUE '3'. " No. de dias no spool
* ********************************************
*
* Nome do Shell: YBRA001 Versão do Shell: v1.02 *- Variaveis ---------------------------------------------------------*
* DATA:
************************************************************************ V_NUM_ITENS TYPE I, " múmero total de itens por OT
* Nome do Programa : ZMRW0010 V_QTD_T LIKE LTAP-NISTA, " Quantidade total acumulada
* Título do Programa : Etiqueta de identificação do material V_POS_ITEM LIKE SY-TABIX, " Armazena a pos. item na tabela interna
* ( WM / Matéria-prima ) V_ETIQ_OT TYPE C, " indicador para impressão de etiquetas
* Programador : Antonio Celso Hunnicutt Cortada " criadas com OT
* Data : 10/05/2000 V_RESPOSTA TYPE C. " Resposta da Janela Pop-up
* Última atualização : 10/05/2000
* *- Tabela Interna -----------------------------------------------------*
* Descrição : Este é um programa report para imprimir as etiquetas de
* identificação do material * Tabela interna que armazenará os dados da Ordem de transferência
* DATA: BEGIN OF I_LTAP OCCURS 0,
*----------------------------------------------------------------------* LGNUM LIKE LTAP-LGNUM, " Sistema de depósito
* Lista de Modificações: TANUM LIKE LTAP-TANUM, " N° OT
* Data Autor Corr. # Descrição TAPOS LIKE LTAP-TAPOS, " N° Item
* 10/05/2000 AC@CORTADAA MD0K921423 Desenvolvimento inicial do prg MATNR LIKE LTAP-MATNR, " Código do material
* 24/05/2000 AC@CORTADAA MD0K922285 Desenvolv.do prog. continuação NLPLA LIKE LTAP-NLPLA, " Local
************************************************************************ NISTA LIKE LTAP-NISTA, " Quantidade ingressada
REPORT ZMRW0010 WDATU LIKE LTAP-WDATU. " Data EM
NO STANDARD PAGE HEADING "Não mostra o cabeçalho padrão SAP DATA: END OF I_LTAP.
LINE-SIZE 170 "Largura do report de 170 caracteres
LINE-COUNT 58 "Comprimento do report de 58 caracteres * tabela interna que armazenará os dados das etiquetas criadas com OT
MESSAGE-ID ZM. "Classe de mensagens é ZM DATA: BEGIN OF I_ETIQUETAS OCCURS 0,
MATNR LIKE LTAP-MATNR, " Código do material
RESERVE 8 LINES. "Pelo menos n linhas serão impressas na última página QTD LIKE LTAP-NISTA, " Quantidade
LOCAL LIKE LTAP-NLPLA, " Local
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" DATA LIKE LTAP-WDATU. " Data EM
" SESSÃO DE DECLARAÇÃO DE DADOS " DATA: END OF I_ETIQUETAS.
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
************************************************************************ ************************************************************************
* Includes * * Parâmetros de entrada :
************************************************************************ * Select Options (S_...)
INCLUDE: * Parameters (P_...)
ZZIHEADR. "Cabeçalho padrão de report ************************************************************************

************************************************************************ PARAMETERS:
* Tabelas P_ET_OT RADIOBUTTON GROUP G1, " Opção Etiqueta por OT
************************************************************************ P_ET_MAN RADIOBUTTON GROUP G1, " Opção Etiqueta Manual
TABLES: P_ET_COD RADIOBUTTON GROUP G1. " Opção Etiqueta Código Barras
LTAP. " Item de ordem de transferência
SELECTION-SCREEN ULINE. " linha de separação

PARAMETERS:
************************************************************************ P_PRINT LIKE TSP01-RQDEST. " Impressora
* Dados:
* Constantes (C_...) SELECTION-SCREEN ULINE. " linha de separação
* Variaveis (V_...)
* Tabelas Internas (I_...) SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE T1.
************************************************************************ PARAMETERS:
*- Constantes ---------------------------------------------------------* P_SD LIKE LTAP-LGNUM MODIF ID M1, " Sistema de Depósito
DATA: P_OT LIKE LTAP-TANUM MODIF ID M1, " N° OT
* constantes utilizadas na programação da impressora para impressão das P_ITEM LIKE LTAP-TAPOS MODIF ID M1, " N° Item
* etiquetas P_MAT LIKE LTAP-MATNR MODIF ID M2, " N° Material
C_FIM_LINHA(3) VALUE '^FS', " término da linha P_LOCAL LIKE LTAP-NLPLA MODIF ID M2, " Local
C_INI_ET(3) VALUE '^XA', " início etiqueta P_DATA LIKE LTAP-WDATU MODIF ID M2, " Data EM
C_FIM_ET1(4) VALUE '^MMC', " fim etiqueta 1 P_NUM_ET TYPE P DECIMALS 0 MODIF ID M2, " Número de Etiquetas
C_FIM_ET2(3) VALUE '^XZ', " fim etiqueta 2 P_QTD_ET LIKE LTAP-NISTA MODIF ID M2, " Qtde por Etiqueta
C_ESPANHOL VALUE 'S', " cód. espanhol P_QTD_A LIKE LTAP-NISTA MODIF ID M5, " Qtd acumulada
C_SIM VALUE 'J'. " Sim (Ja) P_QTD_T LIKE LTAP-NISTA MODIF ID M4, " Qtd total

60
ABAP Training
P_QTD_I LIKE LTAP-NISTA MODIF ID M5, " Qtd inserida * verfica se o número de etiquetas a ser impresso é diferente de zero.
P_DIFER LIKE LTAP-NISTA MODIF ID M4. " Diferença entre qtd. IF P_NUM_ET EQ SPACE. " se o número etiquetas estiver preenchido
" Total e inserida MESSAGE E118 WITH TEXT-009. " preencher o número de etiquetas
ENDIF.
SELECTION-SCREEN END OF BLOCK B1.
* grava os dados da etiqueta a ser impressa em uma tabela
SELECTION-SCREEN PUSHBUTTON /10(20) T3 USER-COMMAND GRAV * interna i_etiquetas, passa os valores do próximo item para os
MODIF ID M1. * parâmetros, calcula a quantidade total acumulada (v_qtd_t)
SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE T2. * e volta pra tela de seleção
PARAMETERS: DO P_NUM_ET TIMES. " grava os dados n vezes,conforme parâmetro
I_ETIQUETAS-MATNR = P_MAT. " código material
P_DADO(15) MODIF ID M3, " Dados para criação código de barras I_ETIQUETAS-QTD = P_QTD_ET. " quantidade por etiqueta
P_COPIA(3) TYPE N MODIF ID M3. " número de etiquetas de cód barras I_ETIQUETAS-LOCAL = P_LOCAL. " local
I_ETIQUETAS-DATA = P_DATA. " data
SELECTION-SCREEN END OF BLOCK B2. APPEND I_ETIQUETAS. " grava dados na tabela interna
ENDDO. " grava os dados n vezes, conforme par.
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" * calcula as quantidades
" SESSÃO DE PROCESSAMENTO " PERFORM F_CALC_QUANTIDADE.
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" V_QTD_T = V_QTD_T + ( P_QTD_ET * P_NUM_ET ).
*----------------------------------------------------------------------*
INITIALIZATION. "Logica para defaults "inteligentes" IF P_DIFER EQ SPACE. " se a diferenca com quantidade recebida = 0.
*----------------------------------------------------------------------* * verifica se existem mais ítens.
IF SY-LANGU EQ C_ESPANHOL. IF V_POS_ITEM NE V_NUM_ITENS. " se existirem mais itens
T1 = 'Crear Etiqueta con OT'. * inicializa as quantidades para o próximo registro
T2 = 'Crear Código de Barras'. CLEAR: V_QTD_T,
ELSE. P_QTD_T.
T1 = 'Criar Etiqueta com OT'.
T2 = 'Criar Código de Barras'. * passa os dados do próximo item para o parâmetro
ENDIF. V_POS_ITEM = V_POS_ITEM + 1. " índice do próximo item
READ TABLE I_LTAP INDEX V_POS_ITEM. " le a tabela
T3 = 'Gravar dados Item'. P_MAT = I_LTAP-MATNR. " código do material
P_LOCAL = I_LTAP-NLPLA. " Local
IF P_OT EQ SPACE. " Se a tela já contém dados (impressão com OT) P_DATA = I_LTAP-WDATU. " Data EM
LOOP AT SCREEN. P_ITEM = I_LTAP-TAPOS. " Item
IF SCREEN-GROUP1 = 'M1' OR P_QTD_I = I_LTAP-NISTA. " Quantidade ingressada
SCREEN-GROUP1 = 'M2' OR P_NUM_ET = 1. " número de etiquetas
SCREEN-GROUP1 = 'M3' OR * calcula a quantidade acumulada
SCREEN-GROUP1 = 'M4' OR PERFORM F_CALC_QUANTIDADE.
SCREEN-GROUP1 = 'M5'. ELSE. " se for último item
SCREEN-INPUT = 0. MESSAGE I118 WITH TEXT-007 " Criação de etiquetas completa
SCREEN-OUTPUT = 0. TEXT-008. " Executar o programa para imprimir
SCREEN-INVISIBLE = 1. V_ETIQ_OT = C_SIM.
MODIFY SCREEN. ENDIF. " se existirem mais itens
ENDIF. ENDIF. " se a diferenca com quantidade recebida = 0.
ENDLOOP.
ENDIF. * Se usuário pressionar a tecla <ENTER>
ELSEIF SY-UCOMM NE 'GRAV' AND SY-UCOMM NE 'ONLI'.
* limpa variáveis de trabalho IF P_SD NE SPACE " se Sist. Dep. estiver preenchido e
PERFORM F_LIMPA_VARIAVEIS. P_OT NE SPACE " se ot estiver preenchida e
AND P_ITEM EQ SPACE. " se item estiver vazio.
*----------------------------------------------------------------------* * seleciona dados da OT
*AT SELECTION-SCREEN. "Tratamento de Erros e lógica para tela de seleção SELECT LGNUM " Sistema de depósito
*----------------------------------------------------------------------* TANUM " N° OT
TAPOS " N° Item
AT SELECTION-SCREEN OUTPUT. MATNR " Código do material
NLPLA " Local
* seleção do título do box a ser exibido na tela de seleção NISTA " Quantidade ingressada
IF SY-LANGU EQ C_ESPANHOL. " Se idioma for espanhol WDATU " Data EM
IF P_ET_OT EQ 'X'. " se for criação de etiqueta por OT FROM LTAP
T1 = 'Crear Etiqueta con OT'. INTO TABLE I_LTAP
ELSEIF P_ET_MAN EQ 'X'. " se for criação de etiqueta manual WHERE LGNUM EQ P_SD " sistema de depósito
T1 = 'Crear Etiqueta Manual'. AND TANUM EQ P_OT. " número da OT
ENDIF. " se for criação de etiqueta por OT IF SY-SUBRC NE 0. " se não encontrar registro, mensagem de erro
ELSE. " se for outro idioma MESSAGE E005. " não foram encontrados dados
IF P_ET_OT EQ 'X'. " se for criação de etiqueta por OT ENDIF. " se não encontrar registro, mensagem de erro
T1 = 'Criar Etiqueta com OT'.
ELSEIF P_ET_MAN EQ 'X'. " se for criação de etiqueta manual * detemina o número total de itens
T1 = 'Criar Etiqueta Manual'. DESCRIBE TABLE I_LTAP LINES V_NUM_ITENS.
ENDIF. " se for criação de etiqueta por OT
ENDIF. " Se idioma for espanhol READ TABLE I_LTAP INDEX 1. " LÊ O PRIMEIRO MATERIAL

* determina quais campos devem ser visualizados em função da seleção * armazena a posição do item (para verificar se existem mais itens)
* do usuário V_POS_ITEM = SY-TABIX.
PERFORM F_DETERMINA_CAMPOS.
P_MAT = I_LTAP-MATNR. " código do material
AT SELECTION-SCREEN. P_LOCAL = I_LTAP-NLPLA. " Local
P_DATA = I_LTAP-WDATU. " Data EM
IF P_ET_OT EQ 'X'. " se criação de etiqueta por OT P_ITEM = I_LTAP-TAPOS. " Item
IF SY-UCOMM EQ 'GRAV'. P_QTD_I = I_LTAP-NISTA. " Quantidade ingressada

61
ABAP Training

ELSEIF P_SD NE SPACE AND " Se o Sistema de depósito estiver pr. * Chama uma janela para confirmar a impressão
P_OT NE SPACE AND " Se N° OT estiver preenchido e PERFORM F_CONFIRMA_IMPRESSAO.
P_ITEM NE SPACE. " N° item também
* Lê os dados da OT * Define saída para impressora
READ TABLE I_LTAP WITH KEY LGNUM = P_SD " sistema de depósito * PERFORM F_DEF_IMPR.
TANUM = P_OT " número da OT
TAPOS = P_ITEM. " número do item * inicializa a impressora.
IF SY-SUBRC NE 0. " se não encontrar registro PERFORM F_INICIALIZA_IMPRESSORA.
MESSAGE E005. " não foram encontrados dados
ENDIF. " se não encontrar registro * verificação do layout etiquetas a ser impresso
IF P_ET_OT EQ 'X'. " Se impressão etiqueta com OT
* armazena a posição do item (para verificar se existem mais itens) PERFORM F_IMPRIME_ETIQ_OT. " imprime layout etiqueta com OT
V_POS_ITEM = SY-TABIX. ELSEIF P_ET_MAN EQ 'X'. " Se impressão etiqueta manual
PERFORM F_IMPRIME_ETIQ_MAN. " imprime layout etiqueta manual
* atribui os dados da OT para os parâmetros de entrada ELSE. " se for imp. cód barras
P_MAT = I_LTAP-MATNR. " código do material IF P_DADO EQ SPACE. " se parâmetro estiver vazio
P_LOCAL = I_LTAP-NLPLA. " Local MESSAGE E037. " mensagem de erro.
P_DATA = I_LTAP-WDATU. " Data EM ENDIF. " se parâmetro estiver vazio
P_QTD_I = I_LTAP-NISTA. " Quantidade ingressada PERFORM F_IMPRIME_COD_BARRAS. " imprime layout etiqueta cód. barras
ENDIF. " Verificação layout a ser impresso
ENDIF. " se item estiver vazio.
*----------------------------------------------------------------------*
* calcula a quantidade acumulada END-OF-SELECTION. "Fim do processamento principal
IF P_NUM_ET NE SPACE. " se o número etiquetas estiver preenchido *----------------------------------------------------------------------*
IF P_QTD_ET NE SPACE. " se a qtde por etiqueta estiver preenchida
P_QTD_A = P_QTD_ET * P_NUM_ET. " Qtd. acumulada
P_QTD_T = V_QTD_T + P_QTD_A. " Total Qtde. acumulada *----------------------------------------------------------------------*
IF P_QTD_I >= P_QTD_T. " se diferença for positiva TOP-OF-PAGE. "Cabeçalho (Aparece sempre no topo da tela.)
P_DIFER = P_QTD_I - P_QTD_T. " Diferença *----------------------------------------------------------------------*
ELSE. " se diferença menor que zero.
MESSAGE E118 WITH TEXT-010. " Qtd. Total > Qtd. Ingressada *----------------------------------------------------------------------*
ENDIF. " se diferença for positiva END-OF-PAGE. "Rodapé
ELSE. " se a qtde por etiqueta estiver vazia *----------------------------------------------------------------------*
P_QTD_ET = P_QTD_I / P_NUM_ET. " Qtd por etiqueta
P_QTD_A = P_QTD_ET * P_NUM_ET. " Qtd. acumulada
P_QTD_T = V_QTD_T + P_QTD_A. " Total Qtde. acumulada "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IF P_QTD_I >= P_QTD_T. " se diferença for positiva >>>>>>>>>>"
P_DIFER = P_QTD_I - P_QTD_T. " Diferença " SESSÃO DE FORMS "
ELSE. " se diferença menor que zero. "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
MESSAGE E118 WITH TEXT-010. " Qtd. Total > Qtd. Ingressada >>>>>>>>>>"
ENDIF. " se diferença for positiva
ENDIF. " se a qtde por etiqueta estiver preenchida *&---------------------------------------------------------------------*
ELSE. " se o número etiquetas estiver vazio *& Form F_IMPRIME_ETIQ_OT
CLEAR: P_QTD_A. " Qtd. acumulada *&---------------------------------------------------------------------*
ENDIF. " se o número etiquetas estiver preenchido * Imprime a etiqueta por OT
*----------------------------------------------------------------------*
ENDIF. " se usuário pressionou botão FORM F_IMPRIME_ETIQ_OT.
ELSEIF P_ET_MAN EQ 'X'. " se criação de etiqueta manual.
* limpa as variáveis * declaração de dados locais
CLEAR: P_SD, " Sistema de Depósito DATA: V_QTD(6) TYPE N. " quantidade por etiqueta
P_OT, " N° OT
P_ITEM, " N° Item * Leitura da tabela com os dados da OT
P_QTD_I, " Número de Etiquetas
P_QTD_T, " Qtd total LOOP AT I_ETIQUETAS. " Leitura da tabela com os dados da OT
P_DIFER. " Diferença entre qtd.
" Total e inserida * passa o conteúdo do campo i_etiquetas-qtd para a variável v_qtd, para
* que apareçam os caracteres 0 à esquerda para completar o campo.
* calcula a quantidade acumulada V_QTD = I_ETIQUETAS-QTD.
P_QTD_A = P_QTD_ET * P_NUM_ET. " Qtd. acumulada
* palavra material
* Se for impressão de código de barras WRITE:/ '^FO560,040^A0R45,36^FR^FDMATERIAL^FS',
ELSE. " se for impressão de código de barras * codigo do material
/ '^FO440,304^A0R140,100^FR^FD' NO-GAP,
ENDIF. " se criação de etiqueta por OT I_ETIQUETAS-MATNR NO-GAP,'^FS',
* linha vertical
*----------------------------------------------------------------------* / '^FO400,000^GB000,1200,2^FS',
START-OF-SELECTION. "Processamento principal * palavra cantidad
*----------------------------------------------------------------------* / '^FO352,040^A0R45,36^FR^FDCANTIDAD^FS',
* qtd do material
* Se a opção for criar etiquetas com OT / '^FO232,104^A0R140,100^FR^FD' NO-GAP,
IF P_ET_OT EQ 'X'. " Se impressão etiqueta com OT V_QTD NO-GAP,'^FS',
* verifica se terminou criação de etiquetas com OT * linha horizontal
IF V_ETIQ_OT NE C_SIM. " se não terminou criação com OT / '^FO184,640^GB000,0216,2^FS',
* Se existirem, envia mensagem de erro * palavra ubicación de ingreso
MESSAGE E118 WITH TEXT-011 " Criação não terminada * OBS.: dependendo do modela de impressora zebra não é possível acentua-
TEXT-006. " impressão cancelada * ção, portanto, não foram utilizados acentos
ENDIF. " se terminou criação com OT / '^FO352,680^A0R45,36^FR^FDUBICACION DE INGRESO^FS',
ENDIF. " Se impressão etiqueta com OT * codigo ubicacion de ingreso

62
ABAP Training
/ '^FO680,240^A0R140,100^FR^FD' NO-GAP, VALUE '^FO440,040^BY3^BCR,248,Y,N,N^FV',
I_ETIQUETAS-LOCAL NO-GAP,'^FS', C_COM_CARAC(24) VALUE '^FO576,040^A0R140,100^FR^FD',
* palavra transporte V_COD_BARRA(52). " armazena a string impressão cód. barras
/ '^FO128,040^A0R140,100^FR^FDTRANSPORTE^FS',
* codigo de barras do transporte (material+Qtd por etiqueta) * inicializa a variável que armazenará a string para imp. cód. barras
/ '^FO016,040^BY3^BCR,080,Y,N,N^FV' NO-GAP, CLEAR V_COD_BARRA.
I_ETIQUETAS-MATNR(10) NO-GAP,V_QTD NO-GAP,'^FS',
* linha horizontal * monta a string de impressão em cód barras.
/ '^FO000,952^GB000,0184,2^FS', CONCATENATE C_COM_CB P_DADO C_FIM_LINHA INTO V_COD_BARRA.
* palavra fecha em
/ '^FO128,960^A0R140,100^FR^FDFECHA EM^FS', DO P_COPIA TIMES. " imprime a etiqueta X vezes, conforme par. entrada
* variavel fecha em
/ '^FO128,040^A0R140,100^FR^FD' NO-GAP, * inicializa a impressora.
I_ETIQUETAS-DATA NO-GAP,'^FS'. * PERFORM F_INICIALIZA_IMPRESSORA.

ENDLOOP. " Leitura da tabela com os dados da OT WRITE:/ C_INI_ET,


/ C_COM_CARAC , P_DADO, C_FIM_LINHA,
ENDFORM. " F_IMPRIME_ETIQ_OT / V_COD_BARRA,
/ C_FIM_ET1,
*&---------------------------------------------------------------------* / C_FIM_ET2.
*& Form F_IMPRIME_ETIQ_MAN
*&---------------------------------------------------------------------* ENDDO. " imprime a etiqueta X vezes, conforme par. entr.
* Imprime a etiqueta
*----------------------------------------------------------------------* ENDFORM. " F_IMPRIME_COD_BARRAS
FORM F_IMPRIME_ETIQ_MAN.
*&---------------------------------------------------------------------*
* declaração de dados locais *& Form f_def_impr
DATA: V_QTD(6) TYPE N. " quantidade por etiqueta * Imprime direto dos parâmetros
*&---------------------------------------------------------------------*
* passa o conteúdo do campo P_QTD_ET para a variável v_qtd, para FORM F_DEF_IMPR.
* que apareçam os caracteres 0 à esquerda para completar o campo.
V_QTD = P_QTD_ET. NEW-PAGE PRINT ON
DESTINATION P_PRINT
DO P_NUM_ET TIMES. " imprime a etiqueta X vezes, conforme par. entrada COPIES C_COPIAS
IMMEDIATELY V_FLAG_IMED
* palavra material KEEP IN SPOOL V_FLAG_KEEP
WRITE:/ '^FO560,040^A0R45,36^FR^FDMATERIAL^FS', DATASET EXPIRATION C_DIAS
* codigo do material NO DIALOG.
/ '^FO440,304^A0R140,100^FR^FD' NO-GAP,P_MAT NO-GAP,'^FS', MESSAGE I019. " Processamento realizado com sucesso
* linha vertical
/ '^FO400,000^GB000,1200,2^FS', ENDFORM. " form f_def_impr.
* palavra cantidad *----------------------------------------------------------------------*
/ '^FO352,040^A0R45,36^FR^FDCANTIDAD^FS',
* qtd do material *----------------------------------------------------------------------*
/ '^FO232,104^A0R140,100^FR^FD' NO-GAP,V_QTD NO-GAP,'^FS', * FORM F_INICIALIZA_IMPRESSORA
* linha horizontal * inicializa a impressora
/ '^FO184,640^GB000,0216,2^FS', *----------------------------------------------------------------------*
* palavra ubicación de ingreso FORM F_INICIALIZA_IMPRESSORA.
* OBS.: dependendo do modela de impressora zebra não é possível acentua- * Inicializa a impressora
* ção, portanto, não foram utilizados acentos
/ '^FO352,680^A0R45,36^FR^FDUBICACION DE INGRESO^FS', WRITE:/ '^XA'.
* codigo ubicacion de ingreso WRITE:/ '^MCY^FS'.
/ '^FO680,240^A0R140,100^FR^FD' NO-GAP,P_LOCAL NO-GAP,'^FS', WRITE:/ '^XZ'.
* palavra transporte WRITE:/ '^XA'.
/ '^FO128,040^A0R140,100^FR^FDTRANSPORTE^FS', WRITE:/ '^PRC'.
* codigo de barras do transporte (material+Qtd por etiqueta) WRITE:/ '^LL410'.
/ '^FO016,040^BY3^BCR,080,Y,N,N^FV', WRITE:/ '^MMT'.
I_ETIQUETAS-MATNR(10) NO-GAP,V_QTD NO-GAP,'^FS', WRITE:/ '^XZ'.
* linha horizontal
/ '^FO000,952^GB000,0184,2^FS', ENDFORM. " FORM F_INICIALIZA_IMPRESSORA
* palavra fecha em
/ '^FO128,960^A0R140,100^FR^FDFECHA EM^FS', *----------------------------------------------------------------------*
* variavel fecha em * FORM F_CALC_QUANTIDADE
/ '^FO128,040^A0R140,100^FR^FD' NO-GAP,P_DATA NO-GAP,'^FS'. * Calcula as quantidades acumulada, total da OT e a diferença entre a
* qtde recebida e a total
ENDDO. " imprime a etiqueta X vezes, conforme par. entrada *----------------------------------------------------------------------*
FORM F_CALC_QUANTIDADE.
ENDFORM. " F_IMPRIME_ETIQ_MAN
IF P_QTD_ET NE SPACE. " se a qtde por etiqueta estiver preenchida
*&---------------------------------------------------------------------* P_QTD_A = P_QTD_ET * P_NUM_ET. " Qtd. acumulada
*& Form F_IMPRIME_COD_BARRAS. P_QTD_T = V_QTD_T + P_QTD_A. " Total Qtde. acumulada
*&---------------------------------------------------------------------* IF P_QTD_I >= P_QTD_T. " se diferença for positiva
* Imprime a etiqueta P_DIFER = P_QTD_I - P_QTD_T. " Diferença
*----------------------------------------------------------------------* ELSE. " se diferença menor que zero.
FORM F_IMPRIME_COD_BARRAS. MESSAGE E118 WITH TEXT-010. " Qtd. Total > Qtd. Ingressada
ENDIF. " se diferença for positiva
* declaração de dados locais ELSE. " se a qtde por etiqueta estiver vazia
DATA: P_QTD_ET = P_QTD_I / P_NUM_ET. " Qtd por etiqueta
C_COM_CB(35) " comando para imprimir em código de barras P_QTD_A = P_QTD_ET * P_NUM_ET. " Qtd. acumulada

63
ABAP Training
P_QTD_T = V_QTD_T + P_QTD_A. " Total Qtde. acumulada SCREEN-INPUT = 0. " oculta parâmetros
IF P_QTD_I >= P_QTD_T. " se diferença for positiva SCREEN-OUTPUT = 0.
P_DIFER = P_QTD_I - P_QTD_T. " Diferença SCREEN-INVISIBLE = 1.
ELSE. " se diferença menor que zero. ENDIF.
MESSAGE E118 WITH TEXT-010. " Qtd. Total > Qtd. Ingressada MODIFY SCREEN. " altera os parâmetros da tela
ENDIF. " se diferença for positiva ENDLOOP. " leitura dos parâmetros da tela
ENDIF. " se a qtde por etiqueta estiver preenchida ENDIF. " verificação do layout

ENDFORM. " FORM F_CALC_QUANTIDADE ENDFORM. " FORM F_DETERMINA_CAMPOS

*----------------------------------------------------------------------* *----------------------------------------------------------------------*
* FORM F_DETERMINA_CAMPOS * FORM F_CONFIRMA_IMPRESSAO.
* Determina quais campos devem ser mostrados, depedendo da seleção do * Determina quais campos devem ser mostrados, depedendo da seleção do
* usuário * usuário
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
FORM F_DETERMINA_CAMPOS. FORM F_CONFIRMA_IMPRESSAO.
* Alteração dos parâmetros da tela em função do layout a ser imprimido * Chama a função POPUP_TO_CONFIRM_STEP para o usuário confirmar a
IF P_ET_OT EQ 'X'. " se criação de etiqueta por OT * impressão
LOOP AT SCREEN. " leitura dos parâmetros da tela CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
IF SCREEN-GROUP1 = 'M1' OR " Se id do parâmetro for M1 ou M2 EXPORTING
SCREEN-GROUP1 = 'M2'. " torna os campos visíveis. DEFAULTOPTION = 'N'
SCREEN-INPUT = 1. TEXTLINE1 = TEXT-003
SCREEN-OUTPUT = 1. TITEL = TEXT-004
SCREEN-INVISIBLE = 0. IMPORTING
ELSEIF SCREEN-GROUP1 = 'M3'. " se for grupo M3 ANSWER = V_RESPOSTA
SCREEN-INPUT = 0. " oculta os campos EXCEPTIONS
SCREEN-OUTPUT = 0. OTHERS = 1.
SCREEN-INVISIBLE = 1. IF V_RESPOSTA NE C_SIM. " Se resposta for não
ELSEIF SCREEN-GROUP1 = 'M4' OR " se for grupo M4 ou M5 STOP. " sai do processamento
SCREEN-GROUP1 = 'M5'. " bloqueia entrada do ENDIF. " Se resposta for não
SCREEN-INPUT = 0. " usuário
SCREEN-OUTPUT = 1. ENDFORM. " F_CONFIRMA_IMPRESSAO.
SCREEN-INVISIBLE = 0.
ENDIF. *----------------------------------------------------------------------*
MODIFY SCREEN. " altera os parâmetros da tela * FORM F_LIMPA_VARIAVEIS.
ENDLOOP. " leitura dos parâmetros da tela * Limpas as variáveis utilizadas no processamento
ELSEIF P_ET_MAN EQ 'X'. " se criação de etiqueta manual *----------------------------------------------------------------------*
LOOP AT SCREEN. " leitura dos parâmetros da tela FORM F_LIMPA_VARIAVEIS.
IF SCREEN-GROUP1 = 'M2'. " Se id do parâmetro for M2
SCREEN-INPUT = 1. " exibe parâmetro CLEAR: I_LTAP,
SCREEN-OUTPUT = 1. I_ETIQUETAS,
SCREEN-INVISIBLE = 0. V_NUM_ITENS,
ELSEIF SCREEN-GROUP1 = 'M1' OR " se forem os grupos M1, M2 V_QTD_T,
SCREEN-GROUP1 = 'M3' OR " M3 ou M4, oculta os campos V_POS_ITEM,
SCREEN-GROUP1 = 'M4'. V_ETIQ_OT,
SCREEN-INPUT = 0. V_RESPOSTA,
SCREEN-OUTPUT = 0. P_SD,
SCREEN-INVISIBLE = 1. P_OT,
ELSEIF SCREEN-GROUP1 = 'M5'. " se for grupo M5 P_ITEM,
SCREEN-INPUT = 0. " bloqueia entrada do P_MAT,
SCREEN-OUTPUT = 1. " usuário P_LOCAL,
SCREEN-INVISIBLE = 0. P_DATA,
ENDIF. P_NUM_ET,
MODIFY SCREEN. " altera os parâmetros da tela P_QTD_ET,
ENDLOOP. " leitura dos parâmetros da tela P_QTD_A,
ELSE. " se criação de código de barras P_QTD_T,
LOOP AT SCREEN. " leitura dos parâmetros da tela P_QTD_I,
IF SCREEN-GROUP1 = 'M3'. " Se id do parâmetro for M3 P_DIFER,
SCREEN-INPUT = 1. " mostra parâmetros P_DADO,
SCREEN-OUTPUT = 1. P_COPIA.
SCREEN-INVISIBLE = 0.
ELSEIF SCREEN-GROUP1 = 'M1' OR " senão REFRESH: I_LTAP,
SCREEN-GROUP1 = 'M2' OR I_ETIQUETAS.
SCREEN-GROUP1 = 'M4' OR
SCREEN-GROUP1 = 'M5'. ENDFORM. " form f_limpa_variaveis.

64
ABAP Training

Exemplo 2:
O programa abaixo é um exemplo de relatório que permite a interação do usuário na
tela de exibição do relatório, onde pode-se selecionar um valor para chamar outra
transação. Possui também o recurso de “Drill-Down” (expande o relatório e mostra
mais detalhes), entre outros.

Alguns comandos utilizados:


• At Line-Selection.
• Set Pf-Status.
• At User-Command
• Call Transaction and skip first screen
************************************************************************ VBRP, "Documento de faturamento: dados de item
* LIKP, "Documento SD: fornecimento: dados de cabeçalho
* ******************************************** KNA1, "Mestre de clientes (parte geral)
* * Confidencial e Proprietário BKPF, "Cabeçalho do documento contábil
* * Copyright 2001, Accenture TVAUT. "Documentos de venda: motivos ordem: textos
* * Todos os direitos reservados
* ******************************************** ************************************************************************
* * Dados:
* Nome do Shell: YTRP0010 Versão do Shell: v1.01 * Constantes (C_...)
* * Variaveis (V_...)
************************************************************************ * Tabelas Internas (T_...)
* Nome do Programa : ZSRG0030 ************************************************************************
* Título do Programa : Gerenciamento de Contratos de Compra Antecipada
* Programador : Programador 1 * Variaveis e Constantes ----------------------------------------------*
* Data : 03/02/2001 DATA:
* Última atualização : 06/02/2001 V_FIELD(20), "Contém o campo clicado do report
* V_FNAME(20), "Contém o nome do campo
* Descrição : Este relatório irá mostrar as ordens do tipo ZVEF V_VAR LIKE VBFA-RFMNG, "Auxiliar do cálculo da qtde
* com informações de CCA, remessa de compra antecipada, V_TIP_REL, "Tipo do relatório
* recusas e devoluções Contab. Estoque V_SUBTIT(50), "Subtitulo do relatório
* V_COUNT TYPE I, "Contador de registros impressos
* Include : V_TABIX LIKE SY-TABIX, "Variável auxiliar para posicionar na I_VBFA2
* V_KWMENG TYPE I,
* Calls : V_RFMNGP TYPE I,
* V_RFMNGR TYPE I,
* Módulos de Funções: V_RFMNGE TYPE I,
* V_RFMNGC TYPE I,
*----------------------------------------------------------------------* V_RFMNG1 TYPE I,
* Lista de Modificações: V_RFMNG2 TYPE I,
* Data Autor Corr. # Descrição V_RFMNG3 TYPE I,
* -------- ------------ ---------- ----------------------------------- V_RFMNG4 TYPE I,
* 03/02/0199 AC@PROG1 MD0K915810 Desenvolvimento inicial do prg V_RFMNG5 TYPE I,
************************************************************************ V_RFMNG6 TYPE I.
REPORT ZSRG0030 MESSAGE-ID ZV
NO STANDARD PAGE HEADING CONSTANTS:
LINE-SIZE 234 C_REC_ZRVF LIKE VBAK-AUART VALUE 'ZRVF',
LINE-COUNT 65(4). C_REC_ZRVR LIKE VBAK-AUART VALUE 'ZRVR',
************************************************************************ C_DEV_ZDVF LIKE VBAK-AUART VALUE 'ZDVF',
* Includes C_DEV_ZDVR LIKE VBAK-AUART VALUE 'ZDVR'.
************************************************************************
*include: DATA BEGIN OF I_BDCDATA OCCURS 0.
* zziheadr. "Cabeçalho padrão de report INCLUDE STRUCTURE BDCDATA.
DATA END OF I_BDCDATA.
************************************************************************
* Tabelas DATA:
************************************************************************ BEGIN OF I_VBAK OCCURS 0,
TABLES: VBELN LIKE VBAK-VBELN, "Ordem ZVEF
VBAK, "Documento de vendas: dados de cabeçalho BSTNK LIKE VBAK-BSTNK, "Numero do pedido
VBAP, "Documento de vendas: dados de item KUNNR LIKE VBAK-KUNNR, "Emissor da ordem
VBUK, "Documento VD: status de cabeçalho e dados administrativos END OF I_VBAK.
M_J1BAB, "Tabela de referência para achar a NF a partir da fatura
J_1BNFDOC, "Cabeçalho da nota fiscal DATA:
ZFA03A, "Faturamento Antecipado - Billing documents / Movement types BEGIN OF I_VBAK1 OCCURS 0,
VBFA, "Fluxo de documentos de vendas e distribuição (VD) VBELN LIKE VBAK-VBELN, "Ordem ZVEF
VBRK, "Documento de faturamento: dados de cabeçalho AUART LIKE VBAK-AUART, "Tipo de documento de venda

65
ABAP Training
AUGRU LIKE VBAK-AUGRU, "Motivo da ordem DATA:
VGBEL LIKE VBAK-VGBEL, "Nº documento do documento modelo BEGIN OF I_VBRP2 OCCURS 0,
XBLNR LIKE VBAK-XBLNR, "Nº documento referência VBELN LIKE VBRP-VBELN, "Documento de faturamento
POSNR LIKE VBAP-POSNR, "Item ZVEF POSNR LIKE VBRP-POSNR, "DItem de documento de faturamen
END OF I_VBAK1. KZWI6 LIKE VBRP-KZWI6, "Subtotal-condição 6 do esquema
END OF I_VBRP2.
DATA:
BEGIN OF I_VBUK OCCURS 0, DATA:
VBELN LIKE VBUK-VBELN, "Status de faturamento da Ordem concluida BEGIN OF I_J1BAB OCCURS 0,
END OF I_VBUK. REFKEY LIKE M_J1BAB-REFKEY, "Documento faturamento
DOCNUM LIKE M_J1BAB-DOCNUM, "Nº documento NF
DATA: END OF I_J1BAB.
BEGIN OF I_VBAP OCCURS 0,
VBELN LIKE VBAP-VBELN, "Ordem ZVEF DATA:
POSNR LIKE VBAP-POSNR, "Item da ordem BEGIN OF I_BNFDOC OCCURS 0,
MATNR LIKE VBAP-MATNR, "Material DOCNUM LIKE J_1BNFDOC-DOCNUM, "Nº documento NF
KWMENG LIKE VBAP-KWMENG, "Quantidado do item na ordem ZZEFETI LIKE J_1BNFDOC-ZZEFETI, "Data efetiva de saída da mercadoria
WERKS LIKE VBAP-WERKS, "Centro ZZDENTR LIKE J_1BNFDOC-ZZDENTR, "Nota fiscal date: Data de Entrada
END OF I_VBAP. END OF I_BNFDOC.

DATA: DATA:
BEGIN OF I_VBFA OCCURS 0, BEGIN OF I_ZFA03A OCCURS 0,
VBELV LIKE VBFA-VBELV, "Documento precedente ABLNR LIKE ZFA03A-ABLNR, "Documento de venda
POSNV LIKE VBFA-POSNV, "Item precedente FBLNR LIKE ZFA03A-FBLNR, "Documento de faturamento
VBELN LIKE VBFA-VBELN, "Documento subsequente FKDAT LIKE ZFA03A-FKDAT, "Dt.faturamento p/índice de docs.fatur
POSNN LIKE VBFA-POSNN, "Item subsequente MBLNR LIKE ZFA03A-MBLNR, "Nº documento de material
VBTYP_N LIKE VBFA-VBTYP_N, "Ctg.doc.subseq. END OF I_ZFA03A.
RFMNG LIKE VBFA-RFMNG, "Quantidade
FKTYP LIKE VBFA-FKTYP, "Ctg.doc.fat DATA:
END OF I_VBFA. BEGIN OF I_ZFA03A1 OCCURS 0,
ABLNR LIKE ZFA03A-ABLNR, "Documento de venda
DATA: FBLNR LIKE ZFA03A-FBLNR, "Documento de faturamento
BEGIN OF I_VBFA1 OCCURS 0, FKDAT LIKE ZFA03A-FKDAT, "Dt.faturamento p/índice de docs.fatur
VBELV LIKE VBFA-VBELV, "Documento precedente MBLNR LIKE ZFA03A-MBLNR, "Nº documento de material
POSNV LIKE VBFA-POSNV, "Item precedente END OF I_ZFA03A1.
VBELN LIKE VBFA-VBELN, "Documento subsequente
POSNN LIKE VBFA-POSNN, "Item subsequente DATA:
RFMNG LIKE VBFA-RFMNG, "Quantidade BEGIN OF I_KNA1 OCCURS 0,
END OF I_VBFA1. KUNNR LIKE KNA1-KUNNR, "Código Emissor
NAME1 LIKE KNA1-NAME1, "Nome do Emissor
DATA: END OF I_KNA1.
BEGIN OF I_VBFA2 OCCURS 0,
VBELV LIKE VBFA-VBELV, "Documento precedente DATA:
POSNV LIKE VBFA-POSNV, "Item precedente BEGIN OF I_LIKP OCCURS 0,
VBELN LIKE VBFA-VBELN, "Documento subsequente VBELN LIKE LIKP-VBELN, "Fornecimento
POSNN LIKE VBFA-POSNN, "Item subsequente ERNAM LIKE LIKP-ERNAM, "usuário que criou o objeto
VBTYP_N LIKE VBFA-VBTYP_N, "Ctg.doc.subseq. ERDAT LIKE LIKP-ERDAT, "Data de criação do registro
END OF I_VBFA2. ROUTE LIKE LIKP-ROUTE, "Itinerário
WADAT LIKE LIKP-WADAT_IST, "Data real de saída de mercadoria
DATA: END OF I_LIKP.
BEGIN OF I_VBFA3 OCCURS 0,
VBELV LIKE VBFA-VBELV, "Documento precedente DATA:
POSNV LIKE VBFA-POSNV, "Item precedente BEGIN OF I_FINAL OCCURS 0,
VBELN LIKE VBFA-VBELN, "Documento subsequente FLAG TYPE C, "Flag para mostrar registro
POSNN LIKE VBFA-POSNN, "Item subsequente VBELN LIKE VBAK-VBELN, "Ordem ZVEF
END OF I_VBFA3. POSNR LIKE VBAP-POSNR, "Item ZVEF
BSTNK LIKE VBAK-BSTNK, "Numero do pedido
DATA: KUNNR LIKE VBAK-KUNNR, "Emissor
BEGIN OF I_VBRK OCCURS 0, NAME1(20) TYPE C, "Descrição do emissor
VBELN LIKE VBRK-VBELN, "Documento de faturamento XBLNR(8) TYPE C, "Numero da Nota Fiscal
FKDAT LIKE VBRK-FKDAT, "Data de faturamento DOCNUM LIKE M_J1BAB-DOCNUM, "No.Documento NF interno
XBLNR LIKE VBRK-XBLNR, "Referência - Número da NF FKDAT LIKE VBRK-FKDAT, "Data da emissão da Nota Fiscal
END OF I_VBRK. WERKS LIKE VBAP-WERKS, "Centro
MATNR(10) TYPE C, "Material
DATA: KWMENG TYPE I, "Quantidade faturada
BEGIN OF I_VBRK1 OCCURS 0, VBELNF LIKE VBFA-VBELN, "Ordem ZVFR
VBELN LIKE VBRK-VBELN, "Documento de faturamento RFMNGP TYPE I, "Qtde remessa a programar
FKDAT LIKE VBRK-FKDAT, "Data de faturamento RFMNGR TYPE I, "Qtde remessa em remessa
XBLNR LIKE VBRK-XBLNR, "Referência - Número da NF RFMNGE TYPE I, "Qtde remessa expedido
END OF I_VBRK1. RFMNGC TYPE I, "Qtde remessa recebido
RFMNG1 TYPE I, "ZRVF
DATA: RFMNG2 TYPE I, "ZRVR
BEGIN OF I_VBRK2 OCCURS 0, RFMNG3 TYPE I, "ZDVF
VBELN LIKE VBRK-VBELN, "Documento de faturamento RFMNG4 TYPE I, "ZDVR
FKDAT LIKE VBRK-FKDAT, "Data de faturamento RFMNG5 TYPE I, "Contab.Estq(S)
XBLNR LIKE VBRK-XBLNR, "Referência - Número da NF RFMNG6 TYPE I, "Contab.Estq(E)
BELNR LIKE BKPF-BELNR, "Documento contábil END OF I_FINAL.
END OF I_VBRK2.
DATA:

66
ABAP Training
BEGIN OF I_SOMA OCCURS 0, POSNV LIKE VBFA-POSNV, "Item
KEYVALUE(37) TYPE C, "Chave VBELN LIKE VBFA-VBELN, "Documento Fatura
KWMENG TYPE I, "Quantidade faturada MBLNR LIKE ZFA03A-MBLNR, "Nº documento de material
RFMNGP TYPE I, "Qtde remessa a programar FKDAT LIKE ZFA03A-FKDAT, "Data de faturamento p/índice d
RFMNGR TYPE I, "Qtde remessa em remessa RFMNG TYPE I, "Quantidade
RFMNGE TYPE I, "Qtde remessa expedido END OF I_CTBESTQE.
RFMNGC TYPE I, "Qtde remessa recebido
RFMNG1 TYPE I, "ZRVF DATA:
RFMNG2 TYPE I, "ZRVR BEGIN OF I_CTBESTQS OCCURS 0,
RFMNG3 TYPE I, "ZDVF VBELV LIKE VBFA-VBELV, "Ordem ZVEF
RFMNG4 TYPE I, "ZDVR POSNV LIKE VBFA-POSNV, "Item
RFMNG5 TYPE I, "Contab.Estq(S) VBELN LIKE VBFA-VBELN, "Documento Fatura
RFMNG6 TYPE I, "Contab.Estq(E) MBLNR LIKE ZFA03A-MBLNR, "Nº documento de material
END OF I_SOMA. FKDAT LIKE ZFA03A-FKDAT, "Data de faturamento p/índice d
RFMNG TYPE I, "Quantidade
DATA: END OF I_CTBESTQS.
BEGIN OF I_REMESSA OCCURS 0,
VBELV LIKE VBFA-VBELV, "Ordem ZVEF ************************************************************************
POSNV LIKE VBFA-POSNV, "Item ZVEF * Parâmetros de entrada :
VBELN LIKE LIKP-VBELN, "Fornecimento * Select Options (S_...)
ROUTE LIKE LIKP-ROUTE, "Itinerário * Parameters (P_...)
VBELNT LIKE VBFA-VBELN, "transporte ************************************************************************
ERDAT LIKE LIKP-ERDAT, "Data de criação do registro SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
ERNAM LIKE LIKP-ERNAM, "usuário que criou o objeto SELECT-OPTIONS: S_KUNNR FOR VBAK-KUNNR MATCHCODE OBJECT
WADAT LIKE LIKP-WADAT_IST, "Data real de saída de mercadoria DEBI,
RFMNG TYPE I, "Quantidade fornecida S_MATNR FOR VBAP-MATNR MATCHCODE OBJECT MAT1.
END OF I_REMESSA. PARAMETERS: P_VBELN LIKE VBAK-VBELN MATCHCODE OBJECT VMVA.
SELECTION-SCREEN END OF BLOCK B1.
DATA: SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-002.
BEGIN OF I_EXPEDIDO OCCURS 0, SELECT-OPTIONS: S_AUDAT FOR VBAK-AUDAT,
VBELV LIKE VBFA-VBELV, "Ordem ZVEF S_WERKS FOR VBAP-WERKS.
POSNV LIKE VBFA-POSNV, "Item ZVEF SELECTION-SCREEN END OF BLOCK B2.
VBELN LIKE LIKP-VBELN, "Fornecimento
VBELNT LIKE VBFA-VBELN, "transporte *-----------------------------------------------------------------------
VBELNF LIKE VBFA-VBELN, "Fatura INITIALIZATION.
XBLNR LIKE VBRK-XBLNR, "Numero da NF *-----------------------------------------------------------------------
DOCNUM LIKE J_1BNFDOC-DOCNUM, "No.Documento NF interno
FKDAT LIKE VBRK-FKDAT, "Data de emissão *-----------------------------------------------------------------------
ZZEFETI LIKE J_1BNFDOC-ZZEFETI, "Data real de saída de mercado AT SELECTION-SCREEN.
ZZDENTR LIKE J_1BNFDOC-ZZDENTR, "Data de entrega do material *-----------------------------------------------------------------------
RFMNG TYPE I, "Quantidade
END OF I_EXPEDIDO. * É preciso indicar pelo menos 1 parâmetro
IF S_KUNNR = SPACE AND S_MATNR = SPACE AND P_VBELN = SPACE.
DATA: MESSAGE E075.
BEGIN OF I_RECEBIDO OCCURS 0, ENDIF.
VBELV LIKE VBFA-VBELV, "Ordem ZVEF
POSNV LIKE VBFA-POSNV, "Item ZVEF * Ao indicar ordem, iremos desconsiderar os outros parâmetros.
VBELN LIKE LIKP-VBELN, "Fornecimento IF P_VBELN NE SPACE.
VBELNT LIKE VBFA-VBELN, "transporte REFRESH: S_MATNR, S_KUNNR.
VBELNF LIKE VBFA-VBELN, "Fatura ENDIF.
XBLNR LIKE VBRK-XBLNR, "Numero da NF
DOCNUM LIKE J_1BNFDOC-DOCNUM, "No.Documento NF interno *-----------------------------------------------------------------------
FKDAT LIKE VBRK-FKDAT, "Data de emissão START-OF-SELECTION.
ZZEFETI LIKE J_1BNFDOC-ZZEFETI, "Data real de saída de mercado *-----------------------------------------------------------------------
ZZDENTR LIKE J_1BNFDOC-ZZDENTR, "Data de entrega do material PERFORM F_INICIA_VAR.
RFMNG TYPE I, "Quantidade PERFORM F_SELECIONA_DADOS.
END OF I_RECEBIDO. PERFORM F_MONTA_TABELA.

DATA: *-----------------------------------------------------------------------
BEGIN OF I_RECDEV OCCURS 0, END-OF-SELECTION.
AUART LIKE VBAK-AUART, "Tipo da ordem *-----------------------------------------------------------------------
VBELN LIKE VBAP-VBELN, "Ordem ZVEF PERFORM F_MOSTRA_DADOS.
POSNR LIKE VBAP-POSNR, "Item da ordem
VBELNO LIKE VBFA-VBELV, "Recusa/Devolução *-----------------------------------------------------------------------
AUGRU LIKE VBAK-AUGRU, "Motivo AT LINE-SELECTION.
VBELNF LIKE VBFA-VBELN, "Fatura *-----------------------------------------------------------------------
FKDAT LIKE VBRK-FKDAT, "Data da fatura SET PF-STATUS 'MAIN2'.
BELNR LIKE BKPF-BELNR, "Doc.Contabil
NETWR LIKE VBRK-NETWR, "Valor GET CURSOR FIELD V_FIELD.
NFNUM LIKE VBAK-XBLNR, "NF cliente/devolvida CASE V_FIELD.
XBLNR LIKE VBRK-XBLNR, "Referência WHEN 'I_FINAL-RFMNGR'. "Coluna L - em remessa
VGBEL LIKE VBAK-VGBEL, "Nº documento do documento modelo V_TIP_REL = 'R'.
DOCNUM LIKE J_1BNFDOC-DOCNUM, "No.Documento NF interno V_SUBTIT = TEXT-054. "Remessas em processamento
RFMNG TYPE I, "Quantidade PERFORM F_MONTA_REMESSA.
END OF I_RECDEV.
WHEN 'I_FINAL-RFMNGE'. "Coluna M - expedido
DATA: V_TIP_REL = 'E'.
BEGIN OF I_CTBESTQE OCCURS 0, V_SUBTIT = TEXT-055. "Remessas expedidas
VBELV LIKE VBFA-VBELV, "Ordem ZVEF PERFORM F_MONTA_EXPEDIDO.

67
ABAP Training
SET PARAMETER ID 'JEF' FIELD I_FINAL-DOCNUM.
WHEN 'I_FINAL-RFMNGC'. "Coluna N - recebido CALL TRANSACTION 'J1B3' AND SKIP FIRST SCREEN.
V_TIP_REL = 'C'.
V_SUBTIT = TEXT-056. "Remessas recebidas pelo Cliente ELSEIF V_FIELD = 'I_REMESSA-VBELN'. "Remessa - Remessa
PERFORM F_MONTA_RECEBIDO. SET PARAMETER ID 'VL' FIELD I_REMESSA-VBELN.
CALL TRANSACTION 'VL03' AND SKIP FIRST SCREEN.
WHEN 'I_FINAL-RFMNG1'. "Coluna O - Recusa/Devolução ZRVF
V_TIP_REL = '1'. ELSEIF V_FIELD = 'I_REMESSA-VBELNT'. "Transporte - remessa
V_SUBTIT = TEXT-057. "Recusas de Simples Faturamento (ZRVF) SET PARAMETER ID 'TNR' FIELD I_REMESSA-VBELNT.
PERFORM F_MONTA_RECDEV USING C_REC_ZRVF. CALL TRANSACTION 'VT03' AND SKIP FIRST SCREEN.

WHEN 'I_FINAL-RFMNG2'. "Coluna P - Recusa/Devolução ZRVR ELSEIF V_FIELD = 'I_EXPEDIDO-VBELN'. "Remessa - Expedida
V_TIP_REL = '2'. SET PARAMETER ID 'VL' FIELD I_EXPEDIDO-VBELN.
V_SUBTIT = TEXT-058. "Recusas de Simples Remessa (ZRVR)'. CALL TRANSACTION 'VL03' AND SKIP FIRST SCREEN.
PERFORM F_MONTA_RECDEV USING C_REC_ZRVR.
ELSEIF V_FIELD = 'I_EXPEDIDO-VBELNT'. "Transporte - expedido
WHEN 'I_FINAL-RFMNG3'. "Coluna Q - Recusa/Devolução ZDVF SET PARAMETER ID 'TNR' FIELD I_EXPEDIDO-VBELNT.
V_TIP_REL = '3'. CALL TRANSACTION 'VT03' AND SKIP FIRST SCREEN.
V_SUBTIT = TEXT-059. "Devoluções de Simples Faturamento (ZDVF)
PERFORM F_MONTA_RECDEV USING C_DEV_ZDVF. ELSEIF V_FIELD = 'I_EXPEDIDO-VBELNF'. "Fatura - expedido
SET PARAMETER ID 'VF' FIELD I_EXPEDIDO-VBELNF.
WHEN 'I_FINAL-RFMNG4'. "Coluna R - Recusa/Devolução ZDVR CALL TRANSACTION 'VF03' AND SKIP FIRST SCREEN.
V_TIP_REL = '4'.
V_SUBTIT = TEXT-060. "Devoluções de Simples Remessa (ZDVR) ELSEIF V_FIELD = 'I_EXPEDIDO-XBLNR'. "Nota Fiscal - expedido
PERFORM F_MONTA_RECDEV USING C_DEV_ZDVR. SET PARAMETER ID 'JEF' FIELD I_EXPEDIDO-DOCNUM.
CALL TRANSACTION 'J1B3' AND SKIP FIRST SCREEN.
WHEN 'I_FINAL-RFMNG5'. "Coluna S - Contab.Estoque(S)
V_TIP_REL = '5'. ELSEIF V_FIELD = 'I_RECEBIDO-VBELN'. "Remessa - recebida
V_SUBTIT = TEXT-061. "Contabilização estoque-Simples Faturamento SET PARAMETER ID 'VL' FIELD I_RECEBIDO-VBELN.
PERFORM F_MONTA_CTBESTQ_S. CALL TRANSACTION 'VL03' AND SKIP FIRST SCREEN.

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


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

WHEN 'DISP'. "Exibir Documento ELSEIF V_TIP_REL = '4'. "ZDVR


GET CURSOR FIELD V_FIELD. SET PARAMETER ID 'JEF' FIELD I_RECDEV-DOCNUM.
IF V_FIELD = 'I_FINAL-VBELN'. "Ordem ZVEF CALL TRANSACTION 'J1B3' AND SKIP FIRST SCREEN.
SET PARAMETER ID 'AUN' FIELD I_FINAL-VBELN.
CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN. ENDIF.

ELSEIF V_FIELD = 'I_FINAL-VBELNF'. "Ordem ZVFR ELSEIF V_FIELD = 'I_RECDEV-NFNUM'. "Nota Fiscal - Recusa/Devol
SET PARAMETER ID 'AUN' FIELD I_FINAL-VBELNF. * if v_tip_rel = '1'. "ZRVF
CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN. SET PARAMETER ID 'JEF' FIELD I_FINAL-DOCNUM.
CALL TRANSACTION 'J1B3' AND SKIP FIRST SCREEN.
ELSEIF V_FIELD = 'I_FINAL-XBLNR'."Nota Fiscal - ZVEF

68
ABAP Training
ELSEIF V_FIELD = 'I_RECDEV-BELNR'. "Doc.Crédito - Recusa/Devol MODIFY I_FINAL.
IF V_TIP_REL = '1' OR "ZRVF ENDLOOP. "I_Final
V_TIP_REL = '3'. "ZDVF PERFORM F_MOSTRA_DADOS.
PERFORM F_DISPLAY_DOCUMENT USING I_RECDEV-VBELNF. ENDCASE.
ENDIF.
*-----------------------------------------------------------------------
ELSEIF V_FIELD = 'I_CTBESTQS-VBELN'. "Fatura - CtbEst(S) TOP-OF-PAGE.
SET PARAMETER ID 'VF' FIELD I_CTBESTQS-VBELN. *-----------------------------------------------------------------------
CALL TRANSACTION 'VF03' AND SKIP FIRST SCREEN. PERFORM F_CABEC_PRINCIPAL.

ELSEIF V_FIELD = 'I_CTBESTQE-VBELN'. "Fatura - CtbEst(E) *-----------------------------------------------------------------------


SET PARAMETER ID 'VF' FIELD I_CTBESTQE-VBELN. TOP-OF-PAGE DURING LINE-SELECTION.
CALL TRANSACTION 'VF03' AND SKIP FIRST SCREEN. *-----------------------------------------------------------------------
IF V_TIP_REL = 'S'. "Soma
ENDIF. PERFORM F_CABEC_SOMA.

WHEN 'SDRE'. "Saldo em remessa - coluna i - m <> 0 ELSEIF V_TIP_REL = 'P'. "Principal
V_TIP_REL = 'P'. "Cabeçalho principal PERFORM F_CABEC_PRINCIPAL.
V_SUBTIT = 'Saldo em remessa'.
LOOP AT I_FINAL. ELSEIF V_TIP_REL = 'I'. "Inicio
V_VAR = I_FINAL-KWMENG - I_FINAL-RFMNGE. PERFORM F_CABEC_PRINCIPAL.
IF V_VAR <> 0.
I_FINAL-FLAG = 'X'. ELSE.
ELSE. FORMAT COLOR COL_HEADING.
I_FINAL-FLAG = ' '.
ENDIF. WRITE 1 V_SUBTIT.
MODIFY I_FINAL. SKIP.
ENDLOOP. "I_final
PERFORM F_MOSTRA_DADOS. FORMAT COLOR COL_NORMAL.

WHEN 'DCFT'. "Divergência na contab. de faturamento - coluna i <> s WRITE: /1 TEXT-003, 14 I_FINAL-VBELN.
V_TIP_REL = 'P'. "Cabeçalho principal
V_SUBTIT = 'Divergência na contab. de faturamento'. IF V_TIP_REL <> '5' AND
LOOP AT I_FINAL. V_TIP_REL <> '6'.
IF I_FINAL-KWMENG <> I_FINAL-RFMNG5.
I_FINAL-FLAG = 'X'. WRITE: /1 TEXT-012, 14 I_FINAL-VBELNF.
ELSE.
I_FINAL-FLAG = ' '. ENDIF.
ENDIF.
MODIFY I_FINAL. WRITE:
ENDLOOP. "I_final /1 TEXT-005, 14 I_FINAL-KUNNR,
PERFORM F_MOSTRA_DADOS. /1 TEXT-010, 14 I_FINAL-MATNR,
/1 TEXT-009, 14 I_FINAL-WERKS.
WHEN 'DCDR'. "Divergência na contab. de devol/recusa- coluna o+q <> t SKIP.
V_TIP_REL = 'P'. "Cabeçalho principal
V_SUBTIT = 'Divergência na contab. de devolução/recusa'. FORMAT COLOR COL_HEADING.
LOOP AT I_FINAL.
V_VAR = I_FINAL-RFMNG1 + I_FINAL-RFMNG3. CASE V_TIP_REL.
IF V_VAR <> I_FINAL-RFMNG6. WHEN 'R'. "Remessa
I_FINAL-FLAG = 'X'. PERFORM F_CABEC_REMESSA.
ELSE.
I_FINAL-FLAG = ' '. WHEN 'E'. "Expedido
ENDIF. PERFORM F_CABEC_EXPREC.
MODIFY I_FINAL.
ENDLOOP. "I_final WHEN 'C'. "Recebido
PERFORM F_MOSTRA_DADOS. PERFORM F_CABEC_EXPREC.

WHEN 'DVRE'. "Divergência na recusa - coluna o <> p WHEN '1'. "ZRVF


V_TIP_REL = 'P'. "Cabeçalho principal PERFORM F_CABEC_ZRVF.
V_SUBTIT = 'Divergência na recusa'.
LOOP AT I_FINAL. WHEN '2'. "ZRVR
IF I_FINAL-RFMNG1 <> I_FINAL-RFMNG2. PERFORM F_CABEC_ZRVR.
I_FINAL-FLAG = 'X'.
ELSE. WHEN '3'. "ZDVF
I_FINAL-FLAG = ' '. PERFORM F_CABEC_ZDVF.
ENDIF.
MODIFY I_FINAL. WHEN '4'. "ZDVR
ENDLOOP. "I_final PERFORM F_CABEC_ZDVR.
PERFORM F_MOSTRA_DADOS.
WHEN '5'. "Contab.Estoque(S)
WHEN 'DVDV'. "Divergência na devolução - coluna q <> r PERFORM F_CABEC_CTBESTQ.
V_TIP_REL = 'P'. "Cabeçalho principal
V_SUBTIT = 'Divergência na devolução'. WHEN '6'. "Contab.Estoque(S)
LOOP AT I_FINAL. PERFORM F_CABEC_CTBESTQ.
IF I_FINAL-RFMNG3 <> I_FINAL-RFMNG4. ENDCASE.
I_FINAL-FLAG = 'X'. ENDIF.
ELSE. FORMAT COLOR COL_NORMAL.
I_FINAL-FLAG = ' '.
ENDIF. *-----------------------------------------------------------------------

69
ABAP Training
END-OF-PAGE. ON CHANGE OF I_VBAK-KUNNR.
*----------------------------------------------------------------------- CLEAR I_KNA1.

*&---------------------------------------------------------------------* SELECT SINGLE NAME1


*& Form F_Inicia_Var FROM KNA1
*&---------------------------------------------------------------------* INTO I_KNA1-NAME1
* Inicializa as variáveis usados no programa * WHERE KUNNR = I_VBAK-KUNNR.
*----------------------------------------------------------------------*
FORM F_INICIA_VAR. I_KNA1-KUNNR = I_VBAK-KUNNR.
APPEND I_KNA1.
V_TIP_REL = 'I'. "Tipo inicial do relatório ENDON.
V_SUBTIT = 'Principal'. ENDLOOP. "I_VBAK

REFRESH: SORT I_VBAK BY VBELN.


I_VBAK, SORT I_KNA1 BY KUNNR.
I_VBAK1,
I_VBAP, *Selecionar somente as ordens com Status de faturamento C-Concluído
I_VBFA, SELECT VBELN
I_VBFA1, FROM VBUK
I_VBFA2, INTO TABLE I_VBUK
I_VBFA3, FOR ALL ENTRIES IN I_VBAK
I_KNA1, WHERE VBELN = I_VBAK-VBELN
I_VBRK, AND FKSAK = 'C'.
I_VBRK1,
I_LIKP, *Verifica se selecionou alguma ordem
I_J1BAB, IF I_VBUK[] IS INITIAL.
I_BNFDOC, MESSAGE ID 'ZM' TYPE 'S' NUMBER '083'
I_ZFA03A, WITH 'Não foi selecionado nenhuma ordem ZVEF'
I_ZFA03A1, 'para os parâmetros acima'.
I_REMESSA, STOP.
I_EXPEDIDO, ENDIF.
I_RECEBIDO,
I_RECDEV, *Seleciona os ítens da ordem ZVEF
I_CTBESTQS, SELECT VBELN POSNR MATNR KWMENG WERKS
I_CTBESTQE. FROM VBAP
* i_fcode. INTO TABLE I_VBAP
FOR ALL ENTRIES IN I_VBUK
* i_fcode-fcode = 'PRIN'. WHERE VBELN = I_VBUK-VBELN
* append i_fcode. AND MATNR IN S_MATNR
AND WERKS IN S_WERKS.
ENDFORM. "f_inicia_var
*Verifica se selecionou algum item
*&---------------------------------------------------------------------* IF I_VBAP[] IS INITIAL.
*& Form F_Seleciona_dados. MESSAGE ID 'ZM' TYPE 'S' NUMBER '083'
*&---------------------------------------------------------------------* WITH 'Não foi selecionado nenhuma ordem ZVEF'
* Seleciona os dados necessários para gerar o relatório 'para os parâmetros acima'.
*----------------------------------------------------------------------* STOP.
FORM F_SELECIONA_DADOS. ENDIF.

*Seleciona as ordens ZVEF SORT I_VBAP BY VBELN POSNR.


IF P_VBELN <> SPACE. "Se parâmetro número de ordem foi digitado
*Verifica o fluxo dos documentos
SELECT VBELN BSTNK KUNNR SELECT VBELV POSNV VBELN POSNN VBTYP_N RFMNG FKTYP
FROM VBAK FROM VBFA
INTO TABLE I_VBAK INTO TABLE I_VBFA
WHERE VBELN = P_VBELN FOR ALL ENTRIES IN I_VBAP
AND AUART = 'ZVEF'. WHERE VBELV = I_VBAP-VBELN
ELSE. AND POSNV = I_VBAP-POSNR.

SELECT VBELN BSTNK KUNNR SORT I_VBFA BY VBELV POSNV VBTYP_N DESCENDING.
FROM VBAK
INTO TABLE I_VBAK LOOP AT I_VBFA.
WHERE AUDAT IN S_AUDAT
AND KUNNR IN S_KUNNR *verifica se o documento subsequente é uma fatura
AND AUART = 'ZVEF'. IF I_VBFA-VBTYP_N = 'M' AND "Fatura
ENDIF. I_VBFA-FKTYP = 'A'. "Fatura/o baseado em orde

*Verifica se selecionou alguma ordem ZVEF *Seleciona o documento de faturamento


IF I_VBAK[] IS INITIAL. SELECT SINGLE VBELN FKDAT XBLNR
MESSAGE ID 'ZM' TYPE 'S' NUMBER '083' FROM VBRK
WITH 'Não foi selecionado nenhuma ordem ZVEF' INTO I_VBRK
'para os parâmetros acima'. WHERE VBELN = I_VBFA-VBELN.
STOP. IF SY-SUBRC = 0.
ENDIF. APPEND I_VBRK.
ENDIF.
SORT I_VBAK BY KUNNR.
*Verifica a existência do registro na ZFA03A
*seleciona as descrições dos emissores na tabela kna1 SELECT SINGLE ABLNR FBLNR FKDAT MBLNR
LOOP AT I_VBAK. FROM ZFA03A

70
ABAP Training
INTO I_ZFA03A
WHERE ABLNR = I_VBFA-VBELV *seleciona os dados de transporte dessa remessa
AND FBLNR = I_VBFA-VBELN. SELECT SINGLE VBELN ERNAM ERDAT ROUTE WADAT_IST
IF SY-SUBRC = 0. FROM LIKP
APPEND I_ZFA03A. INTO I_LIKP
ENDIF. WHERE VBELN = I_VBFA1-VBELN.
IF SY-SUBRC = 0.
*seleciona o número do documento NF a partir da fatura APPEND I_LIKP.
SELECT REFKEY DOCNUM ENDIF.
FROM M_J1BAB ENDIF.
APPENDING TABLE I_J1BAB
UP TO 1 ROWS *seleciona o numero do transporte da remessa
WHERE REFKEY = I_VBFA-VBELN. SELECT VBELV POSNV VBELN POSNN VBTYP_N
FROM VBFA
*verifica se o documento subsequente é uma remessa ZVFR APPENDING TABLE I_VBFA2
ELSEIF I_VBFA-VBTYP_N = 'C'. WHERE VBELV = I_VBFA1-VBELN
AND VBTYP_N = '8'. "No. do Transporte
*Seleciona as remessas ZVFR ENDLOOP. "I_VBFA1
SELECT VBELV POSNV VBELN POSNN RFMNG
FROM VBFA SORT I_VBFA2 BY VBELV POSNV VBTYP_N.
APPENDING TABLE I_VBFA1
WHERE VBELV = I_VBFA-VBELN *processa as faturas e transporte das remessas selecionadas
AND POSNV = I_VBFA-POSNN LOOP AT I_VBFA2.
AND VBTYP_N = 'J' IF I_VBFA2-VBTYP_N = 'M'. "Fatura
AND VBTYP_V = 'C'.
*seleciona a data/numero da NF física da remessa faturada
*verifica se o documento subsequente é uma recusa/devolução SELECT SINGLE VBELN FKDAT XBLNR
ELSEIF I_VBFA-VBTYP_N = 'H'. "Recusa/Devolução FROM VBRK
INTO I_VBRK1
*verfica se essa recusa/devolução está faturada WHERE VBELN = I_VBFA2-VBELN.
* clear vbuk-fksak. IF SY-SUBRC = 0.
APPEND I_VBRK1.
* select single fksak ENDIF.
* from vbuk
* into vbuk-fksak *seleciona o número do documento NF a partir da fatura
* where vbeln = i_vbfa-vbeln. SELECT REFKEY DOCNUM
* if vbuk-fksak = 'C'. "se Recusa/Devol. está faturada FROM M_J1BAB
APPENDING TABLE I_J1BAB
CLEAR VBAK-AUART. UP TO 1 ROWS
WHERE REFKEY = I_VBFA2-VBELN.
SELECT SINGLE VBELN AUART AUGRU VGBEL XBLNR ENDIF.
FROM VBAK
INTO I_VBAK1 ENDLOOP. "I_VBFA2
WHERE VBELN = I_VBFA-VBELN.
IF I_VBAK1-AUART = 'ZRVF' OR SORT I_LIKP BY VBELN.
I_VBAK1-AUART = 'ZRVR' OR SORT I_VBRK1 BY VBELN.
I_VBAK1-AUART = 'ZDVF' OR SORT I_VBAK1 BY VBELN POSNR.
I_VBAK1-AUART = 'ZDVR'.
I_VBAK1-POSNR = I_VBFA-POSNN. IF NOT I_VBAK1[] IS INITIAL.
APPEND I_VBAK1.
*processa os documentos de recusa/devolução selecionados
ENDIF. *busca os documentos de crédito da recusa/devolução
* endif. SELECT VBELV POSNV VBELN POSNN
ENDIF. FROM VBFA
ENDLOOP. "I_VBFA INTO TABLE I_VBFA3
SORT I_VBRK BY VBELN. FOR ALL ENTRIES IN I_VBAK1
SORT I_VBFA1 BY VBELV POSNV. WHERE VBELV = I_VBAK1-VBELN
SORT I_ZFA03A BY ABLNR FBLNR. AND POSNV = I_VBAK1-POSNR
AND VBTYP_N = 'O'.
*processa somente as remessas selecionadas
LOOP AT I_VBFA1. "Remessas IF NOT I_VBFA3[] IS INITIAL.

*verifica se remessa está faturada *seleciona valor de crédito da Recusa/Devolução


CLEAR VBUK. SELECT VBELN POSNR KZWI6
FROM VBRP
SELECT SINGLE FKSTK TRSTA INTO TABLE I_VBRP2
FROM VBUK FOR ALL ENTRIES IN I_VBFA3
INTO (VBUK-FKSTK, VBUK-TRSTA) WHERE VBELN = I_VBFA3-VBELN
WHERE VBELN = I_VBFA1-VBELN. AND POSNR = I_VBFA3-POSNN.
IF VBUK-FKSTK = 'C'. "se Remessa está faturada
*seleciona dados da fatura da Recusa/Devolução
*seleciona o documento fatura da remessa que está faturada SELECT VBELN FKDAT XBLNR
SELECT VBELV POSNV VBELN POSNN VBTYP_N FROM VBRK
FROM VBFA INTO TABLE I_VBRK2
APPENDING TABLE I_VBFA2 FOR ALL ENTRIES IN I_VBFA3
WHERE VBELV = I_VBFA1-VBELN WHERE VBELN = I_VBFA3-VBELN.
AND POSNV = I_VBFA1-POSNN
AND VBTYP_N = 'M'. "Doc. Faturamento LOOP AT I_VBRK2.
ELSE.

71
ABAP Training
*seleciona os documentos contábeis relacionados a fatura BINARY SEARCH.
SELECT BELNR
FROM BKPF MOVE I_KNA1-NAME1 TO I_FINAL-NAME1.
INTO I_VBRK2-BELNR
UP TO 1 ROWS *posiciona no fluxo dos documentos a partir da ordem ZVEF
WHERE AWTYP = 'VBRK' READ TABLE I_VBFA
AND AWKEY = I_VBRK2-VBELN. WITH KEY VBELV = I_VBAP-VBELN
ENDSELECT. POSNV = I_VBAP-POSNR
IF SY-SUBRC = 0. BINARY SEARCH.
MODIFY I_VBRK2.
ENDIF. LOOP AT I_VBFA FROM SY-TABIX.
ENDLOOP. "i_vbrk2 IF I_VBFA-VBELV <> I_VBAP-VBELN OR
I_VBFA-POSNV <> I_VBAP-POSNR.
*seleciona o número do documento NF a partir da fatura EXIT.
SELECT REFKEY DOCNUM ENDIF.
FROM M_J1BAB IF I_VBFA-VBTYP_N = 'C'. "Existem remessas para ordem
APPENDING TABLE I_J1BAB *Verifica se existe remessa para o item ZVFR
FOR ALL ENTRIES IN I_VBRK2 MOVE I_VBFA-VBELN TO I_FINAL-VBELNF.
WHERE REFKEY = I_VBRK2-VBELN.
CLEAR V_VAR.
*seleciona dados da coluna contabilização de estoque
SELECT ABLNR FBLNR FKDAT MBLNR *posiciona ZVFR a partir ZVEF
FROM ZFA03A READ TABLE I_VBFA1
INTO TABLE I_ZFA03A1 WITH KEY VBELV = I_VBFA-VBELN
FOR ALL ENTRIES IN I_VBFA3 POSNV = I_VBFA-POSNN
WHERE ABLNR = I_VBFA3-VBELV BINARY SEARCH.
AND FBLNR = I_VBFA3-VBELN. *para cada ZVEF existem varias ZVFR
ENDIF. LOOP AT I_VBFA1 FROM SY-TABIX.
ENDIF. IF I_VBFA1-VBELV <> I_VBFA-VBELN OR
SORT I_VBFA3 BY VBELV POSNV. I_VBFA1-POSNV <> I_VBFA-POSNN.
SORT I_VBRK2 BY VBELN. EXIT.
SORT I_ZFA03A1 BY ABLNR FBLNR. ENDIF.

IF NOT I_J1BAB[] IS INITIAL. V_VAR = V_VAR + I_VBFA1-RFMNG.

*seleciona os dados da NF *posiciona na fatura da remessa


SELECT DOCNUM ZZEFETI ZZDENTR *se existir então esta remessa está faturada
FROM J_1BNFDOC READ TABLE I_VBFA2
INTO TABLE I_BNFDOC WITH KEY VBELV = I_VBFA1-VBELN
FOR ALL ENTRIES IN I_J1BAB POSNV = I_VBFA1-POSNN
WHERE DOCNUM = I_J1BAB-DOCNUM. VBTYP_N = 'M'
ENDIF. BINARY SEARCH.
IF SY-SUBRC = 0.
SORT I_J1BAB BY REFKEY. *Pode existir mais de uma fatura por ordem ZVFR (estorno) então
SORT I_BNFDOC BY DOCNUM. *devo selecionar a mais atual (última).
LOOP AT I_VBFA2 FROM SY-TABIX.
ENDFORM. "F_SELECIONA_DADOS IF I_VBFA2-VBELV <> I_VBFA1-VBELN OR
*&---------------------------------------------------------------------* I_VBFA2-POSNV <> I_VBFA1-POSNN OR
*& Form F_Monta_tabela. I_VBFA2-VBTYP_N <> 'M'.
*&---------------------------------------------------------------------* EXIT.
* Monta a tabela interna com os dados que serão impressos no relatório * ENDIF.
*----------------------------------------------------------------------* V_TABIX = SY-TABIX.
FORM F_MONTA_TABELA. ENDLOOP.

LOOP AT I_VBAP. READ TABLE I_VBFA2 INDEX V_TABIX.

CLEAR I_FINAL. *remessa faturada, então qtde será somada na coluna expedido
I_FINAL-RFMNGE = I_FINAL-RFMNGE + I_VBFA1-RFMNG.
MOVE:
'X' TO I_FINAL-FLAG, *posiciona na fatura do documento da remessa
I_VBAP-VBELN TO I_FINAL-VBELN, READ TABLE I_VBRK1
I_VBAP-POSNR TO I_FINAL-POSNR, WITH KEY VBELN = I_VBFA2-VBELN
I_VBAP-WERKS TO I_FINAL-WERKS, BINARY SEARCH.
I_VBAP-MATNR TO I_FINAL-MATNR,
I_VBAP-KWMENG TO I_FINAL-KWMENG. *Verifica se existe NF associada a essa fatura
READ TABLE I_J1BAB
*posiciona no cabeçalho da ordem ZVEF WITH KEY REFKEY = I_VBFA2-VBELN
READ TABLE I_VBAK BINARY SEARCH.
WITH KEY VBELN = I_VBAP-VBELN IF SY-SUBRC = 0.
BINARY SEARCH.
CHECK SY-SUBRC = 0. *posiciona na NF para pegar data de entrega e data efetiva
READ TABLE I_BNFDOC
MOVE: WITH KEY DOCNUM = I_J1BAB-DOCNUM
I_VBAK-BSTNK TO I_FINAL-BSTNK, BINARY SEARCH.
I_VBAK-KUNNR TO I_FINAL-KUNNR.
*posiciona no transporte da remessa
*posiciona no emissor para pegar o nome CLEAR I_VBFA2.
READ TABLE I_KNA1
WITH KEY KUNNR = I_VBAK-KUNNR READ TABLE I_VBFA2

72
ABAP Training
WITH KEY VBELV = I_VBFA1-VBELN CLEAR: I_VBAK1, I_VBFA3, I_VBRP2, I_VBRK2, I_J1BAB.
VBTYP_N = '8' "Transporte
BINARY SEARCH. *Busca ordem da recusa/devolução
READ TABLE I_VBAK1
MOVE: WITH KEY VBELN = I_VBFA-VBELN
I_VBFA-VBELV TO I_EXPEDIDO-VBELV, POSNR = I_VBFA-POSNN
I_VBFA-POSNV TO I_EXPEDIDO-POSNV, BINARY SEARCH.
I_VBFA1-VBELN TO I_EXPEDIDO-VBELN, IF SY-SUBRC = 0.
I_VBFA2-VBELN TO I_EXPEDIDO-VBELNT,
I_VBRK1-VBELN TO I_EXPEDIDO-VBELNF, *verifica se esta ordem está faturada
I_VBRK1-XBLNR TO I_EXPEDIDO-XBLNR, READ TABLE I_VBFA3
I_BNFDOC-DOCNUM TO I_EXPEDIDO-DOCNUM, WITH KEY VBELV = I_VBFA-VBELN
I_VBRK1-FKDAT TO I_EXPEDIDO-FKDAT, POSNV = I_VBFA-POSNN
I_BNFDOC-ZZEFETI TO I_EXPEDIDO-ZZEFETI, BINARY SEARCH.
I_BNFDOC-ZZDENTR TO I_EXPEDIDO-ZZDENTR, IF SY-SUBRC = 0.
I_VBFA1-RFMNG TO I_EXPEDIDO-RFMNG.
*busca o valor do crédito no item da ordem
COLLECT I_EXPEDIDO. READ TABLE I_VBRP2
WITH KEY VBELN = I_VBFA3-VBELN
IF I_BNFDOC-ZZDENTR > '00000000'. POSNR = I_VBFA3-POSNN
*se data de entrega estiver preenchida então a remessa já está entregue, BINARY SEARCH.
*então qtde será somada a coluna recebido
I_FINAL-RFMNGC = I_FINAL-RFMNGC + I_VBFA1-RFMNG. *posiciona na fatura da ordem
READ TABLE I_VBRK2
MOVE: WITH KEY VBELN = I_VBFA3-VBELN
I_VBFA-VBELV TO I_RECEBIDO-VBELV, BINARY SEARCH.
I_VBFA-POSNV TO I_RECEBIDO-POSNV, IF SY-SUBRC = 0.
I_VBFA1-VBELN TO I_RECEBIDO-VBELN,
I_VBFA2-VBELN TO I_RECEBIDO-VBELNT, *Verifica se existe NF associada a essa fatura
I_VBRK1-VBELN TO I_RECEBIDO-VBELNF, READ TABLE I_J1BAB
I_VBRK1-XBLNR TO I_RECEBIDO-XBLNR, WITH KEY REFKEY = I_VBRK2-VBELN
I_BNFDOC-DOCNUM TO I_RECEBIDO-DOCNUM, BINARY SEARCH.
I_VBRK1-FKDAT TO I_RECEBIDO-FKDAT, ENDIF.
I_BNFDOC-ZZEFETI TO I_RECEBIDO-ZZEFETI, ENDIF.
I_BNFDOC-ZZDENTR TO I_RECEBIDO-ZZDENTR, ENDIF.
I_VBFA1-RFMNG TO I_RECEBIDO-RFMNG.
MOVE:
COLLECT I_RECEBIDO. I_VBAK1-AUART TO I_RECDEV-AUART,
I_VBAP-VBELN TO I_RECDEV-VBELN,
ENDIF. I_VBAP-POSNR TO I_RECDEV-POSNR,
ENDIF. * i_vbfa3-vbelv to i_recdev-vbelno,
ELSE. I_VBAK1-VBELN TO I_RECDEV-VBELNO,
*remessa não faturada, então qtde será somada a coluna em remessa I_VBAK1-AUGRU TO I_RECDEV-AUGRU,
I_VBAK1-VGBEL TO I_RECDEV-VGBEL,
I_FINAL-RFMNGR = I_FINAL-RFMNGR + I_VBFA1-RFMNG. I_VBFA3-VBELN TO I_RECDEV-VBELNF,
CLEAR I_LIKP. I_VBRK2-FKDAT TO I_RECDEV-FKDAT,
I_VBRK2-BELNR TO I_RECDEV-BELNR,
*posiciona no fornecimento da remessa I_VBRP2-KZWI6 TO I_RECDEV-NETWR,
READ TABLE I_LIKP I_VBFA-RFMNG TO I_RECDEV-RFMNG.
WITH KEY VBELN = I_VBFA1-VBELN
BINARY SEARCH. CASE I_VBAK1-AUART.
WHEN C_REC_ZRVF. "ZRVF
*posiciona no transporte da remessa I_FINAL-RFMNG1 = I_FINAL-RFMNG1 + I_VBFA-RFMNG.
CLEAR I_VBFA2.
MOVE I_FINAL-XBLNR TO I_RECDEV-XBLNR. "NF ZVEF
READ TABLE I_VBFA2
WITH KEY VBELV = I_VBFA1-VBELN PERFORM F_CALC_CONT_ESTQ_E."Calcula coluna T
VBTYP_N = '8'
BINARY SEARCH. WHEN C_REC_ZRVR. "ZRVR
I_FINAL-RFMNG2 = I_FINAL-RFMNG2 + I_VBFA-RFMNG.
MOVE:
I_VBFA-VBELV TO I_REMESSA-VBELV, MOVE:
I_VBFA-POSNV TO I_REMESSA-POSNV, I_VBAK1-XBLNR TO I_RECDEV-XBLNR, "NF Recusada
I_VBFA1-VBELN TO I_REMESSA-VBELN, I_J1BAB-DOCNUM TO I_RECDEV-DOCNUM.
I_LIKP-ROUTE TO I_REMESSA-ROUTE,
I_VBFA2-VBELN TO I_REMESSA-VBELNT, WHEN C_DEV_ZDVF. "ZDVF
I_LIKP-ERDAT TO I_REMESSA-ERDAT, I_FINAL-RFMNG3 = I_FINAL-RFMNG3 + I_VBFA-RFMNG.
I_LIKP-ERNAM TO I_REMESSA-ERNAM,
I_LIKP-WADAT TO I_REMESSA-WADAT, MOVE:
I_VBFA1-RFMNG TO I_REMESSA-RFMNG. I_FINAL-XBLNR TO I_RECDEV-NFNUM, "NF devolvida
APPEND I_REMESSA. I_VBAK1-XBLNR TO I_RECDEV-XBLNR, "NF do cliente
ENDIF. I_J1BAB-DOCNUM TO I_RECDEV-DOCNUM. "NF Interno cliente
ENDLOOP. "I_VBFA1
*não existe remessa, então qtde do item será somada a coluna a programar PERFORM F_CALC_CONT_ESTQ_E."Calcula coluna T

I_FINAL-RFMNGP = I_FINAL-RFMNGP + I_VBFA-RFMNG - V_VAR. WHEN C_DEV_ZDVR. "ZDVR


I_FINAL-RFMNG4 = I_FINAL-RFMNG4 + I_VBFA-RFMNG.
ELSEIF I_VBFA-VBTYP_N = 'H'. "Existem recusa/devoluções
MOVE:

73
ABAP Training
I_VBAK1-XBLNR TO I_RECDEV-XBLNR, "NF do cliente IF SY-SUBRC = 0.
I_J1BAB-DOCNUM TO I_RECDEV-DOCNUM. "NF interno cliente I_FINAL-RFMNG6 = I_FINAL-RFMNG6 + I_VBFA-RFMNG.

*seleciona a nf devolvida MOVE:


SELECT SINGLE XBLNR I_VBFA-VBELV TO I_CTBESTQE-VBELV,
FROM VBRK I_VBFA-POSNV TO I_CTBESTQE-POSNV,
INTO I_RECDEV-NFNUM "NF devolvida I_VBFA3-VBELN TO I_CTBESTQE-VBELN,
WHERE VBELN = I_VBAK1-VGBEL. I_ZFA03A1-MBLNR TO I_CTBESTQE-MBLNR,
I_ZFA03A1-FKDAT TO I_CTBESTQE-FKDAT,
ENDCASE. I_VBFA-RFMNG TO I_CTBESTQE-RFMNG.
COLLECT I_RECDEV.
COLLECT I_CTBESTQE.
ELSEIF I_VBFA-VBTYP_N = 'M' "Existem faturas para ordem ENDIF.
AND I_VBFA-FKTYP = 'A'. ENDIF.
*posiciona na fatura da ordem para pegar o numero/data da nota fiscal
CLEAR I_VBRK. ENDFORM. " F_CALC_CONT_ESTQ_E
*&---------------------------------------------------------------------*
READ TABLE I_VBRK *& Form F_MONTA_REMESSA
WITH KEY VBELN = I_VBFA-VBELN *&---------------------------------------------------------------------*
BINARY SEARCH. * Mostra os dados de remessas *
*----------------------------------------------------------------------*
*posiciona no documento da NF FORM F_MONTA_REMESSA.
CLEAR I_J1BAB. * data: v_i(2) type n.
CLEAR:
READ TABLE I_J1BAB V_COUNT,
WITH KEY REFKEY = I_VBFA-VBELN V_RFMNGR.
BINARY SEARCH.
FORMAT COLOR COL_NORMAL.
MOVE:
I_VBRK-FKDAT TO I_FINAL-FKDAT, READ TABLE I_REMESSA
I_VBRK-XBLNR TO I_FINAL-XBLNR, WITH KEY VBELV = I_FINAL-VBELN
I_J1BAB-DOCNUM TO I_FINAL-DOCNUM. POSNV = I_FINAL-POSNR
BINARY SEARCH.
*posiciona na zfa03a LOOP AT I_REMESSA FROM SY-TABIX.
READ TABLE I_ZFA03A IF I_REMESSA-VBELV <> I_FINAL-VBELN OR
WITH KEY ABLNR = I_VBFA-VBELV I_REMESSA-POSNV <> I_FINAL-POSNR.
FBLNR = I_VBFA-VBELN EXIT.
BINARY SEARCH. ENDIF.
IF SY-SUBRC = 0.
I_FINAL-RFMNG5 = I_FINAL-RFMNG5 + I_FINAL-KWMENG. WRITE:
/1 '|',
MOVE: 2 I_REMESSA-VBELN,
I_VBFA-VBELV TO I_CTBESTQS-VBELV, 12 '|',
I_VBFA-POSNV TO I_CTBESTQS-POSNV, 13 I_REMESSA-ROUTE,
I_ZFA03A-FBLNR TO I_CTBESTQS-VBELN, 19 '|',
I_ZFA03A-MBLNR TO I_CTBESTQS-MBLNR, 20 I_REMESSA-VBELNT,
I_ZFA03A-FKDAT TO I_CTBESTQS-FKDAT, 30 '|',
I_VBFA-RFMNG TO I_CTBESTQS-RFMNG. 31 I_REMESSA-ERDAT,
41 '|',
COLLECT I_CTBESTQS. 42 I_REMESSA-ERNAM,
ENDIF. 54 '|',
ENDIF. 55 I_REMESSA-WADAT,
ENDLOOP. "I_VBFA 65 '|',
APPEND I_FINAL. 66 I_REMESSA-RFMNG NO-ZERO,
77 '|'.
ENDLOOP. "I_VBPA
SORT I_REMESSA BY VBELV POSNV VBELN. HIDE:
SORT I_EXPEDIDO BY VBELV POSNV VBELN. I_REMESSA-VBELN,
SORT I_RECEBIDO BY VBELV POSNV VBELN. I_REMESSA-VBELNT.
SORT I_RECDEV BY AUART VBELN POSNR VBELNO.
ENDFORM. "F_MONTA_TABELA V_RFMNGR = V_RFMNGR + I_REMESSA-RFMNG.
*&---------------------------------------------------------------------* V_COUNT = V_COUNT + 1.
*& Form F_CALC_CONT_ESTQ_E ENDLOOP.
*&---------------------------------------------------------------------* IF V_COUNT > 0.
* Calcula coluna T-Contab.Estoq.(E) para ordens Recusa/Devolução * WRITE / SY-ULINE(77).
* do tipo ZRVF e ZDVF * ENDIF.
*----------------------------------------------------------------------* FORMAT COLOR COL_TOTAL.
FORM F_CALC_CONT_ESTQ_E. WRITE:
/1 '|',
READ TABLE I_VBFA3 2 TEXT-052,
WITH KEY VBELV = I_VBFA-VBELN 65 '|',
POSNV = I_VBFA-POSNN 66 V_RFMNGR NO-ZERO,
BINARY SEARCH. 77 '|'.
IF SY-SUBRC = 0. WRITE / SY-ULINE(77).

READ TABLE I_ZFA03A1 ENDFORM. " F_MONTA_REMESSA


WITH KEY ABLNR = I_VBFA3-VBELV *&---------------------------------------------------------------------*
FBLNR = I_VBFA3-VBELN *& Form F_MONTA_EXPEDIDO
BINARY SEARCH. *&---------------------------------------------------------------------*

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

V_RFMNGE = V_RFMNGE + I_EXPEDIDO-RFMNG. ENDFORM. " F_MONTA_RECEBIDO


V_COUNT = V_COUNT + 1. *&---------------------------------------------------------------------*
ENDLOOP. *& Form F_MONTA_RECDEV
IF V_COUNT > 0. *&---------------------------------------------------------------------*
WRITE / SY-ULINE(88). * Mostra os dados de Recusa/Devolução *
ENDIF. *----------------------------------------------------------------------*
FORMAT COLOR COL_TOTAL. FORM F_MONTA_RECDEV USING V_RECDEV.
WRITE: CLEAR:
/1 '|', V_COUNT,
2 TEXT-052, V_RFMNG1.
76 '|',
77 V_RFMNGE NO-ZERO, FORMAT COLOR COL_NORMAL.
88 '|'.
WRITE / SY-ULINE(88). READ TABLE I_RECDEV
WITH KEY AUART = V_RECDEV
ENDFORM. " F_MONTA_EXPEDIDO VBELN = I_FINAL-VBELN
*&---------------------------------------------------------------------* POSNR = I_FINAL-POSNR
*& Form F_MONTA_RECEBIDO BINARY SEARCH.
*&---------------------------------------------------------------------* LOOP AT I_RECDEV FROM SY-TABIX.
* Mostra os dados recebidos pelo cliente * IF I_RECDEV-AUART <> V_RECDEV OR
*----------------------------------------------------------------------* I_RECDEV-VBELN <> I_FINAL-VBELN OR
FORM F_MONTA_RECEBIDO. I_RECDEV-POSNR <> I_FINAL-POSNR.
EXIT.
CLEAR: ENDIF.
V_COUNT,
V_RFMNGC. CLEAR TVAUT.

FORMAT COLOR COL_NORMAL. SELECT SINGLE BEZEI


FROM TVAUT
READ TABLE I_RECEBIDO INTO TVAUT-BEZEI
WITH KEY VBELV = I_FINAL-VBELN WHERE SPRAS = 'P'
POSNV = I_FINAL-POSNR AND AUGRU = I_RECDEV-AUGRU.
BINARY SEARCH.
LOOP AT I_RECEBIDO FROM SY-TABIX. WRITE:

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

76
ABAP Training
162 '|',
163 I_FINAL-RFMNG1 NO-ZERO HOTSPOT, GET CURSOR FIELD V_FIELD.
174 '|', ASSIGN (V_FIELD) TO <FNAME>.
175 I_FINAL-RFMNG2 NO-ZERO HOTSPOT, REFRESH I_SOMA.
186 '|', LOOP AT I_FINAL.
187 I_FINAL-RFMNG3 NO-ZERO HOTSPOT,
198 '|', CHECK I_FINAL-FLAG = 'X'. "Somente mostrar registro se flag='X'
199 I_FINAL-RFMNG4 NO-ZERO HOTSPOT,
210 '|', CLEAR I_SOMA.
211 I_FINAL-RFMNG5 NO-ZERO HOTSPOT, I_SOMA-KEYVALUE = <FNAME>.
222 '|', MOVE-CORRESPONDING I_FINAL TO I_SOMA.
223 I_FINAL-RFMNG6 NO-ZERO HOTSPOT, COLLECT I_SOMA.
234 '|'. ENDLOOP. "I_FINAL

* if v_tip_rel = 'I'. "montar se for a primeira tela FORMAT COLOR COL_NORMAL.

HIDE: SORT I_SOMA.


I_FINAL-VBELN, LOOP AT I_SOMA.
I_FINAL-POSNR, WRITE:
I_FINAL-VBELNF, /1 '|',
I_FINAL-XBLNR, 2 I_SOMA-KEYVALUE,
I_FINAL-DOCNUM, 38 '|',
I_FINAL-KUNNR, 39 I_SOMA-KWMENG NO-ZERO,
I_FINAL-MATNR, 50 '|',
I_FINAL-WERKS. 51 I_SOMA-RFMNGP NO-ZERO,
* endif. 62 '|',
V_KWMENG = V_KWMENG + I_FINAL-KWMENG. 63 I_SOMA-RFMNGR NO-ZERO,
V_RFMNGP = V_RFMNGP + I_FINAL-RFMNGP. 74 '|',
V_RFMNGR = V_RFMNGR + I_FINAL-RFMNGR. 75 I_SOMA-RFMNGE NO-ZERO,
V_RFMNGE = V_RFMNGE + I_FINAL-RFMNGE. 86 '|',
V_RFMNGC = V_RFMNGC + I_FINAL-RFMNGC. 87 I_SOMA-RFMNGC NO-ZERO,
V_RFMNG1 = V_RFMNG1 + I_FINAL-RFMNG1. 98 '|',
V_RFMNG2 = V_RFMNG2 + I_FINAL-RFMNG2. 99 I_SOMA-RFMNG1 NO-ZERO,
V_RFMNG3 = V_RFMNG3 + I_FINAL-RFMNG3. 110 '|',
V_RFMNG4 = V_RFMNG4 + I_FINAL-RFMNG4. 111 I_SOMA-RFMNG2 NO-ZERO,
V_RFMNG5 = V_RFMNG5 + I_FINAL-RFMNG5. 122 '|',
V_RFMNG6 = V_RFMNG6 + I_FINAL-RFMNG6. 123 I_SOMA-RFMNG3 NO-ZERO,
ENDLOOP. "I_FINAL 134 '|',
IF V_COUNT > 0. 135 I_SOMA-RFMNG4 NO-ZERO,
ULINE. 146 '|',
ENDIF. 147 I_SOMA-RFMNG5 NO-ZERO,
FORMAT COLOR COL_TOTAL. 158 '|',
WRITE: 159 I_SOMA-RFMNG6 NO-ZERO,
1 '|', TEXT-051, V_COUNT, 170 '|'.
91 '|', AT LAST.
92 V_KWMENG NO-ZERO, SUM.
103 '|', FORMAT COLOR COL_TOTAL.
114 '|', WRITE / SY-ULINE(170).
115 V_RFMNGP NO-ZERO, WRITE:
126 '|', /1 '|',
127 V_RFMNGR NO-ZERO, 2 TEXT-052,
138 '|', 38 '|',
139 V_RFMNGE NO-ZERO, 39 I_SOMA-KWMENG NO-ZERO,
150 '|', 50 '|',
151 V_RFMNGC NO-ZERO, 51 I_SOMA-RFMNGP NO-ZERO,
162 '|', 62 '|',
163 V_RFMNG1 NO-ZERO, 63 I_SOMA-RFMNGR NO-ZERO,
174 '|', 74 '|',
175 V_RFMNG2 NO-ZERO, 75 I_SOMA-RFMNGE NO-ZERO,
186 '|', 86 '|',
187 V_RFMNG3 NO-ZERO, 87 I_SOMA-RFMNGC NO-ZERO,
198 '|', 98 '|',
199 V_RFMNG4 NO-ZERO, 99 I_SOMA-RFMNG1 NO-ZERO,
210 '|', 110 '|',
211 V_RFMNG5 NO-ZERO, 111 I_SOMA-RFMNG2 NO-ZERO,
222 '|', 122 '|',
223 V_RFMNG6 NO-ZERO, 123 I_SOMA-RFMNG3 NO-ZERO,
234 '|'. 134 '|',
ULINE. 135 I_SOMA-RFMNG4 NO-ZERO,
146 '|',
ENDFORM. " F_MOSTRA_DADOS 147 I_SOMA-RFMNG5 NO-ZERO,
*&---------------------------------------------------------------------* 158 '|',
*& Form F_MONTA_SOMA 159 I_SOMA-RFMNG6 NO-ZERO,
*&---------------------------------------------------------------------* 170 '|'.
* text * ENDAT.
*----------------------------------------------------------------------* ENDLOOP.
FORM F_MONTA_SOMA. WRITE / SY-ULINE(170).

FIELD-SYMBOLS: <FNAME>. ENDFORM. "F_MONTA_SOMA

77
ABAP Training
*&---------------------------------------------------------------------* 24 I_CTBESTQE-FKDAT,
*& Form F_MONTA_CTBESTQ_S 34 '|',
*&---------------------------------------------------------------------* 35 I_CTBESTQE-RFMNG NO-ZERO,
* text * 46 '|'.
*----------------------------------------------------------------------*
FORM F_MONTA_CTBESTQ_S. HIDE I_CTBESTQE-VBELN.

CLEAR: V_COUNT = V_COUNT + 1.


V_COUNT, V_RFMNG6 = V_RFMNG6 + I_CTBESTQE-RFMNG.
V_RFMNG5. ENDLOOP.
IF V_COUNT > 0.
FORMAT COLOR COL_NORMAL. WRITE / SY-ULINE(46).
ENDIF.
READ TABLE I_CTBESTQS FORMAT COLOR COL_TOTAL.
WITH KEY VBELV = I_FINAL-VBELN WRITE:
POSNV = I_FINAL-POSNR /1 '|',
BINARY SEARCH. 2 TEXT-052,
LOOP AT I_CTBESTQS FROM SY-TABIX. 34 '|',
IF I_CTBESTQS-VBELV <> I_FINAL-VBELN OR 35 V_RFMNG6 NO-ZERO,
I_CTBESTQS-POSNV <> I_FINAL-POSNR. 46 '|'.
EXIT. WRITE / SY-ULINE(46).
ENDIF.
WRITE: ENDFORM. " F_MONTA_CTBESTQ_E
/1 '|', *&---------------------------------------------------------------------*
2 I_CTBESTQS-VBELN, *& Form F_CABEC_PRINCIPAL
12 '|', *&---------------------------------------------------------------------*
13 I_CTBESTQS-MBLNR, * Monta o cabeçalho principal do relatório *
23 '|', *----------------------------------------------------------------------*
24 I_CTBESTQS-FKDAT, FORM F_CABEC_PRINCIPAL.
34 '|',
35 I_CTBESTQS-RFMNG NO-ZERO, FORMAT COLOR COL_HEADING.
46 '|'. WRITE 1 V_SUBTIT.
SKIP.
HIDE I_CTBESTQS-VBELN. ULINE.
WRITE:
V_COUNT = V_COUNT + 1. 1 '|',
V_RFMNG5 = V_RFMNG5 + I_CTBESTQS-RFMNG. 38 TEXT-023,
ENDLOOP. 103 '|',
IF V_COUNT > 0. 118 TEXT-024,
WRITE / SY-ULINE(46). 162 '|',
ENDIF. 176 TEXT-050,
FORMAT COLOR COL_TOTAL. 210 '|',
WRITE: 212 TEXT-025,
/1 '|', 234 '|'.
2 TEXT-052, ULINE.
34 '|', WRITE:
35 V_RFMNG5 NO-ZERO, 1 '|',
46 '|'. 2 TEXT-003,
WRITE / SY-ULINE(46). 12 '|',
13 TEXT-004,
ENDFORM. " F_MONTA_CTBESTQ_S 23 '|',
*&---------------------------------------------------------------------* 25 TEXT-005,
*& Form F_MONTA_CTBESTQ_E 34 '|',
*&---------------------------------------------------------------------* 37 TEXT-006,
* text * 55 '|',
*----------------------------------------------------------------------* 56 TEXT-007,
FORM F_MONTA_CTBESTQ_E. 64 '|',
65 TEXT-008,
CLEAR: 75 '|',
V_COUNT, 76 TEXT-009,
V_RFMNG6. 80 '|',
82 TEXT-010,
FORMAT COLOR COL_NORMAL. 91 '|',
93 TEXT-011,
READ TABLE I_CTBESTQE 103 '|',
WITH KEY VBELV = I_FINAL-VBELN 107 TEXT-012,
POSNV = I_FINAL-POSNR 114 '|',
BINARY SEARCH. 115 TEXT-013,
LOOP AT I_CTBESTQE FROM SY-TABIX. 126 '|',
IF I_CTBESTQE-VBELV <> I_FINAL-VBELN OR 127 TEXT-014,
I_CTBESTQE-POSNV <> I_FINAL-POSNR. 138 '|',
EXIT. 140 TEXT-015,
ENDIF. 150 '|',
WRITE: 152 TEXT-016,
/1 '|', 162 '|',
2 I_CTBESTQE-VBELN, 167 TEXT-017,
12 '|', 174 '|',
13 I_CTBESTQE-MBLNR, 179 TEXT-018,
23 '|', 186 '|',

78
ABAP Training
191 TEXT-019, *&---------------------------------------------------------------------*
198 '|', * Monta cabeçalho do relatório expedido/recebido *
203 TEXT-020, *----------------------------------------------------------------------*
210 '|', FORM F_CABEC_EXPREC.
215 TEXT-021,
222 '|', WRITE / SY-ULINE(88).
227 TEXT-022, WRITE:
234 '|'. /1 '|',
ULINE. 3 TEXT-026,
12 '|',
ENDFORM. " F_CABEC_PRINCIPAL 13 TEXT-028,
*&---------------------------------------------------------------------* 23 '|',
*& Form F_CABEC_SOMA 24 TEXT-037,
*&---------------------------------------------------------------------* 34 '|',
* Monta cabeçalho do SOMA * 35 TEXT-007,
*----------------------------------------------------------------------* 43 '|',
FORM F_CABEC_SOMA. 44 TEXT-033,
FORMAT COLOR COL_HEADING. 54 '|',
WRITE 1 V_SUBTIT. 55 TEXT-034,
SKIP. 65 '|',
WRITE / SY-ULINE(170). 66 TEXT-035,
WRITE: 76 '|',
/1 '|', 78 TEXT-036,
2 TEXT-053, 88 '|'.
38 '|', WRITE / SY-ULINE(88).
41 TEXT-011,
50 '|', ENDFORM. " F_CABEC_EXPREC
51 TEXT-013, *&---------------------------------------------------------------------*
62 '|', *& Form F_CABEC_ZRVF
64 TEXT-014, *&---------------------------------------------------------------------*
74 '|', * Monta cabeçalho do relatório ZRVF *
77 TEXT-015, *----------------------------------------------------------------------*
86 '|', FORM F_CABEC_ZRVF.
89 TEXT-016,
98 '|', WRITE / SY-ULINE(114).
103 TEXT-017, WRITE:
110 '|', /1 '|',
115 TEXT-018, 2 TEXT-044,
122 '|', 12 '|',
127 TEXT-019, 13 TEXT-038,
134 '|', 16 '|',
139 TEXT-020, 22 TEXT-039,
146 '|', 37 '|',
151 TEXT-021, 38 TEXT-037,
158 '|', 48 '|',
163 TEXT-022, 49 TEXT-008,
170 '|'. 59 '|',
WRITE / SY-ULINE(170). 60 TEXT-040,
70 '|',
ENDFORM. " F_CABEC_SOMA 75 TEXT-041,
*&---------------------------------------------------------------------* 91 '|',
*& Form F_CABEC_REMESSA 92 TEXT-042,
*&---------------------------------------------------------------------* 102 '|',
* Monta cabeçalho do relatório de remessa * 103 TEXT-043,
*----------------------------------------------------------------------* 114 '|'.
FORM F_CABEC_REMESSA. WRITE / SY-ULINE(114).

WRITE / SY-ULINE(77). ENDFORM. " F_CABEC_ZRVF


WRITE: *&---------------------------------------------------------------------*
/1 '|', *& Form F_CABEC_ZRVR
3 TEXT-026, *&---------------------------------------------------------------------*
12 '|', * Monta cabeçalho do relatório ZRVR *
13 TEXT-027, *----------------------------------------------------------------------*
19 '|', FORM F_CABEC_ZRVR.
20 TEXT-028,
30 '|', WRITE / SY-ULINE(82).
31 TEXT-029, WRITE:
41 '|', /1 '|',
44 TEXT-030, 2 TEXT-044,
54 '|', 12 '|',
55 TEXT-031, 13 TEXT-038,
65 '|', 16 '|',
67 TEXT-032, 23 TEXT-039,
77 '|'. 37 '|',
WRITE / SY-ULINE(77). 38 TEXT-037,
48 '|',
ENDFORM. " F_CABEC_REMESSA 49 TEXT-008,
*&---------------------------------------------------------------------* 59 '|',
*& Form F_CABEC_EXPREC 60 TEXT-042,

79
ABAP Training
70 '|', 12 '|',
71 TEXT-043, 13 TEXT-047,
82 '|'. 23 '|',
WRITE / SY-ULINE(82). 25 TEXT-048,
34 '|',
ENDFORM. " F_CABEC_ZRVR 36 TEXT-036,
*&---------------------------------------------------------------------* 46 '|'.
*& Form F_CABEC_ZDVF WRITE / SY-ULINE(46).
*&---------------------------------------------------------------------*
* Monta cabeçalho do relatório ZDVF * ENDFORM. " F_CABEC_CTBESTQ
*----------------------------------------------------------------------* *&---------------------------------------------------------------------*
FORM F_CABEC_ZDVF. *& Form F_SORT_TABELA
*&---------------------------------------------------------------------*
WRITE / SY-ULINE(125). * Ordena a tabela I_FINAL *
WRITE: *----------------------------------------------------------------------*
/1 '|', FORM F_SORT_TABELA.
2 TEXT-044,
12 '|', CLEAR: V_FIELD, V_FNAME.
13 TEXT-038,
16 '|', GET CURSOR FIELD V_FIELD.
22 TEXT-039, V_FNAME = V_FIELD+8(12).
37 '|',
38 TEXT-037, * check sy-lilli >= 10.
48 '|',
49 TEXT-008, IF SY-UCOMM = 'ASCE'.
59 '|', SORT I_FINAL BY (V_FNAME) ASCENDING.
60 TEXT-040, ELSE.
70 '|', SORT I_FINAL BY (V_FNAME) DESCENDING.
75 TEXT-041, ENDIF.
91 '|',
92 TEXT-049, * subtract 1 from sy-lsind.
102 '|',
103 TEXT-045, ENDFORM. "F_SORT_TABELA
113 '|', *&---------------------------------------------------------------------*
115 TEXT-046, *& Form F_DISPLAY_DOCUMENT
125 '|'. *&---------------------------------------------------------------------*
WRITE / SY-ULINE(125). * Visualiza documento crédito a partir da fatura (VF03-Contabil) *
*----------------------------------------------------------------------*
ENDFORM. " F_CABEC_ZDVF FORM F_DISPLAY_DOCUMENT USING V_VBELN_F.
*&---------------------------------------------------------------------*
*& Form F_CABEC_ZDVR REFRESH I_BDCDATA.
*&---------------------------------------------------------------------*
* Monta cabeçalho do relatório ZDVR * * Main screen for invoice display
*----------------------------------------------------------------------* I_BDCDATA-PROGRAM = 'SAPMV60A'.
FORM F_CABEC_ZDVR. I_BDCDATA-DYNPRO = '0101'.
I_BDCDATA-DYNBEGIN = 'X'.
WRITE / SY-ULINE(93). APPEND I_BDCDATA.
WRITE:
/1 '|', * Enter the invoice number
2 TEXT-044, CLEAR I_BDCDATA.
12 '|', I_BDCDATA-FNAM = 'VBRK-VBELN'.
13 TEXT-038, I_BDCDATA-FVAL = V_VBELN_F.
16 '|', APPEND I_BDCDATA.
22 TEXT-039,
37 '|', CLEAR I_BDCDATA.
38 TEXT-037, I_BDCDATA-FNAM = 'BDC_OKCODE'.
48 '|', I_BDCDATA-FVAL = 'UEBB'.
49 TEXT-008, APPEND I_BDCDATA.
59 '|',
60 TEXT-049, CALL TRANSACTION 'VF03' USING I_BDCDATA MODE 'E'.
70 '|',
71 TEXT-045, ENDFORM.
81 '|',
83 TEXT-046,
93 '|'.
WRITE / SY-ULINE(93).

ENDFORM. " F_CABEC_ZDVR


*&---------------------------------------------------------------------*
*& Form F_CABEC_CTBESTQ
*&---------------------------------------------------------------------*
* Monta cabeçalho do relatório CTBESTQ *
*----------------------------------------------------------------------*
FORM F_CABEC_CTBESTQ.

WRITE / SY-ULINE(46).
WRITE:
/1 '|',
2 TEXT-037,

80

Você também pode gostar