Você está na página 1de 86

ABAP Training

Sapscript

1
ABAP Training

O que é SAPscript e quando utilizar

SAPscript é a ferramenta do SAP para criação de relatórios mais elaborados,


chamados de formulários. A opção pela utilização da ferramenta geralmente se dá pela
necessidade de alguns recursos que não podem ser obtidos através de código de ABAP
comum, como nos chamados “reports”, tais como inserção de logotipos, fontes de
tamanhos ou tipos diferentes, etc... Muitas vezes, também, dependendo da necessidade
do relatório, pode compensar mais utilizar o desenvolvimento de um relatório
convencional sobre um formulário pré impresso, que já contenha o layout e logotipo
desejados.

2
ABAP Training

Limitações e problemas da ferramenta

Embora seja a ferramenta de geração de formulários mais poderosa do SAP, o


SAPscript ainda apresenta uma série de limitações, principalmente no que diz respeito
a verificação de erros e análise de debug. Um comando escrito na grafia errada dentro
de um formulário, jamais será detectado pelo mesmo. Somente a não funcionalidade
esperada do comando poderá levar ao programador descobrir seu próprio erro.
O modo debug do ambiente de SAPscript pode ser ativado na transação SE71
(SAP Standard Menu -> Tools -> Sapscript -> Form), através do menu Utilitários ->
Ativar debug. O método correto consiste em se preencher o nome do formulário e
idioma nos campos da tela, antes de percorrer o caminho do menu. Algumas vezes, no
entanto, principalmente para um processamento em background, o formulário não
permite ser debugado, embora percorrendo o caminho acima citado, nenhuma
mensagem de impossibilidade seja exibida. Simplesmente, nenhuma tentativa de
debug funciona. Nesses casos, o programador deve utilizar de artifícios como imprimir
o conteúdo dos campos a serem checados em pontos estratégicos do formulário, para
observar seu comportamento.
O comportamento de um formulário SAPscript pode também ser muitas vezes
irritante, principalmente quando se desconhece alguns de seus detalhes. Um dos
problemas mais comuns do formulário SAPscript é quanto a utilização de logotipos nos
relatórios gerados. Sua filosofia pode parecer bastante simples e é, mas essa operação é
bastante sensível, e devem ser salientados alguns pontos:
1. O objeto com o logotipo deve ser gerado a partir de um programa de ABAP, através
da transação SE38, chamado RSTXLDMC. O modo como o arquivo com o logotipo é
tratado, deve ser cuidadosamente verificado, pois implicará no sucesso ou fracasso
da exibição do logotipo esperado. Inicialmente, deve ser ressaltado que o arquivo
deve estar no formato TIFF (extensão .TIF), não comprimido. Essa figura gerada
nestes padrões tem ainda algumas restrições para a sua aplicação. Em primeiro
lugar, o número de píxeis da figura ( a resolução da mesma, em DPI – dots per inch )
devem ser exatamente o número de píxeis informado na tela de seleção do programa
para se garantir que o logotipo seja exibido no tamanho em que foi gerado. Alguns
programas de editoração gráfica, como o Paint Shop Pro, possuem recursos para se
determinar o tamanho da figura em centímetros e até mudá-lo (resize), mantendo-se
a resolução (número de píxels). Em alguns casos, se o número de píxeis não coincidir
com o informado, a figura pode nem ser gerada no SAP, dificultando o trabalho do
programador. Em segundo lugar, o número de cores ou tonalidades de cinza
também precisam coincidir (esse parâmentro varia de acordo com a versão do SAP,
devendo-se estar atento aos dados na tela de seleção do programa). Por fim, um
último parâmetro que pode alterar o tamanho e o formato do logotipo é a
configuração da impressora no SAP. O SAP utiliza a configuração da impressora

3
ABAP Training
para gerar o formulário e imprimí-lo. Se a configuração não estiver correta, pode
influenciar no logotipo e na criação de linhas e caixas (BOXES).
2. Nessa hora entra a segunda dificuldade de se trabalhar com logotipos em SAPscript.
Ao se executar o formulário, em uma visualização na tela, o usuário nunca irá
conseguir enxergar o logotipo. Esse somente irá aparecer na impressão em papel
(ainda que impressão do layout do formulário, e não seu conteúdo final - Utilitários -
> Imprimir layout). As novas versões do SAP já corrigiram esse problema.

Essas duas características podem tomar algumas horas do programador, ainda


que bem experiente no trabalho com SAPscript.
É importante se observar também que os formulários são “client dependent”, o
que significa dizer que devem ser transportados a todos os clientes em que se deseja
executá-lo, independentemente de estar na mesma instância que já o tenha. Isso não
pareceria ser muito complicado se não fosse um trabalho a mais controlar a versão de
todos no momento que uma alteração for feita. Por isso, recomenda-se que todos os
números das Change Requests sejam inseridos como comentário no corpo do
formulário, pois não há administração de versões para Sapscript, como há nos reports.
Um outro problema são os objetos gerados, como os logotipos e textos, que além de
dependentes do cliente, não estão vinculados a nenhuma request, não podendo nem ser
transportados diretamente de um cliente para o outro. Tanto os logotipos quanto os
textos são armazenados da mesma maneira no sistema. Para transportá-los, deve-se
executar o programa RSTXTRAN, que associa esses textos a uma change request para
em seguida, poderem ser transportados
Por falar em transporte, é sempre bom reforçar que no momento do transporte
de um formulário SAPscript, é necessário assegurar que todas as estruturas utilizadas
por ele, tenham sido transportadas anteriormente. O objetivo é assegurar que tudo que
será utilizado pelo formulário já esteja no cliente, no momento em que este for
introduzido, para que não haja erros. A ordem mais aconselhada para esses transportes
seria:

1 . Estrutura
2 . Layout
3 . Programa de povoamento

Também vale a pena chamar a atenção para que esses 3 classes de objetos
estejam em requests separadas no desenvolvimento de um projeto, o que pode evitar
problemas quando algum deles não estiver funcionando propriamente e necessitar ser
reparado...

4
ABAP Training

Programa de Povoamento do SAPSCRIPT

O programa de povoamento é o programa responsável pelo controle da


impressão do formulário. É através dele que o formulário é aberto, que os dados são
enviados para as janelas corretas, que é feito o controle de quebra de páginas, que é
feito o fechamento do formulário, etc.
É no programa de povoamento que é feita a seleção dos dados que deverão
aparecer no relatório. Toda a lógica de seleção, busca dos dados, associação de tabelas,
etc., é feita nele. O formulário é apenas um “dispositivo” para output dos dados.
A construção de um programa de povoamento deve seguir a seguinte estrutura:

- Abertura de um formulário
- Inicialização de um formulário
- Seleção dos dados do formulário
- Impressão dos dados nas janelas do formulário
- Encerramento do formulário
- Fechamento do formulário

5
ABAP Training
• Abertura de formulários.

O primeiro passo para a impressão de um Sapscript através de um programa é a


abertura de um formulário para que se possa fazer o povoamento.
Para que se possa inicializar um formulário é necessário que este seja aberto.
Portanto, é obrigatória a presença de um comando de abertura num programa de
povoamento.
A abertura de um formulário gera automaticamente a inicialização de um
formulário.
O comando para a abertura de um formulário é a seguinte função:

call function 'OPEN_FORM'


exporting
* APPLICATION = 'TX'
* ARCHIVE_INDEX = ' '
* ARCHIVE_PARAMS = ' '
DEVICE = 'PRINTER'
* DIALOG = 'X'
FORM = (Nome do Formulário)
LANGUAGE = (Idioma do Formulário)
* OPTIONS = ITCPO
* importing
* language =
* new_archive_params =
* result =
exceptions
canceled = 1
device = 2
form = 3
options = 4
unclosed = 5
others = 6.

Os parâmetros mais importantes a serem passados para a função são:


Device – Dispositivo onde será gerado o formulário (geralmente PRINTER)
Form – Nome do formulário a ser aberto
Language – Idioma a ser utilizado

Dois outros parâmetros também muitas vezes utilizados são o dialog e o


options.
No primeiro, indica-se se a caixa de diálogo para configuração da impressão
deve ou não ser apresentado. Caso este deva ser omitido, os dados para impressão
serão tomados de uma estrutura a ser colocada no segundo parâmetro. Nessa estrutura
são passados os dados tais como número de cópias e nome da impressora. A opção de
não exibição da caixa de diálogo esta diretamente ligada a utilização do segundo
parâmetro. Se a exibição estiver desabilitada (DIALOG = ‘ ‘) mas a estrutura ITCPO não
estiver preenchida, a caixa de diálogo será exibida.

6
ABAP Training
Alguns dos campos mais importantes e que normalmente são utilizados na
estrutura ITCPO são:

- TDCOPIES (Número de Cópias)


- TDDEST (Dispositivo de Saída)
- TDPREVIEW (Print Preview)
- TDIMMED (Saída Imediata)

Exemplo de abertura do formulário ZSCR_CURSO.

ITCPO-TDIMMED = ‘X’.
ITCPO-TDCOPIES = 2.
ITCPO-TDDEST = ‘IMP1’.

call function 'OPEN_FORM'


exporting
* APPLICATION = 'TX'
* ARCHIVE_INDEX = ' '
* ARCHIVE_PARAMS = ' '
DEVICE = 'PRINTER'
DIALOG = ' '
FORM = 'ZSCR_CURSO'
LANGUAGE = 'P'
OPTIONS = ITCPO
* importing
* language =
* new_archive_params =
* result =
exceptions
canceled = 1
device = 2
form = 3
options = 4
unclosed = 5
others = 6.

Neste exemplo, o formulário ZSCR_CURSO no idioma português será aberto,


sem a exibição da caixa de diálogo de impressão, utilizando a impressora IMP1 e
executando a impressão imediata de 2 cópias.

7
ABAP Training
• Inicialização de um formulário.

A abertura de um formulário automaticamente gera a inicialização do mesmo.


Mas, imagine por exemplo que estejamos gerando relatórios para uma empresa
de computadores onde, para cada novo computador vendido, deve ser gerado um novo
relatório, e esse relatório deve conter todos os componentes presentes no computador
em questão.
A abertura de um formulário inicia o primeiro, mas para cada novo computador
vendido um novo formulário deve ser gerado.
Para isso utilizamos o comando de inicialização. Este comando permite que,
numa mesma impressão, sejam gerados vários formulários diferentes, como se
estivéssemos abrindo um novo para cada computador vendido.
Este comando não é obrigatório e pode não ser utilizado caso não haja
necessidade da quebra e criação de vários formulários para uma só seleção de dados.

O comando para inicialização de um formulário é a seguinte função:

call function 'START_FORM'


exporting
* ARCHIVE_INDEX = ' '
FORM = ' '
LANGUAGE = ' '
* STARTPAGE = ' '
* PROGRAM = ' '
* importing
* language =
exceptions
form = 1
format = 2
unended = 3
unopened = 4
unused = 5
others = 6.

A função é muito similar à função OPEN_FORM, e novamente os parâmetros


mais importantes são o nome (FORM) e o idioma (LANGUAGE) do formulário.
Para que se possa utilizar um comando START_FORM é obrigatório que um
comando de OPEN_FORM tenha sido executado.

8
ABAP Training
• Finalizando um formulário.

Em contrapartida com o item acima (comando START_FORM), toda vez que um


formulário é inicializado, o mesmo deve ser finalizado ao final do seu processamento.
Isso é obtido através do comando :

CALL FUNCTION 'END_FORM'.


* IMPORTING
* RESULT =
* EXCEPTIONS
* UNOPENED = 1
* BAD_PAGEFORMAT_FOR_PRINT = 2
* OTHERS = 3

Para o seu funcionamento, apenas a sua chamada é suficiente, sem as cláusulas


adicionais, comentadas acima.

• Fechando um formulário.

Finalmente, em contrapartida ao comando OPEN_FORM, toda vez que um


formulário é aberto, o mesmo deve ser fechado. Isso é obtido através do comando :

CALL FUNCTION 'CLOSE_FORM'.


* IMPORTING
* RESULT =
* RDI_RESULT =
* TABLES
* OTFDATA =
* EXCEPTIONS
* UNOPENED = 1
* BAD_PAGEFORMAT_FOR_PRINT = 2
* SEND_ERROR = 3
* OTHERS = 4

Como no comando END_FORM, para o seu funcionamento, apenas a sua chamada


é suficiente, sem as cláusulas adicionais, comentadas acima.

9
ABAP Training
Seleção dos dados

A seleção dos dados é feita normalmente com comandos SELECT e demais


comandos ABAP, como já foi visto em tópicos anteriores.
Um ponto importante que deve ser observado é que não é possível utilizar
tabelas internas e variáveis do programa para a impressão dos dados no SAPSCRIPT.
Portanto, se algum dado que deva ser impresso estiver numa tabela interna ou variável,
este deve ser copiado para uma estrutura para que possa ser enviado ao SAPSCRIPT.

10
ABAP Training
• Impressão dos dados nas janelas

A impressão dos dados nas janelas na maioria das vezes é feita simultaneamente
com a seleção dos dados, ou seja, a medida que os dados são selecionados, são enviados
imediatamente para o formulário.
O comando para impressão dos dados é a seguinte função:

call function 'WRITE_FORM'


exporting
ELEMENT = ' '
* FUNCTION = 'SET'
* TYPE = 'BODY'
WINDOW = 'MAIN'
* importing
* pending_lines =
exceptions
element = 1
function = 2
type = 3
unopened = 4
unstarted = 5
window = 6
others = 7.

Dois parâmetros são os mais importantes:


Element – Determina qual Data Element será utilizado dentro do Sapscript
Window – Janela na qual os dados devem ser impressos.

Neste ponto fica evidente a diferenciação entre os tipos de janela MAIN e demais
janelas.
Para as janelas do tipo MAIN, cada comando de escrita (write_form) significa
uma nova linha no formulário e o valor a ser impresso é o valor que o campo armazena
no momento do comando de impressão.
Por exemplo, digamos que o campo MARA-MATNR tenha o valor ‘1234’ e que
um comando de impressão seja dado para a janela MAIN que irá imprimir este campo.
Logo em seguida uma nova seleção da tabela MARA é feita e o campo MATNR agora
vale ‘5678’. Se uma nova impressão na janela MAIN for executada o resultado será o
seguinte:
1234
5678

Já as janelas que não forem do tipo MAIN imprimem os dados uma única vez,
no final da impressão do formulário ou na quebra de página, com os valores
armazenados nos campos no momento do encerramento ou no momento da quebra, e

11
ABAP Training
não no momento da escrita (write_form), ou seja, se no exemplo anterior fosse utilizada
uma janela não-main, o resultado final seria somente 5678.
Na realidade, a utilização de um comando WRITE_FORM numa janela não-main
é utilizada para a escolha de qual elemento de texto será utilizado para a impressão dos
dados. Exemplo:
Uma janela HEADER não-main contém dois elementos de texto chamados
FRASE1 e FRASE2 da seguinte forma:

/E FRASE1
&MARA-MATNR& Teste de Frase 1
/E FRASE2
&MARA-MATNR& Teste de Frase 2

Se um comando WRITE_FORM for executado para a janela HEADER utilizando


o elemento de texto FRASE1,

call function 'WRITE_FORM'


exporting
ELEMENT = 'FRASE1'
* FUNCTION = 'SET'
* TYPE = 'BODY'
WINDOW = 'HEADER'

estará sendo indicado ao programa que, ao se encerrar o formulário, deve ser impresso
o elemento de texto FRASE1 para a janela HEADER (somente um elemento de texto é
utilizado para cada janela não-main).
No caso do exemplo, se o campo MATNR for igual a ‘1234’ no encerramento do
formulário, seria impressa a seguinte frase:
1234 Teste de Frase 1

O elemento de texto a ser impresso será sempre o último a ser selecionado antes
do final ou da quebra de página.
Se nenhum for selecionado, ao encerrar o formulário ou mudar de página serão
impressos os dados que não pertençam a nenhum elemento de texto. Portanto no caso
de um campo que deva ser impresso sempre em todas as páginas, como numero de
página por exemplo, basta colocá-lo fora de qualquer elemento de texto e não
selecionar nenhum elemento de texto para a janela que, automaticamente, este dado
será impresso em todas as páginas.

12
ABAP Training

Fluxo do SAPSCRIPT:
Tendo visto os comandos acima, um fluxo simplificado de um programa para a impressão de
um SAPSCRIPT seria:

FORM f_imprime_sapscript.

* Abre o formulário
CALL FUNCTION 'OPEN_FORM'
EXPORTING
DEVICE = 'PRINTER'
FORM = 'Z_SAPSCRIT'
LANGUAGE = SY-LANGU.

* inicializa o formulário
CALL FUNCTION 'START_FORM'
EXPORTING
FORM = 'Z_SAPSCRIT'
LANGUAGE = SY-LANGU.

loop at i_tab.

* imprime o elemento de dados ITEM da janela MAIN do Sapscript


* com os dados da tabela interna i_tab
CALL FUNCTION 'WRITE_FORM'
EXPORTING
ELEMENT = 'ITEM'
WINDOW = 'MAIN'.
endloop.

* finaliza o formulário
call function 'END_FORM'.

* fecha o formulário
call function 'CLOSE_FORM'.

ENDFORM.

13
ABAP Training

O formulário

Trabalhar com um formulário SAPscript não é complicado, desde que se entenda


seus componentes da maneira correta. Um layout é composto por vários componentes,
dentre os quais podemos citar:

1. Header - informações gerais do formulário, como formato e orientação da página em


será utilizado, parágrafo e fontes default do mesmo (quando não for especificado
nenhuma dentro do form). Nesse tópico aparece também o título do formulário, a
classe de desenvolvimento do mesmo e os idiomas do formulário original e o
corrente.

14
ABAP Training

2. Parágrafos - são elementos que podem ser criados pelo usuário e apresentam
informações dos textos de uma determinada janela. Nesses parágrafos são
determinados tipos de fontes, tabulações, negrito ou sublinhado, etc...

Para criar um parágrafo novo, utilizar o caminho do menu Processar -> Create
Element, lembrando que em um formulário standard, somente se pode alterar o
layout no idioma original.

15
ABAP Training

16
ABAP Training
3. Caracter String - são informações semelhantes às do parágrafo, no que diz respeito a
formatação de textos, no entanto podem ser aplicados a trechos de textos e não
necessariamente a linhas inteiras do formulário.

Sua sintaxe de utilização se assemelha a programação HTML, conforme exemplo a


seguir. Imagine um Caracter string definido com o nome B, cuja formatação de texto
seja o incremento do modelo negrito a uma determinada fonte. Sua utilização seria:

<B>Texto</>

E seu resultado no formulário seria:

Texto

17
ABAP Training
4. Janelas - as janelas são a base da construção do layout. As janelas podem ser criadas
sem limites e tem por finalidade dividir espacialmente as regiões de um formulário
para operações independentes.

Essas janelas podem ser criadas basicamente em 3 tipos distintos:

MAIN - janelas do tipo MAIN são as mais importantes do relatório (janela pela
qual o formulário se guia). Somente é permitido um tipo de janela MAIN por
formulário, e é a única janela obrigatória em uma página. Pode-se criar mais de uma
janela MAIN por página, no entanto essas janelas, na verdade, só são divididas
fisicamente, uma vez que seus elementos e processamento obedecem aos mesmos
comandos, e não podem ter nomes diferentes. A passagem de uma janela MAIN para
outra pode ser automática ou forçada pelo usuário. Quando o espaço físico de uma
janela MAIN está tomado e necessita-se de mais dados na mesma, o formulário
automaticamente passa à próxima janela MAIN do formulário. É através desse
princípio que uma relatório ganha número de páginas automaticamente quando da

18
ABAP Training
execução de um relatório desse tipo, conforme os dados são preenchidos. Para forçar a
passagem de uma janela MAIN para outra, o usuário poderá utilizar o comando:

/: NEXT-WINDOW

A lógica de sequência das janelas MAIN de um formulário segue sempre a um


critério. Dentro de uma página a navegação de uma MAIN para outra segue de acordo
com os índices dessas janelas dentro do formulário, e quando uma nova página é
gerada, a contagem segue a mesma disposição, continuamente.
O exemplo abaixo, figura a situação de uma diagramação conforme uma página
de jornal. A sequência de preenchimento dos dados na página através do povoamento
normal segue:

VAR - essa janela apresenta uma característica própria, que necessita de


verificação constante do formulário com seus dados, que podem variar durante a
execução do relatório. Esse tipo de janela deve ser utilizado quando se pretende
trabalhar com textos que variam, como exemplos de mensagens que podem mudar
durante o decorrer da execução do formulário.

CONST - são janelas que não merecem muita preocupação de processamento por
parte do formulário, uma vez que seus dados devem ser mantidos os mesmos desde
seu primeiro preenchimento até o fechamento do formulário. Geralmente nesse tipo de
janela são incluído objetos e textos que permanecem os mesmos durante todo o
relatório, independente do número de páginas, como logos e rodapés.

19
ABAP Training
5. Páginas - as páginas são os elementos responsáveis pelo agrupamento das janelas
durante certos momentos do relatório. Geralmente só são definidos duas páginas,
que acabam em processo reflexivo, por formulário.

Geralmente uma página FIRST, que apresenta um layout de apresentação dos


documentos e outra NEXT, que contém o layouts das outras páginas subsequentes do
documento. Isso acontece, por exemplo, quando se que obter um relatório com o
logotipo da empresa na primeira página, mas as seguintes, devem ocupar a folha
inteira com os dados do relatório até o final. Cada uma das páginas criadas devem
conter um nome (FIRST, NEXT,...) e pode conter um parágrafo default e um link para a
próxima página. Esse link serve para formar a sequência em que as páginas do relatório
devem ser geradas. Seguindo o exemplo anterior, deveríamos informar:

FIRST -> NEXT


NEXT -> NEXT

20
ABAP Training
Após a primeira página, seria chamada a segunda, com um layout diferente (sem o
logotipo). A partir dessa, todas apresentariam o mesmo tipo de layout (com dados do
relatório aproveitando a página inteira).

6. Page Windows

As page windows podem ser entendidas pelo nosso conceito de layout


propriamente dito. São os elementos responsáveis pela aparecimento ou não das janelas
dentro de uma determinada página, bem como seus posicionamentos em relação à folha
a ser impressa. É também através das page windows que o programador terá acesso
aos Text Elements de cada uma dessas janelas, responsáveis pelo tratamento dos dados
em tempo de execução do formulário.

21
ABAP Training
7. Text Elements

Corresponde à logica de processamento e comportamento de uma janela durante


a execução do formulário. É responsável pelos valores que serão impressos no mesmo,
bem como seu posicionamento dentro da janela e seu tipo de caracter.
De dentro de uma Page Window, é possível selecionarmos qualquer uma das
janelas existentes em uma determinada página, simplesmente clicando o mouse sobre o
seu nome e apertando o botão selecionar, ou mesmo dando um “double-click”
diretamente sobre o nome da janela desejada. Uma vez selecionada a janela, se
apertarmos o botão Text Element, uma tela semelhante à do editor de ABAP/4 do SAP
irá se abrir, com as linhas onde a lógica da janela será introduzida.

Nesses elementos do SAPscript, o programador poderá utilizar alguns comandos


semelhantes ao do ABAP/4, com a indicação de que se trata de uma linha de comando
para o formulário (/:, à esquerda da linha). Abaixo, alguns dos comandos que podem
ser utilizados de dentro dos elementos de texto de uma janela em SAPscript:

22
ABAP Training
IF..ELSE..ENDIF
CASE..WHEN
DEFINE declaração de variáveis dentro da janela, com
atribuição de valor
PERFORM..USING..CHANGING (ver documentação própria nesse material)
BOX..FRAME

INCLUDE

O comando include dentro de uma janela de um formulário SAPscript serve


para inserir um objeto no mesmo. Esse objeto pode ser desde um logo, até um texto
com várias linhas. A sintaxe é bastante simples, e somente deve-se ter um cuidado
bastante especial com o idioma que se trata esse objeto. Independentemente do idioma
do formulário, deve-se sempre utilizar o idioma em que o objeto foi criado.

/: INCLUDE name OBJECT object ID id LANGUAGE spras

23
ABAP Training

Manutenção de formulários

A manutenção dos formulários é feita pela mesma transação citada


anteriormente (SE71). Nessa tela o nome do formulário e o idioma do mesmo são
parâmetros obrigatórios. Nessa tela são feitas praticamente todas as operações com os
formulários do SAP:

1. Criar um formulário novo

Um formulário pode ser criado inteiramente a partir dessa transação.


Preenchendo um nome do formulário, que comece por Z ou Y, não diretamente
seguidos por caracteres especiais, como o ‘_’, o usuário poderá apertar o botão Criar ou
ir ao menu Layout -> Criar. O idioma preenchido será entendido como idioma original
do formulário. A partir daí, outros formulários poderão ser traduzidos a partir desse
original, nas mais diferentes línguas, porém todos manterão as características de layout

24
ABAP Training
do formulário original. Ao mesmo tempo que uma alteração desse original, implica na
imediata alteração de todos os seus “filhos”.

2. Copiar formulário em outro idioma (Tradução)

Uma vez criado um formulário (conforme descrito acima), poderá ser copiado
sobre ele, as informações de um outro formulário do mesmo client, através do menu
Layout -> Copy from, já de dentro da primeira tela do formulário criado (Header).

Atenção que essa cópia é fiel ao formulário copiado, e não poupa nenhuma
informação que já existisse no formulário que recebe a cópia.

25
ABAP Training
3. Copiar um formulário de outro cliente

Um formulário pode também ser copiado de um outro client na mesma


instância, através do menu Utilitários -> Copy from client, da primeira janela da
transação SE71, fora de qualquer formulário específico.

Essa opção irá abrir uma outra janela que recebe basicamente 3 informações:

Nome do formulário a ser copiado


Cliente em que se encontra o original
Nome da cópia no client corrente

26
ABAP Training

Os outros dois campos de check box geralmente não são alterados pois tratam de
informações como cópia do formulário somente no idioma original e exibição ou não de
um log de erros ao final da execução da cópia.
Uma vez entrados os parâmetros, deve-se apertar o botão executar e obter uma
cópia com sucesso em todos os idiomas existentes do formulário.
O cliente de origem do formulário, quando for cópia de forms standards, deve
ser mantido 000, uma vez que o repositório dos formulários originais do SAP
encontram-se todos no 000, e podem ser lidos de todos os outros.

27
ABAP Training

Inclusão de Logos nos formulários

Utilizar logotipos em formulários SAPscripts, não é das tarefas mais simples que
se possa ter. Teoricamente falando, o processo é bastante simples e consiste em gerar no
sistema um objeto no formato hexadecimal, que possa ser interpretado pelo SAPscript,
originando a inclusão de uma imagem. No entanto, devido ás limitações expostas no
começo deste documento, isso pode levar um certo tempo até reproduzir o resultado
desejado.
Para gerarmos o objeto no client desejado (lembre que esse objeto não pode ser
transportado…), devemos executar o programa standard RSTXLDMC, com um arquivo
no formato *.TIF.

28
ABAP Training

Preencher o primeiro campo (file name), com o path completo do arquivo da


imagem do logotipo. Esse caminho pode ser no servidor ou local.
O segundo campo (type) determina se o logotipo deve ser gerado
monocromático (default) ou colorido.
O último parâmetro que exige ser preenchido é o Text Name, onde é feita a
atribuição do nome do objeto que será referenciado de dentro do formulário (padrão:
ZHEX-MACRO-…).
A geração desse logo está intimamente ligado ao formato do arquivo TIF. Isso
quer dizer que o seu tamanho obtido no formulário está relacionado ao tamanho da
imagem geradora do objeto.
Tomar cuidado com o número de cores e tonalidades da imagem e lembrar na
hora de fazer os testes, que o logotipo não aparece na tela, somente em impressões no
papel (problema corrigido nas versões atuais).

Nesta hora, vale lembrar todas as ressalvas feitas anteriormente:

• O arquivo deve estar no formato TIFF (extensão .TIF), não comprimido. Essa figura
gerada nestes padrões tem ainda algumas restrições para a sua aplicação. Em
primeiro lugar, o número de píxeis da figura ( a resolução da mesma, em DPI – dots
per inch ) devem ser exatamente o número de píxeis informado na tela de seleção
do programa para se garantir que o logotipo seja exibido no tamanho em que foi
gerado. Alguns programas de editoração gráfica, como o Paint Shop Pro, possuem
recursos para se determinar o tamanho da figura em centímetros e até mudá-lo
(resize), mantendo-se a resolução (número de píxels). Em alguns casos, se o número
de píxeis não coincidir com o informado, a figura pode nem ser gerada no SAP,
dificultando o trabalho do programador.
• O número de cores ou tonalidades de cinza também precisam coincidir (esse
parâmentro varia de acordo com a versão do SAP, devendo-se estar atento aos
dados na tela de seleção do programa).
• A configuração da impressora no SAP pode alterar o tamanho e o formato do
logotipo é a configuração da impressora no SAP. O SAP utiliza a configuração da
impressora para gerar o formulário e imprimí-lo. Se a configuração não estiver
correta, pode influenciar no logotipo e na criação de linhas e caixas (BOXES).
• Para se transportar um logotipo ou texto, deve-se primeiro, associá-lo a uma Change
Request, através do programa standard RSTXTRAN

29
ABAP Training

Alterações de Programas/Layouts Standards

Na maioria das vezes o trabalho a ser realizado com Sapscripts é alterar os originais do
SAP, pois estes raramente atendem as necessidades do cliente.
O procedimento para alteração depende muito das características do programa de
povoamento standard e das características das funções do SAP que irão utilizar tal sapscript.
No entanto, alguns procedimentos são padrões, e outros são utilizados na grande maioria das
alterações.
1) Fazer uma cópia do programa standard e dos includes (se existirem) que necessitam de
alteração
2) Fazer uma cópia do layoutset standard
3) NÃO DELETAR janelas, elementos de textos, etc. na cópia do layoutset. Mesmo que
alguns (ou todos) os dados e janelas do standard não sejam utilizados, o programa de
povoamento continuará tentando executar escritas em janelas e elementos de dados
específicos, já que é uma cópia do standard. Os novos dados e janelas devem ser apenas
adicionados!
4) Encontrar as posições ideais para alterações no programa de povoamento. Quando os
novos dados devem ser impressos na MAIN, procurar por comandos WRITE_FORM
dentro do programa e colocar as alterações o mais próximo possível do WRITE_FORM
correto. Se devem ser impressos em outras janelas, procurar pelo comando
CLOSE_FORM/END_FORM e colocar as alterações imediatamente antes destes comandos
(sempre que possível)
5) Colocar todas as alterações juntas sempre que possível, identificando visivelmente, através
de comentários, o bloco de alterações. Isso facilita a manutenção e visualização do código,
além de facilitar a busca por possíveis erros, visto que, na sua grande maioria, os
programas standard da SAP são bastante complicados.

*--------------------------------------------------------------------
*
***write texts to TEXTS window
*
*------------------------ --------------------------------------------
*

************************** ALTERAÇÃO
********************************
*--------------------------------------------------- ----------------
*
* Elimina mensagem ONU.... caso ela exista
*-------------------------------------------------------------------
*
read table wk_header_msg with key message(3) = 'ONU'.
v_msg_onu = wk_header_msg -seqnum.
delete wk_header_msg
where message(3) = 'ONU'.
delete wk_refer_msg
where seqnum = v_msg_onu.

30
ABAP Training

*Mensagem p/ materiais não perigosos


ybrvscript -mensg01 = text -001.

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

istart = j_1bb2 -totlih.


if istart > 10. "maximum number of fields in J_1BPRNFTX

31
ABAP Training

Linhas e Boxes:
Para a criação de linhas e Boxes nos formulários, utiliza-se o comando Box.
A sintaxe deste comando é a seguinte:

/: BOX xpos ypos WIDTH largura unidade(CH, cm) HEIGHT altura unidade
FRAME espessura unidade INTENSITY intensidade (0 a 100%)

No entanto, como podemos observar, torna-se muito difícil a criação de boxes e linhas
dinâmicos uma vez que eles dependem da posição na janela na qual estão sendo criados.

Apesar da apresentação ser a melhor, utilizando-se boxes dinâmicos, a complexidade para seu
desenvolvimento na maioria dos casos não justifica sua aplicação.

Uma saída a ser aplicada nestes casos é a seguinte:

Primeiro, cria-se um parágrafo especial, cujo espaçamento entre linhas seja o menor possível:

UL Linha de separação
Atributos standard
Espacej.linhas 0.05 LN
Margem esquerda 1.15 MM
Alinhamento Alinh.esq.

Em seguida, no formulário, simula-se os boxes da seguinte forma na janela Main:

UL &ULINE(73)&
AS <B>| Item,,|,,Código,,|,,Quantidade,,| UN,,|,,Preço Unitário,,|,, Preço
Total |</>
AS <B>| ,,|,, ,,|,, ,,| ,,|,, c/ ICMS ,,|,,
C/Impostos |</>
AS <B>| ,,|,, ,,|,, ,,| ,,|,, (R$) ,,|,,
(R$) |</>
UL &ULINE(73)&

Como o espaçamento entre linhas no parágrafo UL é pequeno, na hora da impressão, as linhas


horizontais acabam se encontrando com as verticais, simulando-se os boxes.

32
ABAP Training

Tabuladores:
Um recurso extremamente importante e diversas vezes esquecidos pelos programadores são os
tabuladores.
Uma das principais queixas dos programadores em relação ao Sapscript é que, quando se
altera a posição de um campo na impressão, acaba-se alterando as posições dos demais,
fazendo com que o trabalho do programador seja exaustivo.
A alternativa para isso não ocorrer é o uso dos tabuladores, definidos para cada parágrafo
criado, conforme o exemplo abaixo:

IL Linha de item
Atributos standard
Espacej.linhas 1.00 LN
Alinhamento Alinh.esq.
Tabuladores
6.00 CH Alinh.à esquerda
25.00 CH Alinh.à esquerda
54.00 CH Alinh.à esquerda
73.00 CH Alinh.à esquerda

E a sua utilização no código fica:

IL &EKPO-EBELP&,,&EKPO-EMATN&,,&EKPO-TXZ01&

Os tabuladores são representados no Sapscript por 2 vírgulas (,,) e seu espaçamento


pode estar tanto em caracteres (CH) quanto em centímetros (CM) e milímetros (MM). Uma
ressalva que deve ser feita é que impressoras matriciais trabalham sempre com caracteres,
dificultando um pouco a determinação do tamanho. Nos casos onde a unidade seja caracter, o
espaçamento utilizado é feito com base no caracter padrão, definido no header do formulário.

Agindo-se assim, garante-se que os textos estarão sempre na posição e alinhados da


maneira como planejada, facilitando futuras manutenções, como a alteração da posição ou
tamanho de um determinado campo. Além disso, a alteração da posição é feita somente em um
lugar e não repetidamente no código, eliminado esforço desnecessário.

Por fim, há uma outra ferramenta que pode ajudar no posicionamento dos textos,
principalmente para impressoras matriciais. Existem réguas especiais que possuem as escalas
mais comuns de caracteres. Um exemplo é a régua Trident modelo FC-1.

33
ABAP Training

Exemplos

• Sapscript

---------------------------------------------------------------------
-----------
Formulário YBRV_CREDIT_MEMO
---------------------------------------------------------------------
-----------

Mandante 650
Idioma P
Original lang. P Idioma Original de Criação
Relevant for transl. Yes
Status Active

Development class YBR0 General Multi -purpose Development cl ass

Created by SAO0105A Changed by


SAO0105A
Date 29.07.1998 Date
01.09.1998
Time 09:02:34 Time
19:52:15
Release 30F Release
30F

Significado Nota de Crédito

Standard attributes
First page FIRST Primeira página a ser
utilizada
Default paragr. MA Parágrafo default para os
textos
Tab stop 1,00 CM
Page format DINA4 Tipo de Papel
Orientation Landscape
Lines/inch 6,00 Espaçamento entre as linhas
Characters/inch 12,00 Espaçamento entre os
caracteres

Font attributes
Font family COURIER Fonte padrão do formulário
Font size 10,0 Point Tamanho da fonte padrão
Bold No
Italic No
Underlined No

34
ABAP Training

-------------------- -------------------------------------------------
-----------
Characters Attributes Definições dos Characters
Strings
---------------------------------------------------------------------
-----------

H1 Header 1
St andard attributes
Marker No
Font attributes
Font family COURIER
Font size 8,0 Point
Bold Yes

H2 Header 2
Stand ard attributes
Marker No
Font attributes
Font family COURIER
Font size 10,0 Point
Bold Yes

H3 Header 3
Standar d attributes
Marker No
Font attributes
Font family COURIER
Font size 6,0 Point
Bold Yes

---------------------------------------------- -----------------------
-----------
Paragraphs Attributes Definições dos tipos de
parágrafos
---------------------------------------------------------------------
-----------

H1 Paragrafo 1 p/ o header
Standard attrib utes
Line spacing 1,00 LN
Alignment Left -aligned
Tabs Tabulações para o
parágrafo
16,00 CH Left -aligned
66,00 CH Left-aligned
80,00 CH Left -aligned

H2 Paragrafo 2 p/ header

35
ABAP Training
Standard attributes
Line spacing 1,00 LN
Alignment Left -aligned
Tabs
56,00 CH Left -aligned
100,00 CH Left -aligned
117,00 CH Left -aligned

MA Paragrafo p/ Main
Standard attributes
Line spacing 1,00 LN
Alignment Left -aligned

---------------------------------------------------------------------
-----------
Windows Attributes Janelas definidas para o
formulário
------------------------------------------------------------- --------
-----------

HEADER Cabeçalho da Nota


Window type CONST

HEAD_PRI Header p/ Main


Window type CONST

MAIN Main window


Window type MAIN

TEXT Textos da Nota


Window type CONST

TOTAL Totais da Nota


Window type CONST

---------------------------------------------------------------------
-----------
Pages Attributes Paginas do formulário com suas
respectivas janelas
---------------------------------------------------------------------
-----------

FIRST Primeira Página


Page counter
Mode INC
Numbering type Arabic numerals
Page window
MAIN Left margin 2,00 CH
Upper margin 9,00 LN

36
ABAP Training
Window width 132,00 CH
Window height 27,00 LN
HEADER Left margin 2,00 CH
Upper margin 1,00 LN
Window width 132,00 CH
Window height 8,00 LN
TEXT Left margin 2,00 CH
Upper margin 36,00 LN
Window width 132,0 0 CH
Window height 3,00 LN
TOTAL Left margin 2,00 CH
Upper margin 39,00 LN
Window wi dth 132,00 CH
Window height 7,00 LN

---------------------------------------------------------------------
-----------
Text elements for following windows:
----------------------------------------------- ----------------------
-----------

HEADER Definição do parágrafo para a linha

/: BOX XPOS 0 CH YPOS 0 CH WIDTH 132 CH HEIGHT 8 LN FRAME 10 TW


/: BOX XPOS 0 CH YPOS 7 LN WIDTH 132 CH HEIGHT 1 LN FRAME 10 TW
/: IF &YBRVS_NOTA-REPRINT& EQ 'S'
H2 REIMPRESSO,,<H2>NOTA DE CRÉDITO</>,,&ybrvs_nota -data&,,Nº
&ybrvs_nota -numero& Desativa
Character String
/: ELSE Ativa Character String
H2 ,,<H2>NOTA DE CRÉDITO</>,,&ybrvs _nota-data&,,Nº &ybrvs_nota -
numero&
/: ENDIF
H1 ,,,,CLARIANT S/A Salta p/
próx. tabulação
H1 <H1>Razão Social:</> &ybrvs_nota -razao(50)& <H1>Cliente:
</>&ybrvs_nota -cliente(20)& <H1>Filial: </>&ybrvs_nota -filial&
H1 <H1>Endereço :</> &ybrvs_nota -endereco(26)& <H1>Bairro :</>
&ybrvs_nota -bairro&
H1 <H1>C.E.P. :</> &ybrvs_nota -cep(11)& <H1>Cidade: Texto
Fixo
</>&ybrvs_nota -cidade(19)& <H1>Estado: </>& ybrvs_nota-estado(4)&
<H3>PREZADOS SENHORES: PARTICIPAMOS A v.Sas. QUE FIZEMOS EM SUA
CONTA
OS LANÇAMENTOS ABAIXO:</>
H1 <H1>Histórico :</> &ybrvs_nota -tipo&
H1 <H1>Valor por Extenso: </>&ybrvs_nota -tot_extens(100)&
<H1>Centavos:</> &spell -decimal(2)&
H1 <H1>Depósito:</> &ybrvs_nota -filial(6)& <H1>Setor:</>
&ybrvs_nota -setor(4)& <H1>Vendedor:</> &ybrvs_nota -vendedor(8)&

37
ABAP Training
<H1>Zona:</> &ybrvs_nota -zona(6)& <H1>Doc. Entr</>
&ybrvs_nota -doc_entr(19)& <H1>N/N.F.F.:</> &ybrvs_nota -
doc_entr(11)&
<H1>de </> &ybrvs_nota -data&
Campo de
tabela/estrutura

HEAD_PRI Indicação de linha de comando

/: BOX WIDTH 132 CH HEIGHT 1 LN FRAME 10 TW


<H1> Código Produto |EMB |UN.| Quantidad e |</>

MAIN Elemento de dados

/E DADOS
/: BOX XPOS 0 CH YPOS 0 CH WIDTH 132 CH HEIGHT 27 LN FRAME 10 TW
/: BOX XPOS 15 CH YPOS 0 CH WIDTH 117 CH HEIGHT 27 LN FRAME 10 TW
/: BOX XPOS 18 CH YPOS 0 CH WIDTH 114 CH HEIGHT 27 LN FRAME 10 TW
/: BOX XPOS 21 CH YPOS 0 CH WIDTH 111 CH HEIGHT 27 LN FRAME 10 TW
/: BOX XPOS 36 CH YPOS 0 CH WIDTH 96 CH HEIGHT 27 LN FRAME 10 TW
/: BOX XPOS 67 CH YPOS 0 CH WIDTH 65 CH HEIGHT 27 LN FRAME 10 TW
/: BOX XPOS 69 CH YPOS 0 CH WIDTH 63 CH HEIGHT 27 LN FRAME 10 TW
/: BOX XPOS 83 CH YPOS 0 CH WIDTH 49 CH HEIGHT 27 LN FRAME 10 TW
/: BOX XPOS 97 CH YPOS 0 CH WIDTH 35 CH HEIGHT 27 LN FRAME 10 TW
/: BOX XPOS 111 CH YPOS 0 CH WIDTH 21 CH HEIGHT 27 LN FRAME 10 TW
/: BOX XPOS 116 CH YPOS 0 CH WIDTH 16 CH HEIGHT 27 LN FRAME 10 TW
MA &ybrvs_nota -produto(15)&
&ybrvs_nota -unidade(3)&&ybrvs_nota -quant(15)&&ybrvs_nota -
nome(31)&
&ybrvs_nota -preco_un(14)&&ybrvs_nota -val_merc(14)&
&ybrvs_nota -val_desc(12)&&ybrvs_nota -porc_ipi(5)&
&ybrvs_nota -val_ipi(15)&

/E HEADER
* <H1> Código Produto EMB UN. Quantidade Nome
do
Produto RN Preço Unitário Valor Mercadoria Valor
Desconto %IPI Valor IPI</>
* &uline(132)&
Parágrafo standard

TEXT Linha de Comentários

/: BOX WIDTH 132 CH HEIGHT 3 LN FRAME 10 TW


/* Exibe tipo no campo texto
* <H1>Textos:</>
* &ybrvs_nota -tipo&

38
ABAP Training

TOTAL

/: BOX XPOS 0 CH YPOS 0 CH WIDTH 15 CH HEIGHT 3 LN FRAME 10 TW


/: BOX XPOS 15 CH YPOS 0 CH WIDTH 5 CH HEIGHT 3 L N FRAME 10 TW
/: BOX XPOS 20 CH YPOS 0 CH WIDTH 14 CH HEIGHT 3 LN FRAME 10 TW
/: BOX XPOS 34 CH YPOS 0 CH WIDTH 14 CH HEIGHT 3 LN FRAME 10 TW
/: BOX XPOS 48 CH YPOS 0 CH WIDTH 14 CH HEIGHT 3 LN FRAME 10 TW
/: BOX XPOS 62 CH YPOS 0 CH WIDTH 14 CH HEIGHT 3 L N FRAME 10 TW
/: BOX XPOS 76 CH YPOS 0 CH WIDTH 14 CH HEIGHT 3 LN FRAME 10 TW
/: BOX XPOS 90 CH YPOS 0 CH WIDTH 14 CH HEIGHT 3 LN FRAME 10 TW
/: BOX XPOS 104 CH YPOS 0 CH WIDTH 14 CH HEIGHT 3 LN FRAME 10 TW
/: BOX XPOS 118 CH YPOS 0 CH WIDTH 14 CH HEIGHT 3 LN FRAME 10 TW
/: BOX XPOS 0 CH YPOS 0 CH WIDTH 132 CH HEIGHT 7 LN FRAME 10 TW
* <H1> Val. Trib. ICMS %ICMS Valor ICMS Valor Mercadoria
Valor
Descontos Valor IPI Val. Outros Abat. Valor Fretes
Val.
Seguros Val. Total Not a</>
MA &ybrvs_nota -porc_icms(5)&&ybrvs_nota -tot_icms(14)&
&ybrvs_nota -tot_merc(14)&&ybrvs_nota -tot_desc(14)&
&ybrvs_nota -tot_ipi+1(13)&
&ybrvs_nota -tot_seg(14)&&ybrvs_nota -
total(14)&
MA
MA
MA ____________________________
___________________________
MA Assinatura Assinatura

39
ABAP Training

Exemplo:

Relatório de Avaliação de Fornecedores


A seguir, temos o programa de povoamento e o formulário Sapscript para um Relatório de
Avaliação de Fornecedores, onde o usuário tem a opção de rodar um relatório ou imprimir o
formulário. A lógica de ambos é complexa. No entanto, servem como referência de estudo pois
abrangem quase todo o conteúdo acima mencionado, incluindo, até, boxes dinâmicos, ou seja,
que variam com a quantidade de linhas a ser exibida e impressão em frente e verso (para isso,
necessita-se de uma impressora com essa capacidade e programada para isso. Por fim, se o
formulário for um envelope como neste caso, é necessária a utilização de uma máquina
envelopadora).

40
ABAP Training
********************************************************************************** QAVE, "Processamento de controle: decisão de utili
* * QALS, "Registro do lote de controle
* ******************************************** * JEST, "Status individual por objeto
* * Confidencial e Proprietário * * VIQMEL, "Nota - cabeçalho
* * Copyright 2001, Accenture * * VIQMSM, "Nota - medidas
* * Todos os direitos reservados * * ELBP, "Critério principal da avaliação de forneced
* ******************************************** * T147C, "Definição dos subcritérios para a avaliação
* * EKPO, "Item do documento de compras
* Nome do Shell: YTRP0010 Versão do Shell: v1.01 * T001W, "Centros/filiais
* * ZSAPSCRIP2, "Estrutura auxiliar de Relatório de Avaliaçã
********************************************************************************** ITCPO, "SAPscript output interface
* Nome do Programa : ZRQM001 * T247, "Denominações e denominação breve dos meses
* Título do Programa : Shell - ABAP/4 List Report * KNA1, "Mestre de clientes (parte geral)
* Programador : Antonio Celso Hunnicutt Cortada * T005T. "Denominação dos países
* Data : 05/02/2001 *
* Última atualização : 05/02/2001 * ************************************************************************
* * * Dados: *
* Descrição : Criar uma transação ON-Line que sera chamada do menu* * Constantes (C_...) *
* SAP, para definir o escopo dos calculos de avaliacao * * Variaveis (V_...) *
* de fornecedores. * * Tabelas Internas (T_...) *
* Esta transacao devera fazer a demosntracao dos resul * ************************************************************************
* tados dos calculos na tela, e permitir a impressao *
* deste relatorio ou a geracao dos dados para ser lidos * *- Variaveis ----------------------------------------------------------*
* por uma planilha excel. *
* * DATA: C_MILHAO(7) TYPE N VALUE '1000000', "Valor de calc de Nota
* * C_LINHA TYPE P DECIMALS 2, "Cte p/ N. linhas Quebra Pág
* Include : ZZIHEADR * C_LINHA1 TYPE P DECIMALS 2, "Cte p/ N. linhas Quebra Pág
*----------------------------------------------------------------------------------------------* C_SIM(3) TYPE C VALUE 'SIM', "SIM
* Lista de Modificações: * C_NAO(3) TYPE C VALUE 'NAO', "NAO
* Data Autor Corr. # Descrição * C_YES(3) TYPE C VALUE 'YES', "SIM
* 05/02/2001 Desenvolvimento inicial do prg * C_NO(2) TYPE C VALUE 'NO', "NAO
************************************************************************ C_PPM(8) TYPE C VALUE 'OBJ_PPM',
REPORT ZRQM001 C_LOTE(8) TYPE C VALUE 'OBJ_LOTE',
NO STANDARD PAGE HEADING "Não mostra o cabeçalho padrão C_NAS(3) TYPE C VALUE 'NAS',
SAP C_MT_101(6) TYPE C VALUE 'MT-101',
LINE-SIZE 170 "Largura do report de nnn caracteres C_DEZ(03) TYPE C VALUE '010',
LINE-COUNT 58 "Comprimento do report de nn caracteres C_Z(03) TYPE C VALUE 'Z01',
MESSAGE-ID ZM. "Classe de mensagens é ZM C_ERRO(10) TYPE C VALUE ' ERRO ',
C_P TYPE C VALUE 'P', "Idioma Português
RESERVE 8 LINES. "Pelo menos n linhas serão impressas na última C_ESP TYPE C VALUE 'S', "idioma espanhol
página C_ARG(2) TYPE C VALUE 'AR', "Argentina
C_BR(2) TYPE C VALUE 'BR', "Brasil
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>> C_SI(2) TYPE C VALUE 'SÍ', "SÍ
>>>>>>>>>>>>>>>>" C_ENG TYPE C VALUE 'E'. "Idioma inglês
" SESSÃO DE DECLARAÇÃO DE DADOS "
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>> DATA: C_STAT(5) TYPE C VALUE 'I0224',
>>>>>>>>>>>>>>>>" C_KZART(1) TYPE C VALUE 'L',
************************************************************************ C_HKRIT(02) TYPE C VALUE '04'.
* Includes *
************************************************************************ DATA: V_TIME TYPE P DECIMALS 2, "Var.P/ armazenar
INCLUDE: No.Linhas(cm)
ZZIHEADR. "Cabeçalho padrão de report V_ATFLV TYPE P DECIMALS 2,
V_VAL_PPM(7) TYPE C,
************************************************************************ V_VAL_LOTE(7) TYPE C,
* Tabelas * V_VAL_NAS(3) TYPE C,
************************************************************************ V_FORNEC_50(50) TYPE C,
TABLES: MARA, "Mestre do material: dados gerais V_IDIOMA LIKE LFA1-SPRAS. "idioma do fornecedor.
MAKT, "Textos breves de material
CABN, "Característica * variaveis auxiliares.
AUSP, "Valores das modalidades das características DATA:
LFA1, "Mestre de fornecedores (parte geral) V_PRIM_VEZ TYPE C VALUE 'T',

41
ABAP Training
V_ULTIMO_DIA LIKE SY-DATUM, V_CENTRO_PPM_OBJ LIKE T706U-BETFA,
V_PRIMEIRO_DIA LIKE SY-DATUM, V_CENTRO_LOT LIKE T706U-BETFA,
V_DIA_CALCULO LIKE SY-DATUM, V_CENTRO_LOT_OBJ LIKE T706U-BETFA.
V_MULTIPLICADOR(5) TYPE N,
V_PRIMEIRO_MES LIKE SY-DATUM,
V_DT_INICIO LIKE SY-DATUM,
V_DT_FIM LIKE SY-DATUM, * variaveis de trabalho.
V_DTI_ANALISE LIKE SY-DATUM, DATA: V_WERKS LIKE QALS-WERK,
V_QTDE(10) TYPE C, V_LIFNR LIKE QALS-LIFNR,
V_QTDE_SAP TYPE I, V_MATNR LIKE QALS-MATNR,
V_QTDE_SAP7 TYPE I. V_TIPO_NF LIKE QALS-ART,
V_QKENNZAHL LIKE QAVE-QKENNZAHL,
V_LINHAS(6) TYPE N.
* variaveis numericas. * variáveis de controle de impressão em branco
DATA: V_SUM_PPM89_M LIKE T706U-BETFA, DATA: V_CHECK_NFL_M TYPE C, " flag para NFL = %LOT =
V_SUM_PPM89_AC LIKE T706U-BETFA, BRANCO
V_SUM_NFL_M LIKE T706U-BETFA, V_CHECK_PPM_M TYPE C, " flag para PPM = NPR = BRANCO
V_SUM_NFL_AC LIKE T706U-BETFA, V_CHECK_NAS_M TYPE C, " flag para NAS = BRANCO
V_SUM_LOT_M LIKE T706U-BETFA, V_CHECK_NQF_M TYPE C, " flag para NQF = BRANCO
V_SUM_LOT_AC LIKE T706U-BETFA, V_CHECK_NFL_AC TYPE C, " flag para NFL = %LOT = BRANCO
V_NUM_NFL_M LIKE T706U-BETFA, V_CHECK_PPM_AC TYPE C, " flag para PPM = NPR = BRANCO
V_NUM_NFL_AC LIKE T706U-BETFA, V_CHECK_NAS_AC TYPE C, " flag para NAS = BRANCO
V_SUM_NPT_M LIKE T706U-BETFA, V_CHECK_NQF_AC TYPE C. " flag para NQF = BRANCO
V_SUM_NPT_AC LIKE T706U-BETFA,
V_TOT_NFL_M LIKE T706U-BETFA,
V_TOT_NFL_AC LIKE T706U-BETFA, *- Tabela Interna -----------------------------------------------------*
V_TOT_LOT_M LIKE T706U-BETFA,
V_TOT_LOT_AC LIKE T706U-BETFA, * Tabela interna para armazenar os valores a serem utilizados no cálculo
V_TOT_PPM_M LIKE T706U-BETFA, * das notas para os caso: Acumulado no Centro e Acumulado na MTB
V_TOT_PPM_AC LIKE T706U-BETFA,
V_TOT_NPR_M LIKE T706U-BETFA, DATA: BEGIN OF I_ACUM OCCURS 0,
V_TOT_NPR_AC LIKE T706U-BETFA, CENTRO LIKE QALS-WERK,
V_TOT_NPT_M LIKE T706U-BETFA, LIFNR LIKE QALS-LIFNR,
V_TOT_NPT_AC LIKE T706U-BETFA, SUM_PPM01_M LIKE PC207-BETPE,
V_TOT_NAS_M LIKE T706U-BETFA, SUM_PPM01_AC LIKE PC207-BETPE,
V_TOT_NCQ_M LIKE T706U-BETFA, SUM_ATRAS_M LIKE T706U-BETFA,
V_TOT_NCQ_AC LIKE T706U-BETFA, SUM_ATRAS_AC LIKE T706U-BETFA,
V_SUM_PPM01_M LIKE T706U-BETFA, SUM_EMDIA_M LIKE T706U-BETFA,
V_SUM_PPM01_AC LIKE PC207-BETPE, SUM_EMDIA_AC LIKE T706U-BETFA,
V_SUM_ATRAS_M LIKE T706U-BETFA, SUM_PPM89_M LIKE T706U-BETFA,
V_SUM_ATRAS_AC LIKE T706U-BETFA, SUM_PPM89_AC LIKE T706U-BETFA,
V_SUM_EMDIA_M LIKE T706U-BETFA, SUM_NFL_M LIKE T706U-BETFA,
V_SUM_EMDIA_AC LIKE T706U-BETFA, SUM_NFL_AC LIKE T706U-BETFA,
V_TOT_NOTAS_M LIKE T706U-BETFA, SUM_LOT_M LIKE T706U-BETFA,
V_TOT_NOTAS_AC LIKE T706U-BETFA, SUM_LOT_AC LIKE T706U-BETFA,
V_FATOR_NFL(3) TYPE C, SUM_NPT_M LIKE T706U-BETFA,
V_FATOR_NPR(3) TYPE C, SUM_NPT_AC LIKE T706U-BETFA,
V_FATOR_NCQ(3) TYPE C, NUM_NPT_M LIKE T706U-BETFA,
V_TOT_POND(5) TYPE I, NUM_NPT_AC LIKE T706U-BETFA,
V_TOT_NQF_M LIKE T706U-BETFA, NUM_NFL_M LIKE T706U-BETFA,
V_TOT_NQF_AC LIKE T706U-BETFA. NUM_NFL_AC LIKE T706U-BETFA.
DATA: END OF I_ACUM.
* variaveis de total por centro.
DATA: DATA: BEGIN OF I_ACUM_CENTRO OCCURS 0,
V_CENTRO_NFL LIKE T706U-BETFA, CENTRO LIKE QALS-WERK,
V_CENTRO_NPR LIKE T706U-BETFA, SUM_PPM01 LIKE T706U-BETFA,
V_CENTRO_NCQ LIKE T706U-BETFA, SUM_ATRAS LIKE T706U-BETFA,
V_CENTRO_NQF LIKE T706U-BETFA, SUM_EMDIA LIKE T706U-BETFA,
V_CENTRO_NPT LIKE T706U-BETFA, SUM_PPM89 LIKE T706U-BETFA,
V_CENTRO_NAS LIKE T706U-BETFA, SUM_NFL LIKE T706U-BETFA,
V_CENTRO_PPM LIKE T706U-BETFA, SUM_LOT LIKE T706U-BETFA,

42
ABAP Training
SUM_NPT LIKE T706U-BETFA, WERKS LIKE QALS-WERK, "centro
NUM_NPT LIKE T706U-BETFA, NFL(5) TYPE C,
NUM_NFL LIKE T706U-BETFA. NPR(5) TYPE C,
DATA: END OF I_ACUM_CENTRO. NCQ(5) TYPE C,
NQF(5) TYPE C,
NPT(5) TYPE C,
DATA: BEGIN OF I_QAVE OCCURS 0, PPM(7) TYPE C,
PRUEFLOS LIKE QAVE-PRUEFLOS, "Nº lote de controle. LOT(7) TYPE C.
KZART LIKE QAVE-KZART, "Código: lote de controle, lote DATA: END OF I_TOT_CENTRO.
QKENNZAHL LIKE QAVE-QKENNZAHL, "Índice de qualidade
VBEWERTUNG LIKE QAVE-VBEWERTUNG, "Avaliação do code DATA: BEGIN OF I_ACUM_MTB,
VDATUM LIKE QAVE-VDATUM. "Data do code para a dec.de NFL_AC(5) TYPE C,
util. NPR_AC(5) TYPE C,
DATA: END OF I_QAVE. NCQ_AC(5) TYPE C,
NQF_AC(5) TYPE C,
DATA: BEGIN OF I_QALS OCCURS 0, NPT_AC(5) TYPE C,
PRUEFLOS LIKE QALS-PRUEFLOS, "Nº lote de controle PPM_AC(7) TYPE C,
WERKS LIKE QALS-WERK, "Centro LOT_AC(7) TYPE C.
ART LIKE QALS-ART, "Tipo de controle DATA: END OF I_ACUM_MTB.
LIFNR LIKE QALS-LIFNR, "Nº conta do fornecedor
MATNR LIKE QALS-MATNR, "Nº material DATA: BEGIN OF I_TOT_FORNEC OCCURS 0,
LMENGESCH LIKE QALS-LMENGESCH, "Registro do lote de LIFNR LIKE QALS-LIFNR,
controle NFL_M(5) TYPE C,
LMENGEIST LIKE QALS-LMENGEIST, "Registro do lote de controle NFL_AC(5) TYPE C,
OBJNR LIKE QALS-OBJNR. "Nº objeto NPR_M(5) TYPE C,
DATA: END OF I_QALS. NPR_AC(5) TYPE C,
NCQ_M(5) TYPE C,
DATA: BEGIN OF I_JEST OCCURS 0, NCQ_AC(5) TYPE C,
OBJNR LIKE JEST-OBJNR, "Nº objeto NQF_M(5) TYPE C,
INACT LIKE JEST-INACT. "Código: status inativo NQF_AC(5) TYPE C,
DATA: END OF I_JEST. NPT_M(5) TYPE C,
NPT_AC(5) TYPE C,
PPM_M(7) TYPE C,
DATA: BEGIN OF I_TABFIM OCCURS 0, PPM_AC(7) TYPE C,
WERKS LIKE QALS-WERK, "Centro LOT_M(7) TYPE C,
LIFNR LIKE QALS-LIFNR, "Fornecedor LOT_AC(7) TYPE C.
PPM1_M(7) TYPE C, DATA: END OF I_TOT_FORNEC.
PPM1_AC(7) TYPE C,
PPM_M(7) TYPE C, DATA: BEGIN OF I_FORNEC OCCURS 0,
PPM_AC(7) TYPE C, LIFNR LIKE LFA1-LIFNR, "fornecedor
NFL_M(5) TYPE C, PPM_OBJ(7) TYPE C,
NFL_AC(5) TYPE C, LOT_OBJ(7) TYPE C,
LOT_M(7) TYPE C, NAS(3) TYPE C.
LOT_AC(7) TYPE C, DATA: END OF I_FORNEC.
NPR_M(5) TYPE C,
NPR_AC(5) TYPE C, DATA: BEGIN OF I_FORNEC_MAT OCCURS 0,
NPT_M(5) TYPE C, LIFNR LIKE LFA1-LIFNR,
NPT_AC(5) TYPE C, MATNR LIKE MARA-MATNR,
NCQ_M(5) TYPE C, PPM_OBJ(10) TYPE C,
NCQ_AC(5) TYPE C, LOT_OBJ(10) TYPE C.
NAS_M(5) TYPE C, DATA: END OF I_FORNEC_MAT.
NAS_AC(5) TYPE C,
NQF_M(5) TYPE C, DATA: BEGIN OF I_VIQMEL OCCURS 0,
NQF_AC(5) TYPE C, MAWERKS LIKE VIQMEL-IWERK, "centro
LOT_OBJ_M(10) TYPE C, LIFNUM LIKE VIQMEL-LIFNUM, "fornecedor
LOT_OBJ_AC(10) TYPE C, MATNR LIKE VIQMEL-MATNR, "material
PPM_OBJ_M(10) TYPE C, STRMN LIKE VIQMEL-STRMN, "Data de início desejada
PPM_OBJ_AC(10) TYPE C. QMNUM LIKE VIQMEL-QMNUM, "Nº nota
DATA: END OF I_TABFIM. OBJNR LIKE VIQMEL-OBJNR, "nº objeto
EBELN LIKE VIQMEL-EBELN, "Pedido
DATA: BEGIN OF I_TOT_CENTRO OCCURS 0, EBELP LIKE VIQMEL-EBELP. "Item

43
ABAP Training
DATA: END OF I_VIQMEL. DATA LIKE QAVE-VDATUM, "Data do code para a de
TIPO_NF(2) TYPE C, "Tipo NF
DATA: BEGIN OF I_JEST_NCQ OCCURS 0, LMENGESCH LIKE QALS-LMENGESCH, "Qtd.rejeitada em
OBJNR LIKE JEST-OBJNR, "Nº objeto amostr
INACT LIKE JEST-INACT. "Código: status inativo QKENNZAHL LIKE QAVE-QKENNZAHL, "Índice de qualidade
DATA: END OF I_JEST_NCQ. LMENGEIST LIKE QALS-LMENGEIST. "Quantidade de lote real
DATA: END OF I_DET_MAT.
DATA: BEGIN OF I_VIQMSM OCCURS 0,
QMNUM LIKE VIQMSM-QMNUM, "Nº nota DATA: BEGIN OF I_TAB_DET_FIM OCCURS 0,
ERDAT LIKE VIQMSM-ERDAT. "Data de criação do regist WERKS LIKE T001W-WERKS, "Centro
DATA: END OF I_VIQMSM. LIFNR LIKE LFA1-LIFNR, "Nº conta do fornecedor
MATNR LIKE MARA-MATNR, "Material
DATA: BEGIN OF I_LFA1 OCCURS 0, PPM_M(7) TYPE C,
LIFNR LIKE LFA1-LIFNR, "Nº conta do fornecedor PPM_AC(7) TYPE C,
NAME1 LIKE LFA1-NAME1, "Nome 1 LOT_M(7) TYPE C,
SPRAS LIKE LFA1-SPRAS, "Chave do idioma LOT_AC(7) TYPE C.
STRAS LIKE LFA1-STRAS, "Rua e nº DATA: END OF I_TAB_DET_FIM.
PFACH LIKE LFA1-PFACH, "CxPostal
PSTLZ LIKE LFA1-PSTLZ, "Código Postal (CEP) DATA: BEGIN OF I_MAKT OCCURS 0,
ORT01 LIKE LFA1-ORT01, "Cidade MATNR LIKE MAKT-MATNR, "material
REGIO LIKE LFA1-REGIO, "Estado MAKTX LIKE MAKT-MAKTX. "descricao
LAND1 LIKE LFA1-LAND1. "Pais DATA: END OF I_MAKT.
DATA: END OF I_LFA1.
DATA: BEGIN OF I_EKPO OCCURS 0,
DATA: BEGIN OF I_ELBP OCCURS 0, EBELN LIKE VIQMEL-EBELN, "pedido
LIFNR LIKE ELBP-LIFNR, "Nº conta do fornecedor EBELP LIKE VIQMEL-EBELP, "item do pedido
BEURT LIKE ELBP-BEURT. "Nota WERKS LIKE EKPO-WERKS. "centro
DATA: END OF I_ELBP. DATA: END OF I_EKPO.

DATA: BEGIN OF I_T001W OCCURS 0, DATA: BEGIN OF I_TAB_RES OCCURS 0,


WERKS LIKE T001W-WERKS, "Centro WERKS LIKE QALS-WERK, "centro
NAME LIKE T001W-NAME1, "Nome 1 LIFNR LIKE QALS-LIFNR, "fornecedor
SPRAS LIKE T001W-SPRAS, "Chave de Idioma PPM_M LIKE T706U-BETFA,
STRAS LIKE T001W-STRAS, "Morada PPM_AC LIKE T706U-BETFA,
PFACH LIKE T001W-PFACH, "CxPostal NFL_M LIKE T706U-BETFA,
PSTLZ LIKE T001W-PSTLZ, "CEP NFL_AC LIKE T706U-BETFA,
ORT01 LIKE T001W-ORT01, "Cidade LOT_M LIKE T706U-BETFA,
REGIO LIKE T001W-REGIO, "Estado LOT_AC LIKE T706U-BETFA,
LAND1 LIKE T001W-LAND1. "Pais NPR_M LIKE T706U-BETFA,
DATA: END OF I_T001W. NPR_AC LIKE T706U-BETFA,
NPT_M LIKE T706U-BETFA,
DATA: BEGIN OF I_REMET, NCQ_M LIKE T706U-BETFA,
WERKS LIKE KNA1-WERKS, "Centro NCQ_AC LIKE T706U-BETFA,
NAME LIKE KNA1-NAME1, "Nome 1 NAS_M LIKE T706U-BETFA,
STRAS LIKE KNA1-STRAS, "Morada NQF_M LIKE T706U-BETFA,
PFACH LIKE KNA1-PFACH, "CxPostal NQF_AC LIKE T706U-BETFA,
PSTLZ LIKE KNA1-PSTLZ, "CEP OBJ_M LIKE T706U-BETFA,
ORT01 LIKE KNA1-ORT01, "Cidade OBJ_AC LIKE T706U-BETFA.
REGIO LIKE KNA1-REGIO, "Estado DATA: END OF I_TAB_RES.
LAND1 LIKE KNA1-LAND1. "Pais
DATA: END OF I_REMET. DATA: BEGIN OF I_RES_INDICE OCCURS 0,
LIFNR LIKE MSEG-LIFNR, "fornecedor
DATA: BEGIN OF I_PAIS OCCURS 0, WERKS LIKE MSEG-WERKS, "centro
LAND1 LIKE T005T-LAND1, PPM_M(7) TYPE C,
LANDX LIKE T005T-LANDX. PPM_AC(7) TYPE C,
DATA: END OF I_PAIS. LOT_M(7) TYPE C,
LOT_AC(7) TYPE C,
DATA: BEGIN OF I_DET_MAT OCCURS 0, LOT_OBJ_M(10) TYPE C,
WERKS LIKE T001W-WERKS, "Centro PPM_OBJ_M(10) TYPE C.
LIFNR LIKE LFA1-LIFNR, "Nº conta do fornecedor DATA: END OF I_RES_INDICE.
MATNR LIKE MARA-MATNR, "Nº material

44
ABAP Training
DATA: BEGIN OF I_CABN OCCURS 0, T1 = TEXT-001. " Características
ATINN LIKE CABN-ATINN, "Característica interna T2 = TEXT-002. " Período de Análise
ADZHL LIKE CABN-ADZHL, "Número interno T3 = TEXT-003. " Apresentação
ATNAM LIKE CABN-ATNAM, "Nome da característica T4 = TEXT-004. " Dados para RAF
ATFOR LIKE CABN-ATFOR. "Formato da caracterí.
DATA: END OF I_CABN. *----------------------------------------------------------------------*
AT SELECTION-SCREEN. "Tratamento de Erros e lógica para tela de
DATA: BEGIN OF I_AUSP OCCURS 0, seleção
OBJEK LIKE AUSP-OBJEK, "Chave do objeto *----------------------------------------------------------------------*
ATINN LIKE AUSP-ATINN, "Característica interna
ATWRT LIKE AUSP-ATWRT, "Valor da característ. * Condições de erro na tela de seleção:
ATFLV LIKE AUSP-ATFLV, "Valor interno vírgula * Se ambos os modos de apresentação estão selecionados
KLART LIKE AUSP-KLART. "Tipo de classe IF P_SOPPM = 'X'
DATA: END OF I_AUSP. AND P_RSUM = 'X'.
MESSAGE E083 WITH 'Selecionar apenas um modo '
DATA: BEGIN OF I_CENTRO OCCURS 0, 'de apresentação'.
WERKS LIKE T001W-WERKS. ENDIF.
DATA: END OF I_CENTRO.
* Se o mês informado está incorreto
************************************************************************ IF P_MES+4(2) > 12
* Parâmetros de entrada : * OR P_MES+4(2) = 0.
* Select Options (S_...) * MESSAGE E083 WITH 'Mês de análise errado'.
* Parameters (P_...) * ENDIF.
************************************************************************
* Se o período de análise está incorreto
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE T1. IF P_PERIOD <= 0.
MESSAGE E083 WITH 'Período de análise errado'.
SELECT-OPTIONS: SO_CENT FOR LFA1-WERKS, "centro para ENDIF.
impressão
SO_FORNE FOR LFA1-LIFNR, "fornecedor IF P_RAF <> SPACE.
SO_MATNR FOR MARA-MATNR, "material IF P_IMPRE EQ SPACE.
SO_WERKS FOR LFA1-WERKS. "centros p/ calc. acum. MTB MESSAGE E351. " Informar uma impressora!
SELECTION-SCREEN END OF BLOCK B1. ENDIF.
* verifica se o campo remetente está preenchido
SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE T2. IF P_REMET EQ SPACE.
PARAMETERS: P_MES LIKE S031-SPMON OBLIGATORY, "mês de MESSAGE E512. " informar número do emitente
analise ENDIF.
P_PERIOD(2) TYPE C OBLIGATORY. "período (mes p tras) ENDIF.

SELECTION-SCREEN END OF BLOCK B2. * verifica se o centro está preenchido quando o processamento for em
* batch
SELECTION-SCREEN BEGIN OF BLOCK B3 WITH FRAME TITLE T3. IF P_BATCH NE SPACE " Se for processamento em batch
PARAMETERS: P_SOPPM AS CHECKBOX, " só ppm AND SO_WERKS[] IS INITIAL.
P_RSUM AS CHECKBOX. " relatório sumarizado MESSAGE E513. " falta centro especificado
SELECTION-SCREEN END OF BLOCK B3. ENDIF. " Se for processamento em batch

SELECTION-SCREEN BEGIN OF BLOCK B4 WITH FRAME TITLE T4. IF SO_WERKS EQ SPACE.


PARAMETERS: P_RAF AS CHECKBOX, " imprime Formulário do IF SO_FORNE EQ SPACE.
RAF IF SO_MATNR EQ SPACE AND P_RAF NE 'X'.
P_IMPRE LIKE USR01-SPLD, " Impressora *Centro, Fornecedor e Material estão em branco ! Processamento
P_REMET LIKE KNA1-KUNNR, " remetente demorado.
P_BATCH AS CHECKBOX. " Impressão via Batch MESSAGE W365.
SELECTION-SCREEN END OF BLOCK B4. ENDIF.
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>> ENDIF.
>>>>>>>>>>>>>>>>" ENDIF.
" SESSÃO DE PROCESSAMENTO "
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>> IF SO_CENT NE ' '.
>>>>>>>>>>>>>>>>" SELECT WERKS
*----------------------------------------------------------------------* FROM T001W
INITIALIZATION. "Logica para defaults "inteligentes" INTO TABLE I_CENTRO
*----------------------------------------------------------------------* WHERE WERKS IN SO_CENT.

45
ABAP Training
FORMAT COLOR COL_HEADING.
LOOP AT I_CENTRO.
IF I_CENTRO-WERKS IN SO_WERKS. WRITE: /02 'FORNECEDOR',
ELSE. 15 'NOME',
MESSAGE E083 WITH 'O(s) centro(s) selecionado(s) não' 170 ' ',
'está(ão) incluído(s) no(s) centro(s)' /02 ' CENTRO',
'da MTB considerado(s)'. 15 'DESCRIÇÃO',
ENDIF. 170 ' '.
ENDLOOP.
ENDIF. FORMAT COLOR COL_HEADING.
*----------------------------------------------------------------------*
START-OF-SELECTION. "Processamento principal WRITE: /05 'MÊS/ANO',
*----------------------------------------------------------------------* 33 'NFL',
PERFORM CALCULA_PERIODO. 48 'NPR',
63 'NCQ',
* form para selecao dos dados referente a nota de fornecimento de lotes, 78 'NQF',
* nota de processo e nota de pontualidade. 93 'NPT',
PERFORM F_SELECT_NFLPRPT. 108 'PPM',
123 'OBJ',
* Form para selecao dos dados referente a nota compromisso com qualida. 138 '%LOT',
PERFORM F_SELECT_NCQ. 153 'OBJ',
170 ' '.
* form para selecao dos dados refer. a nota de avaliacao de sistemas.
PERFORM F_SELECT_NAS. ULINE.

* form para selecao dos dados ref. a nota de qualidade de fornecimento. *----------------------------------------------------------------------*
PERFORM F_SELECT_NQF. TOP-OF-PAGE DURING LINE-SELECTION.
*----------------------------------------------------------------------*
* Calcula os valores sumarizados. PERFORM F_HEADER USING SY-TITLE SPACE SPACE SPACE.
PERFORM F_CALC_DET_MAT.
READ TABLE I_T001W WITH KEY WERKS = I_TAB_DET_FIM-WERKS.
* Calcula PPM e OBJ.
PERFORM F_CALC_PPM_OBJ. FORMAT COLOR COL_HEADING.
WRITE: /002 'ÍNDICE PPM E LOTES NO CENTRO',
* acha descricoes. I_TAB_DET_FIM-WERKS, ' - ',
PERFORM F_ACHA_DESCRICOES. I_T001W-NAME,
170 ''.
* Calcula valores acumulados para os Centros e MTB.
PERFORM F_CALC_ACUM. * format color col_heading.
WRITE: /01 '',
* verifica se solicitou impressao do SAPSCRIPT e chama o form. 53 ' Mês ',
IF P_RAF = 'X'. 79 ' Acum. ',
PERFORM F_PREPARA_SAPSCRIPT. 170 '' .
ELSEIF P_SOPPM = 'X'. WRITE: /02 'Material',
PERFORM F_PRINT_SOPPM. 17 'Descrição Breve',
ELSEIF P_RSUM = 'X'. 58 'PPM',
PERFORM F_PRINT_RSUM. 72 '%LOT',
ELSE. 87 'PPM',
PERFORM F_PRINT_REPORT. 99 '%LOT',
ENDIF. 116 'OBJ PPM',
135 'OBJ %LOT',
*----------------------------------------------------------------------* 170 ' '.
END-OF-SELECTION. "Fim do processamento principal ULINE.
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
* AT LINE-SELECTION. "
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
TOP-OF-PAGE. "Cabeçalho (Aparece sempre no topo da tela.) IF P_RSUM NE 'X'.
*----------------------------------------------------------------------* PERFORM F_PRINT_REP_DET.
ENDIF.
PERFORM F_HEADER USING SY-TITLE SPACE SPACE SPACE. *----------------------------------------------------------------------*

46
ABAP Training
*----------------------------------------------------------------------* * ler a tabela para checar se existe objeto.
END-OF-PAGE. "Rodapé READ TABLE I_JEST WITH KEY OBJNR = I_QALS-OBJNR.
*----------------------------------------------------------------------* IF SY-SUBRC EQ 0 AND I_JEST-INACT = SPACE.
* DELETE I_QALS. "deleta registro estornado.
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>> ENDIF.
>>>>>>>>>>>>>>>>* ENDLOOP.
* " SESSÃO DE FORMS " *
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>> DESCRIBE TABLE I_QALS LINES V_LINHAS.
>>>>>>>>>>>>>>>>*
* IF V_LINHAS EQ 0.
*----------------------------------------------------------------------* EXIT.
* Form F_SELECT_NFLPRPT. ENDIF.
*----------------------------------------------------------------------*
* Funcao para selecao de dados do mes e do periodo * * ordenar tabela para facilitar sapscript.
*----------------------------------------------------------------------* SORT I_QALS BY WERKS LIFNR ART.
FORM F_SELECT_NFLPRPT.
LOOP AT I_QALS.
* selecionar dados da tabela QAVE. IF I_QALS-LIFNR EQ ''.
SELECT PRUEFLOS CONTINUE.
KZART ENDIF.
QKENNZAHL * Atualiza dados qnado muda o centro e o fornecedor.
VBEWERTUNG ON CHANGE OF I_QALS-WERKS OR I_QALS-LIFNR.
VDATUM
FROM QAVE IF V_TIPO_NF NE ' '.
INTO TABLE I_QAVE
WHERE VDATUM >= V_DT_INICIO AND MOVE: V_WERKS TO I_ACUM-CENTRO,
VDATUM <= V_DT_FIM AND V_LIFNR TO I_ACUM-LIFNR,
KZART = C_KZART. V_SUM_PPM89_M TO I_ACUM-SUM_PPM89_M,
V_SUM_PPM89_AC TO I_ACUM-SUM_PPM89_AC,
IF SY-SUBRC = 0. V_NUM_NFL_M TO I_ACUM-NUM_NFL_M,
SELECT PRUEFLOS V_NUM_NFL_AC TO I_ACUM-NUM_NFL_AC,
WERK V_SUM_NFL_M TO I_ACUM-SUM_NFL_M,
ART V_SUM_NFL_AC TO I_ACUM-SUM_NFL_AC,
LIFNR V_SUM_LOT_M TO I_ACUM-SUM_LOT_M,
MATNR V_SUM_LOT_AC TO I_ACUM-SUM_LOT_AC,
LMENGESCH V_SUM_PPM01_M TO I_ACUM-SUM_PPM01_M,
LMENGEIST V_SUM_PPM01_AC TO I_ACUM-SUM_PPM01_AC.
OBJNR APPEND I_ACUM.
FROM QALS CLEAR I_ACUM.
INTO TABLE I_QALS
FOR ALL ENTRIES IN I_QAVE * Calcula dados finais com a contabilizacao feita.
WHERE PRUEFLOS = I_QAVE-PRUEFLOS AND PERFORM F_CALC_NOTAS.
WERK IN SO_WERKS AND * atualiza tabela com os dados calculados.
LIFNR IN SO_FORNE AND PERFORM F_GRAVA_TABFIM.
MATNR IN SO_MATNR AND
( ART = '01' OR ART = '89' OR ART = '90' ) AND * Limpar as variaveis utilizadas no calculo.
STAT35 <> SPACE. CLEAR: V_SUM_PPM89_M, V_SUM_PPM89_AC,
V_NUM_NFL_M, V_NUM_NFL_AC,
IF SY-SUBRC EQ 0. V_SUM_NFL_M, V_SUM_NFL_AC,
SELECT OBJNR V_SUM_NPT_M, V_SUM_NPT_AC,
INACT V_SUM_LOT_M, V_SUM_LOT_AC,
FROM JEST V_TOT_NFL_M, V_TOT_NFL_AC,
INTO TABLE I_JEST V_TOT_LOT_M, V_TOT_LOT_AC,
FOR ALL ENTRIES IN I_QALS V_TOT_PPM_M, V_TOT_PPM_AC,
WHERE OBJNR = I_QALS-OBJNR AND V_TOT_NPR_M, V_TOT_NPR_AC,
STAT = C_STAT. "I0224 V_TOT_NPT_M, V_TOT_NPT_AC,
ENDIF. V_SUM_PPM01_M, V_SUM_PPM01_AC.
ENDIF. ENDIF.
ENDON.
* elimina notas de fornecimento de lotes que estejam estornados.
LOOP AT I_QALS. * guarda valores para geracao de arquivo final.

47
ABAP Training
V_WERKS = I_QALS-WERKS. V_SUM_LOT_AC = V_SUM_LOT_AC + I_QAVE-QKENNZAHL.
V_LIFNR = I_QALS-LIFNR. ENDIF.
V_MATNR = I_QALS-MATNR.
V_TIPO_NF = I_QALS-ART. * contabiliza o valor para calculo de nota de processo.
V_SUM_PPM01_AC = V_SUM_PPM01_AC + I_QALS-LMENGEIST.
IF I_QALS-ART = '89'. ENDIF.
READ TABLE I_QAVE WITH KEY PRUEFLOS = I_QALS-PRUEFLOS. * gera tabela para impressao detalhada por material.
* ---------------------------Fim da Alteração--------------------------*
PERFORM F_GRAVA_DET_MAT.
IF SY-SUBRC NE 0.
CONTINUE. ELSEIF I_QALS-ART = '90'.
ENDIF. READ TABLE I_QAVE WITH KEY PRUEFLOS = I_QALS-PRUEFLOS.

IF I_QAVE-VDATUM >= V_DTI_ANALISE AND IF SY-SUBRC NE 0.


I_QAVE-VDATUM <= V_DT_FIM. CONTINUE.
V_SUM_PPM89_M = V_SUM_PPM89_M + I_QALS-LMENGESCH. ENDIF.
V_SUM_PPM89_AC = V_SUM_PPM89_AC + I_QALS-LMENGESCH.
ELSE. IF I_QAVE-VDATUM >= V_DTI_ANALISE AND
V_SUM_PPM89_AC = V_SUM_PPM89_AC + I_QALS-LMENGESCH. I_QAVE-VDATUM <= V_DT_FIM.
ENDIF. IF I_QAVE-VBEWERTUNG <> 'A'.
V_QKENNZAHL = I_QAVE-QKENNZAHL * -1.
* Gera tabela para impressao detalhada por material. ELSE.
V_QKENNZAHL = I_QAVE-QKENNZAHL.
PERFORM F_GRAVA_DET_MAT. ENDIF.
V_SUM_NPT_M = V_SUM_NPT_M + V_QKENNZAHL.
ELSEIF I_QALS-ART = '01'. V_SUM_NPT_AC = V_SUM_NPT_AC + V_QKENNZAHL.
ELSE.
READ TABLE I_QAVE WITH KEY PRUEFLOS = I_QALS-PRUEFLOS. IF I_QAVE-VBEWERTUNG <> 'A'.
V_QKENNZAHL = I_QAVE-QKENNZAHL * -1.
IF SY-SUBRC NE 0. ELSE.
CONTINUE. V_QKENNZAHL = I_QAVE-QKENNZAHL.
ENDIF. ENDIF.
IF I_QAVE-VDATUM >= V_DTI_ANALISE AND V_SUM_NPT_AC = V_SUM_NPT_AC + V_QKENNZAHL.
I_QAVE-VDATUM <= V_DT_FIM. ENDIF.
ENDIF.
* sumariza o numero de ocorrencias para um dos tipos de controle. ENDLOOP.

V_NUM_NFL_M = V_NUM_NFL_M + 1.
MOVE: V_WERKS TO I_ACUM-CENTRO,
* contabiliza o NFL e LOT. V_LIFNR TO I_ACUM-LIFNR,
V_SUM_PPM89_M TO I_ACUM-SUM_PPM89_M,
V_SUM_NFL_M = V_SUM_NFL_M + I_QAVE-QKENNZAHL. V_SUM_PPM89_AC TO I_ACUM-SUM_PPM89_AC,
IF I_QAVE-QKENNZAHL <> 1. V_NUM_NFL_M TO I_ACUM-NUM_NFL_M,
V_SUM_LOT_M = V_SUM_LOT_M + I_QAVE-QKENNZAHL. V_NUM_NFL_AC TO I_ACUM-NUM_NFL_AC,
ENDIF. V_SUM_NFL_M TO I_ACUM-SUM_NFL_M,
V_SUM_NFL_AC TO I_ACUM-SUM_NFL_AC,
* contabiliza valor para calculo de nota de processo. V_SUM_LOT_M TO I_ACUM-SUM_LOT_M,
V_SUM_PPM01_M = V_SUM_PPM01_M + I_QALS-LMENGEIST. V_SUM_LOT_AC TO I_ACUM-SUM_LOT_AC,
V_SUM_NFL_AC = V_SUM_NFL_AC + I_QAVE-QKENNZAHL. V_SUM_PPM01_M TO I_ACUM-SUM_PPM01_M,
IF I_QAVE-QKENNZAHL <> 1. V_SUM_PPM01_AC TO I_ACUM-SUM_PPM01_AC.
V_SUM_LOT_AC = V_SUM_LOT_AC + I_QAVE-QKENNZAHL. APPEND I_ACUM.
ENDIF. CLEAR I_ACUM.
V_SUM_PPM01_AC = V_SUM_PPM01_AC + I_QALS-LMENGEIST.
V_NUM_NFL_AC = V_NUM_NFL_AC + 1. * Calcula dados finais com a contabilizacao feita.
* ----------------------- Fim da Alteração --------------------------- * PERFORM F_CALC_NOTAS.
ELSE. * Atualiza tabela com os dados calculados.
* sumariza o numero de ocorrencias´para um dados tipo de controle PERFORM F_GRAVA_TABFIM.
V_NUM_NFL_AC = V_NUM_NFL_AC + 1.
* contabiliza NF e LOT ENDFORM.
V_SUM_NFL_AC = V_SUM_NFL_AC + I_QAVE-QKENNZAHL.
IF I_QAVE-QKENNZAHL <> 1. *----------------------------------------------------------------------*

48
ABAP Training
* Form F_CALC_NOTAS. ENDIF.
*----------------------------------------------------------------------*
* Calcula dados finais com a contabilizacao feita. * IF V_TOT_NPT_AC < 0.
*----------------------------------------------------------------------* V_TOT_NPT_AC = 0.
FORM F_CALC_NOTAS. ENDIF.
ENDFORM.
* verifica qual tipo de nota sera calculada.
* calcula nota de fornecimento-mes. *----------------------------------------------------------------------*
IF V_NUM_NFL_M > 0. * Form F_GRAVA_TABFIM.
V_CHECK_NFL_M = ' '. *----------------------------------------------------------------------*
V_TOT_NFL_M = V_SUM_NFL_M / V_NUM_NFL_M. * Grava tabela Final.
V_TOT_LOT_M = 100 - ( V_SUM_LOT_M / V_NUM_NFL_M ). *----------------------------------------------------------------------*
ELSE. FORM F_GRAVA_TABFIM.
V_CHECK_NFL_M = 'X'.
ENDIF. * Verifica se ja existe registro gerado para empresa/fornecedor.

* calcula nota de fornecimento-acumulado. CLEAR: I_TABFIM.


IF V_NUM_NFL_AC > 0.
V_CHECK_NFL_AC = ' '. READ TABLE I_TABFIM WITH KEY WERKS = V_WERKS
V_TOT_NFL_AC = V_SUM_NFL_AC / V_NUM_NFL_AC. LIFNR = V_LIFNR.
V_TOT_LOT_AC = 100 - ( V_SUM_LOT_AC / V_NUM_NFL_AC ) .
ELSE. IF SY-SUBRC NE 0.
V_CHECK_NFL_AC = 'X'. I_TABFIM-WERKS = V_WERKS.
* ----------------------- Fim da Alteração --------------------------- * I_TABFIM-LIFNR = V_LIFNR.
ENDIF.
I_TABFIM-NCQ_M = 100.
* calcula nota processo-mes. I_TABFIM-NCQ_AC = 100.
IF V_SUM_PPM01_M > 0. APPEND I_TABFIM.
V_TOT_PPM_M = ( V_SUM_PPM89_M / V_SUM_PPM01_M ) * ENDIF.
C_MILHAO.
ENDIF. * Verifica qual tipo de nota foi calculado.
V_TOT_NPR_M = 100 - ( V_TOT_PPM_M / 100 ).

IF V_TOT_NPR_M < 0. IF V_TIPO_NF <> 'FQ'.


V_TOT_NPR_M = 0. * grava nota de fornecimento-mes.
ENDIF. IF V_CHECK_NFL_M = 'X'.
I_TABFIM-NFL_M = ' '.
* calcula nota processo-acumulado. I_TABFIM-LOT_M = ' '.
IF V_SUM_PPM01_AC > 0. ELSE.
V_TOT_PPM_AC = ( V_SUM_PPM89_AC / V_SUM_PPM01_AC ) * WRITE V_TOT_NFL_M TO I_TABFIM-NFL_M DECIMALS 0 RIGHT-
C_MILHAO. JUSTIFIED.
ENDIF. WRITE V_TOT_LOT_M TO I_TABFIM-LOT_M DECIMALS 2 RIGHT-
V_TOT_NPR_AC = 100 - ( V_TOT_PPM_AC / 100 ). JUSTIFIED.
ENDIF.
IF V_TOT_NPR_AC < 0.
V_TOT_NPR_AC = 0. * grava nota de fornecimento - acumulado.
ENDIF. IF V_CHECK_NFL_AC = 'X'.
I_TABFIM-NFL_AC = ' '.
V_TOT_NPT_M = 100 + V_SUM_NPT_M. I_TABFIM-LOT_AC = ' '.
IF V_TOT_NPT_M > 100. ELSE.
V_TOT_NPT_M = 100. WRITE V_TOT_NFL_AC TO I_TABFIM-NFL_AC DECIMALS 0
ENDIF. RIGHT-JUSTIFIED.
WRITE V_TOT_LOT_AC TO I_TABFIM-LOT_AC DECIMALS 2
IF V_TOT_NPT_M < 0. RIGHT-JUSTIFIED.
V_TOT_NPT_M = 0. ENDIF.
ENDIF.
* grava valores para calculo futuro de PPM
* calcula nota de pontualidade. WRITE V_SUM_PPM01_M TO I_TABFIM-PPM1_M DECIMALS 0
V_TOT_NPT_AC = 100 + V_SUM_NPT_AC. RIGHT-JUSTIFIED.
IF V_TOT_NPT_AC > 100. WRITE V_SUM_PPM01_AC TO I_TABFIM-PPM1_AC DECIMALS 0
V_TOT_NPT_AC = 100. RIGHT-JUSTIFIED.

49
ABAP Training
*----------------------------------------------------------------------*
* grava nota de processo - mes * Form F_SELECT_NCQ.
IF V_CHECK_NFL_M = 'X'. *----------------------------------------------------------------------*
I_TABFIM-PPM_M = ' '. * Selecao dos dados referente a nota de compromisso com a qualidade.
I_TABFIM-NPR_M = ' '. *----------------------------------------------------------------------*
ELSE. FORM F_SELECT_NCQ.
WRITE V_TOT_PPM_M TO I_TABFIM-PPM_M DECIMALS 0 RIGHT-
JUSTIFIED. * seleciona os dados da VIqMEL.
WRITE V_TOT_NPR_M TO I_TABFIM-NPR_M DECIMALS 0 RIGHT- SELECT MAWERK
JUSTIFIED. LIFNUM
ENDIF. MATNR
STRMN
* grava nota processo - acumulado. QMNUM
IF V_CHECK_NFL_AC = 'X'. OBJNR
I_TABFIM-PPM_AC = ' '. EBELN
I_TABFIM-NPR_AC = ' '. EBELP
ELSE. FROM VIQMEL
WRITE V_TOT_PPM_AC TO I_TABFIM-PPM_AC DECIMALS 0 INTO TABLE I_VIQMEL
RIGHT-JUSTIFIED. WHERE MAWERK IN SO_WERKS AND
WRITE V_TOT_NPR_AC TO I_TABFIM-NPR_AC DECIMALS 0 LIFNUM IN SO_FORNE AND
RIGHT-JUSTIFIED. MATNR IN SO_MATNR AND
ENDIF. STRMN >= V_DT_INICIO AND
STRMN <= V_DT_FIM AND
* grava nota de pontualidade - mes. ( QMART = 'F2' OR QMART = 'Q2' ).
WRITE V_TOT_NPT_M TO I_TABFIM-NPT_M DECIMALS 0 RIGHT-
JUSTIFIED. IF SY-SUBRC NE 0. "se não encontrou medida.
V_TOT_NCQ_M = 100.
* grava nota de pontualidade - acumulado. V_TOT_NCQ_AC = 100.
WRITE V_TOT_NPT_AC TO I_TABFIM-NPT_AC DECIMALS 0 MOVE: I_VIQMEL-MAWERKS TO I_ACUM-CENTRO,
RIGHT-JUSTIFIED. I_VIQMEL-LIFNUM TO I_ACUM-LIFNR,
1 TO I_ACUM-SUM_EMDIA_M,
1 TO I_ACUM-SUM_EMDIA_AC.
ELSEIF V_TIPO_NF = 'FQ'. APPEND I_ACUM.
CLEAR I_ACUM.
* grava valores de nota de compromisso de qualidade - mes. EXIT.
WRITE V_TOT_NCQ_M TO I_TABFIM-NCQ_M DECIMALS 0 RIGHT- ENDIF.
JUSTIFIED.
* Procura por notas estornadas
* grava valores de nota de compromisso de qualidade - acumulado. SELECT OBJNR
WRITE V_TOT_NCQ_AC TO I_TABFIM-NCQ_AC DECIMALS 0 INACT
RIGHT-JUSTIFIED. FROM JEST
INTO TABLE I_JEST_NCQ
ENDIF. FOR ALL ENTRIES IN I_VIQMEL
WHERE OBJNR = I_VIQMEL-OBJNR AND
* atualiza tabela com valores calculados. STAT = 'I0076'.

MODIFY I_TABFIM INDEX SY-TABIX. * Elimina notas de fornecimento de lotes que estejam estornados.
LOOP AT I_VIQMEL.
IF V_TIPO_NF <> 'FQ'. READ TABLE I_JEST WITH KEY OBJNR = I_VIQMEL-OBJNR.
I_ACUM-CENTRO = I_TABFIM-WERKS. IF SY-SUBRC = 0 AND I_JEST-INACT = SPACE.
I_ACUM-LIFNR = I_TABFIM-LIFNR. * Elimina registro marcado para delecao
I_ACUM-SUM_NPT_M = I_TABFIM-NPT_M. DELETE I_VIQMEL.
I_ACUM-NUM_NPT_M = 1. ENDIF.
I_ACUM-SUM_NPT_AC = I_TABFIM-NPT_AC. ENDLOOP.
I_ACUM-NUM_NPT_AC = 1.
APPEND I_ACUM. * Verifica se ainda ha algum registro na tabela i_viqmel.
CLEAR I_ACUM. DESCRIBE TABLE I_VIQMEL LINES V_LINHAS.
ENDIF.
IF V_LINHAS EQ 0.
ENDFORM. V_TOT_NCQ_M = 100.
V_TOT_NCQ_AC = 100.

50
ABAP Training
MOVE: I_VIQMEL-MAWERKS TO I_ACUM-CENTRO, IF I_VIQMSM-ERDAT > I_VIQMEL-STRMN. "nota QM atrasada.
I_VIQMEL-LIFNUM TO I_ACUM-LIFNR, IF I_VIQMEL-STRMN >= V_DTI_ANALISE AND
1 TO I_ACUM-SUM_EMDIA_M, I_VIQMEL-STRMN <= V_DT_FIM.
1 TO I_ACUM-SUM_EMDIA_AC. V_SUM_ATRAS_M = V_SUM_ATRAS_M + 1.
APPEND I_ACUM. V_SUM_ATRAS_AC = V_SUM_ATRAS_AC + 1.
CLEAR I_ACUM. ELSE.
EXIT. V_SUM_ATRAS_AC = V_SUM_ATRAS_AC + 1.
ENDIF. ENDIF.
ELSE.
IF V_LINHAS > 0. "se ainda existe medida procura pelas notas. IF I_VIQMEL-STRMN >= V_DTI_ANALISE AND
SELECT QMNUM I_VIQMEL-STRMN <= V_DT_FIM.
ERDAT V_SUM_EMDIA_M = V_SUM_EMDIA_M + 1.
FROM VIQMSM V_SUM_EMDIA_AC = V_SUM_EMDIA_AC + 1.
INTO TABLE I_VIQMSM ELSE.
FOR ALL ENTRIES IN I_VIQMEL V_SUM_EMDIA_AC = V_SUM_EMDIA_AC + 1.
WHERE QMNUM = I_VIQMEL-QMNUM. ENDIF.
ENDIF.
ENDIF. ELSE.
IF I_VIQMEL-STRMN >= V_DTI_ANALISE AND
SORT I_VIQMEL BY MAWERKS LIFNUM. I_VIQMEL-STRMN <= V_DT_FIM.
V_SUM_ATRAS_M = V_SUM_ATRAS_M + 1.
* atribui tipo de nota para gravacao na tabela final. V_SUM_ATRAS_AC = V_SUM_ATRAS_AC + 1.
ELSE.
LOOP AT I_VIQMEL. V_SUM_ATRAS_AC = V_SUM_ATRAS_AC + 1.
IF I_VIQMEL-MAWERKS EQ ' ' OR I_VIQMEL-LIFNUM EQ ' '. ENDIF.
CONTINUE. ENDIF.
ENDIF.
ENDLOOP.
ON CHANGE OF I_VIQMEL-MAWERKS OR I_VIQMEL-LIFNUM. MOVE: I_VIQMEL-MAWERKS TO I_ACUM-CENTRO,
IF V_TIPO_NF = 'FQ'. I_VIQMEL-LIFNUM TO I_ACUM-LIFNR,
MOVE: V_SUM_ATRAS_M TO I_ACUM-SUM_ATRAS_M,
V_WERKS TO I_ACUM-CENTRO, V_SUM_ATRAS_AC TO I_ACUM-SUM_ATRAS_AC,
V_LIFNR TO I_ACUM-LIFNR, V_SUM_EMDIA_M TO I_ACUM-SUM_EMDIA_M,
V_SUM_ATRAS_M TO I_ACUM-SUM_ATRAS_M, V_SUM_EMDIA_AC TO I_ACUM-SUM_EMDIA_AC.
V_SUM_ATRAS_AC TO I_ACUM-SUM_ATRAS_AC, APPEND I_ACUM.
V_SUM_EMDIA_M TO I_ACUM-SUM_EMDIA_M, CLEAR I_ACUM.
V_SUM_EMDIA_AC TO I_ACUM-SUM_EMDIA_AC. * chama rotina para calculo da NCQ.
APPEND I_ACUM. PERFORM F_CALC_NCQ.
CLEAR I_ACUM. * chama rotina para gravacao da tabela final.
PERFORM F_GRAVA_TABFIM.
* chama rotina para calculo na NCQ.
PERFORM F_CALC_NCQ. ENDFORM.
* chama rotina para gravacao da tabela final.
PERFORM F_GRAVA_TABFIM. *----------------------------------------------------------------------*
* limpa variaveis * Form F_CALC_NCQ
CLEAR: V_SUM_ATRAS_M, V_SUM_ATRAS_AC, *----------------------------------------------------------------------*
V_SUM_EMDIA_M, V_SUM_EMDIA_AC, * rotina para calculo de NCQ.
V_TOT_NOTAS_M, V_TOT_NOTAS_AC, *----------------------------------------------------------------------*
V_TOT_NCQ_M, V_TOT_NCQ_AC. FORM F_CALC_NCQ.
ENDIF.
ENDON. * calculo do mes.
V_TOT_NOTAS_M = V_SUM_EMDIA_M + V_SUM_ATRAS_M.
* guarda valores para geracao de arquivo final.
V_WERKS = I_VIQMEL-MAWERKS. IF V_TOT_NOTAS_M > 0.
V_LIFNR = I_VIQMEL-LIFNUM. V_TOT_NCQ_M = ( V_SUM_EMDIA_M / V_TOT_NOTAS_M ) * 100.
V_TIPO_NF = 'FQ'. ELSE.
V_TOT_NCQ_M = 100.
READ TABLE I_VIQMSM WITH KEY QMNUM = I_VIQMEL- ENDIF.
QMNUM.
* calculo do acumulado.
IF SY-SUBRC EQ 0. V_TOT_NOTAS_AC = V_SUM_EMDIA_AC + V_SUM_ATRAS_AC.

51
ABAP Training
* total de fatores de ponderacao
IF V_TOT_NOTAS_AC > 0.
V_TOT_NCQ_AC = ( V_SUM_EMDIA_AC / V_TOT_NOTAS_AC ) * V_TOT_POND = V_FATOR_NFL + V_FATOR_NPR + V_FATOR_NCQ.
100.
ELSE. * loop na tabela de notas anterior p/ atualizacao do campo de nqf.
V_TOT_NCQ_AC = 100.
ENDIF. LOOP AT I_TABFIM.

ENDFORM. * Se NFL e NPR estiverem BRANCOS, passar BRANCO *


IF I_TABFIM-NFL_M = ' ' AND I_TABFIM-NPR_M = ' '.
*----------------------------------------------------------------------* I_TABFIM-NQF_M = ' '.
* Form F_SELECT_NAS.
*----------------------------------------------------------------------* ELSE.
* Form para selecao dos dados referentea a nota de avaliacao de sistem. IF V_TOT_POND <> 0. "mes
*----------------------------------------------------------------------* V_TOT_NQF_M = ( ( I_TABFIM-NFL_M * V_FATOR_NFL ) +
FORM F_SELECT_NAS. ( I_TABFIM-NPR_M * V_FATOR_NPR ) +
( I_TABFIM-NCQ_M * V_FATOR_NCQ ) ) /
SELECT LIFNR V_TOT_POND.
NAME1
SPRAS WRITE V_TOT_NQF_M TO I_TABFIM-NQF_M DECIMALS 0.
STRAS ENDIF.
PFACH ENDIF.
PSTLZ IF I_TABFIM-NFL_AC = ' ' AND I_TABFIM-NPR_AC = ' '.
ORT01 I_TABFIM-NQF_AC = ' '.
REGIO ELSE.
LAND1 IF V_TOT_POND <> 0.
FROM LFA1 V_TOT_NQF_AC = ( ( I_TABFIM-NFL_AC * V_FATOR_NFL ) +
INTO TABLE I_LFA1 ( I_TABFIM-NPR_AC * V_FATOR_NPR ) +
WHERE LIFNR IN SO_FORNE. ( I_TABFIM-NCQ_AC * V_FATOR_NCQ ) ) /
V_TOT_POND.

ENDFORM. WRITE V_TOT_NQF_AC TO I_TABFIM-NQF_AC DECIMALS 0.


ENDIF.
*----------------------------------------------------------------------* ENDIF.
* Form F_SELECT_NQF
*----------------------------------------------------------------------* * Atualiza tabela
* Form para selecao dos dados referente a nota de qualidad. de forn. MODIFY I_TABFIM.
*----------------------------------------------------------------------*
FORM F_SELECT_NQF. ENDLOOP.

SELECT SINGLE KRGEW SELECT WERKS


FROM T147C NAME1
INTO V_FATOR_NFL SPRAS
WHERE EKORG = '0001' AND STRAS
HKRIT = '02' AND PFACH
TKRIT = '01'. PSTLZ
ORT01
SELECT SINGLE KRGEW REGIO
FROM T147C LAND1
INTO V_FATOR_NPR FROM T001W
WHERE EKORG = '0001' AND INTO TABLE I_T001W
HKRIT = '02' AND FOR ALL ENTRIES IN I_TABFIM
TKRIT = '04'. WHERE WERKS = I_TABFIM-WERKS.

SELECT SINGLE KRGEW SELECT SINGLE


FROM T147C WERKS
INTO V_FATOR_NCQ NAME1
WHERE EKORG = '0001' AND STRAS
HKRIT = '02' AND PFACH
TKRIT = '02'. PSTLZ
ORT01

52
ABAP Training
REGIO V_TOT_PPM_M, V_TOT_PPM_AC,
LAND1 V_TOT_LOT_M, V_TOT_LOT_AC.
FROM KNA1
INTO I_REMET DESCRIBE TABLE I_TABFIM LINES V_LINHAS.
WHERE KUNNR = P_REMET. " N° remetente (quem emite o RAF)
IF V_LINHAS EQ 0.
* o idioma pelo qual o nome do país deve ser procurado depende do MESSAGE I083 WITH
* país do remetente. 'Não há dados para os critérios de seleção' 'informados'.
IF I_REMET-LAND1 EQ C_BR. " Se remetente for brasileiro EXIT.
V_IDIOMA = C_P. " português ENDIF.
ELSEIF I_REMET-LAND1 EQ C_ARG. " Se remetente for argentino
V_IDIOMA = C_ESP. " espanhol SORT I_TABFIM BY LIFNR WERKS.
ENDIF. " Se remetente for brasileiro
LOOP AT I_TABFIM WHERE WERKS IN SO_CENT.
SELECT LAND1
LANDX READ TABLE I_T001W WITH KEY WERKS = I_TABFIM-WERKS.
FROM T005T READ TABLE I_LFA1 WITH KEY LIFNR = I_TABFIM-LIFNR.
INTO TABLE I_PAIS
WHERE SPRAS = V_IDIOMA. ON CHANGE OF I_TABFIM-LIFNR.

ENDFORM. IF V_PRIM_VEZ = 'F'.


IF SO_CENT EQ ' '.
*----------------------------------------------------------------------* READ TABLE I_TOT_FORNEC WITH KEY LIFNR = V_FORNEC.
* Form F_GRAVA_DET_MAT. PERFORM F_PRINT_TOTAL.
*----------------------------------------------------------------------* ENDIF.
* Gera impressao detalhada por material ENDIF.
*----------------------------------------------------------------------*
FORM F_GRAVA_DET_MAT. READ TABLE I_FORNEC WITH KEY LIFNR = I_TABFIM-LIFNR.
FORMAT COLOR COL_NORMAL INTENSIFIED ON.
CLEAR: I_DET_MAT. WRITE: /02 I_TABFIM-LIFNR,
15 I_LFA1-NAME1,
I_DET_MAT-WERKS = V_WERKS. 60 'NAS = ', I_FORNEC-NAS,
I_DET_MAT-LIFNR = V_LIFNR. 170 ' '.
I_DET_MAT-MATNR = V_MATNR.
I_DET_MAT-DATA = I_QAVE-VDATUM. FORMAT COLOR COL_NORMAL.
I_DET_MAT-TIPO_NF = V_TIPO_NF.
V_PRIM_VEZ = 'F'.
IF V_TIPO_NF = '89'.
I_DET_MAT-LMENGESCH = I_QALS-LMENGESCH. CLEAR: V_TOT_NFL_M, V_TOT_NFL_AC,
ELSEIF V_TIPO_NF = '01'. V_TOT_NPR_M, V_TOT_NPR_AC,
I_DET_MAT-QKENNZAHL = I_QAVE-QKENNZAHL. V_TOT_NCQ_M, V_TOT_NCQ_AC,
I_DET_MAT-LMENGEIST = I_QALS-LMENGEIST. V_TOT_NQF_M, V_TOT_NQF_AC,
ENDIF. V_TOT_NPT_M, V_TOT_NPT_AC,
V_TOT_NAS_M,
APPEND I_DET_MAT. V_TOT_PPM_M, V_TOT_PPM_AC,
V_TOT_LOT_M, V_TOT_LOT_AC.
ENDFORM.
* Busca valores de OBJ PPM e LOTE
*----------------------------------------------------------------------* READ TABLE I_FORNEC WITH KEY LIFNR = I_TABFIM-LIFNR.
* Form F_PRINT_REPORT ENDON.
*----------------------------------------------------------------------* * Imprimir descrição de Centro
* imprime o report ON CHANGE OF I_TABFIM-WERKS OR I_TABFIM-LIFNR.
*----------------------------------------------------------------------* FORMAT COLOR COL_NORMAL INTENSIFIED ON.
FORM F_PRINT_REPORT. WRITE: /05 I_TABFIM-WERKS,
DATA: V_FORNEC LIKE QALS-LIFNR. 15 I_T001W-NAME,
CLEAR: V_TOT_NFL_M, V_TOT_NFL_AC, 170 ' '.
V_TOT_NPR_M, V_TOT_NPR_AC, ENDON.
V_TOT_NCQ_M, V_TOT_NCQ_AC,
V_TOT_NQF_M, V_TOT_NQF_AC, FORMAT COLOR COL_NORMAL.
V_TOT_NPT_M, V_TOT_NPT_AC, WRITE: /05 P_MES,
V_TOT_NAS_M, 32 I_TABFIM-NFL_M,

53
ABAP Training
47 I_TABFIM-NPR_M, FORM F_PRINT_REP_DET.
62 I_TABFIM-NCQ_M,
77 I_TABFIM-NQF_M, LOOP AT I_TAB_DET_FIM.
92 I_TABFIM-NPT_M,
107 I_TABFIM-PPM_M HOTSPOT ON. IF I_TAB_DET_FIM-LIFNR = I_TABFIM-LIFNR AND
I_TAB_DET_FIM-WERKS = I_TABFIM-WERKS.
WRITE: 119 I_FORNEC-PPM_OBJ.
CLEAR: I_MAKT, I_FORNEC_MAT.
WRITE: 137 I_TABFIM-LOT_M.
READ TABLE I_MAKT WITH KEY MATNR = I_TAB_DET_FIM-
WRITE: 147 I_FORNEC-LOT_OBJ, MATNR.
170 ' '.
HIDE: I_TABFIM-LIFNR, I_TABFIM-WERKS. READ TABLE I_FORNEC_MAT WITH KEY LIFNR =
I_TAB_DET_FIM-LIFNR
FORMAT COLOR COL_NORMAL. MATNR = I_TAB_DET_FIM-MATNR.

FORMAT COLOR COL_NORMAL. FORMAT COLOR COL_NORMAL.


WRITE: /05 'Acum.', P_PERIOD, 'Mes(es)',
32 I_TABFIM-NFL_AC, WRITE: /02 I_TAB_DET_FIM-MATNR,
47 I_TABFIM-NPR_AC, 17 I_MAKT-MAKTX.
62 I_TABFIM-NCQ_AC, WRITE: 55 I_TAB_DET_FIM-PPM_M,
77 I_TABFIM-NQF_AC, 70 I_TAB_DET_FIM-LOT_M.
92 I_TABFIM-NPT_AC, WRITE: 84 I_TAB_DET_FIM-PPM_AC,
107 I_TABFIM-PPM_AC HOTSPOT ON, 97 I_TAB_DET_FIM-LOT_AC,
137 I_TABFIM-LOT_AC, 113 I_FORNEC_MAT-PPM_OBJ,
170 ' '. 133 I_FORNEC_MAT-LOT_OBJ,
HIDE: I_TABFIM-LIFNR, I_TABFIM-WERKS. 170 ''.
V_FORNEC = I_TABFIM-LIFNR. ENDIF.
AT LAST. ENDLOOP.
ULINE.
READ TABLE I_TOT_FORNEC WITH KEY LIFNR = V_FORNEC. ENDFORM.
IF SO_CENT EQ ' '.
PERFORM F_PRINT_TOTAL. *----------------------------------------------------------------------*
ENDIF. * Form f_prepara_sapscript.
ENDAT. *----------------------------------------------------------------------*
* Prepara SAPSCRIPT para impressão
FORMAT COLOR COL_NORMAL. *----------------------------------------------------------------------*
FORM F_PREPARA_SAPSCRIPT.
ENDLOOP.
IF SY-SUBRC NE 0. DATA: V_FLAG_IMPRES(1) TYPE C,
MESSAGE I083 WITH V_PRIM_VEZ_SAPSCRIPT TYPE C VALUE 'S'.
'Não há dados para os critérios de seleção' 'informados'. * Define valores de linhas x quebra de página
EXIT. C_LINHA = ( 64 * 127 / 30 ). "64 linhas * X mm por linha
ENDIF. C_LINHA1 = ( 61 * 127 / 30 ). "61 linhas * X mm por linha

ULINE. * Contador de número de linhas


* 8.89 cm = 21 linhas do topo da página (11 linhas da MAIN + 10 até
IF SO_CENT EQ '' AND SO_FORNE EQ '' AND SO_MATNR EQ ''. * o topo)
PERFORM F_PRINT_TOTAL_FINAL. V_TIME = 889 / 10.
PERFORM F_PRINT_TOTAL_ACUM.
ELSEIF SO_CENT NE '' AND SO_FORNE EQ '' AND SO_MATNR EQ ''. DESCRIBE TABLE I_TABFIM LINES V_LINHAS.
PERFORM F_PRINT_TOTAL_FINAL. IF V_LINHAS = 0.
ENDIF. MESSAGE I083 WITH
'Não há dados para os critérios de seleção' ' informados'.
ENDFORM. EXIT.
ENDIF.
*----------------------------------------------------------------------*
* Form F_PRINT_REP_DET. V_FLAG_IMPRES = C_SIM.
*----------------------------------------------------------------------*
* Imprime relatorio detalhado por item. V_PRIM_VEZ = C_SIM.
*----------------------------------------------------------------------*

54
ABAP Training
SORT I_TABFIM BY LIFNR.
* Dados do Remetente
* Imprime SAPSCRIPT ZSAPSCRIP2-NAMEC = I_T001W-NAME.
LOOP AT I_TABFIM. ZSAPSCRIP2-REM_NAME = I_REMET-NAME.
ZSAPSCRIP2-REM_RUA = I_REMET-STRAS.
READ TABLE I_TOT_FORNEC WITH KEY LIFNR = I_TABFIM-LIFNR. ZSAPSCRIP2-REM_CAIXA = I_REMET-PFACH.
IF I_TOT_FORNEC-PPM_M = ' '. ZSAPSCRIP2-REM_CEP = I_REMET-PSTLZ.
CONTINUE. ZSAPSCRIP2-REM_CITY = I_REMET-ORT01.
ENDIF. ZSAPSCRIP2-REM_REG = I_REMET-REGIO.
READ TABLE I_PAIS WITH KEY LAND1 = I_REMET-LAND1.
IF V_FLAG_IMPRES = C_SIM(1). ZSAPSCRIP2-REM_PAIS = I_PAIS-LANDX.
* Abre form para impressão de sapscript
PERFORM F_OPEN_FORM. IF I_FORNEC-NAS = ' '.
V_FLAG_IMPRES = C_NAO.
ENDIF. * Se o país do Remetente for
* argentina e o país do fornecedor for argentina, imprimir o relatório
ON CHANGE OF I_TABFIM-LIFNR. * espanhol. Se ambos forem Brasil, imprimir em português. Para os
IF V_PRIM_VEZ <> C_SIM(1). * demais casos, imprimir em inglês.
* Resumo dos índices de PPM de linha e % rejeição de Lote no
Recebimento
PERFORM F_LOOP_RESUMO_INDICE. IF I_LFA1-LAND1 EQ C_BR AND I_REMET-LAND1 EQ C_BR.
V_TIME = 889 / 10. ZSAPSCRIP2-AVALIA = C_NAO.
V_PRIM_VEZ = C_SIM. ELSE.
V_PRIM_VEZ_SAPSCRIPT = C_SIM(1). ZSAPSCRIP2-AVALIA = C_NO.
ENDIF. ENDIF.
ENDON. ELSE.
IF I_LFA1-LAND1 EQ C_BR AND I_REMET-LAND1 EQ C_BR.
CLEAR: I_LFA1, I_T001W. ZSAPSCRIP2-AVALIA = C_SIM.
ELSEIF I_LFA1-LAND1 EQ C_ARG AND I_REMET-LAND1 EQ
* Descrição do Fornecedor e Centro C_ARG.
READ TABLE I_LFA1 WITH KEY LIFNR = I_TABFIM-LIFNR. ZSAPSCRIP2-AVALIA = C_SI.
READ TABLE I_T001W WITH KEY WERKS = I_TABFIM-WERKS. ELSE.
READ TABLE I_TOT_FORNEC WITH KEY LIFNR = I_TABFIM-LIFNR. ZSAPSCRIP2-AVALIA = C_YES.
READ TABLE I_FORNEC WITH KEY LIFNR = I_TABFIM-LIFNR. ENDIF.
* Inicia formulário ENDIF.
IF V_PRIM_VEZ_SAPSCRIPT = C_SIM(1). IF I_TOT_FORNEC-NFL_M = ' '.
PERFORM F_START_FORM. IF I_LFA1-LAND1 EQ C_BR AND I_REMET-LAND1 EQ C_BR.
ENDIF. ZSAPSCRIP2-ATIVO = C_NAO.
* Data de Referência / Acumulado de: ELSE.
ZSAPSCRIP2-ATIVO = C_NO.
PERFORM F_EXTENSO_DATA USING V_DT_FIM+4(2) ENDIF.
V_DT_FIM+2(2) ELSE.
CHANGING ZSAPSCRIP2-DATA_REF. IF I_LFA1-LAND1 EQ C_BR AND I_REMET-LAND1 EQ C_BR.
ZSAPSCRIP2-ATIVO = C_SIM.
PERFORM F_EXTENSO_DATA USING V_DT_INICIO+4(2) ELSEIF I_LFA1-LAND1 EQ C_ARG AND I_REMET-LAND1 EQ
V_DT_INICIO+2(2) C_ARG.
CHANGING ZSAPSCRIP2-ACUM_DT1. ZSAPSCRIP2-ATIVO = C_SI.
PERFORM F_EXTENSO_DATA USING V_DT_FIM+4(2) ELSE.
V_DT_FIM+2(2) ZSAPSCRIP2-ATIVO = C_YES.
CHANGING ZSAPSCRIP2-ACUM_DT2. ENDIF.
* Dados do Destinário ENDIF.
ZSAPSCRIP2-NAMEF = I_LFA1-NAME1.
ZSAPSCRIP2-LIFNR = I_TABFIM-LIFNR.
ZSAPSCRIP2-DEST_NAME = I_LFA1-NAME1. * Iguala todos os campos da tabela de resumo de unidade para a estrutura
ZSAPSCRIP2-DEST_RUA = I_LFA1-STRAS. ZSAPSCRIP2-PPM_M = I_TOT_FORNEC-PPM_M.
ZSAPSCRIP2-DEST_CAIXA = I_LFA1-PFACH. ZSAPSCRIP2-PPM_AC = I_TOT_FORNEC-PPM_AC.
ZSAPSCRIP2-DEST_CEP = I_LFA1-PSTLZ. ZSAPSCRIP2-NQF_M_T = I_TOT_FORNEC-NQF_M.
ZSAPSCRIP2-DEST_CITY = I_LFA1-ORT01. ZSAPSCRIP2-NQF_AC_T = I_TOT_FORNEC-NQF_AC.
ZSAPSCRIP2-DEST_REG = I_LFA1-REGIO. ZSAPSCRIP2-NAS_M_T = I_FORNEC-NAS.
READ TABLE I_PAIS WITH KEY LAND1 = I_LFA1-LAND1. ZSAPSCRIP2-NPT_AC_T = I_TOT_FORNEC-NPT_AC+1.
ZSAPSCRIP2-DEST_PAIS = I_PAIS-LANDX. ZSAPSCRIP2-NPT_M_T = I_TOT_FORNEC-NPT_M+1.

55
ABAP Training
ZSAPSCRIP2-NFL_M_T = I_TOT_FORNEC-NFL_M. PERFORM F_GRAVA_RES_INDICE.
ZSAPSCRIP2-NFL_AC_T = I_TOT_FORNEC-NFL_AC. ENDLOOP.
ZSAPSCRIP2-NPR_M_T = I_TOT_FORNEC-NPR_M.
ZSAPSCRIP2-NPR_AC_T = I_TOT_FORNEC-NPR_AC. IF V_PRIM_VEZ <> C_SIM(1).
ZSAPSCRIP2-NCQ_M_T = I_TOT_FORNEC-NCQ_M. * Imprime último fornecedor cadastrado
ZSAPSCRIP2-NCQ_AC_T = I_TOT_FORNEC-NCQ_AC. PERFORM F_LOOP_RESUMO_INDICE.
ENDIF.
* Impressão do resumo de todas as Unidades
IF V_PRIM_VEZ_SAPSCRIPT = C_SIM(1). IF V_FLAG_IMPRES = C_SIM(1).
PERFORM F_WRITE_RESUMO_UNIDADES. MESSAGE I083 WITH
V_PRIM_VEZ_SAPSCRIPT = C_NAO(1). 'Não há dados para os critérios de seleção' ' informados'.
ENDIF. ELSE.
* Resumo por Unidade * Encerra a impressão via SAPSCRIPT.
ZSAPSCRIP2-NQF_M = I_TABFIM-NQF_M. CALL FUNCTION 'CLOSE_FORM'
ZSAPSCRIP2-NQF_AC = I_TABFIM-NQF_AC. EXCEPTIONS
ZSAPSCRIP2-NFL_M = I_TABFIM-NFL_M. UNOPENED = 1
ZSAPSCRIP2-NFL_AC = I_TABFIM-NFL_AC. OTHERS = 2.
ZSAPSCRIP2-NPR_M = I_TABFIM-NPR_M. ENDIF.
ZSAPSCRIP2-NPR_AC = I_TABFIM-NPR_AC. ENDFORM.
ZSAPSCRIP2-NCQ_M = I_TABFIM-NCQ_M.
ZSAPSCRIP2-NCQ_AC = I_TABFIM-NCQ_AC. *----------------------------------------------------------------------*
ZSAPSCRIP2-NPT_M = I_TABFIM-NPT_M+1. * Form f_CALC_DET_MAT.
ZSAPSCRIP2-NPT_AC = I_TABFIM-NPT_AC+1. *----------------------------------------------------------------------*
* SUMARIZA VALORES POR MATERIAL
* Verifica se está ativo para o determinado fornecedor: *----------------------------------------------------------------------*
IF I_TABFIM-NFL_M = ' '. FORM F_CALC_DET_MAT.
* Se o país do Remetente for
* argentina e o país do fornecedor for argentina, imprimir o relatório CLEAR: V_SUM_PPM89_M,
* espanhol. Se ambos forem Brasil, imprimir em português. Para os V_SUM_PPM89_AC,
* demais casos, imprimir em inglês. V_NUM_NFL_M, V_SUM_NFL_M, V_SUM_PPM01_M,
IF I_LFA1-LAND1 EQ C_BR AND I_REMET-LAND1 EQ C_BR. V_SUM_LOT_M, V_SUM_LOT_AC,
ZSAPSCRIP2-ATIVO = C_NAO. V_NUM_NFL_AC, V_SUM_NFL_AC, V_SUM_PPM01_AC.
ELSE.
ZSAPSCRIP2-ATIVO = C_NO. CLEAR: V_WERKS, V_LIFNR, V_MATNR, V_TIPO_NF.
ENDIF.
ELSE. SORT I_DET_MAT BY WERKS LIFNR MATNR TIPO_NF.
IF I_LFA1-LAND1 EQ C_BR AND I_REMET-LAND1 EQ C_BR.
ZSAPSCRIP2-ATIVO = C_SIM. LOOP AT I_DET_MAT.
ELSEIF I_LFA1-LAND1 EQ C_ARG AND I_REMET-LAND1 EQ
C_ARG. ON CHANGE OF I_DET_MAT-WERKS OR I_DET_MAT-LIFNR
ZSAPSCRIP2-ATIVO = C_SI. OR I_DET_MAT-MATNR.
ELSE. IF V_TIPO_NF NE ' '.
ZSAPSCRIP2-ATIVO = C_YES. PERFORM F_GRAVA_DET_FIM.
ENDIF.
ENDIF. CLEAR: V_SUM_PPM89_M,
IF V_PRIM_VEZ = C_SIM(1). V_SUM_PPM89_AC,
* Impressão do resumo por Unidades V_SUM_LOT_M, V_SUM_LOT_AC,
PERFORM F_WRITE_RESUMO_POR_UNIDADE. V_NUM_NFL_M, V_SUM_NFL_M, V_SUM_PPM01_M,
V_PRIM_VEZ = C_NAO. V_NUM_NFL_AC, V_SUM_NFL_AC, V_SUM_PPM01_AC.
ELSEIF V_TIME > C_LINHA1. ENDIF.
* Impressão do resumo por Unidades
PERFORM F_WRITE_RESUMO_POR_UNIDADE. ENDON.
V_TIME = ( 14 * 127 / 30 ).
ENDIF. * guarda valores para geracao de arquivo final.
V_WERKS = I_DET_MAT-WERKS.
* Atualiza contador de linhas V_LIFNR = I_DET_MAT-LIFNR.
ZSAPSCRIP2-CONT = V_TIME. V_MATNR = I_DET_MAT-MATNR.
V_TIPO_NF = I_DET_MAT-TIPO_NF.
* Chama FORM de impressão de detalhe Resumo por Unidade
PERFORM F_WRITE_DET_RESUMO_POR_UNIDADE. IF I_DET_MAT-TIPO_NF = '89'.
* Grava dados para resumo de índice de PPM IF I_DET_MAT-DATA >= V_DTI_ANALISE AND

56
ABAP Training
I_DET_MAT-DATA <= V_DT_FIM. *----------------------------------------------------------------------*
V_SUM_PPM89_M = V_SUM_PPM89_M + I_DET_MAT- * Form f_grava_det_fim.
LMENGESCH. *----------------------------------------------------------------------*
V_SUM_PPM89_AC = V_SUM_PPM89_AC + I_DET_MAT- * Grava tabela final de detalhes de itens.
LMENGESCH. *----------------------------------------------------------------------*
ELSE. FORM F_GRAVA_DET_FIM.
V_SUM_PPM89_AC = V_SUM_PPM89_AC + I_DET_MAT-
LMENGESCH. CLEAR: I_TAB_DET_FIM.
ENDIF.
READ TABLE I_TAB_DET_FIM WITH KEY WERKS = V_WERKS
ELSEIF I_DET_MAT-TIPO_NF = '01'. LIFNR = V_LIFNR
MATNR = V_MATNR.
IF I_DET_MAT-DATA >= V_DTI_ANALISE AND
I_DET_MAT-DATA <= V_DT_FIM. IF SY-SUBRC <> 0.
* sumariza o numero de ocorrencias para um dado tipo de controle. I_TAB_DET_FIM-WERKS = V_WERKS.
V_NUM_NFL_M = V_NUM_NFL_M + 1. I_TAB_DET_FIM-LIFNR = V_LIFNR.
* contabiliza NFL e LOT. I_TAB_DET_FIM-MATNR = V_MATNR.
V_SUM_NFL_M = V_SUM_NFL_M + I_DET_MAT-QKENNZAHL. APPEND I_TAB_DET_FIM.
IF I_DET_MAT-QKENNZAHL <> 1. ENDIF.
V_SUM_LOT_M = V_SUM_LOT_M + I_DET_MAT-QKENNZAHL.
ENDIF. * grava nota de fornecimento - mes_acumulado.
IF V_NUM_NFL_M > 0.
V_SUM_PPM01_M = V_SUM_PPM01_M + I_DET_MAT- V_CHECK_NFL_M = ' '.
LMENGEIST. V_TOT_LOT_M = 100 - ( V_SUM_LOT_M / V_NUM_NFL_M ).
V_NUM_NFL_AC = V_NUM_NFL_AC + 1. ELSE.
V_SUM_NFL_AC = V_SUM_NFL_AC + I_DET_MAT-QKENNZAHL. V_CHECK_NFL_M = 'X'.
IF I_DET_MAT-QKENNZAHL <> 1. ENDIF.
V_SUM_LOT_AC = V_SUM_LOT_AC + I_DET_MAT- * grava nota de fornecimento mes / acum.
QKENNZAHL. IF V_NUM_NFL_AC > 0.
ENDIF. V_CHECK_NFL_AC = ' '.
V_SUM_PPM01_AC = V_SUM_PPM01_AC + I_DET_MAT- V_TOT_LOT_AC = 100 - ( V_SUM_LOT_AC / V_NUM_NFL_AC ).
LMENGEIST. ELSE.
ELSE. V_CHECK_NFL_AC = 'X'.
* sumariza o numero de ocorrencias pára um dado tipo de controle. ENDIF.
V_NUM_NFL_AC = V_NUM_NFL_AC + 1.
* contabiliza NFL e LOT. * calcula nota de processo - mes.
V_SUM_NFL_AC = V_SUM_NFL_AC + I_DET_MAT- IF V_SUM_PPM01_M > 0.
QKENNZAHL. V_TOT_PPM_M = ( V_SUM_PPM89_M / V_SUM_PPM01_M ) *
IF I_DET_MAT-QKENNZAHL <> 1. C_MILHAO.
V_SUM_LOT_AC = V_SUM_LOT_AC + I_DET_MAT- ENDIF.
QKENNZAHL.
ENDIF. * calcula nota de processo - acum.
IF V_SUM_PPM01_AC > 0.
* contabiliza valor para calculo de nota de processo. V_TOT_PPM_AC = ( V_SUM_PPM89_AC / V_SUM_PPM01_AC ) *
V_SUM_PPM01_AC = V_SUM_PPM01_AC + I_DET_MAT- C_MILHAO.
LMENGEIST. ENDIF.
ENDIF.
ENDIF.
ENDLOOP. * grava nota processo mes / ac.
IF V_CHECK_NFL_AC = 'X'.
* Grava dados do último registro I_TAB_DET_FIM-PPM_M = ' '.
PERFORM F_GRAVA_DET_FIM. I_TAB_DET_FIM-PPM_AC = ' '.
I_TAB_DET_FIM-LOT_M = ' '.
CLEAR: V_SUM_PPM89_M, I_TAB_DET_FIM-LOT_AC = ' '.
V_SUM_PPM89_AC, ELSE.
V_SUM_LOT_M, V_SUM_LOT_AC, WRITE V_TOT_LOT_AC TO I_TAB_DET_FIM-LOT_AC DECIMALS 2
V_NUM_NFL_M, V_SUM_NFL_M, V_SUM_PPM01_M, RIGHT-JUSTIFIED.
V_NUM_NFL_AC, V_SUM_NFL_AC, V_SUM_PPM01_AC. WRITE V_TOT_LOT_M TO I_TAB_DET_FIM-LOT_M DECIMALS 2
RIGHT-JUSTIFIED.
ENDFORM. WRITE V_TOT_PPM_M TO I_TAB_DET_FIM-PPM_M DECIMALS 0
RIGHT-JUSTIFIED.

57
ABAP Training
WRITE V_TOT_PPM_AC TO I_TAB_DET_FIM-PPM_AC DECIMALS 0 FORM F_OPEN_FORM.
RIGHT-JUSTIFIED. DATA: V_DIALOG TYPE C VALUE 'X'.
ENDIF.
MODIFY I_TAB_DET_FIM INDEX SY-TABIX. ITCPO-TDDEST = P_IMPRE.
IF P_BATCH NE ' '.
ENDFORM. ITCPO-TDIMMED = 'X'.
ITCPO-TDNEWID = 'X'.
*----------------------------------------------------------------------* V_DIALOG = ' '.
* Form f_acha_descricoes. ENDIF.
*----------------------------------------------------------------------* * Abre o fórmulário para impressão via SAPSCRIPT
* Grava tabela final de detalhes de itens. CALL FUNCTION 'OPEN_FORM'
*----------------------------------------------------------------------* EXPORTING
FORM F_ACHA_DESCRICOES. DEVICE = 'PRINTER'
FORM = 'Z_AVAL_FORNEC'
SELECT MATNR LANGUAGE = SY-LANGU
MAKTX OPTIONS = ITCPO
FROM MAKT DIALOG = V_DIALOG.
INTO TABLE I_MAKT ENDFORM. " F_OPEN_FORM
FOR ALL ENTRIES IN I_TAB_DET_FIM
WHERE MATNR = I_TAB_DET_FIM-MATNR. *&---------------------------------------------------------------------*
*& Form F_WRITE_RESUMO_UNIDADES
ENDFORM. *&---------------------------------------------------------------------*
* Chama o elemento de texto RESUMO_TODAS_ATIVIDADES
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
* Form f_print_total. FORM F_WRITE_RESUMO_UNIDADES.
*----------------------------------------------------------------------* * Chama o elemento de texto RESUMO_TODAS_ATIVIDADES
* Imprime total do rel. UM.
*----------------------------------------------------------------------* CALL FUNCTION 'WRITE_FORM'
FORM F_PRINT_TOTAL. EXPORTING
ELEMENT = 'RESUMO_TODAS_UNIDADES'
FORMAT COLOR COL_TOTAL. WINDOW = 'MAIN'.

WRITE: /05 'Acum mês MTB ', ENDFORM. " F_WRITE_RESUMO_UNIDADES


32 I_TOT_FORNEC-NFL_M,
47 I_TOT_FORNEC-NPR_M, *&---------------------------------------------------------------------*
62 I_TOT_FORNEC-NCQ_M, *& Form F_WRITE_RESUMO_POR_UNIDADE
77 I_TOT_FORNEC-NQF_M, *&---------------------------------------------------------------------*
92 I_TOT_FORNEC-NPT_M, * Chama o elemento de texto RESUMO_POR_UNIDADE
107 I_TOT_FORNEC-PPM_M, *----------------------------------------------------------------------*
137 I_TOT_FORNEC-LOT_M, FORM F_WRITE_RESUMO_POR_UNIDADE.
170 ' '.
* Chama o elemento de texto RESUMO_POR_UNIDADE
WRITE: /05 'Acum MTB(' NO-GAP, P_PERIOD, 'meses)', * que contém o cabeçalho do RESUMO_POR_UNIDADE
32 I_TOT_FORNEC-NFL_AC, CALL FUNCTION 'WRITE_FORM'
47 I_TOT_FORNEC-NPR_AC, EXPORTING
62 I_TOT_FORNEC-NCQ_AC, ELEMENT = 'RESUMO_POR_UNIDADE'
77 I_TOT_FORNEC-NQF_AC, WINDOW = 'MAIN'.
92 I_TOT_FORNEC-NPT_AC,
107 I_TOT_FORNEC-PPM_AC, ENDFORM. " F_WRITE_RESUMO_POR_UNIDADE
137 I_TOT_FORNEC-LOT_AC,
170 ' '. *&---------------------------------------------------------------------*
*& Form F_WRITE_DET_RESUMO_POR_UNIDADE
FORMAT COLOR COL_NORMAL. *&---------------------------------------------------------------------*
* Chama o elemento de texto DETALHE_RESUMO_POR_UNIDADE, que
ENDFORM. contém os
* dados do RESUMO_POR_UNIDADE.
*&---------------------------------------------------------------------* *----------------------------------------------------------------------*
*& Form F_OPEN_FORM FORM F_WRITE_DET_RESUMO_POR_UNIDADE.
*&---------------------------------------------------------------------*
* Abre o fórmulário para impressão via SAPSCRIPT * Chama o elemento de texto DETALHE_RESUMO_POR_UNIDADE, que
*----------------------------------------------------------------------* contém os

58
ABAP Training
* dados do RESUMO_POR_UNIDADE. ELSE.
CALL FUNCTION 'WRITE_FORM' V_IDIOMA = C_ENG.
EXPORTING ENDIF.
ELEMENT = 'DETALHE_RESUMO_POR_UNIDADE' * Abre o formulário para impressão da página de verso
WINDOW = 'MAIN'. CALL FUNCTION 'START_FORM'
EXPORTING
V_TIME = V_TIME + ( 127 / 10 ). "acrescenta 3 linhas à origem FORM = 'Z_AVAL_FORNEC'
ZSAPSCRIP2-CONT = V_TIME. LANGUAGE = V_IDIOMA
ENDFORM. " F_WRITE_DET_RESUMO_POR_UNIDADE STARTPAGE = 'VERSO'
IMPORTING
*&---------------------------------------------------------------------* LANGUAGE = SY-LANGU.
*& Form F_WRITE_RESUMO_INDICE
*&---------------------------------------------------------------------* * imprime página de verso
* Chama o elemento de texto RESUMO_INDICES_PPM CALL FUNCTION 'WRITE_FORM'
*----------------------------------------------------------------------* EXPORTING
FORM F_WRITE_RESUMO_INDICE. WINDOW = 'INFO3'.

* Chama o elemento de texto RESUMO_INDICES_PPM CALL FUNCTION 'END_FORM'. "Encerra formulário


CALL FUNCTION 'WRITE_FORM'
EXPORTING ENDFORM. " F_WRITE_VERSO_PAG
ELEMENT = 'RESUMO_INDICES_PPM' *&---------------------------------------------------------------------*
WINDOW = 'MAIN'. *& Form F_LOOP_RESUMO_INDICE
*&---------------------------------------------------------------------*
V_TIME = V_TIME + ( 1270 / 75 ). "PULA 4 LINHAS * text *
ZSAPSCRIP2-CONT = V_TIME. *----------------------------------------------------------------------*
* --> p1 text
ENDFORM. " F_WRITE_RESUMO_INDICE * <-- p2 text
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------* FORM F_LOOP_RESUMO_INDICE.
*& Form F_WRITE_DET_RESUMO_INDICE
*&---------------------------------------------------------------------* * Resumo dos índices de PPM de linha e % rejeição de Lote no
* Chama o elemento de texto DETALHE_RESUMO_INDICES_PPM, que Recebimento
contém os V_PRIM_VEZ = C_SIM.
* dados do RESUMO_INDICES_PPM.
*----------------------------------------------------------------------* LOOP AT I_RES_INDICE.
FORM F_WRITE_DET_RESUMO_INDICE. IF V_PRIM_VEZ = C_SIM(1) AND V_TIME <= C_LINHA1.
* Form de impressão de cabec de Resumo dos índices
* Chama o elemento de texto DETALHE_RESUMO_INDICES_PPM, que PERFORM F_WRITE_RESUMO_INDICE.
contém os V_PRIM_VEZ = C_NAO.
* dados do RESUMO_INDICES_PPM. ELSEIF V_TIME > C_LINHA.

CALL FUNCTION 'WRITE_FORM' PERFORM F_WRITE_RESUMO_INDICE.


EXPORTING V_TIME = ( 14 * 127 / 30 ).
ELEMENT = 'DETALHE_RESUMO_INDICES_PPM' ENDIF.
WINDOW = 'MAIN'.
V_TIME = V_TIME + ( 127 / 30 ). "AUMENTA UMA LINHA CLEAR: I_FORNEC.
ZSAPSCRIP2-CONT = V_TIME. READ TABLE I_FORNEC WITH KEY LIFNR = I_RES_INDICE-LIFNR.
ENDFORM. " F_WRITE_DET_RESUMO_INDICE READ TABLE I_T001W WITH KEY WERKS = I_RES_INDICE-WERKS.

*&---------------------------------------------------------------------* ZSAPSCRIP2-CONT = V_TIME.


*& Form F_WRITE_VERSO_PAG ZSAPSCRIP2-PPM_M_I = I_RES_INDICE-PPM_M.
*&---------------------------------------------------------------------* ZSAPSCRIP2-PPM_AC_I = I_RES_INDICE-PPM_AC.
FORM F_WRITE_VERSO_PAG.
* Se o país do Remetente for ZSAPSCRIP2-NAMEC = I_T001W-NAME.
* argentina e o país do fornecedor for argentina, imprimir o relatório
* espanhol. Se ambos forem Brasil, imprimir em português. Para os ZSAPSCRIP2-LOT_M = I_RES_INDICE-LOT_M.
* demais casos, imprimir em inglês. ZSAPSCRIP2-LOT_AC = I_RES_INDICE-LOT_AC.
IF I_LFA1-LAND1 EQ C_BR AND I_REMET-LAND1 EQ C_BR.
V_IDIOMA = C_P. ZSAPSCRIP2-PPM_OBJ_R = I_FORNEC-PPM_OBJ.
ELSEIF I_LFA1-LAND1 EQ C_ARG AND I_REMET-LAND1 EQ C_ARG. ZSAPSCRIP2-LOT_OBJ_R = I_FORNEC-LOT_OBJ.
V_IDIOMA = C_ESP. * Imprime Resumo dos índices de PPM

59
ABAP Training
PERFORM F_WRITE_DET_RESUMO_INDICE. INTO T247-LTX
WHERE SPRAS = V_ID
ENDLOOP. AND MNR = P_DATA_MES.
CONCATENATE T247-LTX(3) '/' P_DATA_ANO INTO P_DATA_ATU.
* Encerra formulário de dados de Nota
CALL FUNCTION 'END_FORM'. ENDFORM. " F_EXTENSO_DATA
*&---------------------------------------------------------------------*
* Form de Impressão de verso da página *& Form F_START_FORM
PERFORM F_WRITE_VERSO_PAG. *&---------------------------------------------------------------------*
* text *
* Limpa tabela *----------------------------------------------------------------------*
REFRESH I_RES_INDICE. * --> p1 text
* <-- p2 text
ENDFORM. " F_LOOP_RESUMO_INDICE *----------------------------------------------------------------------*
FORM F_START_FORM.
*&---------------------------------------------------------------------*
*& Form F_GRAVA_RES_INDICE * Se o país do Remetente for
*&---------------------------------------------------------------------* * argentina e o país do fornecedor for argentina, imprimir o relatório
* text * * espanhol. Se ambos forem Brasil, imprimir em português. Para os
*----------------------------------------------------------------------* * demais casos, imprimir em inglês.
FORM F_GRAVA_RES_INDICE. IF I_LFA1-LAND1 EQ C_BR AND I_REMET-LAND1 EQ C_BR.
V_IDIOMA = C_P.
I_RES_INDICE-LIFNR = I_TABFIM-LIFNR. ELSEIF I_LFA1-LAND1 EQ C_ARG AND I_REMET-LAND1 EQ C_ARG.
I_RES_INDICE-WERKS = I_TABFIM-WERKS. V_IDIOMA = C_ESP.
ELSE.
I_RES_INDICE-PPM_M = I_TABFIM-PPM_M. V_IDIOMA = C_ENG.
I_RES_INDICE-PPM_AC = I_TABFIM-PPM_AC. ENDIF.

I_RES_INDICE-LOT_M = I_TABFIM-LOT_M. * Abre o formulário para impressão da página de verso


I_RES_INDICE-LOT_AC = I_TABFIM-LOT_AC. CALL FUNCTION 'START_FORM'
EXPORTING
I_RES_INDICE-LOT_OBJ_M = I_TABFIM-LOT_OBJ_M. FORM = 'Z_AVAL_FORNEC'
I_RES_INDICE-PPM_OBJ_M = I_TABFIM-PPM_OBJ_M. LANGUAGE = V_IDIOMA
STARTPAGE = 'FIRST'
IMPORTING
APPEND I_RES_INDICE. LANGUAGE = SY-LANGU.

ENDFORM. " F_START_FORM

ENDFORM. " F_GRAVA_RES_INDICE *&---------------------------------------------------------------------*


*&---------------------------------------------------------------------* *& Form CARACTERISTICA
*& Form F_EXTENSO_DATA *&---------------------------------------------------------------------*
*&---------------------------------------------------------------------* * text *
FORM F_EXTENSO_DATA USING P_DATA_MES *----------------------------------------------------------------------*
P_DATA_ANO * --> p1 text
CHANGING P_DATA_ATU. * <-- p2 text
DATA: V_ID LIKE T247-SPRAS. *----------------------------------------------------------------------*
* Se o país do Remetente for FORM CARACTERISTICA USING P_ATNAM P_OBJEK P_KLART
* argentina e o país do fornecedor for argentina, imprimir o relatório P_VALOR.
* espanhol. Se ambos forem Brasil, imprimir em português. Para os READ TABLE I_CABN WITH KEY ATNAM = P_ATNAM.
* demais casos, imprimir em inglês.
IF I_LFA1-LAND1 EQ C_BR AND I_REMET-LAND1 EQ C_BR. IF SY-SUBRC NE 0.
V_ID = C_P. P_VALOR = 'ERRO'.
ELSEIF I_LFA1-LAND1 EQ C_ARG AND I_REMET-LAND1 EQ C_ARG. EXIT.
V_ID = C_ESP. ENDIF.
ELSE.
V_ID = C_ENG. READ TABLE I_AUSP WITH KEY OBJEK = P_OBJEK
ENDIF. ATINN = I_CABN-ATINN
KLART = P_KLART.
SELECT SINGLE LTX IF SY-SUBRC NE 0.
FROM T247 P_VALOR = ' '.

60
ABAP Training
EXIT. WRITE V_VAL_PPM TO I_FORNEC-PPM_OBJ RIGHT-JUSTIFIED.
ENDIF. WRITE V_VAL_LOTE TO I_FORNEC-LOT_OBJ RIGHT-JUSTIFIED.
IF I_CABN-ATFOR = 'NUM'.
V_ATFLV = I_AUSP-ATFLV. READ TABLE I_CABN WITH KEY ATNAM = C_NAS.
IF P_VALOR = V_VAL_PPM. IF SY-SUBRC NE 0.
WRITE V_ATFLV TO P_VALOR DECIMALS 0. I_FORNEC-NAS = ' '.
ELSE. ELSE.
P_VALOR = V_ATFLV. READ TABLE I_AUSP WITH KEY OBJEK = V_OBJEK_FORN
ENDIF. ATINN = I_CABN-ATINN
ELSE. KLART = C_DEZ.
P_VALOR = I_AUSP-ATWRT. IF SY-SUBRC NE 0.
ENDIF. I_FORNEC-NAS = ' '.
ELSE.
ENDFORM. " CARACTERISTICA IF I_CABN-ATFOR = 'NUM'.
*&---------------------------------------------------------------------* V_ATFLV = I_AUSP-ATFLV.
*& Form f_calc_ppm_obj. WRITE V_ATFLV TO V_VAL_NAS DECIMALS 0.
*&---------------------------------------------------------------------* ELSE.
* Calcula PPM e OBJ V_VAL_NAS = I_AUSP-ATWRT.
*----------------------------------------------------------------------* ENDIF.
FORM F_CALC_PPM_OBJ. WRITE V_VAL_NAS TO I_FORNEC-NAS RIGHT-JUSTIFIED.
DATA: V_OBJEK_FORN(50) TYPE C, ENDIF.
V_OBJEK_MAT(50) TYPE C. ENDIF.

* selecao na CABN APPEND I_FORNEC.

SELECT ATINN CLEAR: V_VAL_PPM, V_VAL_LOTE.


ADZHL
ATNAM ENDON.
ATFOR
FROM CABN ENDLOOP.
INTO TABLE I_CABN
WHERE ATNAM = C_LOTE OR CLEAR: V_VAL_PPM, V_VAL_LOTE.
ATNAM = C_PPM OR
ATNAM = C_NAS. LOOP AT I_TAB_DET_FIM.

select objek ON CHANGE OF I_TAB_DET_FIM-LIFNR OR I_TAB_DET_FIM-


atinn MATNR.
atwrt V_OBJEK_MAT+0(18) = I_TAB_DET_FIM-MATNR.
atflv V_OBJEK_MAT+18(10) = I_TAB_DET_FIM-LIFNR.
klart
from ausp * Calcula valor de OBJ PPM
into table i_ausp PERFORM CARACTERISTICA USING C_PPM V_OBJEK_MAT
for all entries in i_cabn C_Z V_VAL_PPM.
where klart = c_dez or * Calcula valor de OBJ LOTE
klart = c_z and PERFORM CARACTERISTICA USING C_LOTE V_OBJEK_MAT
atinn = i_cabn-atinn. C_Z V_VAL_LOTE.
LOOP AT I_TABFIM.
* Gravar dados
ON CHANGE OF I_TABFIM-LIFNR. I_FORNEC_MAT-LIFNR = I_TAB_DET_FIM-LIFNR.
* Calcula valor de OBJ PPM I_FORNEC_MAT-MATNR = I_TAB_DET_FIM-MATNR.
V_OBJEK_FORN = I_TABFIM-LIFNR.
PERFORM CARACTERISTICA USING C_PPM V_OBJEK_FORN TRANSLATE V_VAL_LOTE USING '.,'.
C_DEZ V_VAL_PPM.
WRITE V_VAL_PPM TO I_FORNEC_MAT-PPM_OBJ RIGHT-
* Calcula valor de OBJ LOTE JUSTIFIED.
PERFORM CARACTERISTICA USING C_LOTE V_OBJEK_FORN WRITE V_VAL_LOTE TO I_FORNEC_MAT-LOT_OBJ RIGHT-
C_DEZ V_VAL_LOTE. JUSTIFIED.
APPEND I_FORNEC_MAT.
* Grava valores selecionados
I_FORNEC-LIFNR = I_TABFIM-LIFNR. CLEAR: V_VAL_PPM, V_VAL_LOTE.
TRANSLATE V_VAL_LOTE USING '.,'.

61
ABAP Training
ENDON. ENDLOOP.
ENDLOOP.
ULINE.
ENDFORM.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form f_grava_total_final. *&---------------------------------------------------------------------*
*&---------------------------------------------------------------------* *& Form f_print_total_acum.
* grava total final. *&---------------------------------------------------------------------*
*----------------------------------------------------------------------* * Imprime o total final acum.
FORM F_GRAVA_TOTAL_FINAL. *----------------------------------------------------------------------*

MOVE: I_TABFIM-WERKS TO I_TOT_CENTRO-WERKS, FORM F_PRINT_TOTAL_ACUM.


I_TABFIM-NFL_M TO I_TOT_CENTRO-NFL,
I_TABFIM-NPR_M TO I_TOT_CENTRO-NPR, WRITE: /03 'ACUM NO MTB',
I_TABFIM-NCQ_M TO I_TOT_CENTRO-NCQ, 170 ' '.
I_TABFIM-NQF_M TO I_TOT_CENTRO-NQF,
I_TABFIM-NPT_M TO I_TOT_CENTRO-NPT, WRITE: /32 I_ACUM_MTB-NFL_AC,
I_TABFIM-PPM_M TO I_TOT_CENTRO-PPM, 47 I_ACUM_MTB-NPR_AC,
I_TABFIM-LOT_M TO I_TOT_CENTRO-LOT. 62 I_ACUM_MTB-NCQ_AC,
77 I_ACUM_MTB-NQF_AC,
COLLECT I_TOT_CENTRO. 92 I_ACUM_MTB-NPT_AC,
107 I_ACUM_MTB-PPM_AC,
137 I_ACUM_MTB-LOT_AC,
MOVE: '9999' TO I_TOT_CENTRO-WERKS. 170 ' '.
COLLECT I_TOT_CENTRO. ULINE.

ENDFORM.
ENDFORM. *&---------------------------------------------------------------------*
*& Form CALCULA_PERIODO
*&---------------------------------------------------------------------* *&---------------------------------------------------------------------*
*& Form f_print_total_final. * Este Form é utilizado para calcular o mês de início do período
*&---------------------------------------------------------------------* * selecionado
* Imprime o total final. *----------------------------------------------------------------------*
*----------------------------------------------------------------------* FORM CALCULA_PERIODO.
DATA: V_MES_BATCH LIKE SY-DATUM.
FORM F_PRINT_TOTAL_FINAL.
IF P_BATCH = ' '.
FORMAT COLOR COL_TOTAL. CONCATENATE P_MES '01' INTO V_DIA_CALCULO.
WRITE: /03 'ACUM NO CENTRO', ELSE.
170 ' '. CONCATENATE SY-DATUM(6) '01' INTO V_MES_BATCH.
V_MES_BATCH = V_MES_BATCH - 1.
SORT I_TOT_CENTRO BY WERKS. CONCATENATE V_MES_BATCH(6) '01' INTO V_DIA_CALCULO.
ENDIF.
LOOP AT I_TOT_CENTRO. CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
EXPORTING
CLEAR: I_T001W. DAY_IN = V_DIA_CALCULO
IMPORTING
READ TABLE I_T001W WITH KEY WERKS = I_TOT_CENTRO- LAST_DAY_OF_MONTH = V_ULTIMO_DIA.
WERKS.
* primeiro dia do mes selecionado.
WRITE: /03 I_TOT_CENTRO-WERKS, V_DTI_ANALISE = V_DIA_CALCULO.
I_T001W-NAME,
32 I_TOT_CENTRO-NFL, * Cálculo do início do período de análise
47 I_TOT_CENTRO-NPR, P_PERIOD = P_PERIOD - 1.
62 I_TOT_CENTRO-NCQ, DO P_PERIOD TIMES.
77 I_TOT_CENTRO-NQF, V_PRIMEIRO_DIA = V_DIA_CALCULO - 1.
92 I_TOT_CENTRO-NPT, CONCATENATE V_PRIMEIRO_DIA(6) '01' INTO V_DIA_CALCULO.
107 I_TOT_CENTRO-PPM, ENDDO.
137 I_TOT_CENTRO-LOT, V_DT_INICIO = V_DIA_CALCULO.
170 ' '. V_DT_FIM = V_ULTIMO_DIA.

62
ABAP Training
P_PERIOD = P_PERIOD + 1. SUM_NFL_AC LIKE T706U-BETFA,
ENDFORM. " CALCULA_PERIODO SUM_LOT_M LIKE T706U-BETFA,
*&---------------------------------------------------------------------* SUM_LOT_AC LIKE T706U-BETFA,
*& Form F_CALC_ACUM SUM_NPT_M LIKE T706U-BETFA,
*&---------------------------------------------------------------------* SUM_NPT_AC LIKE T706U-BETFA,
* Form para calcular as notas acumuladas nos centros e MTB. NUM_NPT_M LIKE T706U-BETFA,
* Este form também grava os resultados na tabela do centro. NUM_NPT_AC LIKE T706U-BETFA,
*----------------------------------------------------------------------* SUM_PPM01_M LIKE T706U-BETFA,
FORM F_CALC_ACUM. SUM_PPM01_AC LIKE T706U-BETFA,
SUM_ATRAS_M LIKE T706U-BETFA,
* Declaração de variáveis locais: SUM_ATRAS_AC LIKE T706U-BETFA,
DATA: V_CENT_SUM_PPM89_AC LIKE T706U-BETFA, SUM_EMDIA_M LIKE T706U-BETFA,
V_CENT_NUM_NFL_AC LIKE T706U-BETFA, SUM_EMDIA_AC LIKE T706U-BETFA.
V_CENT_SUM_NFL_AC LIKE T706U-BETFA, DATA: END OF I_ACUM_FORNEC.
V_CENT_SUM_LOT_AC LIKE T706U-BETFA,
V_CENT_SUM_NPT_AC LIKE T706U-BETFA, SORT I_ACUM BY CENTRO.
V_CENT_NUM_NPT_AC LIKE T706U-BETFA,
V_CENT_SUM_PPM01_AC LIKE T706U-BETFA, * verifica se é necessária a impressão dos totais por centro e empresa
V_CENT_SUM_ATRAS_AC LIKE T706U-BETFA, IF SO_FORNE EQ '' AND SO_MATNR EQ ''.
V_CENT_SUM_EMDIA_AC LIKE T706U-BETFA.
* Soma totais gerais para os Centros e para Empresa
DATA: C_MI(7) TYPE N VALUE '1000000'. "Valor de calc de Nota LOOP AT I_ACUM.
DATA: V_PRIM_VEZ TYPE I. "Flag primeira vez
V_CENT_SUM_PPM89_AC = V_CENT_SUM_PPM89_AC + I_ACUM-
DATA: V_MTB_SUM_PPM89_AC LIKE T706U-BETFA, SUM_PPM89_AC.
V_MTB_NUM_NFL_AC LIKE T706U-BETFA, V_CENT_NUM_NFL_AC = V_CENT_NUM_NFL_AC + I_ACUM-
V_MTB_SUM_NFL_AC LIKE T706U-BETFA, NUM_NFL_AC.
V_MTB_SUM_LOT_AC LIKE T706U-BETFA, V_CENT_SUM_NFL_AC = V_CENT_SUM_NFL_AC + I_ACUM-
V_MTB_SUM_NPT_AC LIKE T706U-BETFA, SUM_NFL_AC.
V_MTB_NUM_NPT_AC LIKE T706U-BETFA, V_CENT_SUM_LOT_AC = V_CENT_SUM_LOT_AC + I_ACUM-
V_MTB_SUM_PPM01_AC LIKE PC207-BETPE, SUM_LOT_AC.
V_MTB_SUM_ATRAS_AC LIKE T706U-BETFA, V_CENT_SUM_NPT_AC = V_CENT_SUM_NPT_AC + I_ACUM-
V_MTB_SUM_EMDIA_AC LIKE T706U-BETFA. SUM_NPT_AC.
V_CENT_NUM_NPT_AC = V_CENT_NUM_NPT_AC + I_ACUM-
DATA: V_FORNEC_SUM_PPM89_M LIKE T706U-BETFA, NUM_NPT_AC.
V_FORNEC_SUM_PPM89_AC LIKE T706U-BETFA, V_CENT_SUM_PPM01_AC = V_CENT_SUM_PPM01_AC + I_ACUM-
V_FORNEC_NUM_NFL_M LIKE T706U-BETFA, SUM_PPM01_AC.
V_FORNEC_NUM_NFL_AC LIKE T706U-BETFA, V_CENT_SUM_ATRAS_AC = V_CENT_SUM_ATRAS_AC + I_ACUM-
V_FORNEC_SUM_NFL_M LIKE T706U-BETFA, SUM_ATRAS_AC.
V_FORNEC_SUM_NFL_AC LIKE T706U-BETFA, V_CENT_SUM_EMDIA_AC = V_CENT_SUM_EMDIA_AC + I_ACUM-
V_FORNEC_SUM_LOT_M LIKE T706U-BETFA, SUM_EMDIA_AC.
V_FORNEC_SUM_LOT_AC LIKE T706U-BETFA,
V_FORNEC_SUM_NPT_M LIKE T706U-BETFA, IF SO_CENT EQ ''. "verifica se nenhum centro foi selecionado
V_FORNEC_SUM_NPT_AC LIKE T706U-BETFA, V_MTB_SUM_PPM89_AC = V_MTB_SUM_PPM89_AC + I_ACUM-
V_FORNEC_NUM_NPT_M LIKE T706U-BETFA, SUM_PPM89_AC.
V_FORNEC_NUM_NPT_AC LIKE T706U-BETFA, V_MTB_NUM_NFL_AC = V_MTB_NUM_NFL_AC + I_ACUM-
V_FORNEC_LIFNR LIKE QALS-LIFNR, NUM_NFL_AC.
V_FORNEC_SUM_PPM01_M LIKE T706U-BETFA, V_MTB_SUM_NFL_AC = V_MTB_SUM_NFL_AC + I_ACUM-
V_FORNEC_SUM_PPM01_AC LIKE T706U-BETFA, SUM_NFL_AC.
V_FORNEC_SUM_ATRAS_M LIKE T706U-BETFA, V_MTB_SUM_LOT_AC = V_MTB_SUM_LOT_AC + I_ACUM-
V_FORNEC_SUM_ATRAS_AC LIKE T706U-BETFA, SUM_LOT_AC.
V_FORNEC_SUM_EMDIA_M LIKE T706U-BETFA, V_MTB_SUM_NPT_AC = V_MTB_SUM_NPT_AC + I_ACUM-
V_FORNEC_SUM_EMDIA_AC LIKE T706U-BETFA. SUM_NPT_AC.
V_MTB_NUM_NPT_AC = V_MTB_NUM_NPT_AC + I_ACUM-
DATA: BEGIN OF I_ACUM_FORNEC OCCURS 0, NUM_NPT_AC.
LIFNR LIKE QALS-LIFNR, V_MTB_SUM_PPM01_AC = V_MTB_SUM_PPM01_AC + I_ACUM-
SUM_PPM89_M LIKE T706U-BETFA, SUM_PPM01_AC.
SUM_PPM89_AC LIKE T706U-BETFA, V_MTB_SUM_ATRAS_AC = V_MTB_SUM_ATRAS_AC + I_ACUM-
NUM_NFL_M LIKE T706U-BETFA, SUM_ATRAS_AC.
NUM_NFL_AC LIKE T706U-BETFA, V_MTB_SUM_EMDIA_AC = V_MTB_SUM_EMDIA_AC + I_ACUM-
SUM_NFL_M LIKE T706U-BETFA, SUM_EMDIA_AC.

63
ABAP Training
ENDIF.
* calcula nota de pontualidade.
AT END OF CENTRO. V_TOT_NPT_AC = I_ACUM_CENTRO-SUM_NPT /
I_ACUM_CENTRO-CENTRO = I_ACUM-CENTRO. I_ACUM_CENTRO-NUM_NPT.
I_ACUM_CENTRO-SUM_PPM89 = V_CENT_SUM_PPM89_AC.
I_ACUM_CENTRO-NUM_NFL = V_CENT_NUM_NFL_AC. IF V_TOT_NPT_AC > 100.
I_ACUM_CENTRO-SUM_NFL = V_CENT_SUM_NFL_AC. V_TOT_NPT_AC = 100.
I_ACUM_CENTRO-SUM_LOT = V_CENT_SUM_LOT_AC. ENDIF.
I_ACUM_CENTRO-SUM_NPT = V_CENT_SUM_NPT_AC.
I_ACUM_CENTRO-NUM_NPT = V_CENT_NUM_NPT_AC. IF V_TOT_NPT_AC < 0.
I_ACUM_CENTRO-SUM_PPM01 = V_CENT_SUM_PPM01_AC. V_TOT_NPT_AC = 0.
I_ACUM_CENTRO-SUM_ATRAS = V_CENT_SUM_ATRAS_AC. ENDIF.
I_ACUM_CENTRO-SUM_EMDIA = V_CENT_SUM_EMDIA_AC. * calculo do NCQ acumulado.

APPEND I_ACUM_CENTRO. V_TOT_NOTAS_AC = I_ACUM_CENTRO-SUM_EMDIA +


CLEAR I_ACUM_CENTRO. I_ACUM_CENTRO-SUM_ATRAS.
CLEAR: V_CENT_SUM_PPM89_AC,
V_CENT_NUM_NFL_AC, IF V_TOT_NOTAS_AC > 0.
V_CENT_SUM_NFL_AC, V_TOT_NCQ_AC = ( I_ACUM_CENTRO-SUM_EMDIA /
V_CENT_SUM_LOT_AC, V_TOT_NOTAS_AC ) * 100.
V_CENT_SUM_NPT_AC, ELSE.
V_CENT_NUM_NPT_AC, V_TOT_NCQ_AC = 100.
V_CENT_SUM_PPM01_AC, ENDIF.
V_CENT_SUM_ATRAS_AC,
V_CENT_SUM_EMDIA_AC. * Grava dados na tabela i_tot_centro.
ENDAT. * centro
ENDLOOP. I_TOT_CENTRO-WERKS = I_ACUM_CENTRO-CENTRO.

* grava nota de fornecimento - acumulado.


LOOP AT I_ACUM_CENTRO. IF V_CHECK_NFL_AC = 'X'.
* Limpar as variaveis utilizadas no calculo. I_TOT_CENTRO-NFL = ' '.
CLEAR: V_TOT_NFL_AC, I_TOT_CENTRO-LOT = ' '.
V_TOT_LOT_AC, ELSE.
V_TOT_PPM_AC, WRITE V_TOT_NFL_AC TO I_TOT_CENTRO-NFL DECIMALS 0
V_TOT_NPR_AC, RIGHT-JUSTIFIED.
V_TOT_NPT_AC, WRITE V_TOT_LOT_AC TO I_TOT_CENTRO-LOT DECIMALS 2
V_TOT_NOTAS_AC, RIGHT-JUSTIFIED.
V_TOT_NCQ_AC. ENDIF.

* calcula nota de fornecimento-acumulado. * grava nota processo - acumulado.


IF I_ACUM_CENTRO-NUM_NFL > 0. IF V_CHECK_NFL_AC = 'X'.
V_CHECK_NFL_AC = ' '. I_TOT_CENTRO-PPM = ' '.
V_TOT_NFL_AC = I_ACUM_CENTRO-SUM_NFL / I_TOT_CENTRO-NPR = ' '.
I_ACUM_CENTRO-NUM_NFL. ELSE.
V_TOT_LOT_AC = 100 - ( I_ACUM_CENTRO-SUM_LOT / WRITE V_TOT_PPM_AC TO I_TOT_CENTRO-PPM DECIMALS 0
I_ACUM_CENTRO-NUM_NFL ). RIGHT-JUSTIFIED.
ELSE. WRITE V_TOT_NPR_AC TO I_TOT_CENTRO-NPR DECIMALS 0
V_CHECK_NFL_AC = 'X'. RIGHT-JUSTIFIED.
ENDIF. ENDIF.

* calcula nota processo-acumulado. * grava nota de pontualidade - acumulado.


IF I_ACUM_CENTRO-SUM_PPM01 > 0. WRITE V_TOT_NPT_AC TO I_TOT_CENTRO-NPT DECIMALS 0
V_TOT_PPM_AC = I_ACUM_CENTRO-SUM_PPM89 / RIGHT-JUSTIFIED.
I_ACUM_CENTRO-SUM_PPM01 * C_MI.
* grava valores de nota de compromisso de qualidade - acumulado.
ENDIF. WRITE V_TOT_NCQ_AC TO I_TOT_CENTRO-NCQ DECIMALS 0
V_TOT_NPR_AC = 100 - ( V_TOT_PPM_AC / 100 ). RIGHT-JUSTIFIED.

IF V_TOT_NPR_AC < 0. * Cálculo do NQF


V_TOT_NPR_AC = 0. * Se NFL e NPR estiverem BRANCOS, passar BRANCO *
ENDIF.

64
ABAP Training
IF I_TOT_CENTRO-NFL = ' ' AND I_TOT_CENTRO-NPR = ' '. * calculo do NCQ acumulado.
I_TOT_CENTRO-NQF = ' '. V_TOT_NOTAS_AC = V_MTB_SUM_EMDIA_AC +
ELSE. V_MTB_SUM_ATRAS_AC.
IF V_TOT_POND <> 0.
V_TOT_NQF_AC = ( ( I_TOT_CENTRO-NFL * V_FATOR_NFL ) + IF V_TOT_NOTAS_AC > 0.
( I_TOT_CENTRO-NPR * V_FATOR_NPR ) + V_TOT_NCQ_AC = ( V_MTB_SUM_EMDIA_AC /
( I_TOT_CENTRO-NCQ * V_FATOR_NCQ ) ) / V_TOT_NOTAS_AC ) * 100.
V_TOT_POND. ELSE.
WRITE V_TOT_NQF_AC TO I_TOT_CENTRO-NQF DECIMALS 0. V_TOT_NCQ_AC = 100.
ENDIF. ENDIF.
ENDIF. * Grava os dados para a estrutura i_acum_MTB

* Grava os dados acima na tabela. * grava nota de fornecimento - acumulado.


APPEND I_TOT_CENTRO. IF V_CHECK_NFL_AC = 'X'.
ENDLOOP. I_ACUM_MTB-NFL_AC = ' '.
I_ACUM_MTB-LOT_AC = ' '.
CLEAR: V_TOT_NFL_M, V_TOT_NFL_AC, ELSE.
V_TOT_LOT_M, V_TOT_LOT_AC, WRITE V_TOT_NFL_AC TO I_ACUM_MTB-NFL_AC DECIMALS 0
V_TOT_PPM_M, V_TOT_PPM_AC, RIGHT-JUSTIFIED.
V_TOT_NPR_M, V_TOT_NPR_AC, WRITE V_TOT_LOT_AC TO I_ACUM_MTB-LOT_AC DECIMALS 2
V_TOT_NPT_M, V_TOT_NPT_AC, RIGHT-JUSTIFIED.
V_TOT_NOTAS_M, V_TOT_NOTAS_AC, ENDIF.
V_TOT_NCQ_M, V_TOT_NCQ_AC.
* grava nota processo - acumulado.
IF SO_CENT EQ ''. " verifica se nenhum centro foi selecionado IF V_CHECK_NFL_AC = 'X'.
* Cálculo dos dados gerais para Empresa I_ACUM_MTB-PPM_AC = ' '.
I_ACUM_MTB-NPR_AC = ' '.
* calcula nota de fornecimento-acumulado. ELSE.
IF V_MTB_NUM_NFL_AC > 0. WRITE V_TOT_PPM_AC TO I_ACUM_MTB-PPM_AC DECIMALS 0
V_CHECK_NFL_AC = ' '. RIGHT-JUSTIFIED.
V_TOT_NFL_AC = V_MTB_SUM_NFL_AC / WRITE V_TOT_NPR_AC TO I_ACUM_MTB-NPR_AC DECIMALS 0
V_MTB_NUM_NFL_AC. RIGHT-JUSTIFIED.
V_TOT_LOT_AC = 100 - ( V_MTB_SUM_LOT_AC / ENDIF.
V_MTB_NUM_NFL_AC ).
ELSE. * grava nota de pontualidade - acumulado.
V_CHECK_NFL_AC = 'X'. WRITE V_TOT_NPT_AC TO I_ACUM_MTB-NPT_AC DECIMALS 0
ENDIF. RIGHT-JUSTIFIED.

* grava valores de nota de compromisso de qualidade - acumulado.


* calcula nota processo-acumulado. WRITE V_TOT_NCQ_AC TO I_ACUM_MTB-NCQ_AC DECIMALS 0
IF V_MTB_SUM_PPM01_AC > 0. RIGHT-JUSTIFIED.
V_TOT_PPM_AC = ( V_MTB_SUM_PPM89_AC /
V_MTB_SUM_PPM01_AC ) * C_MILHAO. * Cálculo do NQF
ENDIF. * Se NFL e NPR estiverem BRANCOS, passar BRANCO
V_TOT_NPR_AC = 100 - ( V_TOT_PPM_AC / 100 ). IF I_ACUM_MTB-NFL_AC = ' ' AND I_ACUM_MTB-NPR_AC = ' '.
I_ACUM_MTB-NQF_AC = ' '.
IF V_TOT_NPR_AC < 0. ELSE.
V_TOT_NPR_AC = 0. IF V_TOT_POND <> 0.
ENDIF. V_TOT_NQF_AC = ( ( I_ACUM_MTB-NFL_AC * V_FATOR_NFL ) +
( I_ACUM_MTB-NPR_AC * V_FATOR_NPR ) +
* calcula nota de pontualidade. ( I_ACUM_MTB-NCQ_AC * V_FATOR_NCQ ) ) /
V_TOT_POND.
V_TOT_NPT_AC = V_MTB_SUM_NPT_AC / V_MTB_NUM_NPT_AC. WRITE V_TOT_NQF_AC TO I_ACUM_MTB-NQF_AC DECIMALS 0.
IF V_TOT_NPT_AC > 100. ENDIF.
V_TOT_NPT_AC = 100. ENDIF.
ENDIF.
ENDIF.
IF V_TOT_NPT_AC < 0. ENDIF.
V_TOT_NPT_AC = 0.
ENDIF.
* Calcula totais gerais por fornecedor.

65
ABAP Training
* Insere elemento na tabela para funcionar comando on change. V_FORNEC_NUM_NFL_AC = V_FORNEC_NUM_NFL_AC +
I_ACUM-LIFNR = '999999999'. I_ACUM-NUM_NFL_AC.
APPEND I_ACUM. V_FORNEC_SUM_NFL_M = V_FORNEC_SUM_NFL_M + I_ACUM-
SORT I_ACUM BY LIFNR. SUM_NFL_M.
LOOP AT I_ACUM. V_FORNEC_SUM_NFL_AC = V_FORNEC_SUM_NFL_AC +
ON CHANGE OF I_ACUM-LIFNR. I_ACUM-SUM_NFL_AC.
IF V_PRIM_VEZ NE 0. V_FORNEC_SUM_LOT_M = V_FORNEC_SUM_LOT_M + I_ACUM-
I_ACUM_FORNEC-LIFNR = V_FORNEC_LIFNR. SUM_LOT_M.
I_ACUM_FORNEC-SUM_PPM89_M = V_FORNEC_SUM_PPM89_M. V_FORNEC_SUM_LOT_AC = V_FORNEC_SUM_LOT_AC +
I_ACUM_FORNEC-SUM_PPM89_AC = I_ACUM-SUM_LOT_AC.
V_FORNEC_SUM_PPM89_AC. V_FORNEC_SUM_NPT_M = V_FORNEC_SUM_NPT_M + I_ACUM-
I_ACUM_FORNEC-NUM_NFL_M = V_FORNEC_NUM_NFL_M. SUM_NPT_M.
I_ACUM_FORNEC-NUM_NFL_AC = V_FORNEC_NUM_NFL_AC. V_FORNEC_SUM_NPT_AC = V_FORNEC_SUM_NPT_AC +
I_ACUM_FORNEC-SUM_NFL_M = V_FORNEC_SUM_NFL_M. I_ACUM-SUM_NPT_AC.
I_ACUM_FORNEC-SUM_NFL_AC = V_FORNEC_SUM_NFL_AC. V_FORNEC_NUM_NPT_M = V_FORNEC_NUM_NPT_M + I_ACUM-
I_ACUM_FORNEC-SUM_LOT_M = V_FORNEC_SUM_LOT_M. NUM_NPT_M.
I_ACUM_FORNEC-SUM_LOT_AC = V_FORNEC_SUM_LOT_AC. V_FORNEC_NUM_NPT_AC = V_FORNEC_NUM_NPT_AC +
I_ACUM_FORNEC-SUM_NPT_M = V_FORNEC_SUM_NPT_M. I_ACUM-NUM_NPT_AC.
I_ACUM_FORNEC-SUM_NPT_AC = V_FORNEC_SUM_NPT_AC. V_FORNEC_SUM_PPM01_M = V_FORNEC_SUM_PPM01_M +
I_ACUM_FORNEC-NUM_NPT_M = V_FORNEC_NUM_NPT_M. I_ACUM-SUM_PPM01_M.
I_ACUM_FORNEC-NUM_NPT_AC = V_FORNEC_NUM_NPT_AC. V_FORNEC_SUM_PPM01_AC = V_FORNEC_SUM_PPM01_AC +
I_ACUM_FORNEC-SUM_PPM01_M = V_FORNEC_SUM_PPM01_M. I_ACUM-SUM_PPM01_AC.
I_ACUM_FORNEC-SUM_PPM01_AC = V_FORNEC_SUM_ATRAS_M = V_FORNEC_SUM_ATRAS_M +
V_FORNEC_SUM_PPM01_AC. I_ACUM-SUM_ATRAS_M.
I_ACUM_FORNEC-SUM_ATRAS_M = V_FORNEC_SUM_ATRAS_M. V_FORNEC_SUM_ATRAS_AC = V_FORNEC_SUM_ATRAS_AC +
I_ACUM_FORNEC-SUM_ATRAS_AC = I_ACUM-SUM_ATRAS_AC.
V_FORNEC_SUM_ATRAS_AC. V_FORNEC_SUM_EMDIA_M = V_FORNEC_SUM_EMDIA_M +
I_ACUM_FORNEC-SUM_EMDIA_M = I_ACUM-SUM_EMDIA_M.
V_FORNEC_SUM_EMDIA_M. V_FORNEC_SUM_EMDIA_AC = V_FORNEC_SUM_EMDIA_AC +
I_ACUM_FORNEC-SUM_EMDIA_AC = I_ACUM-SUM_EMDIA_AC.
V_FORNEC_SUM_EMDIA_AC.
V_PRIM_VEZ = 1.
APPEND I_ACUM_FORNEC. V_FORNEC_LIFNR = I_ACUM-LIFNR.
CLEAR I_ACUM_FORNEC. ENDLOOP.
CLEAR: V_FORNEC_SUM_PPM89_M,
V_FORNEC_SUM_PPM89_AC, CLEAR: V_TOT_NFL_M, V_TOT_NFL_AC,
V_FORNEC_NUM_NFL_M, V_TOT_LOT_M, V_TOT_LOT_AC,
V_FORNEC_NUM_NFL_AC, V_TOT_PPM_M, V_TOT_PPM_AC,
V_FORNEC_SUM_NFL_M, V_TOT_NPR_M, V_TOT_NPR_AC,
V_FORNEC_SUM_NFL_AC, V_TOT_NPT_M, V_TOT_NPT_AC,
V_FORNEC_SUM_LOT_M, V_TOT_NOTAS_M, V_TOT_NOTAS_AC,
V_FORNEC_SUM_LOT_AC, V_TOT_NCQ_M, V_TOT_NCQ_AC.
V_FORNEC_SUM_NPT_M, * Cálculo dos dados por fornecedor.
V_FORNEC_SUM_NPT_AC,
V_FORNEC_NUM_NPT_M, LOOP AT I_ACUM_FORNEC.
V_FORNEC_NUM_NPT_AC, * Fornecedor
V_FORNEC_SUM_PPM01_M, I_TOT_FORNEC-LIFNR = I_ACUM_FORNEC-LIFNR.
V_FORNEC_SUM_PPM01_AC, * calcula nota de fornecimento-mes.
V_FORNEC_SUM_ATRAS_M, IF I_ACUM_FORNEC-NUM_NFL_M > 0.
V_FORNEC_SUM_ATRAS_AC, V_CHECK_NFL_M = ' '.
V_FORNEC_SUM_EMDIA_M, V_TOT_NFL_M = I_ACUM_FORNEC-SUM_NFL_M /
V_FORNEC_SUM_EMDIA_AC. I_ACUM_FORNEC-NUM_NFL_M.
ENDIF. V_TOT_LOT_M = 100 - ( I_ACUM_FORNEC-SUM_LOT_M /
I_ACUM_FORNEC-NUM_NFL_M ).
ENDON. ELSE.
V_FORNEC_SUM_PPM89_M = V_FORNEC_SUM_PPM89_M + V_CHECK_NFL_M = 'X'.
I_ACUM-SUM_PPM89_M. ENDIF.
V_FORNEC_SUM_PPM89_AC = V_FORNEC_SUM_PPM89_AC +
I_ACUM-SUM_PPM89_AC. * calcula nota de fornecimento-acumulado.
V_FORNEC_NUM_NFL_M = V_FORNEC_NUM_NFL_M + I_ACUM- IF I_ACUM_FORNEC-NUM_NFL_AC > 0.
NUM_NFL_M. V_CHECK_NFL_AC = ' '.

66
ABAP Training
V_TOT_NFL_AC = I_ACUM_FORNEC-SUM_NFL_AC /
I_ACUM_FORNEC-NUM_NFL_AC. * calculo do NCQ acumulado.
V_TOT_LOT_AC = 100 - ( I_ACUM_FORNEC-SUM_LOT_AC / V_TOT_NOTAS_AC = i_acum_fornec-SUM_EMDIA_AC
I_ACUM_FORNEC-NUM_NFL_AC ) . + I_ACUM_FORNEC-SUM_ATRAS_AC.
ELSE.
V_CHECK_NFL_AC = 'X'. IF V_TOT_NOTAS_AC > 0.
ENDIF. V_TOT_NCQ_AC = ( I_ACUM_FORNEC-SUM_EMDIA_AC
/ V_TOT_NOTAS_AC ) * 100.
* calcula nota processo-mes. ELSE.
IF I_ACUM_FORNEC-SUM_PPM01_M > 0. V_TOT_NCQ_AC = 100.
V_TOT_PPM_M = ( i_acum_fornec-SUM_PPM89_M ENDIF.
/ I_ACUM_FORNEC-SUM_PPM01_M ) * C_MI. * Grava os dados para a estrutura i_tot_fornec
ENDIF. * grava nota de fornecimento-mes.
V_TOT_NPR_M = 100 - ( V_TOT_PPM_M / 100 ). IF V_CHECK_NFL_M = 'X'.
I_TOT_FORNEC-NFL_M = ' '.
IF V_TOT_NPR_M < 0. I_TOT_FORNEC-LOT_M = ' '.
V_TOT_NPR_M = 0. ELSE.
ENDIF. WRITE V_TOT_NFL_M TO I_TOT_FORNEC-NFL_M DECIMALS 0
RIGHT-JUSTIFIED.
* calcula nota processo-acumulado. WRITE V_TOT_LOT_M TO I_TOT_FORNEC-LOT_M DECIMALS 2
IF I_ACUM_FORNEC-SUM_PPM01_AC > 0. RIGHT-JUSTIFIED.
V_TOT_PPM_AC = ( I_ACUM_FORNEC-SUM_PPM89_AC ENDIF.
/ I_ACUM_FORNEC-SUM_PPM01_AC ) * C_MI.
ENDIF. * grava nota de fornecimento - acumulado.
V_TOT_NPR_AC = 100 - ( V_TOT_PPM_AC / 100 ). IF V_CHECK_NFL_AC = 'X'.
I_TOT_FORNEC-NFL_AC = ' '.
IF V_TOT_NPR_AC < 0. I_TOT_FORNEC-LOT_AC = ' '.
V_TOT_NPR_AC = 0. ELSE.
ENDIF. WRITE V_TOT_NFL_AC TO I_TOT_FORNEC-NFL_AC DECIMALS 0
RIGHT-JUSTIFIED.
* calcula nota de pontualidade. WRITE V_TOT_LOT_AC TO I_TOT_FORNEC-LOT_AC DECIMALS 2
V_TOT_NPT_M = I_ACUM_FORNEC-SUM_NPT_M / RIGHT-JUSTIFIED.
I_ACUM_FORNEC-NUM_NPT_M. ENDIF.
V_TOT_NPT_AC = I_ACUM_FORNEC-SUM_NPT_AC /
I_ACUM_FORNEC-NUM_NPT_AC. * grava nota de processo - mes
IF V_TOT_NPT_M > 100. IF V_CHECK_NFL_M = 'X'.
V_TOT_NPT_M = 100. I_TOT_FORNEC-PPM_M = ' '.
ENDIF. I_TOT_FORNEC-NPR_M = ' '.
ELSE.
IF V_TOT_NPT_M < 0. WRITE V_TOT_PPM_M TO I_TOT_FORNEC-PPM_M DECIMALS 0
V_TOT_NPT_M = 0. RIGHT-JUSTIFIED.
ENDIF. WRITE V_TOT_NPR_M TO I_TOT_FORNEC-NPR_M DECIMALS 0
RIGHT-JUSTIFIED.
ENDIF.
IF V_TOT_NPT_AC > 100.
V_TOT_NPT_AC = 100. * grava nota processo - acumulado.
ENDIF. IF V_CHECK_NFL_AC = 'X'.
I_TOT_FORNEC-PPM_AC = ' '.
IF V_TOT_NPT_AC < 0. I_TOT_FORNEC-NPR_AC = ' '.
V_TOT_NPT_AC = 0. ELSE.
ENDIF. WRITE V_TOT_PPM_AC TO I_TOT_FORNEC-PPM_AC DECIMALS 0
* calculo do NCQ mes. RIGHT-JUSTIFIED.
V_TOT_NOTAS_M = I_ACUM_FORNEC-SUM_EMDIA_M + WRITE V_TOT_NPR_AC TO I_TOT_FORNEC-NPR_AC DECIMALS 0
I_ACUM_FORNEC-SUM_ATRAS_M. RIGHT-JUSTIFIED.
ENDIF.
IF V_TOT_NOTAS_M > 0.
V_TOT_NCQ_M = ( I_ACUM_FORNEC-SUM_EMDIA_M / * grava nota de pontualidade - mes.
V_TOT_NOTAS_M ) * 100. WRITE V_TOT_NPT_M TO I_TOT_FORNEC-NPT_M DECIMALS 0
ELSE. RIGHT-JUSTIFIED.
V_TOT_NCQ_M = 100.
ENDIF. * grava nota de pontualidade - acumulado.

67
ABAP Training
WRITE V_TOT_NPT_AC TO I_TOT_FORNEC-NPT_AC DECIMALS 0
RIGHT-JUSTIFIED. SORT I_TABFIM BY LIFNR WERKS.

* grava valores de nota de compromisso de qualidade - mes. LOOP AT I_TABFIM.


WRITE V_TOT_NCQ_M TO I_TOT_FORNEC-NCQ_M DECIMALS 0
RIGHT-JUSTIFIED. READ TABLE I_T001W WITH KEY WERKS = I_TABFIM-WERKS.
READ TABLE I_LFA1 WITH KEY LIFNR = I_TABFIM-LIFNR.
* grava valores de nota de compromisso de qualidade - acumulado.
WRITE V_TOT_NCQ_AC TO I_TOT_FORNEC-NCQ_AC DECIMALS 0 ON CHANGE OF I_TABFIM-LIFNR.
RIGHT-JUSTIFIED.
IF V_PRIM_VEZ = 'F'.
* Cálculo do NQF READ TABLE I_TOT_FORNEC WITH KEY LIFNR = V_FORNEC.
* Se NFL e NPR estiverem BRANCOS, passar BRANCO PERFORM F_PRINT_TOTAL_SOPPM.
ENDIF.
IF I_TOT_FORNEC-NFL_M = ' ' AND I_TOT_FORNEC-NPR_M = ' '.
I_TOT_FORNEC-NQF_M = ' '. FORMAT COLOR COL_NORMAL INTENSIFIED ON.
ELSE. WRITE: /02 I_TABFIM-LIFNR,
IF V_TOT_POND <> 0. "mes 15 I_LFA1-NAME1,
V_TOT_NQF_M = ( ( I_TOT_FORNEC-NFL_M * V_FATOR_NFL ) + 170 ' '.
( I_TOT_FORNEC-NPR_M * V_FATOR_NPR ) +
( I_TOT_FORNEC-NCQ_M * V_FATOR_NCQ ) ) / FORMAT COLOR COL_NORMAL.
V_TOT_POND.
WRITE V_TOT_NQF_M TO I_TOT_FORNEC-NQF_M DECIMALS 0. V_PRIM_VEZ = 'F'.
ENDIF.
ENDIF. * Busca valores de OBJ PPM e LOTE
IF I_TOT_FORNEC-NFL_AC = ' ' AND I_TOT_FORNEC-NPR_AC = ' '. READ TABLE I_FORNEC WITH KEY LIFNR = I_TABFIM-LIFNR.
I_TOT_FORNEC-NQF_AC = ' '. ENDON.
ELSE. * Imprimir descrição de Centro
IF V_TOT_POND <> 0. ON CHANGE OF I_TABFIM-WERKS OR I_TABFIM-LIFNR.
V_TOT_NQF_AC = ( ( I_TOT_FORNEC-NFL_AC * V_FATOR_NFL ) FORMAT COLOR COL_NORMAL INTENSIFIED ON.
+ WRITE: /05 I_TABFIM-WERKS,
( I_TOT_FORNEC-NPR_AC * V_FATOR_NPR ) + 15 I_T001W-NAME,
( I_TOT_FORNEC-NCQ_AC * V_FATOR_NCQ ) ) / 170 ' '.
V_TOT_POND. ENDON.
WRITE V_TOT_NQF_AC TO I_TOT_FORNEC-NQF_AC DECIMALS
0. FORMAT COLOR COL_NORMAL.
ENDIF. WRITE: /05 P_MES,
ENDIF. 107 I_TABFIM-PPM_M HOTSPOT ON,
119 I_FORNEC-PPM_OBJ,
* grava dados da tabela i_tot_fornec 137 I_TABFIM-LOT_M,
APPEND I_TOT_FORNEC. 147 I_FORNEC-LOT_OBJ,
CLEAR I_TOT_FORNEC. 170 ' '.
ENDLOOP. HIDE: I_TABFIM-LIFNR, I_TABFIM-WERKS.
FORMAT COLOR COL_NORMAL.
FORMAT COLOR COL_NORMAL.
ENDFORM. " F_CALC_ACUM WRITE: /05 'Acum.', P_PERIOD, 'Mes(es)',
*&---------------------------------------------------------------------* 107 I_TABFIM-PPM_AC HOTSPOT ON,
*& Form F_PRINT_SOPPM 137 I_TABFIM-LOT_AC,
*&---------------------------------------------------------------------* 170 ' '.
* imprime somente PPM * HIDE: I_TABFIM-LIFNR, I_TABFIM-WERKS.
*----------------------------------------------------------------------* * Armazena o Número do fornecedor para pesquisa na tabela i_tot_fornec
FORM F_PRINT_SOPPM. V_FORNEC = I_TABFIM-LIFNR.
DATA: V_FORNEC LIKE QALS-LIFNR. "Nr. do fornecedor AT LAST.
READ TABLE I_TOT_FORNEC WITH KEY LIFNR = V_FORNEC.
DESCRIBE TABLE I_TABFIM LINES V_LINHAS. PERFORM F_PRINT_TOTAL_SOPPM.
ENDAT.
IF V_LINHAS EQ 0. FORMAT COLOR COL_NORMAL.
MESSAGE I083 WITH ENDLOOP.
'Não há dados para os critérios de seleção' 'informados'. ULINE.
EXIT. IF SO_CENT EQ '' AND SO_FORNE EQ '' AND SO_MATNR EQ ''.
ENDIF. PERFORM F_PRINT_TOTAL_CENTRO_SOPPM.

68
ABAP Training
PERFORM F_PRINT_TOTAL_ACUM_SOPPM.
ELSEIF SO_CENT NE '' AND SO_FORNE EQ '' AND SO_MATNR EQ ''. ENDFORM.
PERFORM F_PRINT_TOTAL_CENTRO_SOPPM. *----------------------------------------------------------------------*
ENDIF. * Form f_print_total_soppm.
ENDFORM. " F_PRINT_SOPPM *----------------------------------------------------------------------*
* Imprime total do rel. somente PPM e Lote
*&---------------------------------------------------------------------* *----------------------------------------------------------------------*
*& Form F_PRINT_RSUM FORM F_PRINT_TOTAL_SOPPM.
*&---------------------------------------------------------------------*
* imprime relatório sumarizado * FORMAT COLOR COL_TOTAL.
*----------------------------------------------------------------------* WRITE: /05 'Acum mês MTB ',
FORM F_PRINT_RSUM. 107 I_TOT_FORNEC-PPM_M,
IF SO_CENT EQ '' AND SO_FORNE EQ '' AND SO_MATNR EQ ''. 137 I_TOT_FORNEC-LOT_M,
PERFORM F_PRINT_TOTAL_FINAL. 170 ' '.
PERFORM F_PRINT_TOTAL_ACUM.
ELSEIF SO_CENT NE '' AND SO_FORNE EQ '' AND SO_MATNR EQ ''. WRITE: /05 'Acum MTB(' NO-GAP, P_PERIOD, 'meses)',
PERFORM F_PRINT_TOTAL_FINAL. 107 I_TOT_FORNEC-PPM_AC,
ELSE. 137 I_TOT_FORNEC-LOT_AC,
MESSAGE E083 WITH 'Não é possível imprimir' 170 ' '.
'com o modo de apresentação' FORMAT COLOR COL_NORMAL.
'escolhido'.
ENDIF. ENDFORM.

ENDFORM. " F_PRINT_RSUM


*&---------------------------------------------------------------------*
*& Form f_print_total_centro_soppm. --------------------------------------------------------------------------------
*&---------------------------------------------------------------------*
* Imprime o total final.
Formulário Z_AVAL_FORNEC
--------------------------------------------------------------------------------
*----------------------------------------------------------------------*
FORM F_PRINT_TOTAL_CENTRO_SOPPM.
Mandante 200
FORMAT COLOR COL_TOTAL.
Idioma P
WRITE: /03 'ACUM NO CENTRO',
Original lang. E
170 ' '.
Status Active
SORT I_TOT_CENTRO BY WERKS.
Layout set class FMHN Dunning reports
Development class ZGAL Classe de desenvolvimento Projeto Galileo
LOOP AT I_TOT_CENTRO.
CLEAR: I_T001W.
Created by SAP Changed by ACSATOS
READ TABLE I_T001W WITH KEY WERKS = I_TOT_CENTRO-
Date 11.07.1993 Date 09.06.1999
WERKS.
Time 16:24:01 Time 15:38:09
WRITE: /03 I_TOT_CENTRO-WERKS,
Release 20A Release 30F
I_T001W-NAME,
107 I_TOT_CENTRO-PPM,
Significado Relatório de Aval. Fornecedor
137 I_TOT_CENTRO-LOT,
170 ' '.
ENDLOOP.
Standard attributes
ULINE.
First page FIRST
Default paragr. AS
ENDFORM.
Tab stop 5,00 CH
*&---------------------------------------------------------------------*
Page format DINA4
*& Form f_print_total_acum_soppm.
Orientation Portrait
*&---------------------------------------------------------------------*
Lines/inch 6,00
* Imprime o total final acum.
Characters/inch 10,00
*----------------------------------------------------------------------*
FORM F_PRINT_TOTAL_ACUM_SOPPM.
Font attributes
WRITE: /03 'ACUM NO MTB',
Font family HELVE
170 ' '.
Font size 12,0 Point
WRITE: /107 I_ACUM_MTB-PPM_AC,
Bold No
137 I_ACUM_MTB-LOT_AC,
Italic No
170 ' '.
Underlined No
ULINE.

69
ABAP Training
56,00 CH Left-aligned
60,00 CH Left-aligned

-------------------------------------------------------------------------------- FO
Characters Attributes Standard attributes
-------------------------------------------------------------------------------- Line spacing 1,00 LN
Alignment Left-aligned
B Bold print Font attributes
Standard attributes Font family COURIER
Marker No Font size 6,0 Point
Font attributes
Bold Yes P0 par. cabeçalho verso
Standard attributes
I Italics Line spacing 1,00 LN
Font attributes Alignment Left-aligned
Italic Yes Font attributes
Font family COURIER
K Key word Font size 6,0 Point
Font attributes Tabs
Font family HELVE 1,00 CM Left-aligned
Font size 10,0 Point 4,50 CM Left-aligned
5,50 CM Left-aligned
LP 7,60 CM Left-aligned
Font attributes 12,70 CM Left-aligned
Font family COURIER
Font size 8,0 Point P1 PARÁGRAFO HEADER
Standard attributes
S Key word (lower case) Line spacing 1,00 LN
Font attributes Alignment Left-aligned
Font family HELVE Font attributes
Font size 8,0 Point Font family COURIER
Font size 10,0 Point
U Underlined Tabs
Font attributes 30,00 CH Left-aligned
Underlined Yes 44,00 CH Left-aligned
50,00 CH Left-aligned
62,00 CH Left-aligned
--------------------------------------------------------------------------------
Paragraphs Attributes P2
-------------------------------------------------------------------------------- Standard attributes
Line spacing 1,00 LN
AS Standard Alignment Left-aligned
Standard attributes Font attributes
Line spacing 1,00 LN Font family COURIER
Alignment Left-aligned Font size 10,0 Point
Tabs Tabs
12,00 CH Left-aligned 20,00 CH Left-aligned
35,00 CH Left-aligned 25,00 CH Left-aligned
30,00 CH Left-aligned
DE Detalhe 35,00 CH Left-aligned
Standard attributes 40,00 CH Left-aligned
Line spacing 1,00 LN 45,00 CH Left-aligned
Alignment Left-aligned
Font attributes P3
Font family HELVE Standard attributes
Font size 10,0 Point Line spacing 1,00 LN
Tabs Alignment Left-aligned
11,00 CH Left-aligned Font attributes
16,00 CH Left-aligned Font family COURIER
26,00 CH Left-aligned Font size 10,0 Point
46,00 CH Left-aligned Tabs

70
ABAP Training
2,00 CH Left-aligned 4,50 CM Left-aligned
37,00 CH Left-aligned 5,50 CM Left-aligned
42,00 CH Left-aligned 7,60 CM Left-aligned
47,00 CH Left-aligned 12,70 CM Left-aligned
52,00 CH Left-aligned
57,00 CH Left-aligned T3 Tabulator for line items
62,00 CH Left-aligned Standard attributes
Line spacing 1,00 LN
P4 No blank lines Yes
Standard attributes Alignment Left-aligned
Line spacing 1,00 LN Tabs
Alignment Left-aligned 3,00 CM Left-aligned
Font attributes 6,00 CM Left-aligned
Font family COURIER 11,00 CM Sign, right-aligned
Font size 10,0 Point 12,00 CM Left-aligned
Tabs 16,50 CM Right-aligned
2,00 CH Left-aligned 17,00 CM Left-aligned
33,00 CH Left-aligned
39,00 CH Left-aligned TI Title in info window
45,00 CH Left-aligned Standard attributes
51,00 CH Left-aligned Line spacing 1,00 LN
57,00 CH Left-aligned Alignment Left-aligned
63,00 CH Left-aligned Font attributes
Font family HELVE
P5 Font size 14,0 Point
Standard attributes Bold Yes
Line spacing 1,00 LN
Alignment Left-aligned UL Separator
Font attributes Standard attributes
Font family COURIER Line spacing 0,50 LN
Font size 8,0 Point Space after 0,50 LN
Tabs Alignment Left-aligned
2,00 CH Left-aligned Font attributes
33,00 CH Left-aligned Font family COURIER
39,00 CH Left-aligned Font size 12,0 Point
45,00 CH Left-aligned Underlined No
51,00 CH Left-aligned
57,00 CH Left-aligned
63,00 CH Left-aligned --------------------------------------------------------------------------------
Windows Attributes
P6 --------------------------------------------------------------------------------
Standard attributes
Line spacing 1,00 LN FOOTER rodapé
Alignment Left-aligned Window type CONST
Font attributes
Font family COURIER HEADER cabeçalho
Font size 6,0 Point Window type CONST
Tabs
1,00 CH Left-aligned INFO3 Endereço
24,00 CH Left-aligned Window type VAR
50,00 CH Left-aligned
MAIN Janela Principal
P7 Window type MAIN
Standard attributes
Line spacing 0,45 LN
Alignment Left-aligned --------------------------------------------------------------------------------
Font attributes Pages Attributes
Font family COURIER --------------------------------------------------------------------------------
Font size 6,0 Point
Tabs FIRST Payment reminder: 1st page
1,00 CM Left-aligned Standard attributes

71
ABAP Training
Next page VERSO P1 ,,ATIVO NO MÊS,,: &ZSAPSCRIP2-ATIVO&,,PPM
Page counter ACUMULADO,,:&ZSAPSCRIP2-PPM_AC&
Mode INC
Numbering type Arabic numerals
Page window
MAIN Left margin 4,00 CH INFO3
Upper margin 10,00 LN
Window width 70,00 CH /* Criado por Antonio Celso Hunnicutt Cortada - 16/02/2001
Window height 55,00 LN /* Relatório de Avaliação de Forncedore - Português
FOOTER Left margin 4,00 CH /* Request :MD0K914497
Upper margin 65,00 LN /* ************************************************************************
Window width 70,00 CH /: BOX XPOS '0.5' CM YPOS '0.3' LN WIDTH '16.5' CM HEIGHT '1.2' LN
Window height 4,00 LN FRAME 10 TW
HEADER Left margin 4,00 CH /: BOX XPOS '0.5' CM YPOS '1.5' LN WIDTH '3.5' CM HEIGHT 6 LN
Upper margin 2,00 LN FRAME 10 TW
Window width 70,00 CH /: BOX XPOS '4' CM YPOS '1.5' LN WIDTH '3.5' CM HEIGHT 6 LN
Window height 8,00 LN FRAME 10 TW
/: BOX XPOS '7.5' CM YPOS '1.5' LN WIDTH 5 CM HEIGHT 3 LN FRAME
VERSO Verso da carta 10 TW
Standard attributes /: BOX XPOS '7.5' CM YPOS '1.5' LN WIDTH 5 CM HEIGHT 6 LN FRAME
Next page FIRST 10 TW
Page counter /: BOX XPOS '12.5' CM YPOS '1.5' LN WIDTH '4.5' CM HEIGHT 6 LN
Mode START FRAME 10 TW
Numbering type Arabic numerals /*
Page window /*
INFO3 Left margin 4,00 CH P0 ,,,, <K><B>PARA USO DO CORREIO</></>
Upper margin 2,00 LN /: BOX XPOS '0.7' CM YPOS '2.5' LN WIDTH 01 CH HEIGHT 3 MM
Window width 70,00 CH FRAME 10 TW
Window height 58,00 LN /: BOX XPOS '4.2' CM YPOS '2.5' LN WIDTH 01 CH HEIGHT 3 MM
FRAME 10 TW
P0 ,,,,,,,,DATA,,ASSINATURA E Nº ENTREGADOR
-------------------------------------------------------------------------------- P0 ,, MUDOU-SE,, NÃO PROCURADO
Text elements for following windows: /: BOX XPOS '0.7' CM YPOS '3.5' LN WIDTH 01 CH HEIGHT 3 MM
-------------------------------------------------------------------------------- FRAME 10 TW
/: BOX XPOS '4.2' CM YPOS '3.5' LN WIDTH 01 CH HEIGHT 3 MM
FOOTER FRAME 10 TW
P0 ,, ENDEREÇO INSUF.,, AUSENTE
P6 ,,NQF=NOTA DA QUALIDADE DE FORNECIMENTO,,NAS=NOTA /: BOX XPOS '0.7' CM YPOS '4.5' LN WIDTH 01 CH HEIGHT 3 MM
DA AVALIAÇÃO DE FRAME 10 TW
SISTEMA /: BOX XPOS '4.2' CM YPOS '4.5' LN WIDTH 01 CH HEIGHT 3 MM
P6 ,,NFL=NOTA DE FORNECIMENTO DE LOTES,,NCQ=NOTA FRAME 10 TW
COMPROM. COM QUALIDADE P0 ,, NÃO EXISTE,, FALECIDO,,,,REINTEGRADO AO SERVIÇO POSTAL
(ITENS) EM
P6 ,,NPR=NOTA DE PROCESSO(PPM DE LINHA),,NPT=NOTA DE /: BOX XPOS '0.7' CM YPOS '5.5' LN WIDTH 01 CH HEIGHT 3 MM
PONTUALIDADE FRAME 10 TW
/: BOX XPOS '4.2' CM YPOS '5.5' LN WIDTH 01 CH HEIGHT 3 MM
FRAME 10 TW
P0 ,, DESCONHECIDO,, INFORMAÇÃO ESCRITA
HEADER P0 ,, RECUSADO,,P/ PORTEIRO/SÍNDICO
/: BOX XPOS '0.7' CM YPOS '6.5' LN WIDTH 01 CH HEIGHT 3 MM
/: INCLUDE TESTE3 OBJECT TEXT ID ST FRAME 10 TW
/: BOX YPOS '0.3' LN WIDTH '72' CH HEIGHT '63' LN FRAME 10 TW AS
/: BOX YPOS '0.3' LN WIDTH '7.2' CM HEIGHT '5' LN FRAME 10 TW AS
P1 ,,RELATÓRIO DE AVALIAÇÃO DO FORNECEDOR AS
P1 ,,DATA DE REFERÊNCIA : &ZSAPSCRIP2-DATA_REF& AS
P1 ,,ACUMULADO DE : &ZSAPSCRIP2-ACUM_DT1& ATÉ AS
&ZSAPSCRIP2-ACUM_DT2& /: INCLUDE TESTE3 OBJECT TEXT ID ST
P1 ,,FORN: &zsapscrip2-lifnr& AS
P1 ,,&ZSAPSCRIP2-NAMEF& AS
P1 ,,AVALIADO,,: &ZSAPSCRIP2-AVALIA&,,PPM MÊS,,:&ZSAPSCRIP2- /: BOX XPOS 1 CH YPOS 19 LN WIDTH 67 CH HEIGHT 06 LN
PPM_M& INTENSITY 35

72
ABAP Training
/: BOX XPOS 1 CH YPOS 25 LN WIDTH 09 CH HEIGHT 6 LN AS <K>,, ESTADO : &ZSAPSCRIP2-REM_REG&,, &ZSAPSCRIP2-
INTENSITY 35 REM_PAIS&
/: BOX XPOS 10 CH YPOS 25 LN WIDTH 50 CH HEIGHT 6 LN FRAME AS <K>,, ÁREA DE SUPRIMENTOS
10 TW INTENSITY 0
/: BOX XPOS 60 CH YPOS 25 LN WIDTH 8 CH HEIGHT 6 LN
INTENSITY 35
/: BOX XPOS 1 CH YPOS 31 LN WIDTH 67 CH HEIGHT 08 LN MAIN
INTENSITY 35
/* /* Criado por Antonio Celso Hunnicutt Cortada - 16/02/2001
/: BOX XPOS 1 CH YPOS 42 LN WIDTH 67 CH HEIGHT 8 LN /* Relatório de Avaliação de Forncedore - Português
INTENSITY 35 /* Request :MD0K914497
/: BOX XPOS 1 CH YPOS 50 LN WIDTH 09 CH HEIGHT 6 LN /* Alteração Funcional - Inclusão NPT por Unidade - MD0K915742
INTENSITY 35 /* Correção - MD0K915748
/: BOX XPOS 10 CH YPOS 50 LN WIDTH 50 CH HEIGHT 6 LN FRAME /* Alteração Funcional - Modificação NPT - MD0K915806
10 TW INTENSITY 0 /* Ajuste do layout - MD0K915848
/: BOX XPOS 60 CH YPOS 50 LN WIDTH 8 CH HEIGHT 6 LN /* ************************************************************************
INTENSITY 35
/: BOX XPOS 1 CH YPOS 56 LN WIDTH 67 CH HEIGHT 02 LN Element RESUMO_TODAS_UNIDADES
INTENSITY 35 /: BOX XPOS '19.5' CH YPOS '1.3' LN WIDTH '5' CH HEIGHT '6' LN
/ FRAME 10 TW
/ /: BOX XPOS '24.5' CH YPOS '1.3' LN WIDTH '5' CH HEIGHT '6' LN
/ FRAME 10 TW
/ /: BOX XPOS '29.5' CH YPOS '1.3' LN WIDTH '5' CH HEIGHT '6' LN
/ FRAME 10 TW
/ /: BOX XPOS '34.5' CH YPOS '1.3' LN WIDTH '5' CH HEIGHT '6' LN
/ FRAME 10 TW
/ /: BOX XPOS '39.5' CH YPOS '1.3' LN WIDTH '5' CH HEIGHT '6' LN
/ FRAME 10 TW
/ /: BOX XPOS '44.5' CH YPOS '1.3' LN WIDTH '5' CH HEIGHT '6' LN
/ FRAME 10 TW
AS <K>,, &ZSAPSCRIP2-DEST_NAME& /: BOX XPOS '19.5' CH YPOS '1.3' LN WIDTH '30' CH HEIGHT '1' LN
AS <K>,, &ZSAPSCRIP2-DEST_RUA& &ZSAPSCRIP2-DEST_CAIXA& FRAME 10 TW
AS <K>,, CEP: &ZSAPSCRIP2-DEST_CEP& &ZSAPSCRIP2- /: BOX XPOS '34.5' CH YPOS '2.3' LN WIDTH '15' CH HEIGHT '1' LN
DEST_CITY& FRAME 10 TW
AS <K>,, ESTADO : &ZSAPSCRIP2-DEST_REG&,, &ZSAPSCRIP2- /: BOX XPOS '34.5' CH YPOS '3.3' LN WIDTH '15' CH HEIGHT '1' LN
DEST_PAIS& FRAME 10 TW
AS <K>,, A/C DEPTO. VENDAS /: BOX XPOS '34.5' CH YPOS '4.3' LN WIDTH '15' CH HEIGHT '1' LN
/ FRAME 10 TW
/ /: BOX XPOS '19.5' CH YPOS '5.3' LN WIDTH '30' CH HEIGHT '1' LN
/ FRAME 10 TW
/ /: BOX XPOS '19.5' CH YPOS '6.3' LN WIDTH '30' CH HEIGHT '1' LN
/ FRAME 10 TW
/ P2 ,, ***RESUMO DE TODAS AS UNIDADES***
/ P2 ,,NOTA,,MÊS,,ACU,,NOTA,,MÊS,,ACU
/ P2 ,,NQF,,<LP>&ZSAPSCRIP2-NQF_M_T&,,&ZSAPSCRIP2-
/ NQF_AC_T&</>,,NFL
/ ,,<LP>&ZSAPSCRIP2-NFL_M_T&,,&ZSAPSCRIP2-NFL_AC_T&</>
/ P2 ,,,,,,,,NPR,,<LP>&ZSAPSCRIP2-NPR_M_T&,,&ZSAPSCRIP2-
/ NPR_AC_T&</>
/ P2 ,,,,,,,,NCQ,,<LP>&ZSAPSCRIP2-NCQ_M_T&,,&ZSAPSCRIP2-
/ NCQ_AC_T&</>
/ P2 ,,NAS,, <LP>&ZSAPSCRIP2-NAS_M_T&</>,,-,,-,,-,,-
/ P2 ,,NPT,, <LP>&ZSAPSCRIP2-NPT_M_T&</>,, <LP>&ZSAPSCRIP2-
/ NPT_AC_T&</>
/
AS Element RESUMO_POR_UNIDADE
AS /: PROTECT
AS <K>,, &ZSAPSCRIP2-REM_NAME& /: IF &ZSAPSCRIP2-CONT& > 253
AS <K>,, &ZSAPSCRIP2-REM_RUA& &ZSAPSCRIP2-REM_CAIXA& /: POSITION YORIGIN '12.7' MM
AS <K>,, CEP: &ZSAPSCRIP2-REM_CEP& &ZSAPSCRIP2-REM_CITY& /: ENDIF

73
ABAP Training
/: BOX XPOS '36.5' CH YPOS '9.3' LN WIDTH '10' CH HEIGHT '1' LN P3 ,,,,,,,,NCQ,,<LP>&ZSAPSCRIP2-NCQ_M&,,&ZSAPSCRIP2-
FRAME 10 TW NCQ_AC&</>
/: BOX XPOS '61.5' CH YPOS '9.3' LN WIDTH '7' CH HEIGHT '2' LN /: ENDPROTECT
FRAME 10 TW
/: BOX XPOS '1.5' CH YPOS '10.3' LN WIDTH '35' CH HEIGHT '1' LN Element RESUMO_INDICES_PPM
FRAME 10 TW /: PROTECT
/: BOX XPOS '36.5' CH YPOS '10.3' LN WIDTH '5' CH HEIGHT '1' LN /: IF &ZSAPSCRIP2-CONT& > 270
FRAME 10 TW /: POSITION YORIGIN '29.6' MM
/: BOX XPOS '41.5' CH YPOS '10.3' LN WIDTH '5' CH HEIGHT '1' LN /: ENDIF
FRAME 10 TW /: BOX XPOS '32.5' CH YPOS '5.3' LN WIDTH '18' CH HEIGHT '2' LN
/: BOX XPOS '46.5' CH YPOS '10.3' LN WIDTH '5' CH HEIGHT '1' LN FRAME 10 TW
FRAME 10 TW /: BOX XPOS '50.5' CH YPOS '5.3' LN WIDTH '18' CH HEIGHT '2' LN
/: BOX XPOS '51.5' CH YPOS '10.3' LN WIDTH '5' CH HEIGHT '1' LN FRAME 10 TW
FRAME 10 TW /: BOX XPOS '1.5' CH YPOS '6.3' LN WIDTH '67' CH HEIGHT 1 LN
/: BOX XPOS '56.5' CH YPOS '10.3' LN WIDTH 12 CH HEIGHT '1' LN FRAME 10 TW
FRAME 10 TW /: BOX XPOS '38.5' CH YPOS '6.3' LN WIDTH '6' CH HEIGHT '1' LN
P2 FRAME 10 TW
P2 ,, ***RESUMO POR UNIDADE*** /: BOX XPOS '56.5' CH YPOS '6.3' LN WIDTH '6' CH HEIGHT '1' LN
P3 ,,,, N.Q.F.,,,,,,,,,, NPT FRAME 10 TW
P3 ,,UNIDADE,,MÊS,,ACU,,NOTA,,MÊS,,ACU,,MÊS/ACU P4
/: ENDPROTECT P4 ,, *** RESUMO DOS ÍNDICES DE PPM DE LINHA E % REJEIÇÃO DE
LOTE NO
Element DETALHE_RESUMO_POR_UNIDADE RECEBIMENTO ***
/: PROTECT P4 ,,,, PPM DE LINHA,,,,,, % REJEIÇÃO LOTE
/: POSITION YORIGIN &ZSAPSCRIP2-CONT& MM P4 ,,UNIDADE,,MÊS,,ACU,,OBJ,,MÊS,,ACU,,OBJ
/: BOX XPOS '1.5' CH YPOS '0.3' LN WIDTH '35' CH HEIGHT '3' LN /: ENDPROTECT
FRAME 10 TW
/: BOX XPOS '36.5' CH YPOS '0.3' LN WIDTH '5' CH HEIGHT '3' LN Element DETALHE_RESUMO_INDICES_PPM
FRAME 10 TW /: POSITION YORIGIN &ZSAPSCRIP2-CONT& MM
/: BOX XPOS '41.5' CH YPOS '0.3' LN WIDTH '5' CH HEIGHT '3' LN /: PROTECT
FRAME 10 TW /: BOX XPOS '1.5' CH YPOS '0.3' LN WIDTH '31' CH HEIGHT '1' LN
/: BOX XPOS '46.5' CH YPOS '0.3' LN WIDTH '5' CH HEIGHT '1' LN FRAME 10 TW
FRAME 10 TW /: BOX XPOS '32.5' CH YPOS '0.3' LN WIDTH '6' CH HEIGHT '1' LN
/: BOX XPOS '46.5' CH YPOS '1.3' LN WIDTH '5' CH HEIGHT '1' LN FRAME 10 TW
FRAME 10 TW /: BOX XPOS '38.5' CH YPOS '0.3' LN WIDTH '6' CH HEIGHT '1' LN
/: BOX XPOS '46.5' CH YPOS '2.3' LN WIDTH '5' CH HEIGHT '1' LN FRAME 10 TW
FRAME 10 TW /: BOX XPOS '44.5' CH YPOS '0.3' LN WIDTH '6' CH HEIGHT '1' LN
/: BOX XPOS '51.5' CH YPOS '0.3' LN WIDTH '5' CH HEIGHT '1' LN FRAME 10 TW
FRAME 10 TW /: BOX XPOS '50.5' CH YPOS '0.3' LN WIDTH '6' CH HEIGHT '1' LN
/: BOX XPOS '51.5' CH YPOS '1.3' LN WIDTH '5' CH HEIGHT '1' LN FRAME 10 TW
FRAME 10 TW /: BOX XPOS '56.5' CH YPOS '0.3' LN WIDTH '6' CH HEIGHT '1' LN
/: BOX XPOS '51.5' CH YPOS '2.3' LN WIDTH '5' CH HEIGHT '1' LN FRAME 10 TW
FRAME 10 TW /: BOX XPOS '62.5' CH YPOS '0.3' LN WIDTH '6' CH HEIGHT '1' LN
/: BOX XPOS '56.5' CH YPOS '0.3' LN WIDTH 5 CH HEIGHT '1' LN FRAME 10 TW
FRAME 10 TW P5 ,,&ZSAPSCRIP2-NAMEC&,,&ZSAPSCRIP2-
/: BOX XPOS '56.5' CH YPOS '1.3' LN WIDTH 5 CH HEIGHT '1' LN PPM_M_I&,,&ZSAPSCRIP2-PPM_AC_I&
FRAME 10 TW ,,&ZSAPSCRIP2-PPM_OBJ_R&,,&ZSAPSCRIP2-LOT_M&
/: BOX XPOS '56.5' CH YPOS '2.3' LN WIDTH 5 CH HEIGHT '1' LN ,,&ZSAPSCRIP2-LOT_AC&,,&ZSAPSCRIP2-LOT_OBJ_R&
FRAME 10 TW /: ENDPROTECT
/: BOX XPOS '61.5' CH YPOS '0.3' LN WIDTH '7' CH HEIGHT '1' LN
FRAME 10 TW
/: BOX XPOS '61.5' CH YPOS '1.3' LN WIDTH '7' CH HEIGHT '1' LN
FRAME 10 TW
/: BOX XPOS '61.5' CH YPOS '2.3' LN WIDTH '7' CH HEIGHT '1' LN
FRAME 10 TW
P3 ,,<LP>&ZSAPSCRIP2-NAMEC&,,&ZSAPSCRIP2-NQF_M&
,,&ZSAPSCRIP2-NQF_AC&</>,,NFL,,<LP>&ZSAPSCRIP2-NFL_M&
,,&ZSAPSCRIP2-NFL_AC&,,&ZSAPSCRIP2-NPT_M&/&ZSAPSCRIP2-
NPT_AC&</>
P3 ,,,,,,,,NPR,,<LP>&ZSAPSCRIP2-NPR_M&,,&ZSAPSCRIP2-
NPR_AC&</>

74
ABAP Training

EXERCÍCIOS
SAPSCRIPT

75
ABAP Training

Exercício 1:

Desenvolver um programa Z_EXC_SAP_1_AL## que permita que o usuário visualize ou


imprima um formulário com os códigos dos Materiais, a descrição, o tipo e o centro.
Permitir a ordenação dos dados por centro, tipo e material

Tabelas: MARA
MARC
MAKT

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).

O relatório deve apresentar o layout abaixo:

Dica: para fazer os quadros ao redor dos itens, não utilizar o comando BOX, usar a
alternativa apresentada anteriormente na apostila. Nos demais locais, utilizar esse
comando.

76
ABAP Training

MATERIAIS
Centro: xxxxxxxx data: dd/mm/aaaa

Código do Material Descrição Tipo


000000 xxxxxxxxxxxxxxxxxxxxxxxxx XXXX
000000 xxxxxxxxxxxxxxxxxxxxxxxxx XXXX
000000 xxxxxxxxxxxxxxxxxxxxxxxxx XXXX
000000 xxxxxxxxxxxxxxxxxxxxxxxxx XXXX

Total de Materiais no Centro: 00

77
ABAP Training

Resolução 1:

1) Report:
************************************************************************
* *
* ******************************************** *
* * Confidencial e P roprietário * *
* * Copyright 2001, Accenture * *
* * Todos os direitos reservados * *
* ******************************************** *
* *
* Nome do Shell: Z_TEMPLATE_REPORT Versão do Shell: v1.03 *
* *
********************************** **************************************
* Nome do Programa : Z_EXC_SAPSCRIPT *
* Título do Programa : Programa de impressão dos materiais por centro *
* Programador : Aluno do curso de ABAP *
* Data : 29/03/2001 *
* Última atualização : 29/03/2001 *
* *
* Descrição : Este é um programa para a visualização de materiais *
* ou impressão dos dados, de acordo com o parâmetro *
* selecionado pelo usuário *
* Include : *
* *
* Calls : *
* *
* Módulos de Funções: *
* *
*---------------------------------------------------------------------- *
* Lista de Modificações: *
* Data Autor Corr. # Descrição *
* 29/03/2001 ABAPDEV1 AF1K900023 Desenvolvimento inicial do prg *
* *
************************************* ***********************************
REPORT Z_EXC_REPORT_1_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 DECLA RAÇÃO DE DADOS "
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
************************************************************************
* Includes *
******************** ****************************************************
*INCLUDE:
* ZZIHEADR. "Cabeçalho padrão de report

************************************************************************
* Tabelas *
************************************************************************
TABLES: mara,
marc,
makt.

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

*- Variáveis --------------------------------------------------------- *
DATA:
V_CONT TYPE I VALUE 0. " contador

78
ABAP Training
*- Tabela Interna ----------------------------------------------------- *

* tabela interna para armazenar o código e o tipo do material


DATA: BEGIN OF I_mara OCCURS 100,
matnr like mara -matnr ,
mtart like mara -mtart ,
END OF I_mara.

* tabela interna para armazenar os materiais por centro


DATA: BEGIN OF I_marc OCCURS 200,
matnr like marc -matnr ,
werks like marc -werks ,
END OF I_marc.

* tabela interna para armazenar a descrição dos materiais


DATA: BEGI N OF I_makt OCCURS 100,
matnr like makt -matnr ,
maktx like makt -maktx ,
END OF I_makt.

* tabela final contendo todos os dados


DATA: BEGIN OF I_final OCCURS 200,
matnr like mara -matnr ,
mtart like mara -mtart ,
werks like marc -werks ,
maktx like makt -maktx ,
END OF I_final.

************************************************************************
* Parâmetros de entrada : *
* Select Options (S_...) *
* Parameters (P_...) *
************************************************************************
SELECTION -SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE T1.

select-options: s_ matnr for mara -matnr, " cód material


s_mtart for mara -mtart, " tipo de material
s_werks for marc -werks. " centro

SELECTION -SCREEN END OF BLOCK B1.

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

parameters: p_cod radiobutton group g1, " ordenado por código


p_desc radiobutton group g1, " ordenado por descrição
p_centro radiobutton group g1, " ordenado por centro
p_tipo radiobutton group g1. " ordenado por tipo

SELECTION -SCREEN END OF BLOCK B2.

SELECTION -SCREEN BEGIN OF BLOCK B3 WITH FRAME TITLE T3.

parameters: p_SCREEN radiobutton group g3, " visualização dos dados


p_SCRIPT radiobutton group g3. " impressão do formulário

SELECTION -SCREEN END OF BLOCK B3.

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

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

T2 = 'Relatório Ordenado Por:'.


T3 = 'Opções de saída '.

*---------------------------------------------------------------------- *
*AT SELECTION -SCREEN. "Tratamento de Erros e lógica para tela de seleção
*---------------------------------------------------------------------- *

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

79
ABAP Training
*---------------------------------------------------------------------- *
* seleciona os dados
PERFORM F_SELECT_DATA.

* imprime os dados
PERFORM F _PRINT_REPORT.

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

*-------------------- -------------------------------------------------- *
AT LINE-SELECTION. "Seleção da linha do relatório
*---------------------------------------------------------------------- *

set parameter id 'MAT' field i_final -matnr. "Seta variável que envolve
"transação

call transaction 'MM03' and skip first screen. "Chama transação


"consulta de materiais

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

format color 2.
write: 'Código', 20 'Descrição do Material', 61 'Tipo', 66 'Centro' .

*---------------------------------------------------------------------- *
*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 matnr
mtart
from mara
into table i_mara
where matnr in s_matnr
and mtart in s_mtart.
if sy-subrc ne 0.
message e001.
endif.

select matnr
werks
from marc
into table i_marc
for all entries in i_mara
where matnr = i_mara -matnr
and werks in s_werks.

select matnr
maktx
from makt
into table i_makt
for all entries in i_mara
where matnr = i_mara -matnr.

* lê os dados p ara juntá -los em uma tabela interna final


loop at i_marc.
read table i_mara with key matnr = i_marc -matnr.

if sy -subrc eq 0.
read table i_makt with key matnr = i_mara -matnr.

80
ABAP Training
if sy -subrc eq 0.
i_final -matnr = i_mara -matnr .
i_final -mtart = i_mara -mtart .
i_final -werks = i_marc -werks .
i_final -maktx = i_makt -maktx .
append i_final.
endif.
endif.
endloop.

ENDFORM. " F_SELECT_DATA

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

**********************************
*Classifica a tabela final
**********************************
if p_screen EQ 'X'.
if p_cod eq 'X'.
sort i_final by matnr maktx werks.
elseif p_desc eq 'X'.
sort i_final by maktx w erks.
elseif p_tipo eq 'X'.
sort i_final by mtart maktx werks.
elseif p_centro eq 'X'.
sort i_final by werks maktx.
endif.
else.
if p_cod eq 'X'.
sort i_final by werks matnr maktx.
elseif p_desc eq 'X'.
sort i_ final by werks maktx.
elseif p_tipo eq 'X'.
sort i_final by werks mtart maktx.
elseif p_centro eq 'X'.
sort i_final by werks maktx.
endif.
endif.
**********************************
*Imprime a tabela final
************************* *********

* se a opção do usuário for imprimir o formulário


if p_script eq 'X'.

* abre o formulário
CALL FUNCTION 'OPEN_FORM'
EXPORTING
DEVICE = 'PRINTER'
FORM = 'Z_EXC_SAPSCRIT'
LANGUAGE = ' P'.

* inicializa o formulário
CALL FUNCTION 'START_FORM'
EXPORTING
FORM = 'Z_EXC_SAPSCRIT'
LANGUAGE = 'P'.

* imprime o cabeçalho
CALL FUNCTION 'WRITE_FORM'
EXPORTING
ELEMENT = 'CABEC '
WINDOW = 'MAIN'.

* lê os dados da tabela final


loop at i_final.
V_CONT = V_CONT + 1.
* a cada mudança de centro, chama o elemento de dados QUEBRA da janela
* MAIN, que inicializa uma nova página e o elemento CABEC que imprime
* o cabeçalho
on change of i_final -werks.

81
ABAP Training
if sy -tabix ne 1. " se não for o 1° registro
CALL FUNCTION 'WRITE_FORM' " quebra de página
EXPORTING
ELEMENT = 'QUEBRA'
WIND OW = 'MAIN'.

CALL FUNCTION 'WRITE_FORM' " imprime o cabeçalho


EXPORTING
ELEMENT = 'CABEC'
WINDOW = 'MAIN'.

V_CONT = 0. " inicializa o contador de materiais


endif. " se não for o 1° registro
endon.
* imprime os itens
CALL FUNCTION 'WRITE_FORM'
EXPORTING
ELEMENT = 'ITEM'
WINDOW = 'MAIN'.

ENDLOOP.

* finaliza o formulário
CALL FUNCTION 'END_FORM'. " FECHA O START
* fecha o formulário
CALL FUNCTION 'CLOSE_FORM'. " FECHA O OPEN

* senão (se for visualização dos dados na tela)


else.
format color 1.
loop at i_final.
if p_centro eq 'X'.
on change of i_final -werks.
if sy -tabix ne 1. " se não for o primeiro registro
new -page. " cria uma nova página
endif. " fim do se for o primeiro registro
endon.
endif.
write: / i_fi nal-matnr hotspot,
i_final -maktx ,
i_final -mtart ,
i_final -werks , ' '.
hide: i_final -matnr.
endloop.
endif.

ENDFORM. " F_PRINT_REPORT

82
ABAP Training

2) Sapscript:
--------------------------------------------------------------------------------
Formulário Z_EXC_SAPSCRIT
--------------------------------------------------------------------------------

Mandante 020
Idioma PT
Idioma original PT
Relevante p/tradução Sim
Status ativo

Cl.desenvolvimento ZABAP

Autor ABAPDEV1 Modificador ABAPDEV1


Data 04.04.2001 Data 04.04.2001
Hora 07:52:50 Hora 16:05:03
Release 46B Release 46B

Significado Relatório de Materiais

Atributos standard
Página inicial PAGE1
Parágrf.default P0
Stop tabulador 1,00 CM
Formato página LETTER
Formato folha Form.vert.
Linhas/polegada 6,00
Caracs/polegada 10,00

AtribsFamCar.
Família caracs. TIMES
Alt.fam.caracs. 12,0 Ponto
Negrito Não
Itálico Não
Sublinhado Não

--------------------------------------------------------------------------------
Caracteres Atributos
--------------------------------------------------------------------------------

83
ABAP Training

PG Caracteres Grandes
Atributos standard
Marcação Não
AtribsFamCar.
Família caracs. TIMES
Alt.fam.caracs. 18,0 Ponto

PM Caracteres Médio
AtribsFamCar.
Família caracs. TIMES
Alt.fam.caracs. 12,0 Ponto

PP Caracteres Pequenos
AtribsFamCar.
Família caracs. TIMES
Alt.fam.caracs. 10,0 Ponto

--------------------------------------------------------------------------------
Parágrafos Atributos
--------------------------------------------------------------------------------

P0 Paragrafo da Main
Atributos standard
Espacej.linhas 1.00 LN
Alinhamento Alinh.esq.
Tabuladores
5.50 CM Alinh.à esquerda
17.50 CM Alinh.à esquerda

PC Paragrafo do Cabeçalho
Atributos standard
Espacej.linhas 1.00 LN
Margem esquerda 0.20 CM
Alinhamento Alinh.esq.
Tabuladores
7.50 CM Alinh.à esquerda
16.50 CM Alinh.à esquerda

UL LINHA DE SEPARAÇÃO
Atributos standard
Espacej.linhas 0.05 LN
Margem esquerda 0.80 MM
Alinhamento Alinh.esq.

84
ABAP Training

--------------------------------------------------------------------------------
Janela Atributos
--------------------------------------------------------------------------------

CABEC Cabeçalho
CategoriaJanela CONST

MAIN Janela princ


CategoriaJanela MAIN

RODAPE Rodapé
CategoriaJanela CONST

--------------------------------------------------------------------------------
Páginas Atributos
--------------------------------------------------------------------------------

PAGE1 Página nova


Atributos standard
Pág.seg. PAGE1
Numer.págs.
Modo INC
Ctg.numeração Algarismos árabes
Janelas páginas
MAIN Margem esquerda 1.00 CM
Margem superior 2.80 CM
Largura janela 19.60 CM
Altura janela 21.20 CM
CABEC Margem esquerda 1.00 CM
Margem superior 1.00 CM
Largura janela 19.60 CM
Altura janela 1.20 CM
RODAPE Margem esquerda 1.00 CM
Margem superior 24.00 CM
Largura janela 19.60 CM
Altura janela 0.60 CM

--------------------------------------------------------------------------------
Elementos texto p/seg.janelas:
--------------------------------------------------------------------------------
CABEC

/: BOX YPOS '-1' MM WIDTH 192 MM HEIGHT 12 MM FRAME 10 TW INTENSITY 10

85
ABAP Training
PC ,,<PG>MATERIAIS</>,,<PM>&SY-DATUM&</>
PC <PM>CENTRO: &I_FINAL-werks&</>
MAIN

/* Janela princ

Elemento CABEC
UL &ULINE(90)&
P0 <PM>| Código do Material,,| Descrição ,,| Tipo,,|</>
UL &ULINE(90)&

Elemento ITEM
P0 <PM>|</> <PP>&I_FINAL-MATNR&</>,,<PM>|</> <PP>&I_FINAL-MAKTX&</>
= ,,<PM>|</> <PP>&I_FINAL-MTART&</>,,<PM>|</>
UL &ULINE(90)&

Elemento QUEBRA
/: NEW-PAGE

RODAPE

/: BOX WIDTH 192 MM HEIGHT 06 MM FRAME 10 TW


PC <PM>TOTAL DE MATERIAIS NO CENTRO: &V_CONT&

86

Você também pode gostar