Escolar Documentos
Profissional Documentos
Cultura Documentos
Report
1
ABAP Training
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.
Documentação: Texto com uma descrição breve do que o programa executa e as suas
condições necessárias para execução.
Debug do programa
Renomeia o programa
4
ABAP Training
Desloca a linha
para a direita
Duplica a linha
selecionada
Marcar bloco
Colar
Copiar buffer
Lista de utilizações
Modificação/Exibição do programa
5
ABAP Training
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
*----------------------------------------------------------------------*
* 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
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: 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
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.
*----------------------------------------------------------------------*
* 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
*----------------------------------------------------------------------*
START-OF-SELECTION.
* Com o comando PERFORM executamos uma rotina que está fora do fluxo
* normal do programa
PERFORM ACESSANDO_CFOP.
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.
ENDLOOP.
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.
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'.
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.
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.
*----------------------------------------------------------------------*
* 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
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
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
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é
16
ABAP Training
Descrição do Template
• Name do “Shell”
• Nome do Programa
• Data
• Última atualização
• Descrição
• Include
• Calls
• Function Modules
• Histórico de Modificações
Declaração de Dados:
17
ABAP Training
• Include ZZIHEADR
• Tabelas
• Constantes e Variáveis
• Tabelas Internas
Parâmetros de Entrada:
• Select-Option
• Parameters
• Initialization
• At Selection-Screen
Ao Comando do Usuário:
• At User-Command
• Start-of-Selection
• End-of-Selection
Cabeçalho e Rodapé
• Top-of-page
18
ABAP Training
• End-of-page
• Forms Section
Comando “Select”
Variações :
1-) SELECT * FROM dbtab.
....
ENDSELECT.
19
ABAP Training
If sy-subrc ne 0.
WRITE : ‘ Nenhum dado foi selecionado’.
Endif.
EXEMPLO:
Adições:
1a-)…WHERE Condition
EXEMPLO:
1b-)…ORDER BY f1…fn
…ORDER BY PRIMARY KEY
20
ABAP Training
EXEMPLO:
1c-)…UP TO n ROWS
EXEMPLO:
21
ABAP Training
EXEMPLO:
Adições :
2a-) WHERE
2b-) ORDER BY
2c-) UP TO n ROWS
Mesmo processo do item 2-) só que os dados novos são inseridos sem
apagar os antigos.
EXEMPLO:
3a-) WHERE
3b-) ORDER BY
3c-) UP TO n ROWS
EXEMPLO:
22
ABAP Training
EXEMPLO:
EXEMPLO:
23
ABAP Training
24
ABAP Training
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.
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.
26
ABAP Training
15 - SELECT MAX(campo)
MIN(campo)
AVG(campo)
COUNT(*) FROM <table> INTO (…..,……,…..,….)
WHERE ………… .
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 ***
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:
29
ABAP Training
Exercício:
Definição do Relatório
Projeto: Andersen Prioridade: 01-Alta
Time: Vendas & Distribuição Ref. WBS: Relatório
Informação de Desenvolvimento
Descrição resumida:
30
ABAP Training
Outros Programas:
Desenho
Fluxo:
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.
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:
1. Tabelas:
31
ABAP Training
2. Constantes:
3. Variáveis
4. Tabelas Internas:
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
5. Parâmetros de Seleção
5.1. Select-Options:
so_tipo (j_1bnfdoc-nftype)
5.2. Parameter:
33
ABAP Training
**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).
Loop at i_j_1bnflin
com a chave docnum = i_j_1bnfdoc-docnum.
34
ABAP Training
i_final-total,
v_ipi.
Loop na I_final
35
ABAP Training
vbeln = v_vgbel e armazena na variável v_vgbel1
(Utilizar o comando select up to 1 rows into ‘variável’)
7. Impressão do Relatório.
i_final-parid,
i_final-vbeln,
i_final-nfnum,
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,
36
ABAP Training
Layout(s) do Relatório:
Subtítulo:
Características de Interatividade:
Requerimentos de Segurança:
Especificações Operacionais
Freqüência:
Dependências:
Instruções de Restart/Recover:
Duração estimada:
Critério de Teste
Condições de Teste:
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
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.
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
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
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
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.
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.
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>"
" 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
* Chamada transacao MM03 (Consulta Materiais), pulando a primeira tela. Para pular essa tela.
* a informação TEM que ser passada ao parâmetro antes
*----------------------------------------------------------------------*
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.
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.
*&---------------------------------------------------------------------*
*& 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.
LOOP AT T_MARC.
APPEND T_FINAL.
ENDIF. “ se encontrou dados da tabela interna t_mara.
ENDLOOP.
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.
ENDLOOP.
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 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.
if sy-subrc ne 0.
message e014. " não existe o documento informado
endif.
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.
*&---------------------------------------------------------------------*
*& Form F_PRINT_REPORT
*&---------------------------------------------------------------------*
* Imprime o report *
*----------------------------------------------------------------------*
form f_print_report.
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.
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
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
* 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.
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.
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.
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.
69
ABAP Training
END-OF-PAGE. ON CHANGE OF I_VBAK-KUNNR.
*----------------------------------------------------------------------- CLEAR I_KNA1.
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
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.
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.
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
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.
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).
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
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.
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).
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).
WRITE / SY-ULINE(46).
WRITE:
/1 '|',
2 TEXT-037,
80