Вы находитесь на странице: 1из 87

ABAP Training

Sapscript

O que SAPscript e quando utilizar


1

ABAP Training

SAPscript a ferramenta do SAP para criao de relatrios mais


elaborados, chamados de formulrios. A opo pela utilizao da ferramenta
geralmente se d pela necessidade de alguns recursos que no podem ser
obtidos atravs de cdigo de ABAP comum, como nos chamados reports,
tais como insero de logotipos, fontes de tamanhos ou tipos diferentes,
etc... Muitas vezes, tambm, dependendo da necessidade do relatrio, pode
compensar mais utilizar o desenvolvimento de um relatrio convencional
sobre um formulrio pr impresso, que j contenha o layout e logotipo
desejados.

ABAP Training
Limitaes e problemas da ferramenta
Embora seja a ferramenta de gerao de formulrios mais poderosa
do SAP, o SAPscript ainda apresenta uma srie de limitaes, principalmente
no que diz respeito a verificao de erros e anlise de debug. Um comando
escrito na grafia errada dentro de um formulrio, jamais ser detectado pelo
mesmo. Somente a no funcionalidade esperada do comando poder levar
ao programador descobrir seu prprio erro.
O modo debug do ambiente de SAPscript pode ser ativado na
transao SE71 (SAP Standard Menu -> Tools -> Sapscript -> Form), atravs
do menu Utilitrios -> Ativar debug. O mtodo correto consiste em se
preencher o nome do formulrio e idioma nos campos da tela, antes de
percorrer o caminho do menu. Algumas vezes, no entanto, principalmente
para um processamento em background, o formulrio no 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
artifcios como imprimir o contedo dos campos a serem checados em
pontos estratgicos do formulrio, para observar seu comportamento.
O comportamento de um formulrio SAPscript pode tambm ser
muitas vezes irritante, principalmente quando se desconhece alguns de
seus detalhes. Um dos problemas mais comuns do formulrio SAPscript
quanto a utilizao de logotipos nos relatrios gerados. Sua filosofia pode
parecer bastante simples e , mas essa operao bastante sensvel, e
devem ser salientados alguns pontos:
1. O objeto com o logotipo deve ser gerado a partir de um programa de
ABAP, atravs da transao SE38, chamado RSTXLDMC. O modo como o
arquivo com o logotipo tratado, deve ser cuidadosamente verificado,
pois implicar no sucesso ou fracasso da exibio do logotipo esperado.
Inicialmente, deve ser ressaltado que o arquivo deve estar no formato
TIFF (extenso .TIF), no comprimido. Essa figura gerada nestes padres
tem ainda algumas restries para a sua aplicao. Em primeiro lugar, o
nmero de pxeis da figura ( a resoluo da mesma, em DPI dots per
inch ) devem ser exatamente o nmero de pxeis informado na tela de
seleo do programa para se garantir que o logotipo seja exibido no
tamanho em que foi gerado. Alguns programas de editorao grfica,
como o Paint Shop Pro, possuem recursos para se determinar o tamanho
da figura em centmetros e at mud-lo (resize), mantendo-se a resoluo
(nmero de pxels). Em alguns casos, se o nmero de pxeis no coincidir
com o informado, a figura pode nem ser gerada no SAP, dificultando o
trabalho do programador. Em segundo lugar, o nmero de cores ou
tonalidades de cinza tambm precisam coincidir (esse parmentro varia
3

ABAP Training
de acordo com a verso do SAP, devendo-se estar atento aos dados na
tela de seleo do programa). Por fim, um ltimo parmetro que pode
alterar o tamanho e o formato do logotipo a configurao da impressora
no SAP. O SAP utiliza a configurao da impressora para gerar o formulrio
e imprim-lo. Se a configurao no estiver correta, pode influenciar no
logotipo e na criao de linhas e caixas (BOXES).
2. Nessa hora entra a segunda dificuldade de se trabalhar com logotipos em
SAPscript. Ao se executar o formulrio, em uma visualizao na tela, o
usurio nunca ir conseguir enxergar o logotipo. Esse somente ir
aparecer na impresso em papel (ainda que impresso do layout do
formulrio, e no seu contedo final - Utilitrios -> Imprimir layout). As
novas verses do SAP j corrigiram esse problema.
Essas duas caractersticas podem tomar algumas horas do
programador, ainda que bem experiente no trabalho com SAPscript.
importante se observar tambm que os formulrios so 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 instncia que j o tenha. Isso no pareceria ser muito complicado se
no fosse um trabalho a mais controlar a verso de todos no momento que
uma alterao for feita. Por isso, recomenda-se que todos os nmeros das
Change Requests sejam inseridos como comentrio no corpo do formulrio,
pois no h administrao de verses para Sapscript, como h nos reports.
Um outro problema so os objetos gerados, como os logotipos e textos, que
alm de dependentes do cliente, no esto vinculados a nenhuma request,
no podendo nem ser transportados diretamente de um cliente para o
outro. Tanto os logotipos quanto os textos so 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 reforar que no momento do
transporte de um formulrio SAPscript, necessrio assegurar que todas as
estruturas utilizadas por ele, tenham sido transportadas anteriormente. O
objetivo assegurar que tudo que ser utilizado pelo formulrio j esteja no
cliente, no momento em que este for introduzido, para que no haja erros. A
ordem mais aconselhada para esses transportes seria:
1 . Estrutura
2 . Layout
3 . Programa de povoamento
Tambm vale a pena chamar a ateno para que esses 3 classes de
objetos estejam em requests separadas no desenvolvimento de um projeto,

ABAP Training
o que pode evitar problemas quando algum deles no estiver funcionando
propriamente e necessitar ser reparado...

ABAP Training
Programa de Povoamento do SAPSCRIPT
O programa de povoamento o programa responsvel pelo controle
da impresso do formulrio. atravs dele que o formulrio aberto, que
os dados so enviados para as janelas corretas, que feito o controle de
quebra de pginas, que feito o fechamento do formulrio, etc.
no programa de povoamento que feita a seleo dos dados que
devero aparecer no relatrio. Toda a lgica de seleo, busca dos dados,
associao de tabelas, etc., feita nele. O formulrio apenas um
dispositivo para output dos dados.
A construo de um programa de povoamento deve seguir a seguinte
estrutura:
-

Abertura de um formulrio
Inicializao de um formulrio
Seleo dos dados do formulrio
Impresso dos dados nas janelas do formulrio
Encerramento do formulrio
Fechamento do formulrio

ABAP Training

Abertura de formulrios.

O primeiro passo para a impresso de um Sapscript atravs de um


programa a abertura de um formulrio para que se possa fazer o
povoamento.
Para que se possa inicializar um formulrio necessrio que este seja
aberto. Portanto, obrigatria a presena de um comando de abertura num
programa de povoamento.
A abertura de um formulrio gera automaticamente a inicializao de
um formulrio.
O comando para a abertura de um formulrio a seguinte funo:
call function 'OPEN_FORM'
exporting
*
APPLICATION
*
ARCHIVE_INDEX
*
ARCHIVE_PARAMS
DEVICE
*
DIALOG
FORM
LANGUAGE
*
OPTIONS
*
importing
*
language
*
new_archive_params
*
result
exceptions
canceled
device
form
options
unclosed
others

=
=
=
=
=
=
=
=

'TX'
' '
' '
'PRINTER'
'X'
(Nome do Formulrio)
(Idioma do Formulrio)
ITCPO

=
=
=
=
=
=
=
=
=

1
2
3
4
5
6.

Os parmetros mais importantes a serem passados para a funo so:


Device Dispositivo onde ser gerado o formulrio (geralmente PRINTER)
Form Nome do formulrio a ser aberto
Language Idioma a ser utilizado
Dois outros parmetros tambm muitas vezes utilizados so o dialog
e o options.
No primeiro, indica-se se a caixa de dilogo para configurao da
impresso deve ou no ser apresentado. Caso este deva ser omitido, os
dados para impresso sero tomados de uma estrutura a ser colocada no
segundo parmetro. Nessa estrutura so passados os dados tais como
nmero de cpias e nome da impressora. A opo de no exibio da caixa
de dilogo esta diretamente ligada a utilizao do segundo parmetro. Se a

ABAP Training
exibio estiver desabilitada (DIALOG = ) mas a estrutura ITCPO no
estiver preenchida, a caixa de dilogo ser exibida.
Alguns dos campos mais importantes e que normalmente so
utilizados na estrutura ITCPO so:
-

TDCOPIES (Nmero de Cpias)


TDDEST (Dispositivo de Sada)
TDPREVIEW (Print Preview)
TDIMMED (Sada Imediata)
Exemplo de abertura do formulrio ZSCR_CURSO.

ITCPO-TDIMMED = X.
ITCPO-TDCOPIES = 2.
ITCPO-TDDEST = IMP1.
call function 'OPEN_FORM'
exporting
*
APPLICATION
*
ARCHIVE_INDEX
*
ARCHIVE_PARAMS
DEVICE
DIALOG
FORM
LANGUAGE
OPTIONS
*
importing
*
language
*
new_archive_params
*
result
exceptions
canceled
device
form
options
unclosed
others

=
=
=
=
=
=
=
=

'TX'
' '
' '
'PRINTER'
' '
'ZSCR_CURSO'
'P'
ITCPO

=
=
=
=
=
=
=
=
=

1
2
3
4
5
6.

Neste exemplo, o formulrio ZSCR_CURSO no idioma portugus ser


aberto, sem a exibio da caixa de dilogo de impresso, utilizando a
impressora IMP1 e executando a impresso imediata de 2 cpias.

ABAP Training

Inicializao de um formulrio.

A abertura de um formulrio automaticamente gera a inicializao do


mesmo.
Mas, imagine por exemplo que estejamos gerando relatrios para uma
empresa de computadores onde, para cada novo computador vendido, deve
ser gerado um novo relatrio, e esse relatrio deve conter todos os
componentes presentes no computador em questo.
A abertura de um formulrio inicia o primeiro, mas para cada novo
computador vendido um novo formulrio deve ser gerado.
Para isso utilizamos o comando de inicializao. Este comando permite
que, numa mesma impresso, sejam gerados vrios formulrios diferentes,
como se estivssemos abrindo um novo para cada computador vendido.
Este comando no obrigatrio e pode no ser utilizado caso no haja
necessidade da quebra e criao de vrios formulrios para uma s seleo
de dados.
O comando para inicializao de um formulrio a seguinte funo:
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 funo muito similar funo OPEN_FORM, e novamente os


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

ABAP Training

Finalizando um formulrio.

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


que um formulrio inicializado, o mesmo deve ser finalizado ao final do
seu processamento. Isso obtido atravs do comando :
CALL FUNCTION 'END_FORM'.
*
IMPORTING
*
RESULT
*
EXCEPTIONS
*
UNOPENED
*
BAD_PAGEFORMAT_FOR_PRINT
*
OTHERS

=
= 1
= 2
= 3

Para o seu funcionamento, apenas a sua chamada suficiente, sem as


clusulas adicionais, comentadas acima.

Fechando um formulrio.
Finalmente, em contrapartida ao comando OPEN_FORM, toda vez que um
formulrio aberto, o mesmo deve ser fechado. Isso obtido atravs do
comando :

CALL
*
*
*
*
*
*
*
*
*
*

FUNCTION 'CLOSE_FORM'.
IMPORTING
RESULT
RDI_RESULT
TABLES
OTFDATA
EXCEPTIONS
UNOPENED
BAD_PAGEFORMAT_FOR_PRINT
SEND_ERROR
OTHERS

=
=
=
=
=
=
=

1
2
3
4

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


chamada suficiente, sem as clusulas adicionais, comentadas acima.

10

ABAP Training
Seleo dos dados
A seleo dos dados feita normalmente com comandos SELECT e
demais comandos ABAP, como j foi visto em tpicos anteriores.
Um ponto importante que deve ser observado que no possvel
utilizar tabelas internas e variveis do programa para a impresso dos
dados no SAPSCRIPT. Portanto, se algum dado que deva ser impresso estiver
numa tabela interna ou varivel, este deve ser copiado para uma estrutura
para que possa ser enviado ao SAPSCRIPT.

11

ABAP Training

Impresso dos dados nas janelas

A impresso dos dados nas janelas na maioria das vezes feita


simultaneamente com a seleo dos dados, ou seja, a medida que os dados
so selecionados, so enviados imediatamente para o formulrio.
O comando para impresso dos dados a seguinte funo:
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 parmetros so 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 diferenciao 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 formulrio e o valor a ser impresso o valor que
o campo armazena no momento do comando de impresso.
Por exemplo, digamos que o campo MARA-MATNR tenha o valor 1234
e que um comando de impresso seja dado para a janela MAIN que ir
imprimir este campo. Logo em seguida uma nova seleo da tabela MARA
feita e o campo MATNR agora vale 5678. Se uma nova impresso na janela
MAIN for executada o resultado ser o seguinte:
1234
5678
J as janelas que no forem do tipo MAIN imprimem os dados uma
nica vez, no final da impresso do formulrio ou na quebra de pgina, com
os valores armazenados nos campos no momento do encerramento ou no
momento da quebra, e no no momento da escrita (write_form), ou seja, se

12

ABAP Training
no exemplo anterior fosse utilizada uma janela no-main, o resultado final
seria somente 5678.
Na realidade, a utilizao de um comando WRITE_FORM numa janela
no-main utilizada para a escolha de qual elemento de texto ser utilizado
para a impresso dos dados. Exemplo:
Uma janela HEADER no-main contm dois elementos de texto
chamados FRASE1 e FRASE2 da seguinte forma:
/E
/E

FRASE1
&MARA-MATNR&
FRASE2
&MARA-MATNR&

Teste de Frase 1
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 formulrio, deve


ser impresso o elemento de texto FRASE1 para a janela HEADER (somente
um elemento de texto utilizado para cada janela no-main).
No caso do exemplo, se o campo MATNR for igual a 1234 no
encerramento do formulrio, 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 pgina.
Se nenhum for selecionado, ao encerrar o formulrio ou mudar de
pgina sero impressos os dados que no pertenam a nenhum elemento
de texto. Portanto no caso de um campo que deva ser impresso sempre em
todas as pginas, como numero de pgina por exemplo, basta coloc-lo fora
de qualquer elemento de texto e no selecionar nenhum elemento de texto
para a janela que, automaticamente, este dado ser impresso em todas as
pginas.

13

ABAP Training
Fluxo do SAPSCRIPT:
Tendo visto os comandos acima, um fluxo simplificado de um programa para a
impresso de um SAPSCRIPT seria:
FORM f_imprime_sapscript.
* Abre o formulrio
CALL FUNCTION 'OPEN_FORM'
EXPORTING
DEVICE
FORM
LANGUAGE

= 'PRINTER'
= 'Z_SAPSCRIT'
= SY-LANGU.

* inicializa o formulrio
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
WINDOW
endloop.

= 'ITEM'
= 'MAIN'.

* finaliza o formulrio
call function 'END_FORM'.
* fecha o formulrio
call function 'CLOSE_FORM'.
ENDFORM.

14

ABAP Training
O formulrio
Trabalhar com um formulrio SAPscript no complicado, desde que
se entenda seus componentes da maneira correta. Um layout composto
por vrios componentes, dentre os quais podemos citar:
1. Header - informaes gerais do formulrio, como formato e orientao da
pgina em ser utilizado, pargrafo e fontes default do mesmo (quando
no for especificado nenhuma dentro do form). Nesse tpico aparece
tambm o ttulo do formulrio, a classe de desenvolvimento do mesmo e
os idiomas do formulrio original e o corrente.

15

ABAP Training
2. Pargrafos - so elementos que podem ser criados pelo usurio e
apresentam informaes dos textos de uma determinada janela. Nesses
pargrafos so determinados tipos de fontes, tabulaes, negrito ou
sublinhado, etc...

Para criar um pargrafo novo, utilizar o caminho do menu Processar


-> Create Element, lembrando que em um formulrio standard,
somente se pode alterar o layout no idioma original.

16

ABAP Training

17

ABAP Training
3. Caracter String - so informaes semelhantes s do pargrafo, no que
diz respeito a formatao de textos, no entanto podem ser aplicados a
trechos de textos e no necessariamente a linhas inteiras do formulrio.

Sua sintaxe de utilizao se assemelha a programao HTML, conforme


exemplo a seguir. Imagine um Caracter string definido com o nome B, cuja
formatao de texto seja o incremento do modelo negrito a uma
determinada fonte. Sua utilizao seria:
<B>Texto</>
E seu resultado no formulrio seria:
Texto

18

ABAP Training
4. Janelas - as janelas so a base da construo do layout. As janelas podem
ser criadas sem limites e tem por finalidade dividir espacialmente as
regies de um formulrio para operaes independentes.

Essas janelas podem ser criadas basicamente em 3 tipos distintos:


MAIN - janelas do tipo MAIN so as mais importantes do relatrio
(janela pela qual o formulrio se guia). Somente permitido um tipo de
janela MAIN por formulrio, e a nica janela obrigatria em uma pgina.
Pode-se criar mais de uma janela MAIN por pgina, no entanto essas janelas,
na verdade, s so divididas fisicamente, uma vez que seus elementos e
processamento obedecem aos mesmos comandos, e no podem ter
nomes diferentes. A passagem de uma janela MAIN para outra pode ser
automtica ou forada pelo usurio. Quando o espao fsico de uma janela
MAIN est tomado e necessita-se de mais dados na mesma, o formulrio
automaticamente passa prxima janela MAIN do formulrio. atravs
desse princpio que uma relatrio ganha nmero de pginas

19

ABAP Training
automaticamente quando da execuo de um relatrio desse tipo, conforme
os dados so preenchidos. Para forar a passagem de uma janela MAIN para
outra, o usurio poder utilizar o comando:
/: NEXT-WINDOW
A lgica de sequncia das janelas MAIN de um formulrio segue
sempre a um critrio. Dentro de uma pgina a navegao de uma MAIN para
outra segue de acordo com os ndices dessas janelas dentro do formulrio, e
quando uma nova pgina gerada, a contagem segue a mesma disposio,
continuamente.
O exemplo abaixo, figura a situao de uma diagramao conforme
uma pgina de jornal. A sequncia de preenchimento dos dados na pgina
atravs do povoamento normal segue:

VAR - essa janela apresenta uma caracterstica prpria, que necessita


de verificao constante do formulrio com seus dados, que podem variar
durante a execuo do relatrio. 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 execuo do
formulrio.
CONST - so janelas que no merecem muita preocupao de
processamento por parte do formulrio, uma vez que seus dados devem ser
mantidos os mesmos desde seu primeiro preenchimento at o fechamento
do formulrio. Geralmente nesse tipo de janela so includo objetos e textos
que permanecem os mesmos durante todo o relatrio, independente do
nmero de pginas, como logos e rodaps.

20

ABAP Training
5.

Pginas - as pginas so os elementos responsveis pelo agrupamento


das janelas durante certos momentos do relatrio. Geralmente s so
definidos duas pginas, que acabam em processo reflexivo, por
formulrio.

Geralmente uma pgina FIRST, que apresenta um layout de


apresentao dos documentos e outra NEXT, que contm o layouts das
outras pginas subsequentes do documento. Isso acontece, por exemplo,
quando se que obter um relatrio com o logotipo da empresa na primeira
pgina, mas as seguintes, devem ocupar a folha inteira com os dados do
relatrio at o final. Cada uma das pginas criadas devem conter um nome
(FIRST, NEXT,...) e pode conter um pargrafo default e um link para a
prxima pgina. Esse link serve para formar a sequncia em que as pginas
do relatrio devem ser geradas. Seguindo o exemplo anterior, deveramos
informar:
FIRST -> NEXT
NEXT -> NEXT

21

ABAP Training
Aps a primeira pgina, seria chamada a segunda, com um layout diferente
(sem o logotipo). A partir dessa, todas apresentariam o mesmo tipo de
layout (com dados do relatrio aproveitando a pgina inteira).
6.

Page Windows

As page windows podem ser entendidas pelo nosso conceito de layout


propriamente dito. So os elementos responsveis pela aparecimento ou
no das janelas dentro de uma determinada pgina, bem como seus
posicionamentos em relao folha a ser impressa. tambm atravs das
page windows que o programador ter acesso aos Text Elements de cada
uma dessas janelas, responsveis pelo tratamento dos dados em tempo de
execuo do formulrio.

22

ABAP Training
7.

Text Elements

Corresponde logica de processamento e comportamento de uma


janela durante a execuo do formulrio. responsvel pelos valores que
sero impressos no mesmo, bem como seu posicionamento dentro da janela
e seu tipo de caracter.
De dentro de uma Page Window, possvel selecionarmos qualquer
uma das janelas existentes em uma determinada pgina, simplesmente
clicando o mouse sobre o seu nome e apertando o boto selecionar, ou
mesmo dando um double-click diretamente sobre o nome da janela
desejada. Uma vez selecionada a janela, se apertarmos o boto Text
Element, uma tela semelhante do editor de ABAP/4 do SAP ir se abrir,
com as linhas onde a lgica da janela ser introduzida.

Nesses elementos do SAPscript, o programador poder utilizar alguns


comandos semelhantes ao do ABAP/4, com a indicao de que se trata de
uma linha de comando para o formulrio (/:, esquerda da linha). Abaixo,

23

ABAP Training
alguns dos comandos que podem ser utilizados de dentro dos elementos de
texto de uma janela em SAPscript:
IF..ELSE..ENDIF
CASE..WHEN
DEFINE
PERFORM..USING..CHANGING
material)
BOX..FRAME

declarao de variveis dentro da janela,


com atribuio de valor
(ver
documentao
prpria
nesse

INCLUDE
O comando include dentro de uma janela de um formulrio SAPscript
serve para inserir um objeto no mesmo. Esse objeto pode ser desde um
logo, at um texto com vrias 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 formulrio, deve-se
sempre utilizar o idioma em que o objeto foi criado.
/: INCLUDE name OBJECT object ID id LANGUAGE spras

24

ABAP Training
Manuteno de formulrios
A manuteno dos formulrios feita pela mesma transao citada
anteriormente (SE71). Nessa tela o nome do formulrio e o idioma do
mesmo so parmetros obrigatrios. Nessa tela so feitas praticamente
todas as operaes com os formulrios do SAP:

1. Criar um formulrio novo


Um formulrio pode ser criado inteiramente a partir dessa transao.
Preenchendo um nome do formulrio, que comece por Z ou Y, no
diretamente seguidos por caracteres especiais, como o _, o usurio poder
apertar o boto Criar ou ir ao menu Layout -> Criar. O idioma preenchido
ser entendido como idioma original do formulrio. A partir da, outros
formulrios podero ser traduzidos a partir desse original, nas mais
diferentes lnguas, porm todos mantero as caractersticas de layout do
formulrio original. Ao mesmo tempo que uma alterao desse original,
implica na imediata alterao de todos os seus filhos.
25

ABAP Training
2.

Copiar formulrio em outro idioma (Traduo)

Uma vez criado um formulrio (conforme descrito acima), poder ser


copiado sobre ele, as informaes de um outro formulrio do mesmo client,
atravs do menu Layout -> Copy from, j de dentro da primeira tela do
formulrio criado (Header).

Ateno que essa cpia fiel ao formulrio copiado, e no poupa


nenhuma informao que j existisse no formulrio que recebe a cpia.

26

ABAP Training
3.

Copiar um formulrio de outro cliente

Um formulrio pode tambm ser copiado de um outro client na


mesma instncia, atravs do menu Utilitrios -> Copy from client, da
primeira janela da transao SE71, fora de qualquer formulrio especfico.

Essa opo ir abrir uma outra janela que recebe basicamente 3


informaes:
Nome do formulrio a ser copiado
Cliente em que se encontra o original
Nome da cpia no client corrente

27

ABAP Training

Os outros dois campos de check box geralmente no so alterados


pois tratam de informaes como cpia do formulrio somente no idioma
original e exibio ou no de um log de erros ao final da execuo da cpia.
Uma vez entrados os parmetros, deve-se apertar o boto executar e
obter uma cpia com sucesso em todos os idiomas existentes do formulrio.
O cliente de origem do formulrio, quando for cpia de forms
standards, deve ser mantido 000, uma vez que o repositrio dos formulrios
originais do SAP encontram-se todos no 000, e podem ser lidos de todos os
outros.

28

ABAP Training
Incluso de Logos nos formulrios
Utilizar logotipos em formulrios SAPscripts, no 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 incluso de uma
imagem. No entanto, devido s limitaes expostas no comeo deste
documento, isso pode levar um certo tempo at reproduzir o resultado
desejado.
Para gerarmos o objeto no client desejado (lembre que esse objeto
no pode ser transportado), devemos executar o programa standard
RSTXLDMC, com um arquivo no formato *.TIF.

29

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
monocromtico (default) ou colorido.
O ltimo parmetro que exige ser preenchido o Text Name, onde
feita a atribuio do nome do objeto que ser referenciado de dentro do
formulrio (padro: ZHEX-MACRO-).
A gerao desse logo est intimamente ligado ao formato do arquivo
TIF. Isso quer dizer que o seu tamanho obtido no formulrio est relacionado
ao tamanho da imagem geradora do objeto.
Tomar cuidado com o nmero de cores e tonalidades da imagem e
lembrar na hora de fazer os testes, que o logotipo no aparece na tela,
somente em impresses no papel (problema corrigido nas verses atuais).
Nesta hora, vale lembrar todas as ressalvas feitas anteriormente:

O arquivo deve estar no formato TIFF (extenso .TIF), no comprimido.


Essa figura gerada nestes padres tem ainda algumas restries para a
sua aplicao. Em primeiro lugar, o nmero de pxeis da figura ( a
resoluo da mesma, em DPI dots per inch ) devem ser exatamente o
nmero de pxeis informado na tela de seleo do programa para se
garantir que o logotipo seja exibido no tamanho em que foi gerado.
Alguns programas de editorao grfica, como o Paint Shop Pro, possuem
recursos para se determinar o tamanho da figura em centmetros e at
mud-lo (resize), mantendo-se a resoluo (nmero de pxels). Em alguns
casos, se o nmero de pxeis no coincidir com o informado, a figura
pode nem ser gerada no SAP, dificultando o trabalho do programador.
O nmero de cores ou tonalidades de cinza tambm precisam coincidir
(esse parmentro varia de acordo com a verso do SAP, devendo-se estar
atento aos dados na tela de seleo do programa).
A configurao da impressora no SAP pode alterar o tamanho e o formato
do logotipo a configurao da impressora no SAP. O SAP utiliza a
configurao da impressora para gerar o formulrio e imprim-lo. Se a
configurao no estiver correta, pode influenciar no logotipo e na
criao de linhas e caixas (BOXES).
Para se transportar um logotipo ou texto, deve-se primeiro, associ-lo a
uma Change Request, atravs do programa standard RSTXTRAN

30

ABAP Training
Alteraes 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 alterao depende muito das caractersticas do
programa de povoamento standard e das caractersticas das funes do SAP que
iro utilizar tal sapscript. No entanto, alguns procedimentos so padres, e outros
so utilizados na grande maioria das alteraes.
1) Fazer uma cpia do programa standard e dos includes (se existirem) que
necessitam de alterao
2) Fazer uma cpia do layoutset standard
3) NO DELETAR janelas, elementos de textos, etc. na cpia do layoutset. Mesmo
que alguns (ou todos) os dados e janelas do standard no sejam utilizados, o
programa de povoamento continuar tentando executar escritas em janelas e
elementos de dados especficos, j que uma cpia do standard. Os novos
dados e janelas devem ser apenas adicionados!
4) Encontrar as posies ideais para alteraes no programa de povoamento.
Quando os novos dados devem ser impressos na MAIN, procurar por comandos
WRITE_FORM dentro do programa e colocar as alteraes o mais prximo
possvel do WRITE_FORM correto. Se devem ser impressos em outras janelas,
procurar pelo comando CLOSE_FORM/END_FORM e colocar as alteraes
imediatamente antes destes comandos (sempre que possvel)
5) Colocar todas as alteraes juntas sempre que possvel, identificando
visivelmente, atravs de comentrios, o bloco de alteraes. Isso facilita a
manuteno e visualizao do cdigo, alm de facilitar a busca por possveis
erros, visto que, na sua grande maioria, os programas standard da SAP so
bastante complicados.
*-------------------------------------------------------------------*
***write
texts
to
TEXTS
window
*
*-------------------------------------------------------------------*
**************************
ALTERAO
********************************
*------------------------------------------------------------------*
*
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.
31

ABAP Training
*Mensagem p/ materiais no perigosos
ybrvscript-mensg01 = text-001.
********************************************************************
**
istart = j_1bb2-totlih.
if istart > 10.
"maximum number of fields in J_1BPRNFTX

32

ABAP Training
Linhas e Boxes:
Para a criao de linhas e Boxes nos formulrios, 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 difcil a criao de boxes e
linhas dinmicos uma vez que eles dependem da posio na janela na qual esto
sendo criados.
Apesar da apresentao ser a melhor, utilizando-se boxes dinmicos, a
complexidade para seu desenvolvimento na maioria dos casos no justifica sua
aplicao.
Uma sada a ser aplicada nestes casos a seguinte:
Primeiro, cria-se um pargrafo especial, cujo espaamento entre linhas seja o
menor possvel:
UL

Linha de separao
Atributos standard
Espacej.linhas 0.05 LN
Margem esquerda 1.15 MM
Alinhamento
Alinh.esq.

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


UL
AS
AS
AS
UL

&ULINE(73)&
<B>| Item,,|,,Cdigo,,|,,Quantidade,,| UN,,|,,Preo Unitrio,,|,, Preo
Total |</>
<B>|
,,|,,
,,|,,
,,| ,,|,, c/ ICMS ,,|,,
C/Impostos |</>
<B>|
,,|,,
,,|,,
,,| ,,|,,
(R$)
,,|,,
(R$)
|</>
&ULINE(73)&

Como o espaamento entre linhas no pargrafo UL pequeno, na hora da


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

33

ABAP Training

Tabuladores:
Um recurso extremamente importante e diversas vezes esquecidos pelos
programadores so os tabuladores.
Uma das principais queixas dos programadores em relao ao Sapscript que,
quando se altera a posio de um campo na impresso, acaba-se alterando as
posies dos demais, fazendo com que o trabalho do programador seja exaustivo.
A alternativa para isso no ocorrer o uso dos tabuladores, definidos para cada
pargrafo 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 utilizao no cdigo fica:

IL

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

Os tabuladores so representados no Sapscript por 2 vrgulas (,,) e seu


espaamento pode estar tanto em caracteres (CH) quanto em centmetros (CM) e
milmetros (MM). Uma ressalva que deve ser feita que impressoras matriciais
trabalham sempre com caracteres, dificultando um pouco a determinao do
tamanho. Nos casos onde a unidade seja caracter, o espaamento utilizado feito
com base no caracter padro, definido no header do formulrio.
Agindo-se assim, garante-se que os textos estaro sempre na posio e
alinhados da maneira como planejada, facilitando futuras manutenes, como a
alterao da posio ou tamanho de um determinado campo. Alm disso, a
alterao da posio feita somente em um lugar e no repetidamente no cdigo,
eliminado esforo desnecessrio.
Por fim, h uma outra ferramenta que pode ajudar no posicionamento dos textos,
principalmente para impressoras matriciais. Existem rguas especiais que possuem
as escalas mais comuns de caracteres. Um exemplo a rgua Trident modelo FC-1.

34

ABAP Training
Exemplos

Sapscript

------------------------------------------------------------------------------Formulrio
YBRV_CREDIT_MEMO
------------------------------------------------------------------------------Mandante
Idioma
Original lang.
Relevant for transl.
Status

650
P
P
Yes
Active

Development class

YBR0

Created by
SAO0105A
Date
01.09.1998
Time
19:52:15
Release
30F
Significado
Standard attributes
First page
utilizada
Default paragr.
textos
Tab stop
Page format
Orientation
Lines/inch
Characters/inch
caracteres
Font attributes
Font family
Font size
Bold
Italic
Underlined

Idioma Original de Criao

General Multi-purpose Development class


SAO0105A

Changed by

29.07.1998

Date

09:02:34

Time

30F

Release

Nota de Crdito

FIRST
MA
1,00 CM
DINA4
Landscape
6,00
12,00

COURIER
10,0 Point
No
No
No

Primeira pgina a ser


Pargrafo default para os
Tipo de Papel
Espaamento entre as linhas
Espaamento entre os

Fonte padro do formulrio


Tamanho da fonte padro

35

ABAP Training

------------------------------------------------------------------------------Characters
Attributes
Definies dos Characters
Strings
------------------------------------------------------------------------------H1

H2

H3

Header 1
Standard attributes
Marker
Font attributes
Font family
Font size
Bold
Header 2
Standard attributes
Marker
Font attributes
Font family
Font size
Bold
Header 3
Standard attributes
Marker
Font attributes
Font family
Font size
Bold

No
COURIER
8,0 Point
Yes

No
COURIER
10,0 Point
Yes

No
COURIER
6,0 Point
Yes

------------------------------------------------------------------------------Paragraphs
Attributes
Definies dos tipos de
pargrafos
------------------------------------------------------------------------------H1

Paragrafo 1 p/ o header
Standard attributes
Line spacing
1,00 LN
Alignment
Left-aligned
Tabs

Tabulaes para o

pargrafo
16,00 CH
66,00 CH

Left-aligned
Left-aligned

36

ABAP Training
80,00 CH

Left-aligned

H2

Paragrafo 2 p/ header
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
Alignment

1,00 LN
Left-aligned

------------------------------------------------------------------------------Windows
Attributes
Janelas definidas para o
formulrio
------------------------------------------------------------------------------HEADER
HEAD_PRI
MAIN
TEXT
TOTAL

Cabealho da Nota
Window type

CONST

Header p/ Main
Window type

CONST

Main window
Window type

MAIN

Textos da Nota
Window type

CONST

Totais da Nota
Window type

CONST

------------------------------------------------------------------------------Pages
Attributes
Paginas do formulrio com suas
respectivas janelas
------------------------------------------------------------------------------FIRST

Primeira Pgina
Page counter

37

ABAP Training
Mode
Numbering type
Page window
MAIN

HEADER

TEXT

TOTAL

INC
Arabic numerals
Left margin
Upper margin
Window width
Window height
Left margin
Upper margin
Window width
Window height
Left margin
Upper margin
Window width
Window height
Left margin
Upper margin
Window width
Window height

2,00
9,00
132,00
27,00
2,00
1,00
132,00
8,00
2,00
36,00
132,00
3,00
2,00
39,00
132,00
7,00

CH
LN
CH
LN
CH
LN
CH
LN
CH
LN
CH
LN
CH
LN
CH
LN

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


------------------------------------------------------------------------------HEADER

Definio do pargrafo 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 CRDITO</>,,&ybrvs_nota-data&,,N
&ybrvs_nota-numero&
Desativa
Character String
/: ELSE
Ativa Character String
H2
,,<H2>NOTA
DE
CRDITO</>,,&ybrvs_nota-data&,,N
&ybrvs_notanumero&
/: ENDIF
H1 ,,,,CLARIANT S/A
Salta p/
prx. tabulao
H1 <H1>Razo Social:</> &ybrvs_nota-razao(50)&
<H1>Cliente:
</>&ybrvs_nota-cliente(20)&
<H1>Filial: </>&ybrvs_nota-filial&
H1 <H1>Endereo
:</> &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)&

38

ABAP Training
<H3>PREZADOS SENHORES: PARTICIPAMOS A v.Sas. QUE FIZEMOS EM SUA
CONTA
OS LANAMENTOS ABAIXO:</>
H1 <H1>Histrico
:</> &ybrvs_nota-tipo&
H1 <H1>Valor por Extenso: </>&ybrvs_nota-tot_extens(100)&
<H1>Centavos:</> &spell-decimal(2)&
H1 <H1>Depsito:</> &ybrvs_nota-filial(6)& <H1>Setor:</>
&ybrvs_nota-setor(4)& <H1>Vendedor:</> &ybrvs_nota-vendedor(8)&
<H1>Zona:</> &ybrvs_nota-zona(6)& <H1>Doc. Entr</>
&ybrvs_nota-doc_entr(19)&
<H1>N/N.F.F.:</>
&ybrvs_notadoc_entr(11)&
<H1>de </> &ybrvs_nota-data&
Campo de
tabela/estrutura
HEAD_PRI

Indicao de linha de comando

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


<H1> Cdigo Produto
|EMB |UN.|
Quantidade

MAIN

|</>

Elemento de dados

/E
/:
/:
/:
/:
/:
/:
/:
/:
/:
/:
/:
MA

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
&ybrvs_nota-produto(15)&
&ybrvs_nota-unidade(3)&&ybrvs_nota-quant(15)&&ybrvs_notanome(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> Cdigo Produto
EMB UN.
Quantidade
do
Produto
RN Preo Unitrio
Valor Mercadoria
Desconto
%IPI
Valor IPI</>

Nome
Valor

39

ABAP Training
*

&uline(132)&
Pargrafo standard

TEXT

Linha de Comentrios

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


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

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 LN 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 LN 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 Nota</>
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_notatotal(14)&
MA
MA
MA
____________________________
___________________________
MA
Assinatura
Assinatura

40

ABAP Training
Exemplo:
Relatrio de Avaliao de Fornecedores
A seguir, temos o programa de povoamento e o formulrio Sapscript para um
Relatrio de Avaliao de Fornecedores, onde o usurio tem a opo de rodar um
relatrio ou imprimir o formulrio. A lgica de ambos complexa. No entanto,
servem como referncia de estudo pois abrangem quase todo o contedo acima
mencionado, incluindo, at, boxes dinmicos, ou seja, que variam com a
quantidade de linhas a ser exibida e impresso em frente e verso (para isso,
necessita-se de uma impressora com essa capacidade e programada para isso. Por
fim, se o formulrio for um envelope como neste caso, necessria a utilizao de
uma mquina envelopadora).

41

ABAP Training
****************************************************************
******************
*
*
*
********************************************
*
*
* Confidencial e Proprietrio
*
*
*
* Copyright 2001, Accenture
*
*
*
* Todos os direitos reservados
*
*
*
********************************************
*
*
*
*
Nome do Shell: YTRP0010 Verso do Shell: v1.01
*
*
*
****************************************************************
******************
* Nome do Programa : ZRQM001
*
* Ttulo do Programa : Shell - ABAP/4 List Report
*
* Programador
: Antonio Celso Hunnicutt Cortada
*
* Data
: 05/02/2001
*
* ltima atualizao : 05/02/2001
*
*
*
* Descrio : Criar uma transao ON-Line que sera chamada do
menu*
*
SAP, para definir o escopo dos calculos de avaliacao
*
*
de fornecedores.
*
*
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
*
*
por uma planilha excel.
*
*
*
*
*
* Include
: ZZIHEADR
*
*---------------------------------------------------------------------------------------------*
* Lista de Modificaes:
*
* Data
Autor
Corr. #
Descrio
*
* 05/02/2001
Desenvolvimento inicial do prg *
****************************************************************
********
REPORT ZRQM001
NO STANDARD PAGE HEADING "No mostra o cabealho
padro SAP
LINE-SIZE 170
"Largura do report de nnn caracteres
LINE-COUNT 58
"Comprimento do report de nn
caracteres
MESSAGE-ID ZM.
"Classe de mensagens ZM
RESERVE 8 LINES. "Pelo menos n linhas sero impressas na
ltima pgina
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
" SESSO DE DECLARAO DE DADOS "

"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
****************************************************************
********
* Includes
*
****************************************************************
********
INCLUDE:
ZZIHEADR.
"Cabealho padro de report
****************************************************************
********
* Tabelas
*
****************************************************************
********
TABLES: MARA,
"Mestre do material: dados gerais
MAKT,
"Textos breves de material
CABN,
"Caracterstica
AUSP,
"Valores das modalidades das caractersticas
LFA1,
"Mestre de fornecedores (parte geral)
QAVE,
"Processamento de controle: deciso de utili
QALS,
"Registro do lote de controle
JEST,
"Status individual por objeto
VIQMEL,
"Nota - cabealho
VIQMSM,
"Nota - medidas
ELBP,
"Critrio principal da avaliao de forneced
T147C,
"Definio dos subcritrios para a avaliao
EKPO,
"Item do documento de compras
T001W,
"Centros/filiais
ZSAPSCRIP2,
"Estrutura auxiliar de Relatrio de Avalia
ITCPO,
"SAPscript output interface
T247,
"Denominaes e denominao breve dos
meses
KNA1,
"Mestre de clientes (parte geral)
T005T.
"Denominao dos pases
****************************************************************
********
* Dados:
*
* Constantes
(C_...)
*
* Variaveis
(V_...)
*
* Tabelas Internas (T_...)
*
****************************************************************
********
*- Variaveis ----------------------------------------------------------*
DATA: C_MILHAO(7) TYPE N VALUE '1000000', "Valor de calc de
Nota
C_LINHA
TYPE P DECIMALS 2,
"Cte p/ N. linhas Quebra
Pg
C_LINHA1
TYPE P DECIMALS 2,
"Cte p/ N. linhas Quebra
Pg
C_SIM(3) TYPE C VALUE 'SIM',
"SIM
C_NAO(3) TYPE C VALUE 'NAO',
"NAO
C_YES(3) TYPE C VALUE 'YES',
"SIM
C_NO(2)
TYPE C VALUE 'NO',
"NAO
C_PPM(8) TYPE C VALUE 'OBJ_PPM',
C_LOTE(8) TYPE C VALUE 'OBJ_LOTE',
C_NAS(3)
TYPE C VALUE 'NAS',
C_MT_101(6) TYPE C VALUE 'MT-101',
C_DEZ(03) TYPE C VALUE '010',
C_Z(03)
TYPE C VALUE 'Z01',
C_ERRO(10) TYPE C VALUE ' ERRO ',
C_P
TYPE C VALUE 'P',
"Idioma Portugus
C_ESP
TYPE C VALUE 'S',
"idioma espanhol

42

ABAP Training
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 ingls
DATA: C_STAT(5) TYPE C VALUE 'I0224',
C_KZART(1) TYPE C VALUE 'L',
C_HKRIT(02) TYPE C VALUE '04'.
DATA: V_TIME
TYPE P DECIMALS 2, "Var.P/ armazenar
No.Linhas(cm)
V_ATFLV
TYPE P DECIMALS 2,
V_VAL_PPM(7) TYPE C,
V_VAL_LOTE(7) TYPE C,
V_VAL_NAS(3) TYPE C,
V_FORNEC_50(50) TYPE C,
V_IDIOMA LIKE LFA1-SPRAS.
"idioma do fornecedor.
* variaveis auxiliares.
DATA:
V_PRIM_VEZ
TYPE C VALUE 'T',
V_ULTIMO_DIA
LIKE SY-DATUM,
V_PRIMEIRO_DIA
LIKE SY-DATUM,
V_DIA_CALCULO
LIKE SY-DATUM,
V_MULTIPLICADOR(5) TYPE N,
V_PRIMEIRO_MES
LIKE SY-DATUM,
V_DT_INICIO
LIKE SY-DATUM,
V_DT_FIM
LIKE SY-DATUM,
V_DTI_ANALISE
LIKE SY-DATUM,
V_QTDE(10)
TYPE C,
V_QTDE_SAP
TYPE I,
V_QTDE_SAP7
TYPE I.
* variaveis numericas.
DATA: V_SUM_PPM89_M LIKE T706U-BETFA,
V_SUM_PPM89_AC LIKE T706U-BETFA,
V_SUM_NFL_M
LIKE T706U-BETFA,
V_SUM_NFL_AC
LIKE T706U-BETFA,
V_SUM_LOT_M
LIKE T706U-BETFA,
V_SUM_LOT_AC
LIKE T706U-BETFA,
V_NUM_NFL_M
LIKE T706U-BETFA,
V_NUM_NFL_AC
LIKE T706U-BETFA,
V_SUM_NPT_M
LIKE T706U-BETFA,
V_SUM_NPT_AC
LIKE T706U-BETFA,
V_TOT_NFL_M
LIKE T706U-BETFA,
V_TOT_NFL_AC
LIKE T706U-BETFA,
V_TOT_LOT_M
LIKE T706U-BETFA,
V_TOT_LOT_AC
LIKE T706U-BETFA,
V_TOT_PPM_M
LIKE T706U-BETFA,
V_TOT_PPM_AC
LIKE T706U-BETFA,
V_TOT_NPR_M
LIKE T706U-BETFA,
V_TOT_NPR_AC
LIKE T706U-BETFA,
V_TOT_NPT_M
LIKE T706U-BETFA,
V_TOT_NPT_AC
LIKE T706U-BETFA,
V_TOT_NAS_M
LIKE T706U-BETFA,
V_TOT_NCQ_M
LIKE T706U-BETFA,
V_TOT_NCQ_AC
LIKE T706U-BETFA,
V_SUM_PPM01_M LIKE T706U-BETFA,
V_SUM_PPM01_AC LIKE PC207-BETPE,
V_SUM_ATRAS_M LIKE T706U-BETFA,
V_SUM_ATRAS_AC LIKE T706U-BETFA,
V_SUM_EMDIA_M LIKE T706U-BETFA,
V_SUM_EMDIA_AC LIKE T706U-BETFA,
V_TOT_NOTAS_M
LIKE T706U-BETFA,
V_TOT_NOTAS_AC LIKE T706U-BETFA,

V_FATOR_NFL(3) TYPE C,
V_FATOR_NPR(3) TYPE C,
V_FATOR_NCQ(3) TYPE C,
V_TOT_POND(5) TYPE I,
V_TOT_NQF_M
LIKE T706U-BETFA,
V_TOT_NQF_AC
LIKE T706U-BETFA.
* variaveis de total por centro.
DATA:
V_CENTRO_NFL LIKE T706U-BETFA,
V_CENTRO_NPR LIKE T706U-BETFA,
V_CENTRO_NCQ LIKE T706U-BETFA,
V_CENTRO_NQF LIKE T706U-BETFA,
V_CENTRO_NPT LIKE T706U-BETFA,
V_CENTRO_NAS
LIKE T706U-BETFA,
V_CENTRO_PPM LIKE T706U-BETFA,
V_CENTRO_PPM_OBJ LIKE T706U-BETFA,
V_CENTRO_LOT LIKE T706U-BETFA,
V_CENTRO_LOT_OBJ LIKE T706U-BETFA.

* variaveis de trabalho.
DATA: V_WERKS
LIKE QALS-WERK,
V_LIFNR
LIKE QALS-LIFNR,
V_MATNR
LIKE QALS-MATNR,
V_TIPO_NF LIKE QALS-ART,
V_QKENNZAHL LIKE QAVE-QKENNZAHL,
V_LINHAS(6) TYPE N.
* variveis de controle de impresso em branco
DATA: V_CHECK_NFL_M TYPE C, " flag para NFL = %LOT =
BRANCO
V_CHECK_PPM_M TYPE C, " flag para PPM = NPR =
BRANCO
V_CHECK_NAS_M TYPE C, " flag para NAS = BRANCO
V_CHECK_NQF_M TYPE C, " flag para NQF = BRANCO
V_CHECK_NFL_AC TYPE C, " flag para NFL = %LOT =
BRANCO
V_CHECK_PPM_AC TYPE C, " flag para PPM = NPR =
BRANCO
V_CHECK_NAS_AC TYPE C, " flag para NAS = BRANCO
V_CHECK_NQF_AC TYPE C. " flag para NQF = BRANCO
*- Tabela Interna -----------------------------------------------------*
* Tabela interna para armazenar os valores a serem utilizados no
clculo
* das notas para os caso: Acumulado no Centro e Acumulado na
MTB
DATA: BEGIN OF I_ACUM OCCURS 0,
CENTRO
LIKE QALS-WERK,
LIFNR
LIKE QALS-LIFNR,
SUM_PPM01_M LIKE PC207-BETPE,
SUM_PPM01_AC LIKE PC207-BETPE,
SUM_ATRAS_M LIKE T706U-BETFA,
SUM_ATRAS_AC LIKE T706U-BETFA,
SUM_EMDIA_M LIKE T706U-BETFA,
SUM_EMDIA_AC LIKE T706U-BETFA,
SUM_PPM89_M LIKE T706U-BETFA,
SUM_PPM89_AC LIKE T706U-BETFA,
SUM_NFL_M
LIKE T706U-BETFA,
SUM_NFL_AC
LIKE T706U-BETFA,
SUM_LOT_M
LIKE T706U-BETFA,
SUM_LOT_AC
LIKE T706U-BETFA,

43

ABAP Training
SUM_NPT_M
LIKE T706U-BETFA,
SUM_NPT_AC
LIKE T706U-BETFA,
NUM_NPT_M
LIKE T706U-BETFA,
NUM_NPT_AC
LIKE T706U-BETFA,
NUM_NFL_M
LIKE T706U-BETFA,
NUM_NFL_AC
LIKE T706U-BETFA.
DATA: END OF I_ACUM.
DATA: BEGIN OF I_ACUM_CENTRO OCCURS 0,
CENTRO
LIKE QALS-WERK,
SUM_PPM01
LIKE T706U-BETFA,
SUM_ATRAS
LIKE T706U-BETFA,
SUM_EMDIA
LIKE T706U-BETFA,
SUM_PPM89
LIKE T706U-BETFA,
SUM_NFL
LIKE T706U-BETFA,
SUM_LOT
LIKE T706U-BETFA,
SUM_NPT
LIKE T706U-BETFA,
NUM_NPT
LIKE T706U-BETFA,
NUM_NFL
LIKE T706U-BETFA.
DATA: END OF I_ACUM_CENTRO.
DATA: BEGIN OF I_QAVE OCCURS 0,
PRUEFLOS LIKE QAVE-PRUEFLOS, "N lote de controle.
KZART
LIKE QAVE-KZART,
"Cdigo: lote de controle, lote
QKENNZAHL LIKE QAVE-QKENNZAHL, "ndice de qualidade
VBEWERTUNG LIKE QAVE-VBEWERTUNG, "Avaliao do code
VDATUM
LIKE QAVE-VDATUM. "Data do code para a
dec.de util.
DATA: END OF I_QAVE.
DATA: BEGIN OF I_QALS OCCURS 0,
PRUEFLOS LIKE QALS-PRUEFLOS, "N lote de controle
WERKS
LIKE QALS-WERK,
"Centro
ART
LIKE QALS-ART,
"Tipo de controle
LIFNR
LIKE QALS-LIFNR,
"N conta do fornecedor
MATNR
LIKE QALS-MATNR,
"N material
LMENGESCH LIKE QALS-LMENGESCH, "Registro do lote de
controle
LMENGEIST LIKE QALS-LMENGEIST, "Registro do lote de
controle
OBJNR
LIKE QALS-OBJNR.
"N objeto
DATA: END OF I_QALS.
DATA: BEGIN OF I_JEST OCCURS 0,
OBJNR
LIKE JEST-OBJNR,
"N objeto
INACT
LIKE JEST-INACT.
"Cdigo: status inativo
DATA: END OF I_JEST.
DATA: BEGIN OF I_TABFIM OCCURS 0,
WERKS
LIKE QALS-WERK,
"Centro
LIFNR
LIKE QALS-LIFNR,
"Fornecedor
PPM1_M(7)
TYPE C,
PPM1_AC(7)
TYPE C,
PPM_M(7)
TYPE C,
PPM_AC(7)
TYPE C,
NFL_M(5)
TYPE C,
NFL_AC(5)
TYPE C,
LOT_M(7)
TYPE C,
LOT_AC(7)
TYPE C,
NPR_M(5)
TYPE C,
NPR_AC(5)
TYPE C,
NPT_M(5)
TYPE C,
NPT_AC(5)
TYPE C,
NCQ_M(5)
TYPE C,

NCQ_AC(5)
TYPE C,
NAS_M(5)
TYPE C,
NAS_AC(5)
TYPE C,
NQF_M(5)
TYPE C,
NQF_AC(5)
TYPE C,
LOT_OBJ_M(10) TYPE C,
LOT_OBJ_AC(10) TYPE C,
PPM_OBJ_M(10) TYPE C,
PPM_OBJ_AC(10) TYPE C.
DATA: END OF I_TABFIM.
DATA: BEGIN OF I_TOT_CENTRO OCCURS 0,
WERKS LIKE QALS-WERK,
"centro
NFL(5) TYPE C,
NPR(5) TYPE C,
NCQ(5) TYPE C,
NQF(5) TYPE C,
NPT(5) TYPE C,
PPM(7) TYPE C,
LOT(7) TYPE C.
DATA: END OF I_TOT_CENTRO.
DATA: BEGIN OF I_ACUM_MTB,
NFL_AC(5) TYPE C,
NPR_AC(5) TYPE C,
NCQ_AC(5) TYPE C,
NQF_AC(5) TYPE C,
NPT_AC(5) TYPE C,
PPM_AC(7) TYPE C,
LOT_AC(7) TYPE C.
DATA: END OF I_ACUM_MTB.
DATA: BEGIN OF I_TOT_FORNEC OCCURS 0,
LIFNR
LIKE QALS-LIFNR,
NFL_M(5) TYPE C,
NFL_AC(5) TYPE C,
NPR_M(5) TYPE C,
NPR_AC(5) TYPE C,
NCQ_M(5) TYPE C,
NCQ_AC(5) TYPE C,
NQF_M(5) TYPE C,
NQF_AC(5) TYPE C,
NPT_M(5) TYPE C,
NPT_AC(5) TYPE C,
PPM_M(7) TYPE C,
PPM_AC(7) TYPE C,
LOT_M(7) TYPE C,
LOT_AC(7) TYPE C.
DATA: END OF I_TOT_FORNEC.
DATA: BEGIN OF I_FORNEC OCCURS 0,
LIFNR
LIKE LFA1-LIFNR,
"fornecedor
PPM_OBJ(7) TYPE C,
LOT_OBJ(7) TYPE C,
NAS(3)
TYPE C.
DATA: END OF I_FORNEC.
DATA: BEGIN OF I_FORNEC_MAT OCCURS 0,
LIFNR
LIKE LFA1-LIFNR,
MATNR
LIKE MARA-MATNR,
PPM_OBJ(10) TYPE C,
LOT_OBJ(10) TYPE C.
DATA: END OF I_FORNEC_MAT.
DATA: BEGIN OF I_VIQMEL OCCURS 0,
MAWERKS
LIKE VIQMEL-IWERK,

44

"centro

ABAP Training
LIFNUM
LIKE VIQMEL-LIFNUM,
MATNR
LIKE VIQMEL-MATNR,
STRMN
LIKE VIQMEL-STRMN,
QMNUM
LIKE VIQMEL-QMNUM,
OBJNR
LIKE VIQMEL-OBJNR,
EBELN
LIKE VIQMEL-EBELN,
EBELP
LIKE VIQMEL-EBELP.
DATA: END OF I_VIQMEL.

"fornecedor
"material
"Data de incio desejada
"N nota
"n objeto
"Pedido
"Item

DATA: BEGIN OF I_JEST_NCQ OCCURS 0,


OBJNR
LIKE JEST-OBJNR,
"N objeto
INACT
LIKE JEST-INACT.
"Cdigo: status inativo
DATA: END OF I_JEST_NCQ.
DATA: BEGIN OF I_VIQMSM OCCURS 0,
QMNUM
LIKE VIQMSM-QMNUM,
ERDAT
LIKE VIQMSM-ERDAT.
regist
DATA: END OF I_VIQMSM.

"N nota
"Data de criao do

DATA: BEGIN OF I_LFA1 OCCURS 0,


LIFNR
LIKE LFA1-LIFNR,
NAME1
LIKE LFA1-NAME1,
SPRAS
LIKE LFA1-SPRAS,
STRAS
LIKE LFA1-STRAS,
PFACH
LIKE LFA1-PFACH,
PSTLZ
LIKE LFA1-PSTLZ,
ORT01
LIKE LFA1-ORT01,
REGIO
LIKE LFA1-REGIO,
LAND1
LIKE LFA1-LAND1.
DATA: END OF I_LFA1.

"N conta do fornecedor


"Nome 1
"Chave do idioma
"Rua e n
"CxPostal
"Cdigo Postal (CEP)
"Cidade
"Estado
"Pais

DATA: BEGIN OF I_ELBP OCCURS 0,


LIFNR
LIKE ELBP-LIFNR,
BEURT
LIKE ELBP-BEURT.
DATA: END OF I_ELBP.

"N conta do fornecedor


"Nota

DATA: BEGIN OF I_T001W OCCURS 0,


WERKS
LIKE T001W-WERKS,
NAME
LIKE T001W-NAME1,
SPRAS
LIKE T001W-SPRAS,
STRAS
LIKE T001W-STRAS,
PFACH
LIKE T001W-PFACH,
PSTLZ
LIKE T001W-PSTLZ,
ORT01
LIKE T001W-ORT01,
REGIO
LIKE T001W-REGIO,
LAND1
LIKE T001W-LAND1.
DATA: END OF I_T001W.
DATA: BEGIN OF I_REMET,
WERKS
LIKE KNA1-WERKS,
NAME
LIKE KNA1-NAME1,
STRAS
LIKE KNA1-STRAS,
PFACH
LIKE KNA1-PFACH,
PSTLZ
LIKE KNA1-PSTLZ,
ORT01
LIKE KNA1-ORT01,
REGIO
LIKE KNA1-REGIO,
LAND1
LIKE KNA1-LAND1.
DATA: END OF I_REMET.
DATA: BEGIN OF I_PAIS OCCURS 0,
LAND1
LIKE T005T-LAND1,
LANDX
LIKE T005T-LANDX.
DATA: END OF I_PAIS.
DATA: BEGIN OF I_DET_MAT OCCURS 0,

"Centro
"Nome 1
"Chave de Idioma
"Morada
"CxPostal
"CEP
"Cidade
"Estado
"Pais

"Centro
"Nome 1
"Morada
"CxPostal
"CEP
"Cidade
"Estado
"Pais

de

WERKS
LIFNR
MATNR
DATA

LIKE T001W-WERKS,
LIKE LFA1-LIFNR,
LIKE MARA-MATNR,
LIKE QAVE-VDATUM,

"Centro
"N conta do fornecedor
"N material
"Data do code para a

TIPO_NF(2) TYPE C,
"Tipo NF
LMENGESCH LIKE QALS-LMENGESCH,
"Qtd.rejeitada em
amostr
QKENNZAHL LIKE QAVE-QKENNZAHL,
"ndice de
qualidade
LMENGEIST LIKE QALS-LMENGEIST.
"Quantidade de lote
real
DATA: END OF I_DET_MAT.
DATA: BEGIN OF I_TAB_DET_FIM OCCURS 0,
WERKS
LIKE T001W-WERKS,
"Centro
LIFNR
LIKE LFA1-LIFNR,
"N conta do fornecedor
MATNR
LIKE MARA-MATNR,
"Material
PPM_M(7) TYPE C,
PPM_AC(7) TYPE C,
LOT_M(7) TYPE C,
LOT_AC(7) TYPE C.
DATA: END OF I_TAB_DET_FIM.
DATA: BEGIN OF I_MAKT OCCURS 0,
MATNR
LIKE MAKT-MATNR,
MAKTX
LIKE MAKT-MAKTX.
DATA: END OF I_MAKT.

"material
"descricao

DATA: BEGIN OF I_EKPO OCCURS 0,


EBELN
LIKE VIQMEL-EBELN,
EBELP
LIKE VIQMEL-EBELP,
WERKS
LIKE EKPO-WERKS.
DATA: END OF I_EKPO.

"pedido
"item do pedido
"centro

DATA: BEGIN OF I_TAB_RES OCCURS 0,


WERKS
LIKE QALS-WERK,
"centro
LIFNR
LIKE QALS-LIFNR,
"fornecedor
PPM_M
LIKE T706U-BETFA,
PPM_AC LIKE T706U-BETFA,
NFL_M
LIKE T706U-BETFA,
NFL_AC
LIKE T706U-BETFA,
LOT_M
LIKE T706U-BETFA,
LOT_AC LIKE T706U-BETFA,
NPR_M
LIKE T706U-BETFA,
NPR_AC
LIKE T706U-BETFA,
NPT_M
LIKE T706U-BETFA,
NCQ_M
LIKE T706U-BETFA,
NCQ_AC
LIKE T706U-BETFA,
NAS_M
LIKE T706U-BETFA,
NQF_M
LIKE T706U-BETFA,
NQF_AC
LIKE T706U-BETFA,
OBJ_M
LIKE T706U-BETFA,
OBJ_AC
LIKE T706U-BETFA.
DATA: END OF I_TAB_RES.
DATA: BEGIN OF I_RES_INDICE OCCURS 0,
LIFNR
LIKE MSEG-LIFNR,
"fornecedor
WERKS
LIKE MSEG-WERKS,
"centro
PPM_M(7) TYPE C,
PPM_AC(7) TYPE C,
LOT_M(7) TYPE C,
LOT_AC(7) TYPE C,
LOT_OBJ_M(10) TYPE C,
PPM_OBJ_M(10) TYPE C.
DATA: END OF I_RES_INDICE.

45

ABAP Training
DATA: BEGIN OF I_CABN OCCURS 0,
ATINN LIKE CABN-ATINN,
ADZHL LIKE CABN-ADZHL,
ATNAM LIKE CABN-ATNAM,
ATFOR LIKE CABN-ATFOR.
DATA: END OF I_CABN.
DATA: BEGIN OF I_AUSP OCCURS 0,
OBJEK LIKE AUSP-OBJEK,
ATINN LIKE AUSP-ATINN,
ATWRT LIKE AUSP-ATWRT,
ATFLV LIKE AUSP-ATFLV,
KLART LIKE AUSP-KLART.
DATA: END OF I_AUSP.

"Caracterstica interna
"Nmero interno
"Nome da caracterstica
"Formato da caracter.

"Chave do objeto
"Caracterstica interna
"Valor da caracterst.
"Valor interno vrgula
"Tipo de classe

DATA: BEGIN OF I_CENTRO OCCURS 0,


WERKS LIKE T001W-WERKS.
DATA: END OF I_CENTRO.
****************************************************************
********
* Parmetros de entrada :
*
* Select Options (S_...)
*
* Parameters (P_...)
*
****************************************************************
********
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE T1.
SELECT-OPTIONS: SO_CENT FOR LFA1-WERKS, "centro para
impresso
SO_FORNE FOR LFA1-LIFNR, "fornecedor
SO_MATNR FOR MARA-MATNR, "material
SO_WERKS FOR LFA1-WERKS. "centros p/ calc. acum.
MTB
SELECTION-SCREEN END OF BLOCK B1.
SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE T2.
PARAMETERS: P_MES
LIKE S031-SPMON OBLIGATORY, "ms
de analise
P_PERIOD(2) TYPE C OBLIGATORY.
"perodo (mes p
tras)
SELECTION-SCREEN END OF BLOCK B2.
SELECTION-SCREEN BEGIN OF BLOCK B3 WITH FRAME TITLE T3.
PARAMETERS:
P_SOPPM AS CHECKBOX, " s ppm
P_RSUM AS CHECKBOX. " relatrio sumarizado
SELECTION-SCREEN END OF BLOCK B3.
SELECTION-SCREEN BEGIN OF BLOCK B4 WITH FRAME TITLE T4.
PARAMETERS:
P_RAF AS CHECKBOX, " imprime Formulrio
do RAF
P_IMPRE LIKE USR01-SPLD, " Impressora
P_REMET LIKE KNA1-KUNNR, " remetente
P_BATCH AS CHECKBOX. " Impresso via Batch
SELECTION-SCREEN END OF BLOCK B4.
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
" SESSO DE PROCESSAMENTO "
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
*----------------------------------------------------------------------*
INITIALIZATION.
"Logica para defaults "inteligentes"
*----------------------------------------------------------------------*

T1 =
T2 =
T3 =
T4 =

TEXT-001.
TEXT-002.
TEXT-003.
TEXT-004.

" Caractersticas
" Perodo de Anlise
" Apresentao
" Dados para RAF

*----------------------------------------------------------------------*
AT SELECTION-SCREEN. "Tratamento de Erros e lgica para tela
de seleo
*----------------------------------------------------------------------*
* Condies de erro na tela de seleo:
* Se ambos os modos de apresentao esto selecionados
IF P_SOPPM = 'X'
AND P_RSUM = 'X'.
MESSAGE E083 WITH 'Selecionar apenas um modo '
'de apresentao'.
ENDIF.
* Se o ms informado est incorreto
IF P_MES+4(2) > 12
OR P_MES+4(2) = 0.
MESSAGE E083 WITH 'Ms de anlise errado'.
ENDIF.
* Se o perodo de anlise est incorreto
IF P_PERIOD <= 0.
MESSAGE E083 WITH 'Perodo de anlise errado'.
ENDIF.
IF P_RAF <> SPACE.
IF P_IMPRE EQ SPACE.
MESSAGE E351.
" Informar uma impressora!
ENDIF.
* verifica se o campo remetente est preenchido
IF P_REMET EQ SPACE.
MESSAGE E512.
" informar nmero do emitente
ENDIF.
ENDIF.
* verifica se o centro est preenchido quando o processamento
for em
* batch
IF P_BATCH NE SPACE
" Se for processamento em batch
AND SO_WERKS[] IS INITIAL.
MESSAGE E513.
" falta centro especificado
ENDIF.
" Se for processamento em batch
IF SO_WERKS EQ SPACE.
IF SO_FORNE EQ SPACE.
IF SO_MATNR EQ SPACE AND P_RAF NE 'X'.
*Centro, Fornecedor e Material esto em branco ! Processamento
demorado.
MESSAGE W365.
ENDIF.
ENDIF.
ENDIF.
IF SO_CENT NE ' '.
SELECT WERKS
FROM T001W
INTO TABLE I_CENTRO
WHERE WERKS IN SO_CENT.
LOOP AT I_CENTRO.
IF I_CENTRO-WERKS IN SO_WERKS.
ELSE.

46

ABAP Training
MESSAGE E083 WITH 'O(s) centro(s) selecionado(s) no'
'est(o) includo(s) no(s) centro(s)'
'da MTB considerado(s)'.
ENDIF.
ENDLOOP.
ENDIF.
*----------------------------------------------------------------------*
START-OF-SELECTION.
"Processamento principal
*----------------------------------------------------------------------*
PERFORM CALCULA_PERIODO.
* form para selecao dos dados referente a nota de fornecimento
de lotes,
* nota de processo e nota de pontualidade.
PERFORM F_SELECT_NFLPRPT.
* Form para selecao dos dados referente a nota compromisso com
qualida.
PERFORM F_SELECT_NCQ.
* form para selecao dos dados refer. a nota de avaliacao de
sistemas.
PERFORM F_SELECT_NAS.
* form para selecao dos dados ref. a nota de qualidade de
fornecimento.
PERFORM F_SELECT_NQF.
* Calcula os valores sumarizados.
PERFORM F_CALC_DET_MAT.
* Calcula PPM e OBJ.
PERFORM F_CALC_PPM_OBJ.
* acha descricoes.
PERFORM F_ACHA_DESCRICOES.
* Calcula valores acumulados para os Centros e MTB.
PERFORM F_CALC_ACUM.
* verifica se solicitou impressao do SAPSCRIPT e chama o form.
IF P_RAF = 'X'.
PERFORM F_PREPARA_SAPSCRIPT.
ELSEIF P_SOPPM = 'X'.
PERFORM F_PRINT_SOPPM.
ELSEIF P_RSUM = 'X'.
PERFORM F_PRINT_RSUM.
ELSE.
PERFORM F_PRINT_REPORT.
ENDIF.
*----------------------------------------------------------------------*
END-OF-SELECTION.
"Fim do processamento principal
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
TOP-OF-PAGE.
"Cabealho (Aparece sempre no topo da tela.)
*----------------------------------------------------------------------*
PERFORM F_HEADER USING SY-TITLE SPACE SPACE SPACE.
FORMAT COLOR COL_HEADING.
WRITE: /02 'FORNECEDOR',
15 'NOME',
170 ' ',

/02 ' CENTRO',


15 'DESCRIO',
170 ' '.
FORMAT COLOR COL_HEADING.
WRITE: /05 'MS/ANO',
33 'NFL',
48 'NPR',
63 'NCQ',
78 'NQF',
93 'NPT',
108 'PPM',
123 'OBJ',
138 '%LOT',
153 'OBJ',
170 ' '.
ULINE.
*----------------------------------------------------------------------*
TOP-OF-PAGE DURING LINE-SELECTION.
*----------------------------------------------------------------------*
PERFORM F_HEADER USING SY-TITLE SPACE SPACE SPACE.
READ TABLE I_T001W WITH KEY WERKS = I_TAB_DET_FIMWERKS.
FORMAT COLOR COL_HEADING.
WRITE: /002 'NDICE PPM E LOTES NO CENTRO',
I_TAB_DET_FIM-WERKS, ' - ',
I_T001W-NAME,
170 ''.
* format color col_heading.
WRITE: /01 '',
53 '
Ms
',
79 '
Acum.
',
170 '' .
WRITE: /02 'Material',
17 'Descrio Breve',
58 'PPM',
72 '%LOT',
87 'PPM',
99 '%LOT',
116 'OBJ PPM',
135 'OBJ %LOT',
170 ' '.
ULINE.
*----------------------------------------------------------------------*
AT LINE-SELECTION.
"
*----------------------------------------------------------------------*
IF P_RSUM NE 'X'.
PERFORM F_PRINT_REP_DET.
ENDIF.
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
END-OF-PAGE.
"Rodap
*----------------------------------------------------------------------*
*
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*
*
" SESSO DE FORMS "
*
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*

47

ABAP Training
*
*----------------------------------------------------------------------*
*
Form F_SELECT_NFLPRPT.
*----------------------------------------------------------------------*
* Funcao para selecao de dados do mes e do periodo
*
*----------------------------------------------------------------------*
FORM F_SELECT_NFLPRPT.

* ordenar tabela para facilitar sapscript.


SORT I_QALS BY WERKS LIFNR ART.
LOOP AT I_QALS.
IF I_QALS-LIFNR EQ ''.
CONTINUE.
ENDIF.
* Atualiza dados qnado muda o centro e o fornecedor.
ON CHANGE OF I_QALS-WERKS OR I_QALS-LIFNR.

* selecionar dados da tabela QAVE.


SELECT PRUEFLOS
KZART
QKENNZAHL
VBEWERTUNG
VDATUM
FROM QAVE
INTO TABLE I_QAVE
WHERE VDATUM >= V_DT_INICIO AND
VDATUM <= V_DT_FIM AND
KZART = C_KZART.
IF SY-SUBRC = 0.
SELECT PRUEFLOS
WERK
ART
LIFNR
MATNR
LMENGESCH
LMENGEIST
OBJNR
FROM QALS
INTO TABLE I_QALS
FOR ALL ENTRIES IN I_QAVE
WHERE PRUEFLOS = I_QAVE-PRUEFLOS AND
WERK IN SO_WERKS AND
LIFNR IN SO_FORNE AND
MATNR IN SO_MATNR AND
( ART = '01' OR ART = '89' OR ART = '90' ) AND
STAT35 <> SPACE.
IF SY-SUBRC EQ 0.
SELECT OBJNR
INACT
FROM JEST
INTO TABLE I_JEST
FOR ALL ENTRIES IN I_QALS
WHERE OBJNR = I_QALS-OBJNR AND
STAT = C_STAT.
"I0224
ENDIF.
ENDIF.
* elimina notas de fornecimento de lotes que estejam estornados.
LOOP AT I_QALS.
* ler a tabela para checar se existe objeto.
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.

IF V_TIPO_NF NE ' '.


MOVE: V_WERKS
TO I_ACUM-CENTRO,
V_LIFNR
TO I_ACUM-LIFNR,
V_SUM_PPM89_M TO I_ACUM-SUM_PPM89_M,
V_SUM_PPM89_AC TO I_ACUM-SUM_PPM89_AC,
V_NUM_NFL_M
TO I_ACUM-NUM_NFL_M,
V_NUM_NFL_AC TO I_ACUM-NUM_NFL_AC,
V_SUM_NFL_M
TO I_ACUM-SUM_NFL_M,
V_SUM_NFL_AC
TO I_ACUM-SUM_NFL_AC,
V_SUM_LOT_M
TO I_ACUM-SUM_LOT_M,
V_SUM_LOT_AC TO I_ACUM-SUM_LOT_AC,
V_SUM_PPM01_M TO I_ACUM-SUM_PPM01_M,
V_SUM_PPM01_AC TO I_ACUM-SUM_PPM01_AC.
APPEND I_ACUM.
CLEAR I_ACUM.
*

Calcula dados finais com a contabilizacao feita.


PERFORM F_CALC_NOTAS.
* atualiza tabela com os dados calculados.
PERFORM F_GRAVA_TABFIM.
* Limpar as variaveis utilizadas no calculo.
CLEAR: V_SUM_PPM89_M, V_SUM_PPM89_AC,
V_NUM_NFL_M, V_NUM_NFL_AC,
V_SUM_NFL_M, V_SUM_NFL_AC,
V_SUM_NPT_M, V_SUM_NPT_AC,
V_SUM_LOT_M, V_SUM_LOT_AC,
V_TOT_NFL_M, V_TOT_NFL_AC,
V_TOT_LOT_M, V_TOT_LOT_AC,
V_TOT_PPM_M, V_TOT_PPM_AC,
V_TOT_NPR_M, V_TOT_NPR_AC,
V_TOT_NPT_M, V_TOT_NPT_AC,
V_SUM_PPM01_M, V_SUM_PPM01_AC.
ENDIF.
ENDON.
* guarda valores para geracao de arquivo final.
V_WERKS = I_QALS-WERKS.
V_LIFNR = I_QALS-LIFNR.
V_MATNR = I_QALS-MATNR.
V_TIPO_NF = I_QALS-ART.
IF I_QALS-ART = '89'.
READ TABLE I_QAVE WITH KEY PRUEFLOS = I_QALSPRUEFLOS.
* ---------------------------Fim da Alterao--------------------------*

DESCRIBE TABLE I_QALS LINES V_LINHAS.

IF SY-SUBRC NE 0.
CONTINUE.
ENDIF.

IF V_LINHAS EQ 0.
EXIT.
ENDIF.

IF I_QAVE-VDATUM >= V_DTI_ANALISE AND


I_QAVE-VDATUM <= V_DT_FIM.
V_SUM_PPM89_M = V_SUM_PPM89_M + I_QALS-LMENGESCH.

48

ABAP Training
V_SUM_PPM89_AC = V_SUM_PPM89_AC + I_QALSLMENGESCH.
ELSE.
V_SUM_PPM89_AC = V_SUM_PPM89_AC + I_QALSLMENGESCH.
ENDIF.
* Gera tabela para impressao detalhada por material.
PERFORM F_GRAVA_DET_MAT.
ELSEIF I_QALS-ART = '01'.
READ TABLE I_QAVE WITH KEY PRUEFLOS = I_QALSPRUEFLOS.
IF SY-SUBRC NE 0.
CONTINUE.
ENDIF.
IF I_QAVE-VDATUM >= V_DTI_ANALISE AND
I_QAVE-VDATUM <= V_DT_FIM.
* sumariza o numero de ocorrencias para um dos tipos de
controle.
V_NUM_NFL_M = V_NUM_NFL_M + 1.
* contabiliza o NFL e LOT.
V_SUM_NFL_M = V_SUM_NFL_M + I_QAVE-QKENNZAHL.
IF I_QAVE-QKENNZAHL <> 1.
V_SUM_LOT_M = V_SUM_LOT_M + I_QAVE-QKENNZAHL.
ENDIF.
* contabiliza valor para calculo de nota de processo.
V_SUM_PPM01_M = V_SUM_PPM01_M + I_QALS-LMENGEIST.
V_SUM_NFL_AC = V_SUM_NFL_AC + I_QAVE-QKENNZAHL.
IF I_QAVE-QKENNZAHL <> 1.
V_SUM_LOT_AC = V_SUM_LOT_AC + I_QAVE-QKENNZAHL.
ENDIF.
V_SUM_PPM01_AC = V_SUM_PPM01_AC + I_QALSLMENGEIST.
V_NUM_NFL_AC = V_NUM_NFL_AC + 1.
* ----------------------- Fim da Alterao --------------------------- *
ELSE.
* sumariza o numero de ocorrenciaspara um dados tipo de
controle
V_NUM_NFL_AC = V_NUM_NFL_AC + 1.
* contabiliza NF e LOT
V_SUM_NFL_AC = V_SUM_NFL_AC + I_QAVE-QKENNZAHL.
IF I_QAVE-QKENNZAHL <> 1.
V_SUM_LOT_AC = V_SUM_LOT_AC + I_QAVE-QKENNZAHL.
ENDIF.
* contabiliza o valor para calculo de nota de processo.
V_SUM_PPM01_AC = V_SUM_PPM01_AC + I_QALSLMENGEIST.
ENDIF.
* gera tabela para impressao detalhada por material.
PERFORM F_GRAVA_DET_MAT.
ELSEIF I_QALS-ART = '90'.
READ TABLE I_QAVE WITH KEY PRUEFLOS = I_QALSPRUEFLOS.

IF SY-SUBRC NE 0.
CONTINUE.
ENDIF.
IF I_QAVE-VDATUM >= V_DTI_ANALISE AND
I_QAVE-VDATUM <= V_DT_FIM.
IF I_QAVE-VBEWERTUNG <> 'A'.
V_QKENNZAHL = I_QAVE-QKENNZAHL * -1.
ELSE.
V_QKENNZAHL = I_QAVE-QKENNZAHL.
ENDIF.
V_SUM_NPT_M = V_SUM_NPT_M + V_QKENNZAHL.
V_SUM_NPT_AC = V_SUM_NPT_AC + V_QKENNZAHL.
ELSE.
IF I_QAVE-VBEWERTUNG <> 'A'.
V_QKENNZAHL = I_QAVE-QKENNZAHL * -1.
ELSE.
V_QKENNZAHL = I_QAVE-QKENNZAHL.
ENDIF.
V_SUM_NPT_AC = V_SUM_NPT_AC + V_QKENNZAHL.
ENDIF.
ENDIF.
ENDLOOP.
MOVE: V_WERKS
TO I_ACUM-CENTRO,
V_LIFNR
TO I_ACUM-LIFNR,
V_SUM_PPM89_M TO I_ACUM-SUM_PPM89_M,
V_SUM_PPM89_AC TO I_ACUM-SUM_PPM89_AC,
V_NUM_NFL_M
TO I_ACUM-NUM_NFL_M,
V_NUM_NFL_AC TO I_ACUM-NUM_NFL_AC,
V_SUM_NFL_M
TO I_ACUM-SUM_NFL_M,
V_SUM_NFL_AC
TO I_ACUM-SUM_NFL_AC,
V_SUM_LOT_M
TO I_ACUM-SUM_LOT_M,
V_SUM_LOT_AC TO I_ACUM-SUM_LOT_AC,
V_SUM_PPM01_M TO I_ACUM-SUM_PPM01_M,
V_SUM_PPM01_AC TO I_ACUM-SUM_PPM01_AC.
APPEND I_ACUM.
CLEAR I_ACUM.
* Calcula dados finais com a contabilizacao feita.
PERFORM F_CALC_NOTAS.
* Atualiza tabela com os dados calculados.
PERFORM F_GRAVA_TABFIM.
ENDFORM.
*----------------------------------------------------------------------*
*
Form F_CALC_NOTAS.
*----------------------------------------------------------------------*
* Calcula dados finais com a contabilizacao feita.
*----------------------------------------------------------------------*
FORM F_CALC_NOTAS.
* verifica qual tipo de nota sera calculada.
* calcula nota de fornecimento-mes.
IF V_NUM_NFL_M > 0.
V_CHECK_NFL_M = ' '.
V_TOT_NFL_M = V_SUM_NFL_M / V_NUM_NFL_M.
V_TOT_LOT_M = 100 - ( V_SUM_LOT_M / V_NUM_NFL_M ).
ELSE.
V_CHECK_NFL_M = 'X'.
ENDIF.
* calcula nota de fornecimento-acumulado.
IF V_NUM_NFL_AC > 0.

49

ABAP Training
V_CHECK_NFL_AC = ' '.
V_TOT_NFL_AC = V_SUM_NFL_AC / V_NUM_NFL_AC.
V_TOT_LOT_AC = 100 - ( V_SUM_LOT_AC / V_NUM_NFL_AC ) .
ELSE.
V_CHECK_NFL_AC = 'X'.
* ----------------------- Fim da Alterao --------------------------- *
ENDIF.
* calcula nota processo-mes.
IF V_SUM_PPM01_M > 0.
V_TOT_PPM_M = ( V_SUM_PPM89_M / V_SUM_PPM01_M ) *
C_MILHAO.
ENDIF.
V_TOT_NPR_M = 100 - ( V_TOT_PPM_M / 100 ).
IF V_TOT_NPR_M < 0.
V_TOT_NPR_M = 0.
ENDIF.
* calcula nota processo-acumulado.
IF V_SUM_PPM01_AC > 0.
V_TOT_PPM_AC = ( V_SUM_PPM89_AC / V_SUM_PPM01_AC ) *
C_MILHAO.
ENDIF.
V_TOT_NPR_AC = 100 - ( V_TOT_PPM_AC / 100 ).
IF V_TOT_NPR_AC < 0.
V_TOT_NPR_AC = 0.
ENDIF.
V_TOT_NPT_M = 100 + V_SUM_NPT_M.
IF V_TOT_NPT_M > 100.
V_TOT_NPT_M = 100.
ENDIF.
IF V_TOT_NPT_M < 0.
V_TOT_NPT_M = 0.
ENDIF.
* calcula nota de pontualidade.
V_TOT_NPT_AC = 100 + V_SUM_NPT_AC.
IF V_TOT_NPT_AC > 100.
V_TOT_NPT_AC = 100.
ENDIF.
IF V_TOT_NPT_AC < 0.
V_TOT_NPT_AC = 0.
ENDIF.
ENDFORM.
*----------------------------------------------------------------------*
*
Form F_GRAVA_TABFIM.
*----------------------------------------------------------------------*
* Grava tabela Final.
*----------------------------------------------------------------------*
FORM F_GRAVA_TABFIM.
* Verifica se ja existe registro gerado para empresa/fornecedor.
CLEAR: I_TABFIM.
READ TABLE I_TABFIM WITH KEY WERKS = V_WERKS
LIFNR = V_LIFNR.
IF SY-SUBRC NE 0.
I_TABFIM-WERKS = V_WERKS.

I_TABFIM-LIFNR = V_LIFNR.
I_TABFIM-NCQ_M = 100.
I_TABFIM-NCQ_AC = 100.
APPEND I_TABFIM.
ENDIF.
* Verifica qual tipo de nota foi calculado.
IF V_TIPO_NF <> 'FQ'.
* grava nota de fornecimento-mes.
IF V_CHECK_NFL_M = 'X'.
I_TABFIM-NFL_M = ' '.
I_TABFIM-LOT_M = ' '.
ELSE.
WRITE V_TOT_NFL_M TO I_TABFIM-NFL_M DECIMALS 0 RIGHTJUSTIFIED.
WRITE V_TOT_LOT_M TO I_TABFIM-LOT_M DECIMALS 2 RIGHTJUSTIFIED.
ENDIF.
* grava nota de fornecimento - acumulado.
IF V_CHECK_NFL_AC = 'X'.
I_TABFIM-NFL_AC = ' '.
I_TABFIM-LOT_AC = ' '.
ELSE.
WRITE V_TOT_NFL_AC TO I_TABFIM-NFL_AC DECIMALS 0
RIGHT-JUSTIFIED.
WRITE V_TOT_LOT_AC TO I_TABFIM-LOT_AC DECIMALS 2
RIGHT-JUSTIFIED.
ENDIF.
* grava valores para calculo futuro de PPM
WRITE V_SUM_PPM01_M TO I_TABFIM-PPM1_M DECIMALS 0
RIGHT-JUSTIFIED.
WRITE V_SUM_PPM01_AC TO I_TABFIM-PPM1_AC DECIMALS 0
RIGHT-JUSTIFIED.
* grava nota de processo - mes
IF V_CHECK_NFL_M = 'X'.
I_TABFIM-PPM_M = ' '.
I_TABFIM-NPR_M = ' '.
ELSE.
WRITE V_TOT_PPM_M TO I_TABFIM-PPM_M DECIMALS 0 RIGHTJUSTIFIED.
WRITE V_TOT_NPR_M TO I_TABFIM-NPR_M DECIMALS 0 RIGHTJUSTIFIED.
ENDIF.
* grava nota processo - acumulado.
IF V_CHECK_NFL_AC = 'X'.
I_TABFIM-PPM_AC = ' '.
I_TABFIM-NPR_AC = ' '.
ELSE.
WRITE V_TOT_PPM_AC TO I_TABFIM-PPM_AC DECIMALS 0
RIGHT-JUSTIFIED.
WRITE V_TOT_NPR_AC TO I_TABFIM-NPR_AC DECIMALS 0
RIGHT-JUSTIFIED.
ENDIF.
* grava nota de pontualidade - mes.
WRITE V_TOT_NPT_M TO I_TABFIM-NPT_M DECIMALS 0 RIGHTJUSTIFIED.
* grava nota de pontualidade - acumulado.

50

ABAP Training
WRITE V_TOT_NPT_AC TO I_TABFIM-NPT_AC DECIMALS 0 RIGHTJUSTIFIED.
ELSEIF V_TIPO_NF = 'FQ'.
* grava valores de nota de compromisso de qualidade - mes.
WRITE V_TOT_NCQ_M TO I_TABFIM-NCQ_M DECIMALS 0 RIGHTJUSTIFIED.
* grava valores de nota de compromisso de qualidade acumulado.
WRITE V_TOT_NCQ_AC TO I_TABFIM-NCQ_AC DECIMALS 0
RIGHT-JUSTIFIED.
ENDIF.
* atualiza tabela com valores calculados.
MODIFY I_TABFIM INDEX SY-TABIX.
IF V_TIPO_NF <> 'FQ'.
I_ACUM-CENTRO = I_TABFIM-WERKS.
I_ACUM-LIFNR = I_TABFIM-LIFNR.
I_ACUM-SUM_NPT_M = I_TABFIM-NPT_M.
I_ACUM-NUM_NPT_M = 1.
I_ACUM-SUM_NPT_AC = I_TABFIM-NPT_AC.
I_ACUM-NUM_NPT_AC = 1.
APPEND I_ACUM.
CLEAR I_ACUM.
ENDIF.
ENDFORM.
*----------------------------------------------------------------------*
*
Form F_SELECT_NCQ.
*----------------------------------------------------------------------*
* Selecao dos dados referente a nota de compromisso com a
qualidade.
*----------------------------------------------------------------------*
FORM F_SELECT_NCQ.
* seleciona os dados da VIqMEL.
SELECT MAWERK
LIFNUM
MATNR
STRMN
QMNUM
OBJNR
EBELN
EBELP
FROM VIQMEL
INTO TABLE I_VIQMEL
WHERE MAWERK IN SO_WERKS AND
LIFNUM IN SO_FORNE AND
MATNR IN SO_MATNR AND
STRMN >= V_DT_INICIO AND
STRMN <= V_DT_FIM AND
( QMART = 'F2' OR QMART = 'Q2' ).
IF SY-SUBRC NE 0. "se no encontrou medida.
V_TOT_NCQ_M = 100.
V_TOT_NCQ_AC = 100.
MOVE: I_VIQMEL-MAWERKS TO I_ACUM-CENTRO,
I_VIQMEL-LIFNUM TO I_ACUM-LIFNR,
1 TO I_ACUM-SUM_EMDIA_M,

1 TO I_ACUM-SUM_EMDIA_AC.
APPEND I_ACUM.
CLEAR I_ACUM.
EXIT.
ENDIF.
* Procura por notas estornadas
SELECT OBJNR
INACT
FROM JEST
INTO TABLE I_JEST_NCQ
FOR ALL ENTRIES IN I_VIQMEL
WHERE OBJNR = I_VIQMEL-OBJNR AND
STAT = 'I0076'.
* Elimina notas de fornecimento de lotes que estejam estornados.
LOOP AT I_VIQMEL.
READ TABLE I_JEST WITH KEY OBJNR = I_VIQMEL-OBJNR.
IF SY-SUBRC = 0 AND I_JEST-INACT = SPACE.
* Elimina registro marcado para delecao
DELETE I_VIQMEL.
ENDIF.
ENDLOOP.
* Verifica se ainda ha algum registro na tabela i_viqmel.
DESCRIBE TABLE I_VIQMEL LINES V_LINHAS.
IF V_LINHAS EQ 0.
V_TOT_NCQ_M = 100.
V_TOT_NCQ_AC = 100.
MOVE: I_VIQMEL-MAWERKS TO I_ACUM-CENTRO,
I_VIQMEL-LIFNUM TO I_ACUM-LIFNR,
1 TO I_ACUM-SUM_EMDIA_M,
1 TO I_ACUM-SUM_EMDIA_AC.
APPEND I_ACUM.
CLEAR I_ACUM.
EXIT.
ENDIF.
IF V_LINHAS > 0. "se ainda existe medida procura pelas notas.
SELECT QMNUM
ERDAT
FROM VIQMSM
INTO TABLE I_VIQMSM
FOR ALL ENTRIES IN I_VIQMEL
WHERE QMNUM = I_VIQMEL-QMNUM.
ENDIF.
SORT I_VIQMEL BY MAWERKS LIFNUM.
* atribui tipo de nota para gravacao na tabela final.
LOOP AT I_VIQMEL.
IF I_VIQMEL-MAWERKS EQ ' ' OR I_VIQMEL-LIFNUM EQ ' '.
CONTINUE.
ENDIF.
ON CHANGE OF I_VIQMEL-MAWERKS OR I_VIQMEL-LIFNUM.
IF V_TIPO_NF = 'FQ'.
MOVE:
V_WERKS
TO I_ACUM-CENTRO,
V_LIFNR
TO I_ACUM-LIFNR,
V_SUM_ATRAS_M TO I_ACUM-SUM_ATRAS_M,
V_SUM_ATRAS_AC TO I_ACUM-SUM_ATRAS_AC,
V_SUM_EMDIA_M TO I_ACUM-SUM_EMDIA_M,

51

ABAP Training
V_SUM_EMDIA_AC TO I_ACUM-SUM_EMDIA_AC.
APPEND I_ACUM.
CLEAR I_ACUM.
* chama rotina para calculo na NCQ.
PERFORM F_CALC_NCQ.
* chama rotina para gravacao da tabela final.
PERFORM F_GRAVA_TABFIM.
* limpa variaveis
CLEAR: V_SUM_ATRAS_M, V_SUM_ATRAS_AC,
V_SUM_EMDIA_M, V_SUM_EMDIA_AC,
V_TOT_NOTAS_M, V_TOT_NOTAS_AC,
V_TOT_NCQ_M, V_TOT_NCQ_AC.
ENDIF.
ENDON.
* guarda valores para geracao de arquivo final.
V_WERKS = I_VIQMEL-MAWERKS.
V_LIFNR = I_VIQMEL-LIFNUM.
V_TIPO_NF = 'FQ'.
READ TABLE I_VIQMSM WITH KEY QMNUM = I_VIQMEL-QMNUM.
IF SY-SUBRC EQ 0.
IF I_VIQMSM-ERDAT > I_VIQMEL-STRMN.
"nota QM
atrasada.
IF I_VIQMEL-STRMN >= V_DTI_ANALISE AND
I_VIQMEL-STRMN <= V_DT_FIM.
V_SUM_ATRAS_M = V_SUM_ATRAS_M + 1.
V_SUM_ATRAS_AC = V_SUM_ATRAS_AC + 1.
ELSE.
V_SUM_ATRAS_AC = V_SUM_ATRAS_AC + 1.
ENDIF.
ELSE.
IF I_VIQMEL-STRMN >= V_DTI_ANALISE AND
I_VIQMEL-STRMN <= V_DT_FIM.
V_SUM_EMDIA_M = V_SUM_EMDIA_M + 1.
V_SUM_EMDIA_AC = V_SUM_EMDIA_AC + 1.
ELSE.
V_SUM_EMDIA_AC = V_SUM_EMDIA_AC + 1.
ENDIF.
ENDIF.
ELSE.
IF I_VIQMEL-STRMN >= V_DTI_ANALISE AND
I_VIQMEL-STRMN <= V_DT_FIM.
V_SUM_ATRAS_M = V_SUM_ATRAS_M + 1.
V_SUM_ATRAS_AC = V_SUM_ATRAS_AC + 1.
ELSE.
V_SUM_ATRAS_AC = V_SUM_ATRAS_AC + 1.
ENDIF.
ENDIF.
ENDLOOP.
MOVE: I_VIQMEL-MAWERKS TO I_ACUM-CENTRO,
I_VIQMEL-LIFNUM TO I_ACUM-LIFNR,
V_SUM_ATRAS_M TO I_ACUM-SUM_ATRAS_M,
V_SUM_ATRAS_AC TO I_ACUM-SUM_ATRAS_AC,
V_SUM_EMDIA_M TO I_ACUM-SUM_EMDIA_M,
V_SUM_EMDIA_AC TO I_ACUM-SUM_EMDIA_AC.
APPEND I_ACUM.
CLEAR I_ACUM.
* chama rotina para calculo da NCQ.
PERFORM F_CALC_NCQ.
* chama rotina para gravacao da tabela final.
PERFORM F_GRAVA_TABFIM.

ENDFORM.
*----------------------------------------------------------------------*
*
Form F_CALC_NCQ
*----------------------------------------------------------------------*
* rotina para calculo de NCQ.
*----------------------------------------------------------------------*
FORM F_CALC_NCQ.
* calculo do mes.
V_TOT_NOTAS_M = V_SUM_EMDIA_M + V_SUM_ATRAS_M.
IF V_TOT_NOTAS_M > 0.
V_TOT_NCQ_M = ( V_SUM_EMDIA_M / V_TOT_NOTAS_M ) * 100.
ELSE.
V_TOT_NCQ_M = 100.
ENDIF.
* calculo do acumulado.
V_TOT_NOTAS_AC = V_SUM_EMDIA_AC + V_SUM_ATRAS_AC.
IF V_TOT_NOTAS_AC > 0.
V_TOT_NCQ_AC = ( V_SUM_EMDIA_AC / V_TOT_NOTAS_AC ) *
100.
ELSE.
V_TOT_NCQ_AC = 100.
ENDIF.
ENDFORM.
*----------------------------------------------------------------------*
*
Form F_SELECT_NAS.
*----------------------------------------------------------------------*
* Form para selecao dos dados referentea a nota de avaliacao de
sistem.
*----------------------------------------------------------------------*
FORM F_SELECT_NAS.
SELECT LIFNR
NAME1
SPRAS
STRAS
PFACH
PSTLZ
ORT01
REGIO
LAND1
FROM LFA1
INTO TABLE I_LFA1
WHERE LIFNR IN SO_FORNE.
ENDFORM.
*----------------------------------------------------------------------*
*
Form F_SELECT_NQF
*----------------------------------------------------------------------*
* Form para selecao dos dados referente a nota de qualidad. de
forn.
*----------------------------------------------------------------------*
FORM F_SELECT_NQF.
SELECT SINGLE KRGEW
FROM T147C
INTO V_FATOR_NFL
WHERE EKORG = '0001' AND

52

ABAP Training
HKRIT = '02' AND
TKRIT = '01'.
SELECT SINGLE KRGEW
FROM T147C
INTO V_FATOR_NPR
WHERE EKORG = '0001' AND
HKRIT = '02' AND
TKRIT = '04'.
SELECT SINGLE KRGEW
FROM T147C
INTO V_FATOR_NCQ
WHERE EKORG = '0001' AND
HKRIT = '02' AND
TKRIT = '02'.
* total de fatores de ponderacao
V_TOT_POND = V_FATOR_NFL + V_FATOR_NPR + V_FATOR_NCQ.
* loop na tabela de notas anterior p/ atualizacao do campo de nqf.
LOOP AT I_TABFIM.
* Se NFL e NPR estiverem BRANCOS, passar BRANCO *
IF I_TABFIM-NFL_M = ' ' AND I_TABFIM-NPR_M = ' '.
I_TABFIM-NQF_M = ' '.
ELSE.
IF V_TOT_POND <> 0.
"mes
V_TOT_NQF_M = ( ( I_TABFIM-NFL_M * V_FATOR_NFL ) +
( I_TABFIM-NPR_M * V_FATOR_NPR ) +
( I_TABFIM-NCQ_M * V_FATOR_NCQ ) ) /
V_TOT_POND.
WRITE V_TOT_NQF_M TO I_TABFIM-NQF_M DECIMALS 0.
ENDIF.
ENDIF.
IF I_TABFIM-NFL_AC = ' ' AND I_TABFIM-NPR_AC = ' '.
I_TABFIM-NQF_AC = ' '.
ELSE.
IF V_TOT_POND <> 0.
V_TOT_NQF_AC = ( ( I_TABFIM-NFL_AC * V_FATOR_NFL ) +
( I_TABFIM-NPR_AC * V_FATOR_NPR ) +
( I_TABFIM-NCQ_AC * V_FATOR_NCQ ) ) /
V_TOT_POND.
WRITE V_TOT_NQF_AC TO I_TABFIM-NQF_AC DECIMALS 0.
ENDIF.
ENDIF.
* Atualiza tabela
MODIFY I_TABFIM.
ENDLOOP.
SELECT WERKS
NAME1
SPRAS
STRAS
PFACH
PSTLZ
ORT01
REGIO
LAND1

FROM T001W
INTO TABLE I_T001W
FOR ALL ENTRIES IN I_TABFIM
WHERE WERKS = I_TABFIM-WERKS.
SELECT SINGLE
WERKS
NAME1
STRAS
PFACH
PSTLZ
ORT01
REGIO
LAND1
FROM KNA1
INTO I_REMET
WHERE KUNNR = P_REMET.
RAF)

" N remetente (quem emite o

* o idioma pelo qual o nome do pas deve ser procurado depende


do
* pas do remetente.
IF I_REMET-LAND1 EQ C_BR.
" Se remetente for brasileiro
V_IDIOMA = C_P.
" portugus
ELSEIF I_REMET-LAND1 EQ C_ARG. " Se remetente for argentino
V_IDIOMA = C_ESP.
" espanhol
ENDIF.
" Se remetente for brasileiro
SELECT LAND1
LANDX
FROM T005T
INTO TABLE I_PAIS
WHERE SPRAS = V_IDIOMA.
ENDFORM.
*----------------------------------------------------------------------*
*
Form F_GRAVA_DET_MAT.
*----------------------------------------------------------------------*
* Gera impressao detalhada por material
*----------------------------------------------------------------------*
FORM F_GRAVA_DET_MAT.
CLEAR: I_DET_MAT.
I_DET_MAT-WERKS = V_WERKS.
I_DET_MAT-LIFNR = V_LIFNR.
I_DET_MAT-MATNR = V_MATNR.
I_DET_MAT-DATA = I_QAVE-VDATUM.
I_DET_MAT-TIPO_NF = V_TIPO_NF.
IF V_TIPO_NF = '89'.
I_DET_MAT-LMENGESCH = I_QALS-LMENGESCH.
ELSEIF V_TIPO_NF = '01'.
I_DET_MAT-QKENNZAHL = I_QAVE-QKENNZAHL.
I_DET_MAT-LMENGEIST = I_QALS-LMENGEIST.
ENDIF.
APPEND I_DET_MAT.
ENDFORM.
*----------------------------------------------------------------------*
*
Form F_PRINT_REPORT
*----------------------------------------------------------------------*
* imprime o report

53

ABAP Training
*----------------------------------------------------------------------*
FORM F_PRINT_REPORT.
DATA: V_FORNEC LIKE QALS-LIFNR.
CLEAR: V_TOT_NFL_M, V_TOT_NFL_AC,
V_TOT_NPR_M, V_TOT_NPR_AC,
V_TOT_NCQ_M, V_TOT_NCQ_AC,
V_TOT_NQF_M, V_TOT_NQF_AC,
V_TOT_NPT_M, V_TOT_NPT_AC,
V_TOT_NAS_M,
V_TOT_PPM_M, V_TOT_PPM_AC,
V_TOT_LOT_M, V_TOT_LOT_AC.
DESCRIBE TABLE I_TABFIM LINES V_LINHAS.

FORMAT COLOR COL_NORMAL.


WRITE: /05 P_MES,
32 I_TABFIM-NFL_M,
47 I_TABFIM-NPR_M,
62 I_TABFIM-NCQ_M,
77 I_TABFIM-NQF_M,
92 I_TABFIM-NPT_M,
107 I_TABFIM-PPM_M HOTSPOT ON.
WRITE: 119 I_FORNEC-PPM_OBJ.
WRITE: 137 I_TABFIM-LOT_M.

IF V_LINHAS EQ 0.
MESSAGE I083 WITH
'No h dados para os critrios de seleo' 'informados'.
EXIT.
ENDIF.

WRITE: 147 I_FORNEC-LOT_OBJ,


170 ' '.
HIDE: I_TABFIM-LIFNR, I_TABFIM-WERKS.

SORT I_TABFIM BY LIFNR WERKS.

FORMAT COLOR COL_NORMAL.


WRITE: /05 'Acum.', P_PERIOD, 'Mes(es)',
32 I_TABFIM-NFL_AC,
47 I_TABFIM-NPR_AC,
62 I_TABFIM-NCQ_AC,
77 I_TABFIM-NQF_AC,
92 I_TABFIM-NPT_AC,
107 I_TABFIM-PPM_AC HOTSPOT ON,
137 I_TABFIM-LOT_AC,
170 ' '.
HIDE: I_TABFIM-LIFNR, I_TABFIM-WERKS.
V_FORNEC = I_TABFIM-LIFNR.
AT LAST.

LOOP AT I_TABFIM WHERE WERKS IN SO_CENT.


READ TABLE I_T001W WITH KEY WERKS = I_TABFIM-WERKS.
READ TABLE I_LFA1 WITH KEY LIFNR = I_TABFIM-LIFNR.
ON CHANGE OF I_TABFIM-LIFNR.
IF V_PRIM_VEZ = 'F'.
IF SO_CENT EQ ' '.
READ TABLE I_TOT_FORNEC WITH KEY LIFNR = V_FORNEC.
PERFORM F_PRINT_TOTAL.
ENDIF.
ENDIF.
READ TABLE I_FORNEC WITH KEY LIFNR = I_TABFIM-LIFNR.
FORMAT COLOR COL_NORMAL INTENSIFIED ON.
WRITE: /02 I_TABFIM-LIFNR,
15 I_LFA1-NAME1,
60 'NAS = ', I_FORNEC-NAS,
170 ' '.
FORMAT COLOR COL_NORMAL.
V_PRIM_VEZ = 'F'.
CLEAR: V_TOT_NFL_M, V_TOT_NFL_AC,
V_TOT_NPR_M, V_TOT_NPR_AC,
V_TOT_NCQ_M, V_TOT_NCQ_AC,
V_TOT_NQF_M, V_TOT_NQF_AC,
V_TOT_NPT_M, V_TOT_NPT_AC,
V_TOT_NAS_M,
V_TOT_PPM_M, V_TOT_PPM_AC,
V_TOT_LOT_M, V_TOT_LOT_AC.
* Busca valores de OBJ PPM e LOTE
READ TABLE I_FORNEC WITH KEY LIFNR = I_TABFIM-LIFNR.
ENDON.
* Imprimir descrio de Centro
ON CHANGE OF I_TABFIM-WERKS OR I_TABFIM-LIFNR.
FORMAT COLOR COL_NORMAL INTENSIFIED ON.
WRITE: /05 I_TABFIM-WERKS,
15 I_T001W-NAME,
170 ' '.
ENDON.

FORMAT COLOR COL_NORMAL.

READ TABLE I_TOT_FORNEC WITH KEY LIFNR = V_FORNEC.


IF SO_CENT EQ ' '.
PERFORM F_PRINT_TOTAL.
ENDIF.
ENDAT.
FORMAT COLOR COL_NORMAL.
ENDLOOP.
IF SY-SUBRC NE 0.
MESSAGE I083 WITH
'No h dados para os critrios de seleo' 'informados'.
EXIT.
ENDIF.
ULINE.
IF SO_CENT EQ '' AND SO_FORNE EQ '' AND SO_MATNR EQ ''.
PERFORM F_PRINT_TOTAL_FINAL.
PERFORM F_PRINT_TOTAL_ACUM.
ELSEIF SO_CENT NE '' AND SO_FORNE EQ '' AND SO_MATNR EQ
''.
PERFORM F_PRINT_TOTAL_FINAL.
ENDIF.
ENDFORM.
*----------------------------------------------------------------------*
*
Form F_PRINT_REP_DET.
*----------------------------------------------------------------------*
* Imprime relatorio detalhado por item.
*----------------------------------------------------------------------*

54

ABAP Training
FORM F_PRINT_REP_DET.
LOOP AT I_TAB_DET_FIM.
IF I_TAB_DET_FIM-LIFNR = I_TABFIM-LIFNR AND
I_TAB_DET_FIM-WERKS = I_TABFIM-WERKS.
CLEAR: I_MAKT, I_FORNEC_MAT.
READ TABLE I_MAKT WITH KEY MATNR = I_TAB_DET_FIMMATNR.
READ TABLE I_FORNEC_MAT WITH KEY LIFNR =
I_TAB_DET_FIM-LIFNR
MATNR = I_TAB_DET_FIM-MATNR.
FORMAT COLOR COL_NORMAL.
WRITE: /02 I_TAB_DET_FIM-MATNR,
17 I_MAKT-MAKTX.
WRITE: 55 I_TAB_DET_FIM-PPM_M,
70 I_TAB_DET_FIM-LOT_M.
WRITE: 84 I_TAB_DET_FIM-PPM_AC,
97 I_TAB_DET_FIM-LOT_AC,
113 I_FORNEC_MAT-PPM_OBJ,
133 I_FORNEC_MAT-LOT_OBJ,
170 ''.
ENDIF.
ENDLOOP.
ULINE.
ENDFORM.
*----------------------------------------------------------------------*
*
Form f_prepara_sapscript.
*----------------------------------------------------------------------*
* Prepara SAPSCRIPT para impresso
*----------------------------------------------------------------------*
FORM F_PREPARA_SAPSCRIPT.
DATA: V_FLAG_IMPRES(1) TYPE C,
V_PRIM_VEZ_SAPSCRIPT TYPE C VALUE 'S'.
* Define valores de linhas x quebra de pgina
C_LINHA = ( 64 * 127 / 30 ). "64 linhas * X mm por linha
C_LINHA1 = ( 61 * 127 / 30 ). "61 linhas * X mm por linha
* Contador de nmero de linhas
* 8.89 cm = 21 linhas do topo da pgina (11 linhas da MAIN + 10
at
*
o topo)
V_TIME = 889 / 10.
DESCRIBE TABLE I_TABFIM LINES V_LINHAS.
IF V_LINHAS = 0.
MESSAGE I083 WITH
'No h dados para os critrios de seleo' ' informados'.
EXIT.
ENDIF.
V_FLAG_IMPRES = C_SIM.
V_PRIM_VEZ = C_SIM.
SORT I_TABFIM BY LIFNR.
* Imprime SAPSCRIPT
LOOP AT I_TABFIM.

READ TABLE I_TOT_FORNEC WITH KEY LIFNR = I_TABFIMLIFNR.


IF I_TOT_FORNEC-PPM_M = ' '.
CONTINUE.
ENDIF.
IF V_FLAG_IMPRES = C_SIM(1).
* Abre form para impresso de sapscript
PERFORM F_OPEN_FORM.
V_FLAG_IMPRES = C_NAO.
ENDIF.
ON CHANGE OF I_TABFIM-LIFNR.
IF V_PRIM_VEZ <> C_SIM(1).
* Resumo dos ndices de PPM de linha e % rejeio de Lote no
Recebimento
PERFORM F_LOOP_RESUMO_INDICE.
V_TIME = 889 / 10.
V_PRIM_VEZ = C_SIM.
V_PRIM_VEZ_SAPSCRIPT = C_SIM(1).
ENDIF.
ENDON.
CLEAR: I_LFA1, I_T001W.
* Descrio do Fornecedor e Centro
READ TABLE I_LFA1 WITH KEY LIFNR = I_TABFIM-LIFNR.
READ TABLE I_T001W WITH KEY WERKS = I_TABFIM-WERKS.
READ TABLE I_TOT_FORNEC WITH KEY LIFNR = I_TABFIMLIFNR.
READ TABLE I_FORNEC WITH KEY LIFNR = I_TABFIM-LIFNR.
* Inicia formulrio
IF V_PRIM_VEZ_SAPSCRIPT = C_SIM(1).
PERFORM F_START_FORM.
ENDIF.
* Data de Referncia / Acumulado de:
PERFORM F_EXTENSO_DATA USING V_DT_FIM+4(2)
V_DT_FIM+2(2)
CHANGING ZSAPSCRIP2-DATA_REF.
PERFORM F_EXTENSO_DATA USING V_DT_INICIO+4(2)
V_DT_INICIO+2(2)
CHANGING ZSAPSCRIP2-ACUM_DT1.
PERFORM F_EXTENSO_DATA USING V_DT_FIM+4(2)
V_DT_FIM+2(2)
CHANGING ZSAPSCRIP2-ACUM_DT2.
* Dados do Destinrio
ZSAPSCRIP2-NAMEF
= I_LFA1-NAME1.
ZSAPSCRIP2-LIFNR
= I_TABFIM-LIFNR.
ZSAPSCRIP2-DEST_NAME
= I_LFA1-NAME1.
ZSAPSCRIP2-DEST_RUA
= I_LFA1-STRAS.
ZSAPSCRIP2-DEST_CAIXA
= I_LFA1-PFACH.
ZSAPSCRIP2-DEST_CEP
= I_LFA1-PSTLZ.
ZSAPSCRIP2-DEST_CITY
= I_LFA1-ORT01.
ZSAPSCRIP2-DEST_REG
= I_LFA1-REGIO.
READ TABLE I_PAIS WITH KEY LAND1 = I_LFA1-LAND1.
ZSAPSCRIP2-DEST_PAIS
= I_PAIS-LANDX.
* Dados do Remetente
ZSAPSCRIP2-NAMEC
= I_T001W-NAME.
ZSAPSCRIP2-REM_NAME
= I_REMET-NAME.
ZSAPSCRIP2-REM_RUA
= I_REMET-STRAS.
ZSAPSCRIP2-REM_CAIXA
= I_REMET-PFACH.
ZSAPSCRIP2-REM_CEP
= I_REMET-PSTLZ.

55

ABAP Training
ZSAPSCRIP2-REM_CITY
= I_REMET-ORT01.
ZSAPSCRIP2-REM_REG
= I_REMET-REGIO.
READ TABLE I_PAIS WITH KEY LAND1 = I_REMET-LAND1.
ZSAPSCRIP2-REM_PAIS
= I_PAIS-LANDX.
IF I_FORNEC-NAS = ' '.
* Se o pas do Remetente for
* argentina e o pas do fornecedor for argentina, imprimir o
relatrio
* espanhol. Se ambos forem Brasil, imprimir em portugus. Para
os
* demais casos, imprimir em ingls.

PERFORM F_WRITE_RESUMO_UNIDADES.
V_PRIM_VEZ_SAPSCRIPT = C_NAO(1).
ENDIF.
* Resumo por Unidade
ZSAPSCRIP2-NQF_M = I_TABFIM-NQF_M.
ZSAPSCRIP2-NQF_AC = I_TABFIM-NQF_AC.
ZSAPSCRIP2-NFL_M = I_TABFIM-NFL_M.
ZSAPSCRIP2-NFL_AC = I_TABFIM-NFL_AC.
ZSAPSCRIP2-NPR_M = I_TABFIM-NPR_M.
ZSAPSCRIP2-NPR_AC = I_TABFIM-NPR_AC.
ZSAPSCRIP2-NCQ_M = I_TABFIM-NCQ_M.
ZSAPSCRIP2-NCQ_AC = I_TABFIM-NCQ_AC.
ZSAPSCRIP2-NPT_M = I_TABFIM-NPT_M+1.
ZSAPSCRIP2-NPT_AC = I_TABFIM-NPT_AC+1.

IF I_LFA1-LAND1 EQ C_BR AND I_REMET-LAND1 EQ C_BR.


ZSAPSCRIP2-AVALIA = C_NAO.
ELSE.
ZSAPSCRIP2-AVALIA = C_NO.
ENDIF.
ELSE.
IF I_LFA1-LAND1 EQ C_BR AND I_REMET-LAND1 EQ C_BR.
ZSAPSCRIP2-AVALIA = C_SIM.
ELSEIF I_LFA1-LAND1 EQ C_ARG AND I_REMET-LAND1 EQ
C_ARG.
ZSAPSCRIP2-AVALIA = C_SI.
ELSE.
ZSAPSCRIP2-AVALIA = C_YES.
ENDIF.
ENDIF.
IF I_TOT_FORNEC-NFL_M = ' '.
IF I_LFA1-LAND1 EQ C_BR AND I_REMET-LAND1 EQ C_BR.
ZSAPSCRIP2-ATIVO = C_NAO.
ELSE.
ZSAPSCRIP2-ATIVO = C_NO.
ENDIF.
ELSE.
IF I_LFA1-LAND1 EQ C_BR AND I_REMET-LAND1 EQ C_BR.
ZSAPSCRIP2-ATIVO = C_SIM.
ELSEIF I_LFA1-LAND1 EQ C_ARG AND I_REMET-LAND1 EQ
C_ARG.
ZSAPSCRIP2-ATIVO = C_SI.
ELSE.
ZSAPSCRIP2-ATIVO = C_YES.
ENDIF.
ENDIF.

* Verifica se est ativo para o determinado fornecedor:


IF I_TABFIM-NFL_M = ' '.
* Se o pas do Remetente for
* argentina e o pas do fornecedor for argentina, imprimir o
relatrio
* espanhol. Se ambos forem Brasil, imprimir em portugus. Para
os
* demais casos, imprimir em ingls.
IF I_LFA1-LAND1 EQ C_BR AND I_REMET-LAND1 EQ C_BR.
ZSAPSCRIP2-ATIVO = C_NAO.
ELSE.
ZSAPSCRIP2-ATIVO = C_NO.
ENDIF.
ELSE.
IF I_LFA1-LAND1 EQ C_BR AND I_REMET-LAND1 EQ C_BR.
ZSAPSCRIP2-ATIVO = C_SIM.
ELSEIF I_LFA1-LAND1 EQ C_ARG AND I_REMET-LAND1 EQ
C_ARG.
ZSAPSCRIP2-ATIVO = C_SI.
ELSE.
ZSAPSCRIP2-ATIVO = C_YES.
ENDIF.
ENDIF.
IF V_PRIM_VEZ = C_SIM(1).
* Impresso do resumo por Unidades
PERFORM F_WRITE_RESUMO_POR_UNIDADE.
V_PRIM_VEZ = C_NAO.
ELSEIF V_TIME > C_LINHA1.
* Impresso do resumo por Unidades
PERFORM F_WRITE_RESUMO_POR_UNIDADE.
V_TIME = ( 14 * 127 / 30 ).
ENDIF.

* Iguala todos os campos da tabela de resumo de unidade para a


estrutura
ZSAPSCRIP2-PPM_M = I_TOT_FORNEC-PPM_M.
ZSAPSCRIP2-PPM_AC = I_TOT_FORNEC-PPM_AC.
ZSAPSCRIP2-NQF_M_T = I_TOT_FORNEC-NQF_M.
ZSAPSCRIP2-NQF_AC_T = I_TOT_FORNEC-NQF_AC.
ZSAPSCRIP2-NAS_M_T = I_FORNEC-NAS.
ZSAPSCRIP2-NPT_AC_T = I_TOT_FORNEC-NPT_AC+1.
ZSAPSCRIP2-NPT_M_T = I_TOT_FORNEC-NPT_M+1.
ZSAPSCRIP2-NFL_M_T = I_TOT_FORNEC-NFL_M.
ZSAPSCRIP2-NFL_AC_T = I_TOT_FORNEC-NFL_AC.
ZSAPSCRIP2-NPR_M_T = I_TOT_FORNEC-NPR_M.
ZSAPSCRIP2-NPR_AC_T = I_TOT_FORNEC-NPR_AC.
ZSAPSCRIP2-NCQ_M_T = I_TOT_FORNEC-NCQ_M.
ZSAPSCRIP2-NCQ_AC_T = I_TOT_FORNEC-NCQ_AC.

* Atualiza contador de linhas


ZSAPSCRIP2-CONT = V_TIME.

* Impresso do resumo de todas as Unidades


IF V_PRIM_VEZ_SAPSCRIPT = C_SIM(1).

* Chama FORM de impresso de detalhe Resumo por Unidade


PERFORM F_WRITE_DET_RESUMO_POR_UNIDADE.
* Grava dados para resumo de ndice de PPM
PERFORM F_GRAVA_RES_INDICE.
ENDLOOP.
IF V_PRIM_VEZ <> C_SIM(1).
* Imprime ltimo fornecedor cadastrado
PERFORM F_LOOP_RESUMO_INDICE.
ENDIF.
IF V_FLAG_IMPRES = C_SIM(1).
MESSAGE I083 WITH
'No h dados para os critrios de seleo' ' informados'.
ELSE.

56

ABAP Training
* Encerra a impresso via SAPSCRIPT.
CALL FUNCTION 'CLOSE_FORM'
EXCEPTIONS
UNOPENED = 1
OTHERS = 2.
ENDIF.
ENDFORM.
*----------------------------------------------------------------------*
*
Form f_CALC_DET_MAT.
*----------------------------------------------------------------------*
* SUMARIZA VALORES POR MATERIAL
*----------------------------------------------------------------------*
FORM F_CALC_DET_MAT.
CLEAR: V_SUM_PPM89_M,
V_SUM_PPM89_AC,
V_NUM_NFL_M, V_SUM_NFL_M, V_SUM_PPM01_M,
V_SUM_LOT_M, V_SUM_LOT_AC,
V_NUM_NFL_AC, V_SUM_NFL_AC, V_SUM_PPM01_AC.
CLEAR: V_WERKS, V_LIFNR, V_MATNR, V_TIPO_NF.
SORT I_DET_MAT BY WERKS LIFNR MATNR TIPO_NF.
LOOP AT I_DET_MAT.
ON CHANGE OF I_DET_MAT-WERKS OR I_DET_MAT-LIFNR
OR I_DET_MAT-MATNR.
IF V_TIPO_NF NE ' '.
PERFORM F_GRAVA_DET_FIM.
CLEAR: V_SUM_PPM89_M,
V_SUM_PPM89_AC,
V_SUM_LOT_M, V_SUM_LOT_AC,
V_NUM_NFL_M, V_SUM_NFL_M, V_SUM_PPM01_M,
V_NUM_NFL_AC, V_SUM_NFL_AC, V_SUM_PPM01_AC.
ENDIF.
ENDON.
* guarda valores para geracao de arquivo final.
V_WERKS = I_DET_MAT-WERKS.
V_LIFNR = I_DET_MAT-LIFNR.
V_MATNR = I_DET_MAT-MATNR.
V_TIPO_NF = I_DET_MAT-TIPO_NF.
IF I_DET_MAT-TIPO_NF = '89'.
IF I_DET_MAT-DATA >= V_DTI_ANALISE AND
I_DET_MAT-DATA <= V_DT_FIM.
V_SUM_PPM89_M = V_SUM_PPM89_M + I_DET_MATLMENGESCH.
V_SUM_PPM89_AC = V_SUM_PPM89_AC + I_DET_MATLMENGESCH.
ELSE.
V_SUM_PPM89_AC = V_SUM_PPM89_AC + I_DET_MATLMENGESCH.
ENDIF.
ELSEIF I_DET_MAT-TIPO_NF = '01'.
IF I_DET_MAT-DATA >= V_DTI_ANALISE AND
I_DET_MAT-DATA <= V_DT_FIM.
* sumariza o numero de ocorrencias para um dado tipo de
controle.
V_NUM_NFL_M = V_NUM_NFL_M + 1.

* contabiliza NFL e LOT.


V_SUM_NFL_M = V_SUM_NFL_M + I_DET_MAT-QKENNZAHL.
IF I_DET_MAT-QKENNZAHL <> 1.
V_SUM_LOT_M = V_SUM_LOT_M + I_DET_MAT-QKENNZAHL.
ENDIF.
V_SUM_PPM01_M = V_SUM_PPM01_M + I_DET_MATLMENGEIST.
V_NUM_NFL_AC = V_NUM_NFL_AC + 1.
V_SUM_NFL_AC = V_SUM_NFL_AC + I_DET_MAT-QKENNZAHL.
IF I_DET_MAT-QKENNZAHL <> 1.
V_SUM_LOT_AC = V_SUM_LOT_AC + I_DET_MATQKENNZAHL.
ENDIF.
V_SUM_PPM01_AC = V_SUM_PPM01_AC + I_DET_MATLMENGEIST.
ELSE.
* sumariza o numero de ocorrencias pra um dado tipo de
controle.
V_NUM_NFL_AC = V_NUM_NFL_AC + 1.
* contabiliza NFL e LOT.
V_SUM_NFL_AC = V_SUM_NFL_AC + I_DET_MATQKENNZAHL.
IF I_DET_MAT-QKENNZAHL <> 1.
V_SUM_LOT_AC = V_SUM_LOT_AC + I_DET_MATQKENNZAHL.
ENDIF.
* contabiliza valor para calculo de nota de processo.
V_SUM_PPM01_AC = V_SUM_PPM01_AC + I_DET_MATLMENGEIST.
ENDIF.
ENDIF.
ENDLOOP.
* Grava dados do ltimo registro
PERFORM F_GRAVA_DET_FIM.
CLEAR: V_SUM_PPM89_M,
V_SUM_PPM89_AC,
V_SUM_LOT_M, V_SUM_LOT_AC,
V_NUM_NFL_M, V_SUM_NFL_M, V_SUM_PPM01_M,
V_NUM_NFL_AC, V_SUM_NFL_AC, V_SUM_PPM01_AC.
ENDFORM.
*----------------------------------------------------------------------*
*
Form f_grava_det_fim.
*----------------------------------------------------------------------*
* Grava tabela final de detalhes de itens.
*----------------------------------------------------------------------*
FORM F_GRAVA_DET_FIM.
CLEAR: I_TAB_DET_FIM.
READ TABLE I_TAB_DET_FIM WITH KEY WERKS = V_WERKS
LIFNR = V_LIFNR
MATNR = V_MATNR.
IF SY-SUBRC <> 0.
I_TAB_DET_FIM-WERKS = V_WERKS.
I_TAB_DET_FIM-LIFNR = V_LIFNR.
I_TAB_DET_FIM-MATNR = V_MATNR.
APPEND I_TAB_DET_FIM.
ENDIF.

57

ABAP Training
* grava nota de fornecimento - mes_acumulado.
IF V_NUM_NFL_M > 0.
V_CHECK_NFL_M = ' '.
V_TOT_LOT_M = 100 - ( V_SUM_LOT_M / V_NUM_NFL_M ).
ELSE.
V_CHECK_NFL_M = 'X'.
ENDIF.
* grava nota de fornecimento mes / acum.
IF V_NUM_NFL_AC > 0.
V_CHECK_NFL_AC = ' '.
V_TOT_LOT_AC = 100 - ( V_SUM_LOT_AC / V_NUM_NFL_AC ).
ELSE.
V_CHECK_NFL_AC = 'X'.
ENDIF.
* calcula nota de processo - mes.
IF V_SUM_PPM01_M > 0.
V_TOT_PPM_M = ( V_SUM_PPM89_M / V_SUM_PPM01_M ) *
C_MILHAO.
ENDIF.
* calcula nota de processo - acum.
IF V_SUM_PPM01_AC > 0.
V_TOT_PPM_AC = ( V_SUM_PPM89_AC / V_SUM_PPM01_AC ) *
C_MILHAO.
ENDIF.
* grava nota processo mes / ac.
IF V_CHECK_NFL_AC = 'X'.
I_TAB_DET_FIM-PPM_M = ' '.
I_TAB_DET_FIM-PPM_AC = ' '.
I_TAB_DET_FIM-LOT_M = ' '.
I_TAB_DET_FIM-LOT_AC = ' '.
ELSE.
WRITE V_TOT_LOT_AC TO I_TAB_DET_FIM-LOT_AC DECIMALS 2
RIGHT-JUSTIFIED.
WRITE V_TOT_LOT_M TO I_TAB_DET_FIM-LOT_M DECIMALS 2
RIGHT-JUSTIFIED.
WRITE V_TOT_PPM_M TO I_TAB_DET_FIM-PPM_M DECIMALS 0
RIGHT-JUSTIFIED.
WRITE V_TOT_PPM_AC TO I_TAB_DET_FIM-PPM_AC DECIMALS 0
RIGHT-JUSTIFIED.
ENDIF.
MODIFY I_TAB_DET_FIM INDEX SY-TABIX.
ENDFORM.
*----------------------------------------------------------------------*
*
Form f_acha_descricoes.
*----------------------------------------------------------------------*
* Grava tabela final de detalhes de itens.
*----------------------------------------------------------------------*
FORM F_ACHA_DESCRICOES.
SELECT MATNR
MAKTX
FROM MAKT
INTO TABLE I_MAKT
FOR ALL ENTRIES IN I_TAB_DET_FIM
WHERE MATNR = I_TAB_DET_FIM-MATNR.
ENDFORM.
*----------------------------------------------------------------------*
*
Form f_print_total.

*----------------------------------------------------------------------*
* Imprime total do rel. UM.
*----------------------------------------------------------------------*
FORM F_PRINT_TOTAL.
FORMAT COLOR COL_TOTAL.
WRITE: /05 'Acum ms MTB ',
32 I_TOT_FORNEC-NFL_M,
47 I_TOT_FORNEC-NPR_M,
62 I_TOT_FORNEC-NCQ_M,
77 I_TOT_FORNEC-NQF_M,
92 I_TOT_FORNEC-NPT_M,
107 I_TOT_FORNEC-PPM_M,
137 I_TOT_FORNEC-LOT_M,
170 ' '.
WRITE: /05 'Acum MTB(' NO-GAP, P_PERIOD, 'meses)',
32 I_TOT_FORNEC-NFL_AC,
47 I_TOT_FORNEC-NPR_AC,
62 I_TOT_FORNEC-NCQ_AC,
77 I_TOT_FORNEC-NQF_AC,
92 I_TOT_FORNEC-NPT_AC,
107 I_TOT_FORNEC-PPM_AC,
137 I_TOT_FORNEC-LOT_AC,
170 ' '.
FORMAT COLOR COL_NORMAL.
ENDFORM.
*&---------------------------------------------------------------------*
*&
Form F_OPEN_FORM
*&---------------------------------------------------------------------*
* Abre o frmulrio para impresso via SAPSCRIPT
*----------------------------------------------------------------------*
FORM F_OPEN_FORM.
DATA: V_DIALOG TYPE C VALUE 'X'.
ITCPO-TDDEST = P_IMPRE.
IF P_BATCH NE ' '.
ITCPO-TDIMMED = 'X'.
ITCPO-TDNEWID = 'X'.
V_DIALOG = ' '.
ENDIF.
* Abre o frmulrio para impresso via SAPSCRIPT
CALL FUNCTION 'OPEN_FORM'
EXPORTING
DEVICE
= 'PRINTER'
FORM
= 'Z_AVAL_FORNEC'
LANGUAGE
= SY-LANGU
OPTIONS
= ITCPO
DIALOG
= V_DIALOG.
ENDFORM.
" F_OPEN_FORM
*&---------------------------------------------------------------------*
*&
Form F_WRITE_RESUMO_UNIDADES
*&---------------------------------------------------------------------*
* Chama o elemento de texto RESUMO_TODAS_ATIVIDADES
*----------------------------------------------------------------------*
FORM F_WRITE_RESUMO_UNIDADES.
* Chama o elemento de texto RESUMO_TODAS_ATIVIDADES
CALL FUNCTION 'WRITE_FORM'
EXPORTING
ELEMENT
= 'RESUMO_TODAS_UNIDADES'

58

ABAP Training
WINDOW
ENDFORM.

= 'MAIN'.
" F_WRITE_RESUMO_UNIDADES

*&---------------------------------------------------------------------*
*&
Form F_WRITE_RESUMO_POR_UNIDADE
*&---------------------------------------------------------------------*
* Chama o elemento de texto RESUMO_POR_UNIDADE
*----------------------------------------------------------------------*
FORM F_WRITE_RESUMO_POR_UNIDADE.
* Chama o elemento de texto RESUMO_POR_UNIDADE
* que contm o cabealho do RESUMO_POR_UNIDADE
CALL FUNCTION 'WRITE_FORM'
EXPORTING
ELEMENT
= 'RESUMO_POR_UNIDADE'
WINDOW
= 'MAIN'.
ENDFORM.

" F_WRITE_RESUMO_POR_UNIDADE

*&---------------------------------------------------------------------*
*&
Form F_WRITE_DET_RESUMO_POR_UNIDADE
*&---------------------------------------------------------------------*
* Chama o elemento de texto DETALHE_RESUMO_POR_UNIDADE,
que contm os
* dados do RESUMO_POR_UNIDADE.
*----------------------------------------------------------------------*
FORM F_WRITE_DET_RESUMO_POR_UNIDADE.
* Chama o elemento de texto DETALHE_RESUMO_POR_UNIDADE,
que contm os
* dados do RESUMO_POR_UNIDADE.
CALL FUNCTION 'WRITE_FORM'
EXPORTING
ELEMENT
= 'DETALHE_RESUMO_POR_UNIDADE'
WINDOW
= 'MAIN'.
V_TIME = V_TIME + ( 127 / 10 ). "acrescenta 3 linhas origem
ZSAPSCRIP2-CONT = V_TIME.
ENDFORM.
" F_WRITE_DET_RESUMO_POR_UNIDADE
*&---------------------------------------------------------------------*
*&
Form F_WRITE_RESUMO_INDICE
*&---------------------------------------------------------------------*
* Chama o elemento de texto RESUMO_INDICES_PPM
*----------------------------------------------------------------------*
FORM F_WRITE_RESUMO_INDICE.
* Chama o elemento de texto RESUMO_INDICES_PPM
CALL FUNCTION 'WRITE_FORM'
EXPORTING
ELEMENT
= 'RESUMO_INDICES_PPM'
WINDOW
= 'MAIN'.
V_TIME = V_TIME + ( 1270 / 75 ). "PULA 4 LINHAS
ZSAPSCRIP2-CONT = V_TIME.
ENDFORM.

" F_WRITE_RESUMO_INDICE

*&---------------------------------------------------------------------*
*&
Form F_WRITE_DET_RESUMO_INDICE
*&---------------------------------------------------------------------*
* Chama o elemento de texto DETALHE_RESUMO_INDICES_PPM,
que contm os
* dados do RESUMO_INDICES_PPM.
*----------------------------------------------------------------------*

FORM F_WRITE_DET_RESUMO_INDICE.
* Chama o elemento de texto DETALHE_RESUMO_INDICES_PPM,
que contm os
* dados do RESUMO_INDICES_PPM.
CALL FUNCTION 'WRITE_FORM'
EXPORTING
ELEMENT
= 'DETALHE_RESUMO_INDICES_PPM'
WINDOW
= 'MAIN'.
V_TIME = V_TIME + ( 127 / 30 ). "AUMENTA UMA LINHA
ZSAPSCRIP2-CONT = V_TIME.
ENDFORM.
" F_WRITE_DET_RESUMO_INDICE
*&---------------------------------------------------------------------*
*&
Form F_WRITE_VERSO_PAG
*&---------------------------------------------------------------------*
FORM F_WRITE_VERSO_PAG.
* Se o pas do Remetente for
* argentina e o pas do fornecedor for argentina, imprimir o
relatrio
* espanhol. Se ambos forem Brasil, imprimir em portugus. Para
os
* demais casos, imprimir em ingls.
IF I_LFA1-LAND1 EQ C_BR AND I_REMET-LAND1 EQ C_BR.
V_IDIOMA = C_P.
ELSEIF I_LFA1-LAND1 EQ C_ARG AND I_REMET-LAND1 EQ C_ARG.
V_IDIOMA = C_ESP.
ELSE.
V_IDIOMA = C_ENG.
ENDIF.
* Abre o formulrio para impresso da pgina de verso
CALL FUNCTION 'START_FORM'
EXPORTING
FORM
= 'Z_AVAL_FORNEC'
LANGUAGE
= V_IDIOMA
STARTPAGE = 'VERSO'
IMPORTING
LANGUAGE
= SY-LANGU.
* imprime pgina de verso
CALL FUNCTION 'WRITE_FORM'
EXPORTING
WINDOW = 'INFO3'.
CALL FUNCTION 'END_FORM'.

"Encerra formulrio

ENDFORM.
" F_WRITE_VERSO_PAG
*&---------------------------------------------------------------------*
*&
Form F_LOOP_RESUMO_INDICE
*&---------------------------------------------------------------------*
*
text
*
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM F_LOOP_RESUMO_INDICE.
* Resumo dos ndices de PPM de linha e % rejeio de Lote no
Recebimento
V_PRIM_VEZ = C_SIM.
LOOP AT I_RES_INDICE.
IF V_PRIM_VEZ = C_SIM(1) AND V_TIME <= C_LINHA1.
* Form de impresso de cabec de Resumo dos ndices
PERFORM F_WRITE_RESUMO_INDICE.

59

ABAP Training
V_PRIM_VEZ = C_NAO.
ELSEIF V_TIME > C_LINHA.
PERFORM F_WRITE_RESUMO_INDICE.
V_TIME = ( 14 * 127 / 30 ).
ENDIF.
CLEAR: I_FORNEC.
READ TABLE I_FORNEC WITH KEY LIFNR = I_RES_INDICE-LIFNR.
READ TABLE I_T001W WITH KEY WERKS = I_RES_INDICEWERKS.
ZSAPSCRIP2-CONT = V_TIME.
ZSAPSCRIP2-PPM_M_I = I_RES_INDICE-PPM_M.
ZSAPSCRIP2-PPM_AC_I = I_RES_INDICE-PPM_AC.
ZSAPSCRIP2-NAMEC

= I_T001W-NAME.

ZSAPSCRIP2-LOT_M = I_RES_INDICE-LOT_M.
ZSAPSCRIP2-LOT_AC = I_RES_INDICE-LOT_AC.
ZSAPSCRIP2-PPM_OBJ_R = I_FORNEC-PPM_OBJ.
ZSAPSCRIP2-LOT_OBJ_R = I_FORNEC-LOT_OBJ.
* Imprime Resumo dos ndices de PPM
PERFORM F_WRITE_DET_RESUMO_INDICE.
ENDLOOP.
* Encerra formulrio de dados de Nota
CALL FUNCTION 'END_FORM'.
* Form de Impresso de verso da pgina
PERFORM F_WRITE_VERSO_PAG.
* Limpa tabela
REFRESH I_RES_INDICE.
ENDFORM.

" F_LOOP_RESUMO_INDICE

*&---------------------------------------------------------------------*
*&
Form F_GRAVA_RES_INDICE
*&---------------------------------------------------------------------*
*
text
*
*----------------------------------------------------------------------*
FORM F_GRAVA_RES_INDICE.
I_RES_INDICE-LIFNR = I_TABFIM-LIFNR.
I_RES_INDICE-WERKS = I_TABFIM-WERKS.
I_RES_INDICE-PPM_M = I_TABFIM-PPM_M.
I_RES_INDICE-PPM_AC = I_TABFIM-PPM_AC.
I_RES_INDICE-LOT_M = I_TABFIM-LOT_M.
I_RES_INDICE-LOT_AC = I_TABFIM-LOT_AC.
I_RES_INDICE-LOT_OBJ_M = I_TABFIM-LOT_OBJ_M.
I_RES_INDICE-PPM_OBJ_M = I_TABFIM-PPM_OBJ_M.
APPEND I_RES_INDICE.

ENDFORM.
" F_GRAVA_RES_INDICE
*&---------------------------------------------------------------------*
*&
Form F_EXTENSO_DATA

*&---------------------------------------------------------------------*
FORM F_EXTENSO_DATA USING P_DATA_MES
P_DATA_ANO
CHANGING P_DATA_ATU.
DATA: V_ID LIKE T247-SPRAS.
* Se o pas do Remetente for
* argentina e o pas do fornecedor for argentina, imprimir o
relatrio
* espanhol. Se ambos forem Brasil, imprimir em portugus. Para
os
* demais casos, imprimir em ingls.
IF I_LFA1-LAND1 EQ C_BR AND I_REMET-LAND1 EQ C_BR.
V_ID = C_P.
ELSEIF I_LFA1-LAND1 EQ C_ARG AND I_REMET-LAND1 EQ C_ARG.
V_ID = C_ESP.
ELSE.
V_ID = C_ENG.
ENDIF.
SELECT SINGLE LTX
FROM T247
INTO T247-LTX
WHERE SPRAS = V_ID
AND MNR = P_DATA_MES.
CONCATENATE T247-LTX(3) '/' P_DATA_ANO INTO P_DATA_ATU.
ENDFORM.
" F_EXTENSO_DATA
*&---------------------------------------------------------------------*
*&
Form F_START_FORM
*&---------------------------------------------------------------------*
*
text
*
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM F_START_FORM.
* Se o pas do Remetente for
* argentina e o pas do fornecedor for argentina, imprimir o
relatrio
* espanhol. Se ambos forem Brasil, imprimir em portugus. Para
os
* demais casos, imprimir em ingls.
IF I_LFA1-LAND1 EQ C_BR AND I_REMET-LAND1 EQ C_BR.
V_IDIOMA = C_P.
ELSEIF I_LFA1-LAND1 EQ C_ARG AND I_REMET-LAND1 EQ C_ARG.
V_IDIOMA = C_ESP.
ELSE.
V_IDIOMA = C_ENG.
ENDIF.
* Abre o formulrio para impresso da pgina de verso
CALL FUNCTION 'START_FORM'
EXPORTING
FORM
= 'Z_AVAL_FORNEC'
LANGUAGE
= V_IDIOMA
STARTPAGE = 'FIRST'
IMPORTING
LANGUAGE
= SY-LANGU.
ENDFORM.

" F_START_FORM

*&---------------------------------------------------------------------*
*&
Form CARACTERISTICA
*&---------------------------------------------------------------------*
*
text
*

60

ABAP Training
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM CARACTERISTICA USING P_ATNAM P_OBJEK P_KLART
P_VALOR.
READ TABLE I_CABN WITH KEY ATNAM = P_ATNAM.
IF SY-SUBRC NE 0.
P_VALOR = 'ERRO'.
EXIT.
ENDIF.
READ TABLE I_AUSP WITH KEY OBJEK = P_OBJEK
ATINN = I_CABN-ATINN
KLART = P_KLART.
IF SY-SUBRC NE 0.
P_VALOR = ' '.
EXIT.
ENDIF.
IF I_CABN-ATFOR = 'NUM'.
V_ATFLV = I_AUSP-ATFLV.
IF P_VALOR = V_VAL_PPM.
WRITE V_ATFLV TO P_VALOR DECIMALS 0.
ELSE.
P_VALOR = V_ATFLV.
ENDIF.
ELSE.
P_VALOR = I_AUSP-ATWRT.
ENDIF.
ENDFORM.
" CARACTERISTICA
*&---------------------------------------------------------------------*
*&
Form f_calc_ppm_obj.
*&---------------------------------------------------------------------*
*
Calcula PPM e OBJ
*----------------------------------------------------------------------*
FORM F_CALC_PPM_OBJ.
DATA: V_OBJEK_FORN(50) TYPE C,
V_OBJEK_MAT(50) TYPE C.
* selecao na CABN
SELECT ATINN
ADZHL
ATNAM
ATFOR
FROM CABN
INTO TABLE I_CABN
WHERE ATNAM = C_LOTE OR
ATNAM = C_PPM OR
ATNAM = C_NAS.
select objek
atinn
atwrt
atflv
klart
from ausp
into table i_ausp
for all entries in i_cabn
where klart = c_dez or
klart = c_z and
atinn = i_cabn-atinn.
LOOP AT I_TABFIM.

ON CHANGE OF I_TABFIM-LIFNR.
* Calcula valor de OBJ PPM
V_OBJEK_FORN = I_TABFIM-LIFNR.
PERFORM CARACTERISTICA USING C_PPM V_OBJEK_FORN
C_DEZ V_VAL_PPM.
* Calcula valor de OBJ LOTE
PERFORM CARACTERISTICA USING C_LOTE V_OBJEK_FORN
C_DEZ V_VAL_LOTE.
* Grava valores selecionados
I_FORNEC-LIFNR = I_TABFIM-LIFNR.
TRANSLATE V_VAL_LOTE USING '.,'.
WRITE V_VAL_PPM TO I_FORNEC-PPM_OBJ RIGHT-JUSTIFIED.
WRITE V_VAL_LOTE TO I_FORNEC-LOT_OBJ RIGHT-JUSTIFIED.
READ TABLE I_CABN WITH KEY ATNAM = C_NAS.
IF SY-SUBRC NE 0.
I_FORNEC-NAS = ' '.
ELSE.
READ TABLE I_AUSP WITH KEY OBJEK = V_OBJEK_FORN
ATINN = I_CABN-ATINN
KLART = C_DEZ.
IF SY-SUBRC NE 0.
I_FORNEC-NAS = ' '.
ELSE.
IF I_CABN-ATFOR = 'NUM'.
V_ATFLV = I_AUSP-ATFLV.
WRITE V_ATFLV TO V_VAL_NAS DECIMALS 0.
ELSE.
V_VAL_NAS = I_AUSP-ATWRT.
ENDIF.
WRITE V_VAL_NAS TO I_FORNEC-NAS RIGHT-JUSTIFIED.
ENDIF.
ENDIF.
APPEND I_FORNEC.
CLEAR: V_VAL_PPM, V_VAL_LOTE.
ENDON.
ENDLOOP.
CLEAR: V_VAL_PPM, V_VAL_LOTE.
LOOP AT I_TAB_DET_FIM.
ON CHANGE OF I_TAB_DET_FIM-LIFNR OR I_TAB_DET_FIMMATNR.
V_OBJEK_MAT+0(18) = I_TAB_DET_FIM-MATNR.
V_OBJEK_MAT+18(10) = I_TAB_DET_FIM-LIFNR.
* Calcula valor de OBJ PPM
PERFORM CARACTERISTICA USING C_PPM V_OBJEK_MAT
C_Z V_VAL_PPM.
* Calcula valor de OBJ LOTE
PERFORM CARACTERISTICA USING C_LOTE V_OBJEK_MAT
C_Z V_VAL_LOTE.
* Gravar dados
I_FORNEC_MAT-LIFNR = I_TAB_DET_FIM-LIFNR.
I_FORNEC_MAT-MATNR = I_TAB_DET_FIM-MATNR.
TRANSLATE V_VAL_LOTE USING '.,'.

61

ABAP Training
WRITE V_VAL_PPM TO I_FORNEC_MAT-PPM_OBJ RIGHTJUSTIFIED.
WRITE V_VAL_LOTE TO I_FORNEC_MAT-LOT_OBJ RIGHTJUSTIFIED.
APPEND I_FORNEC_MAT.
CLEAR: V_VAL_PPM, V_VAL_LOTE.
ENDON.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&
Form f_grava_total_final.
*&---------------------------------------------------------------------*
*
grava total final.
*----------------------------------------------------------------------*
FORM F_GRAVA_TOTAL_FINAL.
MOVE: I_TABFIM-WERKS
TO I_TOT_CENTRO-WERKS,
I_TABFIM-NFL_M
TO I_TOT_CENTRO-NFL,
I_TABFIM-NPR_M
TO I_TOT_CENTRO-NPR,
I_TABFIM-NCQ_M
TO I_TOT_CENTRO-NCQ,
I_TABFIM-NQF_M
TO I_TOT_CENTRO-NQF,
I_TABFIM-NPT_M
TO I_TOT_CENTRO-NPT,
I_TABFIM-PPM_M
TO I_TOT_CENTRO-PPM,
I_TABFIM-LOT_M
TO I_TOT_CENTRO-LOT.
COLLECT I_TOT_CENTRO.
MOVE: '9999'
TO I_TOT_CENTRO-WERKS.
COLLECT I_TOT_CENTRO.
ENDFORM.
*&---------------------------------------------------------------------*
*&
Form f_print_total_final.
*&---------------------------------------------------------------------*
*
Imprime o total final.
*----------------------------------------------------------------------*
FORM F_PRINT_TOTAL_FINAL.
FORMAT COLOR COL_TOTAL.
WRITE: /03 'ACUM NO CENTRO',
170 ' '.
SORT I_TOT_CENTRO BY WERKS.
LOOP AT I_TOT_CENTRO.
CLEAR: I_T001W.
READ TABLE I_T001W WITH KEY WERKS = I_TOT_CENTROWERKS.
WRITE: /03 I_TOT_CENTRO-WERKS,
I_T001W-NAME,
32 I_TOT_CENTRO-NFL,
47 I_TOT_CENTRO-NPR,
62 I_TOT_CENTRO-NCQ,
77 I_TOT_CENTRO-NQF,
92 I_TOT_CENTRO-NPT,

107 I_TOT_CENTRO-PPM,
137 I_TOT_CENTRO-LOT,
170 ' '.
ENDLOOP.
ULINE.
ENDFORM.
*&---------------------------------------------------------------------*
*&
Form f_print_total_acum.
*&---------------------------------------------------------------------*
*
Imprime o total final acum.
*----------------------------------------------------------------------*
FORM F_PRINT_TOTAL_ACUM.
WRITE: /03 'ACUM NO MTB',
170 ' '.
WRITE: /32 I_ACUM_MTB-NFL_AC,
47 I_ACUM_MTB-NPR_AC,
62 I_ACUM_MTB-NCQ_AC,
77 I_ACUM_MTB-NQF_AC,
92 I_ACUM_MTB-NPT_AC,
107 I_ACUM_MTB-PPM_AC,
137 I_ACUM_MTB-LOT_AC,
170 ' '.
ULINE.
ENDFORM.
*&---------------------------------------------------------------------*
*&
Form CALCULA_PERIODO
*&---------------------------------------------------------------------*
* Este Form utilizado para calcular o ms de incio do perodo
* selecionado
*----------------------------------------------------------------------*
FORM CALCULA_PERIODO.
DATA: V_MES_BATCH LIKE SY-DATUM.
IF P_BATCH = ' '.
CONCATENATE P_MES '01' INTO V_DIA_CALCULO.
ELSE.
CONCATENATE SY-DATUM(6) '01' INTO V_MES_BATCH.
V_MES_BATCH = V_MES_BATCH - 1.
CONCATENATE V_MES_BATCH(6) '01' INTO V_DIA_CALCULO.
ENDIF.
CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
EXPORTING
DAY_IN
= V_DIA_CALCULO
IMPORTING
LAST_DAY_OF_MONTH = V_ULTIMO_DIA.
* primeiro dia do mes selecionado.
V_DTI_ANALISE = V_DIA_CALCULO.
* Clculo do incio do perodo de anlise
P_PERIOD = P_PERIOD - 1.
DO P_PERIOD TIMES.
V_PRIMEIRO_DIA = V_DIA_CALCULO - 1.
CONCATENATE V_PRIMEIRO_DIA(6) '01' INTO V_DIA_CALCULO.
ENDDO.
V_DT_INICIO = V_DIA_CALCULO.
V_DT_FIM = V_ULTIMO_DIA.
P_PERIOD = P_PERIOD + 1.
ENDFORM.
" CALCULA_PERIODO

62

ABAP Training
*&---------------------------------------------------------------------*
*&
Form F_CALC_ACUM
*&---------------------------------------------------------------------*
*
Form para calcular as notas acumuladas nos centros e MTB.
*
Este form tambm grava os resultados na tabela do centro.
*----------------------------------------------------------------------*
FORM F_CALC_ACUM.
* Declarao de variveis locais:
DATA: V_CENT_SUM_PPM89_AC LIKE T706U-BETFA,
V_CENT_NUM_NFL_AC
LIKE T706U-BETFA,
V_CENT_SUM_NFL_AC
LIKE T706U-BETFA,
V_CENT_SUM_LOT_AC
LIKE T706U-BETFA,
V_CENT_SUM_NPT_AC
LIKE T706U-BETFA,
V_CENT_NUM_NPT_AC
LIKE T706U-BETFA,
V_CENT_SUM_PPM01_AC LIKE T706U-BETFA,
V_CENT_SUM_ATRAS_AC LIKE T706U-BETFA,
V_CENT_SUM_EMDIA_AC LIKE T706U-BETFA.
DATA: C_MI(7) TYPE N VALUE '1000000'. "Valor de calc de Nota
DATA: V_PRIM_VEZ TYPE I.
"Flag primeira vez
DATA: V_MTB_SUM_PPM89_AC LIKE T706U-BETFA,
V_MTB_NUM_NFL_AC
LIKE T706U-BETFA,
V_MTB_SUM_NFL_AC
LIKE T706U-BETFA,
V_MTB_SUM_LOT_AC
LIKE T706U-BETFA,
V_MTB_SUM_NPT_AC
LIKE T706U-BETFA,
V_MTB_NUM_NPT_AC
LIKE T706U-BETFA,
V_MTB_SUM_PPM01_AC
LIKE PC207-BETPE,
V_MTB_SUM_ATRAS_AC
LIKE T706U-BETFA,
V_MTB_SUM_EMDIA_AC
LIKE T706U-BETFA.
DATA: V_FORNEC_SUM_PPM89_M LIKE T706U-BETFA,
V_FORNEC_SUM_PPM89_AC LIKE T706U-BETFA,
V_FORNEC_NUM_NFL_M
LIKE T706U-BETFA,
V_FORNEC_NUM_NFL_AC
LIKE T706U-BETFA,
V_FORNEC_SUM_NFL_M
LIKE T706U-BETFA,
V_FORNEC_SUM_NFL_AC
LIKE T706U-BETFA,
V_FORNEC_SUM_LOT_M
LIKE T706U-BETFA,
V_FORNEC_SUM_LOT_AC
LIKE T706U-BETFA,
V_FORNEC_SUM_NPT_M
LIKE T706U-BETFA,
V_FORNEC_SUM_NPT_AC
LIKE T706U-BETFA,
V_FORNEC_NUM_NPT_M
LIKE T706U-BETFA,
V_FORNEC_NUM_NPT_AC
LIKE T706U-BETFA,
V_FORNEC_LIFNR
LIKE QALS-LIFNR,
V_FORNEC_SUM_PPM01_M LIKE T706U-BETFA,
V_FORNEC_SUM_PPM01_AC LIKE T706U-BETFA,
V_FORNEC_SUM_ATRAS_M LIKE T706U-BETFA,
V_FORNEC_SUM_ATRAS_AC LIKE T706U-BETFA,
V_FORNEC_SUM_EMDIA_M LIKE T706U-BETFA,
V_FORNEC_SUM_EMDIA_AC LIKE T706U-BETFA.
DATA: BEGIN OF I_ACUM_FORNEC OCCURS 0,
LIFNR
LIKE QALS-LIFNR,
SUM_PPM89_M LIKE T706U-BETFA,
SUM_PPM89_AC LIKE T706U-BETFA,
NUM_NFL_M
LIKE T706U-BETFA,
NUM_NFL_AC
LIKE T706U-BETFA,
SUM_NFL_M
LIKE T706U-BETFA,
SUM_NFL_AC
LIKE T706U-BETFA,
SUM_LOT_M
LIKE T706U-BETFA,
SUM_LOT_AC
LIKE T706U-BETFA,
SUM_NPT_M
LIKE T706U-BETFA,
SUM_NPT_AC
LIKE T706U-BETFA,
NUM_NPT_M
LIKE T706U-BETFA,
NUM_NPT_AC
LIKE T706U-BETFA,

SUM_PPM01_M LIKE T706U-BETFA,


SUM_PPM01_AC LIKE T706U-BETFA,
SUM_ATRAS_M LIKE T706U-BETFA,
SUM_ATRAS_AC LIKE T706U-BETFA,
SUM_EMDIA_M LIKE T706U-BETFA,
SUM_EMDIA_AC LIKE T706U-BETFA.
DATA: END OF I_ACUM_FORNEC.
SORT I_ACUM BY CENTRO.
* verifica se necessria a impresso dos totais por centro e
empresa
IF SO_FORNE EQ '' AND SO_MATNR EQ ''.
* Soma totais gerais para os Centros e para Empresa
LOOP AT I_ACUM.
V_CENT_SUM_PPM89_AC = V_CENT_SUM_PPM89_AC + I_ACUMSUM_PPM89_AC.
V_CENT_NUM_NFL_AC = V_CENT_NUM_NFL_AC + I_ACUMNUM_NFL_AC.
V_CENT_SUM_NFL_AC = V_CENT_SUM_NFL_AC + I_ACUMSUM_NFL_AC.
V_CENT_SUM_LOT_AC = V_CENT_SUM_LOT_AC + I_ACUMSUM_LOT_AC.
V_CENT_SUM_NPT_AC = V_CENT_SUM_NPT_AC + I_ACUMSUM_NPT_AC.
V_CENT_NUM_NPT_AC = V_CENT_NUM_NPT_AC + I_ACUMNUM_NPT_AC.
V_CENT_SUM_PPM01_AC = V_CENT_SUM_PPM01_AC + I_ACUMSUM_PPM01_AC.
V_CENT_SUM_ATRAS_AC = V_CENT_SUM_ATRAS_AC + I_ACUMSUM_ATRAS_AC.
V_CENT_SUM_EMDIA_AC = V_CENT_SUM_EMDIA_AC + I_ACUMSUM_EMDIA_AC.
IF SO_CENT EQ ''. "verifica se nenhum centro foi selecionado
V_MTB_SUM_PPM89_AC = V_MTB_SUM_PPM89_AC + I_ACUMSUM_PPM89_AC.
V_MTB_NUM_NFL_AC = V_MTB_NUM_NFL_AC + I_ACUMNUM_NFL_AC.
V_MTB_SUM_NFL_AC = V_MTB_SUM_NFL_AC + I_ACUMSUM_NFL_AC.
V_MTB_SUM_LOT_AC = V_MTB_SUM_LOT_AC + I_ACUMSUM_LOT_AC.
V_MTB_SUM_NPT_AC = V_MTB_SUM_NPT_AC + I_ACUMSUM_NPT_AC.
V_MTB_NUM_NPT_AC = V_MTB_NUM_NPT_AC + I_ACUMNUM_NPT_AC.
V_MTB_SUM_PPM01_AC = V_MTB_SUM_PPM01_AC + I_ACUMSUM_PPM01_AC.
V_MTB_SUM_ATRAS_AC = V_MTB_SUM_ATRAS_AC + I_ACUMSUM_ATRAS_AC.
V_MTB_SUM_EMDIA_AC = V_MTB_SUM_EMDIA_AC + I_ACUMSUM_EMDIA_AC.
ENDIF.
AT END OF CENTRO.
I_ACUM_CENTRO-CENTRO = I_ACUM-CENTRO.
I_ACUM_CENTRO-SUM_PPM89 = V_CENT_SUM_PPM89_AC.
I_ACUM_CENTRO-NUM_NFL = V_CENT_NUM_NFL_AC.
I_ACUM_CENTRO-SUM_NFL = V_CENT_SUM_NFL_AC.
I_ACUM_CENTRO-SUM_LOT = V_CENT_SUM_LOT_AC.
I_ACUM_CENTRO-SUM_NPT = V_CENT_SUM_NPT_AC.
I_ACUM_CENTRO-NUM_NPT = V_CENT_NUM_NPT_AC.
I_ACUM_CENTRO-SUM_PPM01 = V_CENT_SUM_PPM01_AC.

63

ABAP Training
I_ACUM_CENTRO-SUM_ATRAS = V_CENT_SUM_ATRAS_AC.
I_ACUM_CENTRO-SUM_EMDIA = V_CENT_SUM_EMDIA_AC.
APPEND I_ACUM_CENTRO.
CLEAR I_ACUM_CENTRO.
CLEAR: V_CENT_SUM_PPM89_AC,
V_CENT_NUM_NFL_AC,
V_CENT_SUM_NFL_AC,
V_CENT_SUM_LOT_AC,
V_CENT_SUM_NPT_AC,
V_CENT_NUM_NPT_AC,
V_CENT_SUM_PPM01_AC,
V_CENT_SUM_ATRAS_AC,
V_CENT_SUM_EMDIA_AC.
ENDAT.
ENDLOOP.
LOOP AT I_ACUM_CENTRO.
* Limpar as variaveis utilizadas no calculo.
CLEAR: V_TOT_NFL_AC,
V_TOT_LOT_AC,
V_TOT_PPM_AC,
V_TOT_NPR_AC,
V_TOT_NPT_AC,
V_TOT_NOTAS_AC,
V_TOT_NCQ_AC.
* calcula nota de fornecimento-acumulado.
IF I_ACUM_CENTRO-NUM_NFL > 0.
V_CHECK_NFL_AC = ' '.
V_TOT_NFL_AC = I_ACUM_CENTRO-SUM_NFL /
I_ACUM_CENTRO-NUM_NFL.
V_TOT_LOT_AC = 100 - ( I_ACUM_CENTRO-SUM_LOT /
I_ACUM_CENTRO-NUM_NFL ).
ELSE.
V_CHECK_NFL_AC = 'X'.
ENDIF.
* calcula nota processo-acumulado.
IF I_ACUM_CENTRO-SUM_PPM01 > 0.
V_TOT_PPM_AC = I_ACUM_CENTRO-SUM_PPM89 /
I_ACUM_CENTRO-SUM_PPM01 * C_MI.
ENDIF.
V_TOT_NPR_AC = 100 - ( V_TOT_PPM_AC / 100 ).
IF V_TOT_NPR_AC < 0.
V_TOT_NPR_AC = 0.
ENDIF.
* calcula nota de pontualidade.
V_TOT_NPT_AC = I_ACUM_CENTRO-SUM_NPT /
I_ACUM_CENTRO-NUM_NPT.
IF V_TOT_NPT_AC > 100.
V_TOT_NPT_AC = 100.
ENDIF.
IF V_TOT_NPT_AC < 0.
V_TOT_NPT_AC = 0.
ENDIF.
* calculo do NCQ acumulado.
V_TOT_NOTAS_AC = I_ACUM_CENTRO-SUM_EMDIA +
I_ACUM_CENTRO-SUM_ATRAS.

IF V_TOT_NOTAS_AC > 0.
V_TOT_NCQ_AC = ( I_ACUM_CENTRO-SUM_EMDIA /
V_TOT_NOTAS_AC ) * 100.
ELSE.
V_TOT_NCQ_AC = 100.
ENDIF.
* Grava dados na tabela i_tot_centro.
* centro
I_TOT_CENTRO-WERKS = I_ACUM_CENTRO-CENTRO.
* grava nota de fornecimento - acumulado.
IF V_CHECK_NFL_AC = 'X'.
I_TOT_CENTRO-NFL = ' '.
I_TOT_CENTRO-LOT = ' '.
ELSE.
WRITE V_TOT_NFL_AC TO I_TOT_CENTRO-NFL DECIMALS 0
RIGHT-JUSTIFIED.
WRITE V_TOT_LOT_AC TO I_TOT_CENTRO-LOT DECIMALS 2
RIGHT-JUSTIFIED.
ENDIF.
* grava nota processo - acumulado.
IF V_CHECK_NFL_AC = 'X'.
I_TOT_CENTRO-PPM = ' '.
I_TOT_CENTRO-NPR = ' '.
ELSE.
WRITE V_TOT_PPM_AC TO I_TOT_CENTRO-PPM DECIMALS 0
RIGHT-JUSTIFIED.
WRITE V_TOT_NPR_AC TO I_TOT_CENTRO-NPR DECIMALS 0
RIGHT-JUSTIFIED.
ENDIF.
* grava nota de pontualidade - acumulado.
WRITE V_TOT_NPT_AC TO I_TOT_CENTRO-NPT DECIMALS 0
RIGHT-JUSTIFIED.
* grava valores de nota de compromisso de qualidade acumulado.
WRITE V_TOT_NCQ_AC TO I_TOT_CENTRO-NCQ DECIMALS 0
RIGHT-JUSTIFIED.
* Clculo do NQF
* Se NFL e NPR estiverem BRANCOS, passar BRANCO *
IF I_TOT_CENTRO-NFL = ' ' AND I_TOT_CENTRO-NPR = ' '.
I_TOT_CENTRO-NQF = ' '.
ELSE.
IF V_TOT_POND <> 0.
V_TOT_NQF_AC = ( ( I_TOT_CENTRO-NFL * V_FATOR_NFL ) +
( I_TOT_CENTRO-NPR * V_FATOR_NPR ) +
( I_TOT_CENTRO-NCQ * V_FATOR_NCQ ) ) /
V_TOT_POND.
WRITE V_TOT_NQF_AC TO I_TOT_CENTRO-NQF DECIMALS 0.
ENDIF.
ENDIF.
* Grava os dados acima na tabela.
APPEND I_TOT_CENTRO.
ENDLOOP.
CLEAR: V_TOT_NFL_M, V_TOT_NFL_AC,
V_TOT_LOT_M, V_TOT_LOT_AC,
V_TOT_PPM_M, V_TOT_PPM_AC,
V_TOT_NPR_M, V_TOT_NPR_AC,

64

ABAP Training
V_TOT_NPT_M, V_TOT_NPT_AC,
V_TOT_NOTAS_M, V_TOT_NOTAS_AC,
V_TOT_NCQ_M, V_TOT_NCQ_AC.
IF SO_CENT EQ ''. " verifica se nenhum centro foi selecionado
* Clculo dos dados gerais para Empresa
* calcula nota de fornecimento-acumulado.
IF V_MTB_NUM_NFL_AC > 0.
V_CHECK_NFL_AC = ' '.
V_TOT_NFL_AC = V_MTB_SUM_NFL_AC / V_MTB_NUM_NFL_AC.
V_TOT_LOT_AC = 100 - ( V_MTB_SUM_LOT_AC /
V_MTB_NUM_NFL_AC ).
ELSE.
V_CHECK_NFL_AC = 'X'.
ENDIF.
* calcula nota processo-acumulado.
IF V_MTB_SUM_PPM01_AC > 0.
V_TOT_PPM_AC = ( V_MTB_SUM_PPM89_AC /
V_MTB_SUM_PPM01_AC ) * C_MILHAO.
ENDIF.
V_TOT_NPR_AC = 100 - ( V_TOT_PPM_AC / 100 ).
IF V_TOT_NPR_AC < 0.
V_TOT_NPR_AC = 0.
ENDIF.
* calcula nota de pontualidade.
V_TOT_NPT_AC = V_MTB_SUM_NPT_AC / V_MTB_NUM_NPT_AC.
IF V_TOT_NPT_AC > 100.
V_TOT_NPT_AC = 100.
ENDIF.
IF V_TOT_NPT_AC < 0.
V_TOT_NPT_AC = 0.
ENDIF.
* calculo do NCQ acumulado.
V_TOT_NOTAS_AC = V_MTB_SUM_EMDIA_AC +
V_MTB_SUM_ATRAS_AC.
IF V_TOT_NOTAS_AC > 0.
V_TOT_NCQ_AC = ( V_MTB_SUM_EMDIA_AC /
V_TOT_NOTAS_AC ) * 100.
ELSE.
V_TOT_NCQ_AC = 100.
ENDIF.
* Grava os dados para a estrutura i_acum_MTB
* grava nota de fornecimento - acumulado.
IF V_CHECK_NFL_AC = 'X'.
I_ACUM_MTB-NFL_AC = ' '.
I_ACUM_MTB-LOT_AC = ' '.
ELSE.
WRITE V_TOT_NFL_AC TO I_ACUM_MTB-NFL_AC DECIMALS 0
RIGHT-JUSTIFIED.
WRITE V_TOT_LOT_AC TO I_ACUM_MTB-LOT_AC DECIMALS 2
RIGHT-JUSTIFIED.
ENDIF.
* grava nota processo - acumulado.
IF V_CHECK_NFL_AC = 'X'.
I_ACUM_MTB-PPM_AC = ' '.

I_ACUM_MTB-NPR_AC = ' '.


ELSE.
WRITE V_TOT_PPM_AC TO I_ACUM_MTB-PPM_AC DECIMALS 0
RIGHT-JUSTIFIED.
WRITE V_TOT_NPR_AC TO I_ACUM_MTB-NPR_AC DECIMALS 0
RIGHT-JUSTIFIED.
ENDIF.
* grava nota de pontualidade - acumulado.
WRITE V_TOT_NPT_AC TO I_ACUM_MTB-NPT_AC DECIMALS 0
RIGHT-JUSTIFIED.
* grava valores de nota de compromisso de qualidade acumulado.
WRITE V_TOT_NCQ_AC TO I_ACUM_MTB-NCQ_AC DECIMALS 0
RIGHT-JUSTIFIED.
* Clculo do NQF
* Se NFL e NPR estiverem BRANCOS, passar BRANCO
IF I_ACUM_MTB-NFL_AC = ' ' AND I_ACUM_MTB-NPR_AC = ' '.
I_ACUM_MTB-NQF_AC = ' '.
ELSE.
IF V_TOT_POND <> 0.
V_TOT_NQF_AC = ( ( I_ACUM_MTB-NFL_AC * V_FATOR_NFL )
+
( I_ACUM_MTB-NPR_AC * V_FATOR_NPR ) +
( I_ACUM_MTB-NCQ_AC * V_FATOR_NCQ ) ) /
V_TOT_POND.
WRITE V_TOT_NQF_AC TO I_ACUM_MTB-NQF_AC DECIMALS
0.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
* Calcula totais gerais por fornecedor.
* Insere elemento na tabela para funcionar comando on change.
I_ACUM-LIFNR = '999999999'.
APPEND I_ACUM.
SORT I_ACUM BY LIFNR.
LOOP AT I_ACUM.
ON CHANGE OF I_ACUM-LIFNR.
IF V_PRIM_VEZ NE 0.
I_ACUM_FORNEC-LIFNR
= V_FORNEC_LIFNR.
I_ACUM_FORNEC-SUM_PPM89_M =
V_FORNEC_SUM_PPM89_M.
I_ACUM_FORNEC-SUM_PPM89_AC =
V_FORNEC_SUM_PPM89_AC.
I_ACUM_FORNEC-NUM_NFL_M = V_FORNEC_NUM_NFL_M.
I_ACUM_FORNEC-NUM_NFL_AC = V_FORNEC_NUM_NFL_AC.
I_ACUM_FORNEC-SUM_NFL_M = V_FORNEC_SUM_NFL_M.
I_ACUM_FORNEC-SUM_NFL_AC = V_FORNEC_SUM_NFL_AC.
I_ACUM_FORNEC-SUM_LOT_M = V_FORNEC_SUM_LOT_M.
I_ACUM_FORNEC-SUM_LOT_AC = V_FORNEC_SUM_LOT_AC.
I_ACUM_FORNEC-SUM_NPT_M = V_FORNEC_SUM_NPT_M.
I_ACUM_FORNEC-SUM_NPT_AC = V_FORNEC_SUM_NPT_AC.
I_ACUM_FORNEC-NUM_NPT_M = V_FORNEC_NUM_NPT_M.
I_ACUM_FORNEC-NUM_NPT_AC = V_FORNEC_NUM_NPT_AC.
I_ACUM_FORNEC-SUM_PPM01_M =
V_FORNEC_SUM_PPM01_M.
I_ACUM_FORNEC-SUM_PPM01_AC =
V_FORNEC_SUM_PPM01_AC.
I_ACUM_FORNEC-SUM_ATRAS_M = V_FORNEC_SUM_ATRAS_M.

65

ABAP Training
I_ACUM_FORNEC-SUM_ATRAS_AC =
V_FORNEC_SUM_ATRAS_AC.
I_ACUM_FORNEC-SUM_EMDIA_M =
V_FORNEC_SUM_EMDIA_M.
I_ACUM_FORNEC-SUM_EMDIA_AC =
V_FORNEC_SUM_EMDIA_AC.
APPEND I_ACUM_FORNEC.
CLEAR I_ACUM_FORNEC.
CLEAR: V_FORNEC_SUM_PPM89_M,
V_FORNEC_SUM_PPM89_AC,
V_FORNEC_NUM_NFL_M,
V_FORNEC_NUM_NFL_AC,
V_FORNEC_SUM_NFL_M,
V_FORNEC_SUM_NFL_AC,
V_FORNEC_SUM_LOT_M,
V_FORNEC_SUM_LOT_AC,
V_FORNEC_SUM_NPT_M,
V_FORNEC_SUM_NPT_AC,
V_FORNEC_NUM_NPT_M,
V_FORNEC_NUM_NPT_AC,
V_FORNEC_SUM_PPM01_M,
V_FORNEC_SUM_PPM01_AC,
V_FORNEC_SUM_ATRAS_M,
V_FORNEC_SUM_ATRAS_AC,
V_FORNEC_SUM_EMDIA_M,
V_FORNEC_SUM_EMDIA_AC.
ENDIF.
ENDON.
V_FORNEC_SUM_PPM89_M = V_FORNEC_SUM_PPM89_M +
I_ACUM-SUM_PPM89_M.
V_FORNEC_SUM_PPM89_AC = V_FORNEC_SUM_PPM89_AC +
I_ACUM-SUM_PPM89_AC.
V_FORNEC_NUM_NFL_M = V_FORNEC_NUM_NFL_M + I_ACUMNUM_NFL_M.
V_FORNEC_NUM_NFL_AC = V_FORNEC_NUM_NFL_AC +
I_ACUM-NUM_NFL_AC.
V_FORNEC_SUM_NFL_M = V_FORNEC_SUM_NFL_M + I_ACUMSUM_NFL_M.
V_FORNEC_SUM_NFL_AC = V_FORNEC_SUM_NFL_AC +
I_ACUM-SUM_NFL_AC.
V_FORNEC_SUM_LOT_M = V_FORNEC_SUM_LOT_M + I_ACUMSUM_LOT_M.
V_FORNEC_SUM_LOT_AC = V_FORNEC_SUM_LOT_AC +
I_ACUM-SUM_LOT_AC.
V_FORNEC_SUM_NPT_M = V_FORNEC_SUM_NPT_M + I_ACUMSUM_NPT_M.
V_FORNEC_SUM_NPT_AC = V_FORNEC_SUM_NPT_AC +
I_ACUM-SUM_NPT_AC.
V_FORNEC_NUM_NPT_M = V_FORNEC_NUM_NPT_M +
I_ACUM-NUM_NPT_M.
V_FORNEC_NUM_NPT_AC = V_FORNEC_NUM_NPT_AC +
I_ACUM-NUM_NPT_AC.
V_FORNEC_SUM_PPM01_M = V_FORNEC_SUM_PPM01_M +
I_ACUM-SUM_PPM01_M.
V_FORNEC_SUM_PPM01_AC = V_FORNEC_SUM_PPM01_AC +
I_ACUM-SUM_PPM01_AC.
V_FORNEC_SUM_ATRAS_M = V_FORNEC_SUM_ATRAS_M +
I_ACUM-SUM_ATRAS_M.
V_FORNEC_SUM_ATRAS_AC = V_FORNEC_SUM_ATRAS_AC +
I_ACUM-SUM_ATRAS_AC.
V_FORNEC_SUM_EMDIA_M = V_FORNEC_SUM_EMDIA_M +
I_ACUM-SUM_EMDIA_M.
V_FORNEC_SUM_EMDIA_AC = V_FORNEC_SUM_EMDIA_AC +
I_ACUM-SUM_EMDIA_AC.

V_PRIM_VEZ = 1.
V_FORNEC_LIFNR = I_ACUM-LIFNR.
ENDLOOP.
CLEAR: V_TOT_NFL_M, V_TOT_NFL_AC,
V_TOT_LOT_M, V_TOT_LOT_AC,
V_TOT_PPM_M, V_TOT_PPM_AC,
V_TOT_NPR_M, V_TOT_NPR_AC,
V_TOT_NPT_M, V_TOT_NPT_AC,
V_TOT_NOTAS_M, V_TOT_NOTAS_AC,
V_TOT_NCQ_M, V_TOT_NCQ_AC.
* Clculo dos dados por fornecedor.
LOOP AT I_ACUM_FORNEC.
* Fornecedor
I_TOT_FORNEC-LIFNR = I_ACUM_FORNEC-LIFNR.
* calcula nota de fornecimento-mes.
IF I_ACUM_FORNEC-NUM_NFL_M > 0.
V_CHECK_NFL_M = ' '.
V_TOT_NFL_M = I_ACUM_FORNEC-SUM_NFL_M /
I_ACUM_FORNEC-NUM_NFL_M.
V_TOT_LOT_M = 100 - ( I_ACUM_FORNEC-SUM_LOT_M /
I_ACUM_FORNEC-NUM_NFL_M ).
ELSE.
V_CHECK_NFL_M = 'X'.
ENDIF.
* calcula nota de fornecimento-acumulado.
IF I_ACUM_FORNEC-NUM_NFL_AC > 0.
V_CHECK_NFL_AC = ' '.
V_TOT_NFL_AC = I_ACUM_FORNEC-SUM_NFL_AC /
I_ACUM_FORNEC-NUM_NFL_AC.
V_TOT_LOT_AC = 100 - ( I_ACUM_FORNEC-SUM_LOT_AC /
I_ACUM_FORNEC-NUM_NFL_AC ) .
ELSE.
V_CHECK_NFL_AC = 'X'.
ENDIF.
* calcula nota processo-mes.
IF I_ACUM_FORNEC-SUM_PPM01_M > 0.
V_TOT_PPM_M = ( i_acum_fornec-SUM_PPM89_M
/ I_ACUM_FORNEC-SUM_PPM01_M ) * C_MI.
ENDIF.
V_TOT_NPR_M = 100 - ( V_TOT_PPM_M / 100 ).
IF V_TOT_NPR_M < 0.
V_TOT_NPR_M = 0.
ENDIF.
* calcula nota processo-acumulado.
IF I_ACUM_FORNEC-SUM_PPM01_AC > 0.
V_TOT_PPM_AC = ( I_ACUM_FORNEC-SUM_PPM89_AC
/ I_ACUM_FORNEC-SUM_PPM01_AC ) * C_MI.
ENDIF.
V_TOT_NPR_AC = 100 - ( V_TOT_PPM_AC / 100 ).
IF V_TOT_NPR_AC < 0.
V_TOT_NPR_AC = 0.
ENDIF.
* calcula nota de pontualidade.
V_TOT_NPT_M = I_ACUM_FORNEC-SUM_NPT_M /
I_ACUM_FORNEC-NUM_NPT_M.
V_TOT_NPT_AC = I_ACUM_FORNEC-SUM_NPT_AC /
I_ACUM_FORNEC-NUM_NPT_AC.

66

ABAP Training
IF V_TOT_NPT_M > 100.
V_TOT_NPT_M = 100.
ENDIF.
IF V_TOT_NPT_M < 0.
V_TOT_NPT_M = 0.
ENDIF.
IF V_TOT_NPT_AC > 100.
V_TOT_NPT_AC = 100.
ENDIF.
IF V_TOT_NPT_AC < 0.
V_TOT_NPT_AC = 0.
ENDIF.
* calculo do NCQ mes.
V_TOT_NOTAS_M = I_ACUM_FORNEC-SUM_EMDIA_M +
I_ACUM_FORNEC-SUM_ATRAS_M.
IF V_TOT_NOTAS_M > 0.
V_TOT_NCQ_M = ( I_ACUM_FORNEC-SUM_EMDIA_M /
V_TOT_NOTAS_M ) * 100.
ELSE.
V_TOT_NCQ_M = 100.
ENDIF.
* calculo do NCQ acumulado.
V_TOT_NOTAS_AC = i_acum_fornec-SUM_EMDIA_AC
+ I_ACUM_FORNEC-SUM_ATRAS_AC.
IF V_TOT_NOTAS_AC > 0.
V_TOT_NCQ_AC = ( I_ACUM_FORNEC-SUM_EMDIA_AC
/ V_TOT_NOTAS_AC ) * 100.
ELSE.
V_TOT_NCQ_AC = 100.
ENDIF.
* Grava os dados para a estrutura i_tot_fornec
* grava nota de fornecimento-mes.
IF V_CHECK_NFL_M = 'X'.
I_TOT_FORNEC-NFL_M = ' '.
I_TOT_FORNEC-LOT_M = ' '.
ELSE.
WRITE V_TOT_NFL_M TO I_TOT_FORNEC-NFL_M DECIMALS 0
RIGHT-JUSTIFIED.
WRITE V_TOT_LOT_M TO I_TOT_FORNEC-LOT_M DECIMALS 2
RIGHT-JUSTIFIED.
ENDIF.
* grava nota de fornecimento - acumulado.
IF V_CHECK_NFL_AC = 'X'.
I_TOT_FORNEC-NFL_AC = ' '.
I_TOT_FORNEC-LOT_AC = ' '.
ELSE.
WRITE V_TOT_NFL_AC TO I_TOT_FORNEC-NFL_AC DECIMALS 0
RIGHT-JUSTIFIED.
WRITE V_TOT_LOT_AC TO I_TOT_FORNEC-LOT_AC DECIMALS 2
RIGHT-JUSTIFIED.
ENDIF.
* grava nota de processo - mes
IF V_CHECK_NFL_M = 'X'.
I_TOT_FORNEC-PPM_M = ' '.
I_TOT_FORNEC-NPR_M = ' '.
ELSE.

WRITE V_TOT_PPM_M TO I_TOT_FORNEC-PPM_M DECIMALS 0


RIGHT-JUSTIFIED.
WRITE V_TOT_NPR_M TO I_TOT_FORNEC-NPR_M DECIMALS 0
RIGHT-JUSTIFIED.
ENDIF.
* grava nota processo - acumulado.
IF V_CHECK_NFL_AC = 'X'.
I_TOT_FORNEC-PPM_AC = ' '.
I_TOT_FORNEC-NPR_AC = ' '.
ELSE.
WRITE V_TOT_PPM_AC TO I_TOT_FORNEC-PPM_AC DECIMALS 0
RIGHT-JUSTIFIED.
WRITE V_TOT_NPR_AC TO I_TOT_FORNEC-NPR_AC DECIMALS 0
RIGHT-JUSTIFIED.
ENDIF.
* grava nota de pontualidade - mes.
WRITE V_TOT_NPT_M TO I_TOT_FORNEC-NPT_M DECIMALS 0
RIGHT-JUSTIFIED.
* grava nota de pontualidade - acumulado.
WRITE V_TOT_NPT_AC TO I_TOT_FORNEC-NPT_AC DECIMALS 0
RIGHT-JUSTIFIED.
* grava valores de nota de compromisso de qualidade - mes.
WRITE V_TOT_NCQ_M TO I_TOT_FORNEC-NCQ_M DECIMALS 0
RIGHT-JUSTIFIED.
* grava valores de nota de compromisso de qualidade acumulado.
WRITE V_TOT_NCQ_AC TO I_TOT_FORNEC-NCQ_AC DECIMALS 0
RIGHT-JUSTIFIED.
* Clculo do NQF
* Se NFL e NPR estiverem BRANCOS, passar BRANCO
IF I_TOT_FORNEC-NFL_M = ' ' AND I_TOT_FORNEC-NPR_M = ' '.
I_TOT_FORNEC-NQF_M = ' '.
ELSE.
IF V_TOT_POND <> 0.
"mes
V_TOT_NQF_M = ( ( I_TOT_FORNEC-NFL_M * V_FATOR_NFL ) +
( I_TOT_FORNEC-NPR_M * V_FATOR_NPR ) +
( I_TOT_FORNEC-NCQ_M * V_FATOR_NCQ ) ) /
V_TOT_POND.
WRITE V_TOT_NQF_M TO I_TOT_FORNEC-NQF_M DECIMALS 0.
ENDIF.
ENDIF.
IF I_TOT_FORNEC-NFL_AC = ' ' AND I_TOT_FORNEC-NPR_AC = ' '.
I_TOT_FORNEC-NQF_AC = ' '.
ELSE.
IF V_TOT_POND <> 0.
V_TOT_NQF_AC = ( ( I_TOT_FORNEC-NFL_AC *
V_FATOR_NFL ) +
( I_TOT_FORNEC-NPR_AC * V_FATOR_NPR ) +
( I_TOT_FORNEC-NCQ_AC * V_FATOR_NCQ ) ) /
V_TOT_POND.
WRITE V_TOT_NQF_AC TO I_TOT_FORNEC-NQF_AC DECIMALS
0.
ENDIF.
ENDIF.
* grava dados da tabela i_tot_fornec
APPEND I_TOT_FORNEC.
CLEAR I_TOT_FORNEC.
ENDLOOP.

67

ABAP Training
ENDFORM.
" F_CALC_ACUM
*&---------------------------------------------------------------------*
*&
Form F_PRINT_SOPPM
*&---------------------------------------------------------------------*
*
imprime somente PPM
*
*----------------------------------------------------------------------*
FORM F_PRINT_SOPPM.
DATA: V_FORNEC LIKE QALS-LIFNR.
"Nr. do fornecedor
DESCRIBE TABLE I_TABFIM LINES V_LINHAS.
IF V_LINHAS EQ 0.
MESSAGE I083 WITH
'No h dados para os critrios de seleo' 'informados'.
EXIT.
ENDIF.
SORT I_TABFIM BY LIFNR WERKS.
LOOP AT I_TABFIM.
READ TABLE I_T001W WITH KEY WERKS = I_TABFIM-WERKS.
READ TABLE I_LFA1 WITH KEY LIFNR = I_TABFIM-LIFNR.
ON CHANGE OF I_TABFIM-LIFNR.
IF V_PRIM_VEZ = 'F'.
READ TABLE I_TOT_FORNEC WITH KEY LIFNR = V_FORNEC.
PERFORM F_PRINT_TOTAL_SOPPM.
ENDIF.
FORMAT COLOR COL_NORMAL INTENSIFIED ON.
WRITE: /02 I_TABFIM-LIFNR,
15 I_LFA1-NAME1,
170 ' '.
FORMAT COLOR COL_NORMAL.
V_PRIM_VEZ = 'F'.
* Busca valores de OBJ PPM e LOTE
READ TABLE I_FORNEC WITH KEY LIFNR = I_TABFIM-LIFNR.
ENDON.
* Imprimir descrio de Centro
ON CHANGE OF I_TABFIM-WERKS OR I_TABFIM-LIFNR.
FORMAT COLOR COL_NORMAL INTENSIFIED ON.
WRITE: /05 I_TABFIM-WERKS,
15 I_T001W-NAME,
170 ' '.
ENDON.
FORMAT COLOR COL_NORMAL.
WRITE: /05 P_MES,
107 I_TABFIM-PPM_M HOTSPOT ON,
119 I_FORNEC-PPM_OBJ,
137 I_TABFIM-LOT_M,
147 I_FORNEC-LOT_OBJ,
170 ' '.
HIDE: I_TABFIM-LIFNR, I_TABFIM-WERKS.
FORMAT COLOR COL_NORMAL.
FORMAT COLOR COL_NORMAL.
WRITE: /05 'Acum.', P_PERIOD, 'Mes(es)',
107 I_TABFIM-PPM_AC HOTSPOT ON,
137 I_TABFIM-LOT_AC,

170 ' '.


HIDE: I_TABFIM-LIFNR, I_TABFIM-WERKS.
* Armazena o Nmero do fornecedor para pesquisa na tabela
i_tot_fornec
V_FORNEC = I_TABFIM-LIFNR.
AT LAST.
READ TABLE I_TOT_FORNEC WITH KEY LIFNR = V_FORNEC.
PERFORM F_PRINT_TOTAL_SOPPM.
ENDAT.
FORMAT COLOR COL_NORMAL.
ENDLOOP.
ULINE.
IF SO_CENT EQ '' AND SO_FORNE EQ '' AND SO_MATNR EQ ''.
PERFORM F_PRINT_TOTAL_CENTRO_SOPPM.
PERFORM F_PRINT_TOTAL_ACUM_SOPPM.
ELSEIF SO_CENT NE '' AND SO_FORNE EQ '' AND SO_MATNR EQ
''.
PERFORM F_PRINT_TOTAL_CENTRO_SOPPM.
ENDIF.
ENDFORM.
" F_PRINT_SOPPM
*&---------------------------------------------------------------------*
*&
Form F_PRINT_RSUM
*&---------------------------------------------------------------------*
*
imprime relatrio sumarizado
*
*----------------------------------------------------------------------*
FORM F_PRINT_RSUM.
IF SO_CENT EQ '' AND SO_FORNE EQ '' AND SO_MATNR EQ ''.
PERFORM F_PRINT_TOTAL_FINAL.
PERFORM F_PRINT_TOTAL_ACUM.
ELSEIF SO_CENT NE '' AND SO_FORNE EQ '' AND SO_MATNR EQ
''.
PERFORM F_PRINT_TOTAL_FINAL.
ELSE.
MESSAGE E083 WITH 'No possvel imprimir'
'com o modo de apresentao'
'escolhido'.
ENDIF.
ENDFORM.
" F_PRINT_RSUM
*&---------------------------------------------------------------------*
*&
Form f_print_total_centro_soppm.
*&---------------------------------------------------------------------*
*
Imprime o total final.
*----------------------------------------------------------------------*
FORM F_PRINT_TOTAL_CENTRO_SOPPM.
FORMAT COLOR COL_TOTAL.
WRITE: /03 'ACUM NO CENTRO',
170 ' '.
SORT I_TOT_CENTRO BY WERKS.
LOOP AT I_TOT_CENTRO.
CLEAR: I_T001W.
READ TABLE I_T001W WITH KEY WERKS = I_TOT_CENTROWERKS.
WRITE: /03 I_TOT_CENTRO-WERKS,
I_T001W-NAME,
107 I_TOT_CENTRO-PPM,
137 I_TOT_CENTRO-LOT,
170 ' '.
ENDLOOP.
ULINE.
ENDFORM.
*&---------------------------------------------------------------------*

68

ABAP Training
*&
Form f_print_total_acum_soppm.
*&---------------------------------------------------------------------*
*
Imprime o total final acum.
*----------------------------------------------------------------------*
FORM F_PRINT_TOTAL_ACUM_SOPPM.
WRITE: /03 'ACUM NO MTB',
170 ' '.
WRITE: /107 I_ACUM_MTB-PPM_AC,
137 I_ACUM_MTB-LOT_AC,
170 ' '.
ULINE.
ENDFORM.
*----------------------------------------------------------------------*
*
Form f_print_total_soppm.
*----------------------------------------------------------------------*
* Imprime total do rel. somente PPM e Lote
*----------------------------------------------------------------------*
FORM F_PRINT_TOTAL_SOPPM.
FORMAT COLOR COL_TOTAL.
WRITE: /05 'Acum ms MTB ',
107 I_TOT_FORNEC-PPM_M,
137 I_TOT_FORNEC-LOT_M,
170 ' '.
WRITE: /05 'Acum MTB(' NO-GAP, P_PERIOD, 'meses)',
107 I_TOT_FORNEC-PPM_AC,
137 I_TOT_FORNEC-LOT_AC,
170 ' '.
FORMAT COLOR COL_NORMAL.
ENDFORM.

Lines/inch
6,00
Characters/inch
10,00
Font attributes
Font family
HELVE
Font size
12,0 Point
Bold
No
Italic
No
Underlined
No

-------------------------------------------------------------------------------Characters Attributes
-------------------------------------------------------------------------------B

Bold print
Standard attributes
Marker
No
Font attributes
Bold
Yes

Italics
Font attributes
Italic
Yes

Key word
Font attributes
Font family
HELVE
Font size
10,0 Point

LP
Font attributes
Font family
COURIER
Font size
8,0 Point

--------------------------------------------------------------------------------

Formulrio
Z_AVAL_FORNEC

Key word (lower case)


Font attributes
Font family
HELVE
Font size
8,0 Point

Underlined
Font attributes
Underlined

-------------------------------------------------------------------------------Mandante
Idioma
Original lang.
Status

200
P

E
Active

Layout set class FMHN Dunning reports


Development class ZGAL Classe de desenvolvimento Projeto
Galileo
Created by
Date
Time
Release
Significado

SAP
11.07.1993
16:24:01
20A

Changed by
Date
Time
Release

ACSATOS
09.06.1999
15:38:09
30F

-------------------------------------------------------------------------------Paragraphs Attributes
-------------------------------------------------------------------------------AS

Standard
Standard attributes
Line spacing
1,00 LN
Alignment
Left-aligned
Tabs
12,00 CH
Left-aligned
35,00 CH
Left-aligned

DE

Detalhe
Standard attributes
Line spacing
1,00 LN
Alignment
Left-aligned
Font attributes
Font family
HELVE
Font size
10,0 Point

Relatrio de Aval. Fornecedor

Standard attributes
First page
FIRST
Default paragr. AS
Tab stop
5,00 CH
Page format
DINA4
Orientation
Portrait

Yes

69

ABAP Training
Tabs
11,00 CH
16,00 CH
26,00 CH
46,00 CH
56,00 CH
60,00 CH

2,00 CH
37,00 CH
42,00 CH
47,00 CH
52,00 CH
57,00 CH
62,00 CH

Left-aligned
Left-aligned
Left-aligned
Left-aligned
Left-aligned
Left-aligned

FO

P4
Standard attributes
Line spacing
1,00 LN
Alignment
Left-aligned
Font attributes
Font family
COURIER
Font size
6,0 Point

P0

P1

P2

Left-aligned
Left-aligned
Left-aligned
Left-aligned
Left-aligned
Left-aligned
Left-aligned

par. cabealho verso


Standard attributes
Line spacing
1,00 LN
Alignment
Left-aligned
Font attributes
Font family
COURIER
Font size
6,0 Point
Tabs
1,00 CM
Left-aligned
4,50 CM
Left-aligned
5,50 CM
Left-aligned
7,60 CM
Left-aligned
12,70 CM
Left-aligned
PARGRAFO HEADER
Standard attributes
Line spacing
1,00 LN
Alignment
Left-aligned
Font attributes
Font family
COURIER
Font size
10,0 Point
Tabs
30,00 CH
Left-aligned
44,00 CH
Left-aligned
50,00 CH
Left-aligned
62,00 CH
Left-aligned
Standard attributes
Line spacing
1,00 LN
Alignment
Left-aligned
Font attributes
Font family
COURIER
Font size
10,0 Point
Tabs
20,00 CH
Left-aligned
25,00 CH
Left-aligned
30,00 CH
Left-aligned
35,00 CH
Left-aligned
40,00 CH
Left-aligned
45,00 CH
Left-aligned

P3
Standard attributes
Line spacing
1,00 LN
Alignment
Left-aligned
Font attributes
Font family
COURIER
Font size
10,0 Point
Tabs

Standard attributes
Line spacing
1,00 LN
Alignment
Left-aligned
Font attributes
Font family
COURIER
Font size
10,0 Point
Tabs
2,00 CH
Left-aligned
33,00 CH
Left-aligned
39,00 CH
Left-aligned
45,00 CH
Left-aligned
51,00 CH
Left-aligned
57,00 CH
Left-aligned
63,00 CH
Left-aligned
P5
Standard attributes
Line spacing
1,00 LN
Alignment
Left-aligned
Font attributes
Font family
COURIER
Font size
8,0 Point
Tabs
2,00 CH
Left-aligned
33,00 CH
Left-aligned
39,00 CH
Left-aligned
45,00 CH
Left-aligned
51,00 CH
Left-aligned
57,00 CH
Left-aligned
63,00 CH
Left-aligned
P6
Standard attributes
Line spacing
1,00 LN
Alignment
Left-aligned
Font attributes
Font family
COURIER
Font size
6,0 Point
Tabs
1,00 CH
Left-aligned
24,00 CH
Left-aligned
50,00 CH
Left-aligned
P7
Standard attributes
Line spacing
0,45 LN
Alignment
Left-aligned
Font attributes
Font family
COURIER
Font size
6,0 Point
Tabs
1,00 CM
Left-aligned
4,50 CM
Left-aligned
5,50 CM
Left-aligned
7,60 CM
Left-aligned
12,70 CM
Left-aligned

70

ABAP Training
T3

Tabulator for line items


Standard attributes
Line spacing
1,00 LN
No blank lines Yes
Alignment
Left-aligned
Tabs
3,00 CM
Left-aligned
6,00 CM
Left-aligned
11,00 CM
Sign, right-aligned
12,00 CM
Left-aligned
16,50 CM
Right-aligned
17,00 CM
Left-aligned

TI

Title in info window


Standard attributes
Line spacing
1,00 LN
Alignment
Left-aligned
Font attributes
Font family
HELVE
Font size
14,0 Point
Bold
Yes

UL

Separator
Standard attributes
Line spacing
0,50 LN
Space after
0,50 LN
Alignment
Left-aligned
Font attributes
Font family
COURIER
Font size
12,0 Point
Underlined
No

-------------------------------------------------------------------------------Windows
Attributes
-------------------------------------------------------------------------------FOOTER

rodap
Window type

CONST

HEADER

cabealho
Window type

CONST

INFO3

Endereo
Window type

VAR

MAIN

Janela Principal
Window type
MAIN

-------------------------------------------------------------------------------Pages
Attributes
-------------------------------------------------------------------------------FIRST

Payment reminder: 1st page


Standard attributes
Next page
VERSO
Page counter
Mode
INC
Numbering type Arabic numerals
Page window
MAIN
Left margin
4,00 CH
Upper margin
10,00 LN
Window width
70,00 CH
Window height
55,00 LN
FOOTER
Left margin
4,00 CH

HEADER

VERSO

Upper margin
Window width
Window height
Left margin
Upper margin
Window width
Window height

65,00 LN
70,00 CH
4,00 LN
4,00 CH
2,00 LN
70,00 CH
8,00 LN

Verso da carta
Standard attributes
Next page
FIRST
Page counter
Mode
START
Numbering type Arabic numerals
Page window
INFO3
Left margin
4,00 CH
Upper margin
2,00 LN
Window width
70,00 CH
Window height
58,00 LN

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


-------------------------------------------------------------------------------FOOTER
P6 ,,NQF=NOTA DA QUALIDADE DE FORNECIMENTO,,NAS=NOTA
DA AVALIAO DE
SISTEMA
P6 ,,NFL=NOTA DE FORNECIMENTO DE LOTES,,NCQ=NOTA
COMPROM. COM QUALIDADE
(ITENS)
P6 ,,NPR=NOTA DE PROCESSO(PPM DE LINHA),,NPT=NOTA DE
PONTUALIDADE

HEADER
/: INCLUDE TESTE3 OBJECT TEXT ID ST
/: BOX YPOS '0.3' LN WIDTH '72' CH HEIGHT '63' LN FRAME 10 TW
/: BOX YPOS '0.3' LN WIDTH '7.2' CM HEIGHT '5' LN FRAME 10 TW
P1 ,,RELATRIO DE AVALIAO DO FORNECEDOR
P1 ,,DATA DE REFERNCIA : &ZSAPSCRIP2-DATA_REF&
P1 ,,ACUMULADO DE : &ZSAPSCRIP2-ACUM_DT1& AT
&ZSAPSCRIP2-ACUM_DT2&
P1 ,,FORN: &zsapscrip2-lifnr&
P1 ,,&ZSAPSCRIP2-NAMEF&
P1 ,,AVALIADO,,: &ZSAPSCRIP2-AVALIA&,,PPM
MS,,:&ZSAPSCRIP2-PPM_M&
P1 ,,ATIVO NO MS,,: &ZSAPSCRIP2-ATIVO&,,PPM
ACUMULADO,,:&ZSAPSCRIP2-PPM_AC&

INFO3
/* Criado por Antonio Celso Hunnicutt Cortada - 16/02/2001
/* Relatrio de Avaliao de Forncedore - Portugus
/* Request :MD0K914497
/*
****************************************************************
********
/: BOX XPOS '0.5' CM YPOS '0.3' LN WIDTH '16.5' CM HEIGHT '1.2'
LN FRAME 10 TW

71

ABAP Training
/: BOX XPOS '0.5' CM YPOS '1.5' LN WIDTH '3.5' CM HEIGHT 6 LN
FRAME 10 TW
/: BOX XPOS '4' CM YPOS '1.5' LN WIDTH '3.5' CM HEIGHT 6 LN
FRAME 10 TW
/: BOX XPOS '7.5' CM YPOS '1.5' LN WIDTH 5 CM HEIGHT 3 LN
FRAME 10 TW
/: BOX XPOS '7.5' CM YPOS '1.5' LN WIDTH 5 CM HEIGHT 6 LN
FRAME 10 TW
/: BOX XPOS '12.5' CM YPOS '1.5' LN WIDTH '4.5' CM HEIGHT 6 LN
FRAME 10 TW
/*
/*
P0 ,,,,
<K><B>PARA USO DO CORREIO</></>
/: BOX XPOS '0.7' CM YPOS '2.5' LN WIDTH 01 CH HEIGHT 3 MM
FRAME 10 TW
/: 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,, NO PROCURADO
/: 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
FRAME 10 TW
P0 ,, ENDEREO INSUF.,, AUSENTE
/: BOX XPOS '0.7' CM YPOS '4.5' LN WIDTH 01 CH HEIGHT 3 MM
FRAME 10 TW
/: BOX XPOS '4.2' CM YPOS '4.5' LN WIDTH 01 CH HEIGHT 3 MM
FRAME 10 TW
P0 ,, NO EXISTE,, FALECIDO,,,,REINTEGRADO AO SERVIO
POSTAL EM
/: BOX XPOS '0.7' CM YPOS '5.5' LN WIDTH 01 CH HEIGHT 3 MM
FRAME 10 TW
/: BOX XPOS '4.2' CM YPOS '5.5' LN WIDTH 01 CH HEIGHT 3 MM
FRAME 10 TW
P0 ,, DESCONHECIDO,, INFORMAO ESCRITA
P0 ,, RECUSADO,,P/ PORTEIRO/SNDICO
/: BOX XPOS '0.7' CM YPOS '6.5' LN WIDTH 01 CH HEIGHT 3 MM
FRAME 10 TW
AS
AS
AS
AS
AS
/: INCLUDE TESTE3 OBJECT TEXT ID ST
AS
AS
/: BOX XPOS 1 CH YPOS 19 LN WIDTH 67 CH HEIGHT 06 LN
INTENSITY 35
/: BOX XPOS 1 CH YPOS 25 LN WIDTH 09 CH HEIGHT 6 LN
INTENSITY 35
/: BOX XPOS 10 CH YPOS 25 LN WIDTH 50 CH HEIGHT 6 LN FRAME
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
INTENSITY 35
/*
/: BOX XPOS 1 CH YPOS 42 LN WIDTH 67 CH HEIGHT 8 LN
INTENSITY 35
/: BOX XPOS 1 CH YPOS 50 LN WIDTH 09 CH HEIGHT 6 LN
INTENSITY 35
/: BOX XPOS 10 CH YPOS 50 LN WIDTH 50 CH HEIGHT 6 LN FRAME
10 TW INTENSITY 0
/: 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


INTENSITY 35
/
/
/
/
/
/
/
/
/
/
/
AS <K>,, &ZSAPSCRIP2-DEST_NAME&
AS <K>,, &ZSAPSCRIP2-DEST_RUA& &ZSAPSCRIP2DEST_CAIXA&
AS <K>,, CEP: &ZSAPSCRIP2-DEST_CEP& &ZSAPSCRIP2DEST_CITY&
AS <K>,, ESTADO : &ZSAPSCRIP2-DEST_REG&,, &ZSAPSCRIP2DEST_PAIS&
AS <K>,, A/C DEPTO. VENDAS
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
AS
AS
AS <K>,, &ZSAPSCRIP2-REM_NAME&
AS <K>,, &ZSAPSCRIP2-REM_RUA& &ZSAPSCRIP2-REM_CAIXA&
AS <K>,, CEP: &ZSAPSCRIP2-REM_CEP& &ZSAPSCRIP2REM_CITY&
AS <K>,, ESTADO : &ZSAPSCRIP2-REM_REG&,, &ZSAPSCRIP2REM_PAIS&
AS <K>,, REA DE SUPRIMENTOS

MAIN
/* Criado por Antonio Celso Hunnicutt Cortada - 16/02/2001
/* Relatrio de Avaliao de Forncedore - Portugus
/* Request :MD0K914497
/* Alterao Funcional - Incluso NPT por Unidade - MD0K915742
/* Correo - MD0K915748
/* Alterao Funcional - Modificao NPT - MD0K915806
/* Ajuste do layout - MD0K915848
/*
****************************************************************
********
Element RESUMO_TODAS_UNIDADES

72

ABAP Training
/: 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
/: BOX XPOS '19.5' CH YPOS '1.3' LN WIDTH '30' CH HEIGHT '1' LN
FRAME 10 TW
/: BOX XPOS '34.5' CH YPOS '2.3' LN WIDTH '15' CH HEIGHT '1' LN
FRAME 10 TW
/: BOX XPOS '34.5' CH YPOS '3.3' LN WIDTH '15' CH HEIGHT '1' LN
FRAME 10 TW
/: 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,,MS,,ACU,,NOTA,,MS,,ACU
P2 ,,NQF,,<LP>&ZSAPSCRIP2-NQF_M_T&,,&ZSAPSCRIP2NQF_AC_T&</>,,NFL
,,<LP>&ZSAPSCRIP2-NFL_M_T&,,&ZSAPSCRIP2-NFL_AC_T&</>
P2 ,,,,,,,,NPR,,<LP>&ZSAPSCRIP2-NPR_M_T&,,&ZSAPSCRIP2NPR_AC_T&</>
P2 ,,,,,,,,NCQ,,<LP>&ZSAPSCRIP2-NCQ_M_T&,,&ZSAPSCRIP2NCQ_AC_T&</>
P2 ,,NAS,, <LP>&ZSAPSCRIP2-NAS_M_T&</>,,-,,-,,-,,P2 ,,NPT,, <LP>&ZSAPSCRIP2-NPT_M_T&</>,,
<LP>&ZSAPSCRIP2-NPT_AC_T&</>
Element RESUMO_POR_UNIDADE
/: PROTECT
/: IF &ZSAPSCRIP2-CONT& > 253
/: POSITION YORIGIN '12.7' MM
/: ENDIF
/: BOX XPOS '36.5' CH YPOS '9.3' LN WIDTH '10' CH HEIGHT '1' LN
FRAME 10 TW
/: BOX XPOS '61.5' CH YPOS '9.3' LN WIDTH '7' CH HEIGHT '2' LN
FRAME 10 TW
/: BOX XPOS '1.5' CH YPOS '10.3' LN WIDTH '35' CH HEIGHT '1' LN
FRAME 10 TW
/: BOX XPOS '36.5' CH YPOS '10.3' LN WIDTH '5' CH HEIGHT '1' LN
FRAME 10 TW
/: BOX XPOS '41.5' CH YPOS '10.3' LN WIDTH '5' CH HEIGHT '1' LN
FRAME 10 TW
/: BOX XPOS '46.5' CH YPOS '10.3' LN WIDTH '5' CH HEIGHT '1' LN
FRAME 10 TW
/: BOX XPOS '51.5' CH YPOS '10.3' LN WIDTH '5' CH HEIGHT '1' LN
FRAME 10 TW
/: BOX XPOS '56.5' CH YPOS '10.3' LN WIDTH 12 CH HEIGHT '1' LN
FRAME 10 TW
P2
P2 ,, ***RESUMO POR UNIDADE***
P3 ,,,, N.Q.F.,,,,,,,,,, NPT
P3 ,,UNIDADE,,MS,,ACU,,NOTA,,MS,,ACU,,MS/ACU
/: ENDPROTECT
Element DETALHE_RESUMO_POR_UNIDADE
/: PROTECT

/: POSITION YORIGIN &ZSAPSCRIP2-CONT& MM


/: BOX XPOS '1.5' CH YPOS '0.3' LN WIDTH '35' CH HEIGHT '3' LN
FRAME 10 TW
/: BOX XPOS '36.5' CH YPOS '0.3' LN WIDTH '5' CH HEIGHT '3' LN
FRAME 10 TW
/: BOX XPOS '41.5' CH YPOS '0.3' LN WIDTH '5' CH HEIGHT '3' LN
FRAME 10 TW
/: BOX XPOS '46.5' CH YPOS '0.3' LN WIDTH '5' CH HEIGHT '1' LN
FRAME 10 TW
/: BOX XPOS '46.5' CH YPOS '1.3' LN WIDTH '5' CH HEIGHT '1' LN
FRAME 10 TW
/: BOX XPOS '46.5' CH YPOS '2.3' LN WIDTH '5' CH HEIGHT '1' LN
FRAME 10 TW
/: BOX XPOS '51.5' CH YPOS '0.3' LN WIDTH '5' CH HEIGHT '1' LN
FRAME 10 TW
/: BOX XPOS '51.5' CH YPOS '1.3' LN WIDTH '5' CH HEIGHT '1' LN
FRAME 10 TW
/: BOX XPOS '51.5' CH YPOS '2.3' LN WIDTH '5' CH HEIGHT '1' LN
FRAME 10 TW
/: BOX XPOS '56.5' CH YPOS '0.3' LN WIDTH 5 CH HEIGHT '1' LN
FRAME 10 TW
/: BOX XPOS '56.5' CH YPOS '1.3' LN WIDTH 5 CH HEIGHT '1' LN
FRAME 10 TW
/: BOX XPOS '56.5' CH YPOS '2.3' LN WIDTH 5 CH HEIGHT '1' LN
FRAME 10 TW
/: 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&,,&ZSAPSCRIP2NPT_M&/&ZSAPSCRIP2-NPT_AC&</>
P3 ,,,,,,,,NPR,,<LP>&ZSAPSCRIP2-NPR_M&,,&ZSAPSCRIP2NPR_AC&</>
P3 ,,,,,,,,NCQ,,<LP>&ZSAPSCRIP2-NCQ_M&,,&ZSAPSCRIP2NCQ_AC&</>
/: ENDPROTECT
Element RESUMO_INDICES_PPM
/: PROTECT
/: IF &ZSAPSCRIP2-CONT& > 270
/: POSITION YORIGIN '29.6' MM
/: ENDIF
/: BOX XPOS '32.5' CH YPOS '5.3' LN WIDTH '18' CH HEIGHT '2' LN
FRAME 10 TW
/: BOX XPOS '50.5' CH YPOS '5.3' LN WIDTH '18' CH HEIGHT '2' LN
FRAME 10 TW
/: BOX XPOS '1.5' CH YPOS '6.3' LN WIDTH '67' CH HEIGHT 1 LN
FRAME 10 TW
/: BOX XPOS '38.5' CH YPOS '6.3' LN WIDTH '6' CH HEIGHT '1' LN
FRAME 10 TW
/: BOX XPOS '56.5' CH YPOS '6.3' LN WIDTH '6' CH HEIGHT '1' LN
FRAME 10 TW
P4
P4 ,, *** RESUMO DOS NDICES DE PPM DE LINHA E % REJEIO
DE LOTE NO
RECEBIMENTO ***
P4 ,,,, PPM DE LINHA,,,,,, % REJEIO LOTE
P4 ,,UNIDADE,,MS,,ACU,,OBJ,,MS,,ACU,,OBJ
/: ENDPROTECT
Element DETALHE_RESUMO_INDICES_PPM
/: POSITION YORIGIN &ZSAPSCRIP2-CONT& MM

73

ABAP Training
/: PROTECT
/: BOX XPOS '1.5' CH YPOS '0.3' LN WIDTH '31' CH HEIGHT
FRAME 10 TW
/: BOX XPOS '32.5' CH YPOS '0.3' LN WIDTH '6' CH HEIGHT
FRAME 10 TW
/: BOX XPOS '38.5' CH YPOS '0.3' LN WIDTH '6' CH HEIGHT
FRAME 10 TW
/: BOX XPOS '44.5' CH YPOS '0.3' LN WIDTH '6' CH HEIGHT
FRAME 10 TW
/: BOX XPOS '50.5' CH YPOS '0.3' LN WIDTH '6' CH HEIGHT
FRAME 10 TW
/: BOX XPOS '56.5' CH YPOS '0.3' LN WIDTH '6' CH HEIGHT
FRAME 10 TW
/: BOX XPOS '62.5' CH YPOS '0.3' LN WIDTH '6' CH HEIGHT
FRAME 10 TW
P5 ,,&ZSAPSCRIP2-NAMEC&,,&ZSAPSCRIP2PPM_M_I&,,&ZSAPSCRIP2-PPM_AC_I&
,,&ZSAPSCRIP2-PPM_OBJ_R&,,&ZSAPSCRIP2-LOT_M&
,,&ZSAPSCRIP2-LOT_AC&,,&ZSAPSCRIP2-LOT_OBJ_R&
/: ENDPROTECT

'1' LN
'1' LN
'1' LN
'1' LN
'1' LN
'1' LN
'1' LN

74

ABAP Training

EXERCCIOS
SAPSCRIPT

75

ABAP Training
Exerccio 1:
Desenvolver um programa Z_EXC_SAP_1_AL## que permita que o usurio
visualize ou imprima um formulrio com os cdigos dos Materiais, a descrio,
o tipo e o centro.
Permitir a ordenao dos dados por centro, tipo e material
Tabelas:

MARA
MARC
MAKT

Fazer a quebra do relatrio por centro (Pode-se usar os seguintes comandos


para fazer isso: ON CHANGE, AT END ou AT NEW. Ateno s peculiaridades de
cada comando).
O relatrio deve apresentar o layout abaixo:
Dica: para fazer os quadros ao redor dos itens, no utilizar o comando BOX,
usar a alternativa apresentada anteriormente na apostila. Nos demais locais,
utilizar esse comando.

76

ABAP Training
MATERIAIS
Centro: xxxxxxxx
Cdigo do Material
000000
000000
000000
000000

data: dd/mm/aaaa
Descrio
xxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxx

Tipo
XXXX
XXXX
XXXX
XXXX

Total de Materiais no Centro: 00

77

ABAP Training
Resoluo 1:
1) Report:
************************************************************************
*
*
*
********************************************
*
*
* Confidencial e Proprietrio
*
*
*
* Copyright 2001, Accenture
*
*
*
* Todos os direitos reservados
*
*
*
********************************************
*
*
*
*
Nome do Shell: Z_TEMPLATE_REPORT Verso do Shell: v1.03 *
*
*
************************************************************************
* Nome do Programa : Z_EXC_SAPSCRIPT
*
* Ttulo do Programa : Programa de impresso dos materiais por centro *
* Programador
: Aluno do curso de ABAP
*
* Data
: 29/03/2001
*
* ltima atualizao : 29/03/2001
*
*
*
* Descrio : Este um programa para a visualizao de materiais *
*
ou impresso dos dados, de acordo com o parmetro
*
*
selecionado pelo usurio
*
* Include
:
*
*
*
* Calls
:
*
*
*
* Mdulos de Funes:
*
*
*
*----------------------------------------------------------------------*
* Lista de Modificaes:
*
* Data
Autor
Corr. #
Descrio
*
* 29/03/2001 ABAPDEV1
AF1K900023 Desenvolvimento inicial do prg *
*
*
************************************************************************
REPORT Z_EXC_REPORT_1_AL06_D
NO STANDARD PAGE HEADING "No mostra o cabealho padro 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 sero impressas na ltima
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
*
" SESSO DE DECLARAO DE DADOS "
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
************************************************************************
* Includes
*
************************************************************************
*INCLUDE:
* ZZIHEADR.
"Cabealho padro de report
************************************************************************
* Tabelas
*
************************************************************************
TABLES: mara,
marc,
makt.
************************************************************************
* Dados:
*
* Constantes
(C_...)
*

78

ABAP Training
* Variaveis
(V_...)
*
* Tabelas Internas (I_...)
*
************************************************************************
*- Constantes ---------------------------------------------------------*
*DATA:
* C_..
*- Variveis ---------------------------------------------------------*
DATA:
V_CONT TYPE I VALUE 0.
" contador
*- Tabela Interna -----------------------------------------------------*
* tabela interna para armazenar o cdigo 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 descrio dos materiais
DATA: BEGIN 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.
************************************************************************
* Parmetros de entrada :
*
* Select Options (S_...)
*
* Parameters
(P_...)
*
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE T1.
select-options: s_matnr for mara-matnr, " cd 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 cdigo
p_desc
radiobutton group g1, " ordenado por descrio
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.

79

ABAP Training
parameters: p_SCREEN radiobutton group g3, " visualizao dos dados
p_SCRIPT radiobutton group g3. " impresso do formulrio
SELECTION-SCREEN END OF BLOCK B3.
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
" SESSO DE PROCESSAMENTO "
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
*----------------------------------------------------------------------*
INITIALIZATION.
"Logica para defaults "inteligentes"
*----------------------------------------------------------------------*
T2 = 'Relatrio Ordenado Por:'.
T3 = 'Opes de sada'.
*----------------------------------------------------------------------*
*AT SELECTION-SCREEN. "Tratamento de Erros e lgica para tela de seleo
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
START-OF-SELECTION.
"Processamento principal
*----------------------------------------------------------------------*
* seleciona os dados
PERFORM F_SELECT_DATA.
* imprime os dados
PERFORM F_PRINT_REPORT.
*----------------------------------------------------------------------*
*END-OF-SELECTION.
"Fim do processamento principal
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
AT LINE-SELECTION.
"Seleo da linha do relatrio
*----------------------------------------------------------------------*
set parameter id 'MAT' field i_final-matnr. "Seta varivel que envolve
"transao
call transaction 'MM03' and skip first screen. "Chama transao
"consulta de materiais
*----------------------------------------------------------------------*
TOP-OF-PAGE.
"Cabealho (Aparece sempre no topo da tela.)
*----------------------------------------------------------------------*
format color 2.
write: 'Cdigo', 20 'Descrio do Material', 61 'Tipo', 66 'Centro'.
*----------------------------------------------------------------------*
*END-OF-PAGE.
"Rodap
*----------------------------------------------------------------------*
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
" SESSO DE FORMS "
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
*&---------------------------------------------------------------------*
*&
Form F_SELECT_DATA
*&---------------------------------------------------------------------*
* Seleciona dados e armazena-os na tabela interna

80

ABAP Training
*----------------------------------------------------------------------*
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 para 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.
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 werks.
elseif p_tipo eq 'X'.
sort i_final by mtart maktx werks.

81

ABAP Training
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 opo do usurio for imprimir o formulrio
if p_script eq 'X'.
* abre o formulrio
CALL FUNCTION 'OPEN_FORM'
EXPORTING
DEVICE = 'PRINTER'
FORM
= 'Z_EXC_SAPSCRIT'
LANGUAGE = 'P'.
* inicializa o formulrio
CALL FUNCTION 'START_FORM'
EXPORTING
FORM
= 'Z_EXC_SAPSCRIT'
LANGUAGE = 'P'.
* imprime o cabealho
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 mudana de centro, chama o elemento de dados QUEBRA da janela
* MAIN, que inicializa uma nova pgina e o elemento CABEC que imprime
* o cabealho
on change of i_final-werks.
if sy-tabix ne 1.
" se no for o 1 registro
CALL FUNCTION 'WRITE_FORM' " quebra de pgina
EXPORTING
ELEMENT = 'QUEBRA'
WINDOW = 'MAIN'.
CALL FUNCTION 'WRITE_FORM' " imprime o cabealho
EXPORTING
ELEMENT = 'CABEC'
WINDOW = 'MAIN'.
V_CONT = 0.
" inicializa o contador de materiais
endif.
" se no for o 1 registro
endon.
* imprime os itens
CALL FUNCTION 'WRITE_FORM'

82

ABAP Training
EXPORTING
ELEMENT = 'ITEM'
WINDOW = 'MAIN'.
ENDLOOP.
* finaliza o formulrio
CALL FUNCTION 'END_FORM'.
* fecha o formulrio
CALL FUNCTION 'CLOSE_FORM'.

" FECHA O START


" FECHA O OPEN

* seno (se for visualizao 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 no for o primeiro registro
new-page.
" cria uma nova pgina
endif.
" fim do se for o primeiro registro
endon.
endif.
write: / i_final-matnr hotspot,
i_final-maktx ,
i_final-mtart ,
i_final-werks , ' '.
hide: i_final-matnr.
endloop.
endif.
ENDFORM.

" F_PRINT_REPORT

83

ABAP Training
2) Sapscript:
-------------------------------------------------------------------------------Formulrio
Z_EXC_SAPSCRIT
-------------------------------------------------------------------------------Mandante
020
Idioma
PT
Idioma original
PT
Relevante p/traduo Sim
Status
ativo
Cl.desenvolvimento ZABAP
Autor
Data
Hora
Release

ABAPDEV1
04.04.2001
07:52:50
46B

Significado

Modificador
Data
Hora
Release

ABAPDEV1
04.04.2001
16:05:03
46B

Relatrio de Materiais

Atributos standard
Pgina inicial
PAGE1
Pargrf.default
P0
Stop tabulador
1,00 CM
Formato pgina
LETTER
Formato folha
Form.vert.
Linhas/polegada
6,00
Caracs/polegada
10,00
AtribsFamCar.
Famlia caracs.
Alt.fam.caracs.
Negrito
Itlico
Sublinhado

TIMES
12,0 Ponto
No
No
No

-------------------------------------------------------------------------------Caracteres Atributos
-------------------------------------------------------------------------------PG

Caracteres Grandes
Atributos standard

84

ABAP Training
Marcao
No
AtribsFamCar.
Famlia caracs. TIMES
Alt.fam.caracs. 18,0 Ponto
PM

Caracteres Mdio
AtribsFamCar.
Famlia caracs. TIMES
Alt.fam.caracs. 12,0 Ponto

PP

Caracteres Pequenos
AtribsFamCar.
Famlia caracs. TIMES
Alt.fam.caracs. 10,0 Ponto

-------------------------------------------------------------------------------Pargrafos 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 Cabealho
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 SEPARAO
Atributos standard
Espacej.linhas 0.05 LN
Margem esquerda 0.80 MM
Alinhamento
Alinh.esq.

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

85

ABAP Training
CABEC

Cabealho
CategoriaJanela CONST

MAIN

Janela princ
CategoriaJanela MAIN

RODAPE

Rodap
CategoriaJanela CONST

-------------------------------------------------------------------------------Pginas
Atributos
-------------------------------------------------------------------------------PAGE1

Pgina nova
Atributos standard
Pg.seg.
PAGE1
Numer.pgs.
Modo
INC
Ctg.numerao
Algarismos rabes
Janelas pginas
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
PC
,,<PG>MATERIAIS</>,,<PM>&SY-DATUM&</>
PC
<PM>CENTRO: &I_FINAL-werks&</>
MAIN
/* Janela princ
Elemento CABEC

86

ABAP Training
UL
P0
UL

&ULINE(90)&
<PM>| Cdigo do Material,,| Descrio ,,| Tipo,,|</>
&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
/:
PC

BOX WIDTH 192 MM HEIGHT 06 MM FRAME 10 TW


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

87

Вам также может понравиться