ABAP - Wagner
ABAP - Wagner
ABAP - Wagner
Workbench
SAP R/3 ®
ABAP Workbench
Release: 4.6C
Nome : ___________________________________________
Departamento:______________________ Data:___/___/___
Introdução ao ABAP Workbench
Marcas Registradas
SAP e o logotipo SAP são marcas registradas da SAP AG.
MS-DOS e EXCEL são marcas registradas da Microsoft.
OS/2, CICS, MVS, ACF/VTAM, VSE, AIX, OS/400 e AS/400 são marcas registradas
da IBM.
X-Window-System é uma marca registrada da MIT University.
SINIX, UTM e BS2000 são marcas registradas da Siemens.
UNIX é uma marca registrada da AT&T.
HP-UX é uma marca registrada da Hewlett Packard.
DECnet, DECstation, DECsystem, VAXstation e VMS são marcas registradas da
DEC.
Ethernet é uma marca registrada da Xerox Corporation.
ORACLE SQL*net, SQL*+ PRO*C são marcas registradas da ORACLE Corporation.
INFORMIX-OnLine e INFORMIX-ESQL/C são marcas registradas da INFORMIX
Corporation.
Confidencialidade
Este Documento entitulado ‘ABAP Workbench SAP R/3’, desenvolvido para ser
utilizado para treinamento corporativo do ERP SAP R/3, da SAP AG, é de
propriedade exclusiva da ALLIANSYS CONSULTING LTDA, sendo proibida sua
cópia total ou parcial, ou mesmo divulgação sem prévia autorização desta empresa.
ÍNDICE
CONFIDENCIALIDADE ............................................................................................................. 2
CAPÍTULO 1 .......................................................................................................................................... 6
RELATÓRIOS ..................................................................................................................................... 13
REPORTS (OVERVIEW E TÉCNICAS).................................................................................................. 13
FORMATO DE LISTA DE SAÍDA ........................................................................................................... 14
O COMANDO WRITE ........................................................................................................................ 15
ESPECIFICAÇÃO DE POSIÇÃO E TAMANHO ....................................................................................... 16
SINTAXE DO COMMANDO WRITE .................................................................................................... 17
OPÇÕES DE FORMATO ....................................................................................................................... 18
ATRIBUTOS DE SAÍDA I ..................................................................................................................... 19
ATRIBUTOS DE SAÍDA II.................................................................................................................... 20
ATRIBUTOS DOS CAMPOS DE SAÍDA ................................................................................................... 21
SÍMBOLOS E ÍCONES EM LISTAS ........................................................................................................ 22
RELATÓRIOS INTERATIVOS............................................................................................................... 23
PAGE HEADINGS ................................................................................................................................ 24
LISTAS SECUNDÁRIAS E A VARIÁVEL DE SISTEMA SY-LSIND......................................................... 25
SELEÇÃO DE LINHAS I – UTILIZANDO A VARIÁVEL DE SISTEMA SY-LISEL .................................. 26
SELEÇÃO DE LINHAS II...................................................................................................................... 27
SELEÇÃO DE LINHAS III ................................................................................................................... 28
EXERCÍCIOS ....................................................................................................................................... 29
CAPÍTULO 3 ........................................................................................................................................ 30
TABELAS INTERNAS........................................................................................................................ 59
ENTENDENDO OS NOVOS TIPOS DE TABELAS INTERNAS ................................................................... 71
Standard ......................................................................................................................................... 71
Sorted.............................................................................................................................................. 71
Hashed............................................................................................................................................ 71
CONSIDERAÇÕES................................................................................................................................ 72
WORK ÁREA DA TABELA INTERNA ................................................................................................... 73
LOOPING DE LEITURA NA TABELA INTERNA .................................................................................... 78
ACESSANDO ENTRADAS INDIVIDUAIS EM TABELAS INTERNAS ........................................................ 79
MODIFICANDO UMA TABELA INTERNA ATRAVÉS DO ÍNDICE ........................................................... 80
MODIFICANDO UMA TABELA INTERNA ATRAVÉS DE CHAVES ......................................................... 81
DELETANDO UMA TABELA INTERNA ................................................................................................. 82
TABELAS INTENAS COM E SEM HEADER LINE .............................................................................. 83
EXERCÍCIOS ....................................................................................................................................... 84
CAPÍTULO 7 ........................................................................................................................................ 85
SAPSCRIPT........................................................................................................................................ 163
1 – O QUE É SAPSCRIPT E QUANDO UTILIZAR ................................................................................ 163
2 - LIMITAÇÕES E PROBLEMAS DA FERRAMENTA .......................................................................... 163
Programa de Povoamento de SAPscript ................................................................................ 164
Abertura de formulário ............................................................................................................. 164
Inicialização de um formulário ............................................................................................... 166
Seleção dos dados...................................................................................................................... 167
Impressão dos dados nas janelas ............................................................................................ 167
3 - O FORMULÁRIO .......................................................................................................................... 169
3.1. Header ............................................................................................................................. 169
3.2. Parágrafos ...................................................................................................................... 169
3.3. Caracter String .............................................................................................................. 169
3.4. Janelas ............................................................................................................................. 170
3.5. Páginas............................................................................................................................ 171
3.6. Page Windows ................................................................................................................ 171
3.7. Text Elements ................................................................................................................. 171
4 - MANUTENÇÃO DE FORMULÁRIOS............................................................................................... 172
4.1. Criar um formulário novo ............................................................................................ 172
4.2. Copiar formulários em outro idioma (Tradução) ..................................................... 172
4.3. Copiar um formulário de outro cliente ....................................................................... 173
5 - INCLUSÃO DE LOGOS NO FORMULÁRIO ...................................................................................... 173
6 - ALTERAÇÃO DE PROGRAMAS / LAYOUT STANDARDS ............................................................... 174
Capítulo 1
Novidades no ABAP WorkBench
Estrutura de Telas no Object Navigator
Right-Click para
mostrar menu de
Contexto
• A lista de objetos para um objeto corrente mostrado na Object Window pode ser
mostrada pressionando-se o botão “Object List”.
Editor
Screen
Painter
• Navegação:
o Efetuando-se um double-click em um programa existente, inicia-se a
ferramenta correspondente no Workbench na Object Window.
o Se o objeto não existir, é possível cria-lo simplesmente efetuando-se um
double-click neste objeto.
Definir o
Domínio
Características
técnicas
diretamente no
Data Element
A partir da versão 4.6, as características técnicas podem ser definidas diretamente no data
element, sem que haja a necessidade de criação de domínios.
• C – Caracter
• N – Numérico
• D – Data (YYYMMMDD)
• T – Time (HHMMSS)
• X – Byte (Hexadecimal)
• I – Inteiro
• P – Packed
• F – Ponto Flutuante
• STRING – Caracter tipo string
• XSTRING – Hexadecimal para imagens.
Exemplo de Codificação
Exercícios
Utilize este espaço para colocar observações a respeito dos exercícios propostos pelo
instrutor.
Capítulo 2
Relatórios
NEW-PAGE... .
Events TOP-OF-PAGE.
TOP-OF-PAGE.
END-OF-PAGE.
Text elements
Text symbols
Headings
Selection texts
System fields
Acima podemos observar os comandos que geram as listas para impressão, bem como
eventos e elemtneos de textos utilizados.
*******************************************
*******************************************
Também por default, o ABAP gera duas linhas HEADER. O título da lista e o cabeçalho da
lista (se disponível) aparecece no topo à esquerda, enquanto que o número da página
aparece no topo, ao lado direito. Estes valores permanecem válidos quando o relatório é
“rolado” pela tela.
O comando WRITE
REPORT RSBBB02A.
.
.
.
WRITE: '*************'(001).
SKIP 2.
WRITE: 'Date'(002),
SY-DATUM.
WRITE: 'Time'(003), DEMO/CHAP 02.A WRITE 1
SY-UZEIT.
SKIP 2. ******************************************
WRITE: '*************'(001).
Date 17.10.2001 Time 14:46:10
*******************************************
Sucessivos WRITEs geram saída em uma mesma linha. Quando uma linha é completa, a
saída continua na próxima linha. Por default, dois campos que seguem um ao lado do outro
devem ser separados por um branco. Você pode usar a adição NO-GAP para suprimir a
impressão dos caracteres em branco.
REPORT RSBBB02B.
WRITE: 5 '***************'(001).
SKIP.
WRITE: 5 'Date'(002),
20 SY-DATUM.
WRITE: /5 'Time'(003),
20 SY-UZEIT. DEMO/CHAP 02.B WRITE 1
ULINE /5(30) .
SKIP 2. ************************************
ULINE.
Date 10/17/1995
Time 16:18:38
_________________________
Coluna 5 Coluna 20
Você pode especificar um formato para o valor de saída. Este permite você definir uma
quabra de linha, a linha inicial e o tamanho da saída.
<value>
/p(l)
/ Quebra
p Pos. da coluna Valor saída
l Tamanho saída Campo ou literal
<options>
Opções de formato
A posição da coluna, através de um valor de até 3 dígitos ou uma variável que respeite este
tamanho, usando o parâmetro acicional AT.
Opções de Formato
REPORT RSBBB02C.
DATA: DATUM TYPE D,
TIME TYPE T.
DATUM = SY-DATUM.
TIME = SY-UZEIT. DEMO/CHAP 02.C 1
WRITE: 5 'Datum'(001),
20 DATUM DD/MM/YYYY. ************************************
WRITE: /5 'Time'(002), Date 10/17/95
(8) TIME USING EDIT MASK Time 07:08:17
’_ _:_ _:_ _’ _________________________
UNDER DATUM.
Coluna 5 Coluna 20
Para formatar um campo data, você deve utilizar a opção DD/MM/YYYY. Para formatar um
campo de data sem o formato DD/MM/YYYY, você deve especificar o tamanho da saída do
campo, inclusive os caracteres de formatação (/), por exemplo.
Para definir a posição dos campos, você pode usar os parâmetros LEFT-JUSTIFIED, RIGHT-
JUSTIFIED e CENTERED. O default é: campos numéricos são posicionados RIGHT-
JUSTIFIED e todos os outros, LEFT-JUSTIFIED.
Utilizando USING EDIT MASK, você pode especificar um template de formato. O underscore
indica como posição de saída . O sistema imprime diretamente qualquer outro caracter usado
no template.
Atributos de Saída I
REPORT RSBBB02E.
FORMAT INTENSIFIED OFF.
WRITE: 5 '*************'(001).
SKIP 2.
WRITE: 5 'Date'(002).
FORMAT INTENSIFIED.
WRITE: 20 SY-DATUM DD/MM/YYYY.
DEMO/CHAP 02.E 1
FORMAT INTENSIFIED OFF.
WRITE: /5 'Time'(003). ************************************
Date 17.10.1995
Time 16:18:38
_________________________
Em qualquer formato de tela, você deve setar através do comando FORMAT os comandos
WRITE que aparecem na nova linha adiante.
Atributos de Saída II
REPORT RSBBB02F.
TABLES: SPFLI, SFLIGHT.
DATA: TOTAL LIKE SFLIGHT-PAYMENTSUM.
DEMO/CHAP 02.06 1
GET SPFLI FIELDS ... .
CAR ID from to
FORMAT COLOR COL_KEY. Date Sales
WRITE: /SPFLI-CARRID, AA 0017 NEW YORK SAN FRANCISCO
SPFLI-CONNID. 10/29/1995 6.466,70
11/11/1995 13.100,07
... 11/16/1995 24.500,13
GET SFLIGHT FIELDS ... . ...
FORMAT COLOR COL_NORMAL.
WRITE: SFLIGHT-FLDATE. Total sales for flight AA 0017 112.633,93
As listas seguintes mostram as sete cores que você pode usar em relatórios. Você ativa
estas cores especificando um valor numérico ou um nome simbólico. Você pode deixar
“highlight” os elementos para facilitar a legibilidade.
FORMAT COLOR...
OFF or COL_BACKGROUND Background
1 COL_HEADING Heading
2 COL_NORMAL Corpo
3 COL-TOTAL Total
4 COL_KEY Chave
5 COL-POSITIVE Valores positivos
6 COL_NEGATIVE Valores
Negativos
7 COL_GROUP Níveis de grupo
Você pode especificar o ON, OFF e <n> (para COLOR) dinamicamente utilizando
sintaxe diferente, por exemplo:
DATA: C TYPE I VALUE 5.
FORMAT INTENSIFIED ON COLOR = C.
REPORT RSBBB02G.
TABLES: SPFLI, SFLIGHT.
PARAMETERS: LIMIT LIKE SFLIGHT-PAYMENTSUM.
Usando o comando WRITE, você pode especificar atributos para um valor de saída. Os
atributos de saída são os mesmos que os do comando FORMAT.
As especificações do comando WRITE são aplicadas somente aos valores associados à este
comando. A formatação da linha sofre um overwrite.
REPORT RSBBB02I.
TABLES SCUSTOM.
INCLUDE <SYMBOL> .
Usando a adição AS SYMBOL do comando WRITE, você pode usar símbolos em relatórios.
Os nomes dos símbolos utilizados são definidos no programa include <SYMBOL>.
Com o comando WRITE <f> AS ICON você pode incluir ícones em relatórios, você irá
precisar do programa include <ICON> declarado em seu programa. Note que nem
todos os ícones podem ser impressos em listas. Ver include <LIST>.
Relatórios Interativos.
Eventos
Report RSDEMO00.
* Basic list
START-OF-SELECTION.
GET ... .
END-OF-SELECTION.
TOP-OF-PAGE..
* Interactive Reporting
AT PFnn.
AT LINE-SELECTION.
AT USER-COMMAND.
O relatório Interativo permite que seja gerada uma segunda lista, ou seja um segundo
relatório, a partir de um evento efetuado em uma linha deste relatório (drill-down).
Este evento pode ser destinado a várias linhas ao mesmo tempo, utilizando-se o evento AT
PF <função> , como pode também ser sensível ao double-click, neste caso utilizamos o
comando AT LINE-SELECTION.
Algumas facilidades são criadas com o drill-down, como por exemplo o evento TOP-OF-
PAGE DURING LINE-SELECTION, o qual é utilizado para formatar cabeçalhos em listas
secundárias.
Page Headings
Text element
Basic list
REPORT RSBBB06C.
.
:
TOP-OF-PAGE DURING LINE-SELECTION.
Choose :
TOP-OF-PAGE.
Secondary list
REPORT RSBBB06A.
Basic list
GET SFLIGHT. SY-LSIND:0
:.
Choose
AT LINE-SELECTION. 1. Secondary
CASE SY-LSIND . list
SY-LSIND:1
WHEN '1'.
:. Choose
2. Secondary 3. Secondary
WHEN '2'.
list list
:.
WHEN '3'.
SY-LSIND:2
SY-LSIND =
SY-LSIND - 1. Choose
:.
Uma lista pode gerar até 20 níveis de drill-down. Para os seguintes níveis de lista, você pode
utilizar as mesmas funções como as utilizadas para as listas básicas (Scroll, Print). Utiliza-se
o Ícone BACK ou EXIT para voltar aos níveis inferiores, a partir das listas secundárias.
Quando a variável de sistema SY-LSIND é alterada, você pode formatar o tipo de saída que
pode variar, de acordo com o tipo de relatório que pertence a cada nível de drill-down.
AA 0169 12121994
AA 0192 26081994 AT LINE-SELECTION.
LH 0108 25011995 MOVE: SY-LISEL(3) TO SFLIGHT-CARRID,
SY-LISEL+6(4) TO SFLIGHT-CONNID,
Choose SY-LISEL+14(8) TO SFLIGHT-FLDATE.
SELECT * FROM SBOOK
WHERE CARRID = SFLIGHT-CARRID
AND CONNID = SFLIGHT-CONNID
AND FLDATE = SFLIGHT-FLDATE.
LH 0108 25011995
SY-LISEL
WRITE : SBOOK-PRICE ,.......
Usuários freqüentemente querem selecionar a linha em uma lista corrente e mostrar dados
adicionais para aquela linha correspondente. Para prover o dado correspondente para a
respectiva linha, você pode usar a variável de sistema SY-LISEL. A linha selecionada é
automaticamente transferida para a variável SY-LISEL. O conteúdo da variável SY-LISEL é
então utilizada para recuperar dados adicionais.
Seleção de Linhas II
HIDE <field>.
Hide area
Carrier Flight no. Flight date
"SFLIGHT-CARRID" AA
AA 0169 12121994 "SFLIGHT-CONNID" 0169
LH 0454 17111994 "SFLIGHT-FLDATE"
12121994
"SFLIGHT-CARRID" LH
"SFLIGHT-CONNID" 0454
Choose
"SFLIGHT-FLDATE"
17111994
REPORT RSBBB06C.
..
GET. SFLIGHT.
WRITE: SFLIGHT-CARRID,18 SFLIGHT-CONNID,
... .
HIDE: SFLIGHT-CARRID, SFLIGHT-CONNID,
SFLIGHT-FLDATE.
Você pode utilizar o comando HIDE para “esconder”o conteúdo do campo que deverá ser
utilizado como chave para gerar uma nova lista. Estes campos declarados no HIDE são
armazenados em uma área especial. O sistema armazena para cada campo, seu nome e
valor.
HIDE <field>.
Hide area
SY-LISELFlight no. Flight date
"SFLIGHT-CARRID" AA
Carrier "SFLIGHT-CONNID" 0169
0000000015
AA 0169
0001
12121994 "SFLIGHT-FLDATE"
LH 0454 17111994 12121994
"SFLIGHT-CARRID" LH
.. "SFLIGHT-CONNID" 0454
.
"SFLIGHT-FLDATE"
Choose
17111994
LH 0454 17111994
SY-LISEL
LH 0454 17111994 ?
SFLIGHT SFLIGHT SFLIGHT SFLIGHT-PRICE
-CARRID -CONNID -FLDATE REPORT RSBBB06C.
AT LINE-SELECTION.
SELECT
SELECT ** FROM
FROM SBOOK
SBOOK WHERE...
WHERE... .
WRITE: SBOOK-CARRID SBOOK-CONNID, ...
Quando o usuário selecionar uma linha e ativar a tecla de função, o sistema executa a
seguinte sequencia automaticamente antes de processar o bloco correspondente:
Exercícios
Utilize este espaço para colocar observações a respeito dos exercícios propostos pelo
instrutor.
Capítulo 3
ABAP Open SQL
O banco de dados de um programa ABAP pode ser acessado pelo Open SQL ou pelo
Native SQL.
O Open SQL contém instruções DML SELECT, UPDATE, INSERT, DELETE e MODIFY. O
usuário não deve modificar as entradas do banco de dados sem antes entender o conceito
de transação SAP (consultar o capítulo Conceito de Transação deste curso). As instruções
do Open SQL definem um valor no campo código de retorno SY-SUBRC. Se SY-SUBRC = 0,
a operação foi bem sucedida. Se SY-SUBRC <> 0, a operação não teve sucesso.
Application
ABAP ABAP
Database
UPDATE
SELECT
DELETE
MODIFY
Single line
} Multiple lines
}
Particular
column
R
SAP AG
Native SQL está conectado ao ABAP de forma bem genérica. Permite ao usuário aplicar
todas as funções oferecidas pela interface de programação do sistema do banco de dados
que esteja sendo usado. Diferentemente das instruções do Open SQL, as instruções do
Native SQL não são verificadas e convertidas pela interface do banco de dados. Em vez
disso, passam diretamente ao sistema do banco de dados, ou seja, os programas escritos
usando o Native SQL são específicos do banco de dados. Convém não usar o Native SQL
para escrever aplicações do sistema R/3.
A instrução SELECT do Open SQL deve ser usada para ler dados do banco de dados.
Subjacente à instrução SELECT existe uma lógica complexa que permite acesso a muitos
tipos diferentes de tabelas do banco de dados.
A instrução contém uma série de cláusulas, cada qual com uma tarefa diferente:
A cláusula SELECT especifica se o resultado da seleção deve ser uma linha simples ou
várias linhas; se os campos que devem ser incluídos no resultado; se o resultado poderá
conter duas ou mais linhas idênticas.
A cláusula INTO especifica o objeto de dados interno do programa no qual o usuário deseja
colocar os dados selecionados.
A cláusula FROM especifica a origem dos dados (tabela do banco de dados ou visão).
A cláusula WHERE especifica as condições que devem ser atendidas por uma entrada de
tabela para ser incluída no resultado.
A instrução SELECT SINGLE permite ao usuário ler uma linha simples de uma tabela do
banco de dados. Para garantir a leitura de uma única entrada, é preciso especificar todos os
campos-chave da cláusula WHERE.
Table fields and work area fields have the same names
SELECT SINGLE
Tabelle SPFLI carrid connid airpfrom airpto
FROM spfli
INTO CORRESPONDING FIELDS OF wa_spfli
WHERE carrid = 'LH' AND connid = '400'.
Caso o operador não use a adição SINGLE na cláusula SELECT, o sistema lê todas as
entradas da tabela que satisfaçam o critério da cláusula WHERE. O programa ABAP lê os
dados, linha por linha, na área-alvo em um loop. Deve-se usar a instrução ENDSELECT para
marcar o final do loop.
ENDSELECT.
R
SAP AG
Todas as instruções entre SELECT e ENDSELECT são executadas para cada entrada do
banco de dados que é lida. Quando o sistema seleciona pelo menos uma entrada, SY-
SUBRC = 0. Depois que a instrução SELECT tiver sido executada em cada passo do loop, o
campo de sistema SY-DBCNT contém o número de linhas lido. Depois da instrução
ENDSELECT, esse campo conterá o número total de linhas lido.
O sistema permite ler, de uma só vez, os dados da tabela do banco de dados para uma
tabela interna usando a instrução SELECT … INTO TABLE (busca de matriz).
ABAP
Internal
table
SAP AG
O sistema não utiliza um loop para ler os dados para uma tabela interna. Assim, não é
preciso usar uma instrução ENDSELECT. Quando o sistema consegue ler pelo menos uma
entrada da tabela, SY-SUBRC = 0. Utilizar uma busca de matriz é, quase sempre, mais
eficiente do que ler as entradas da tabela em um loop e anexá-las a uma tabela interna.
O usuário especifica quais os registros de dados que devem ser lidos do banco de dados
usando a cláusula WHERE. O sistema permite digitar apenas os nomes dos campos da
tabela do banco de dados a serem lidos na cláusula WHERE.
Exercícios
Utilize este espaço para colocar observações a respeito dos exercícios propostos pelo
instrutor.
Capítulo 4
Estruturas de Programas e Dados
P r e d e fin e d D a ta T y p e s Predefined
Data type
User-defined
(P,I,F,C,N,D,T,X)
Elementary Structured
D a ta ty p e M e a n in g In it ia l v a lu e S ta n d a r d P e r m it te d
le n g th le n g th
I in t e g e r 0 4 4
F f lo a t in g p o in t n o . 0 .0 0 0 ... 8 8
N n u m e r ic t e x t 0 0 ...0 1 1 -m a x .
C
alphanumeric
te x t b la n k 1 1 -m a x .
D d a te (Y Y Y Y M M D D ) 00000000 8 8
T t im e ( H H M M S S ) 000000 6 6
X h e x a d e c im a l X '0 0 ' 1 1 -m a x .
R
SAP AG
Nas categorias de números P, dois dígitos são armazenados em cada byte. A última
metade do byte é usada para o sinal de menos ou mais.
Objetos de dados e categorias definidas pelo usuário também podem ser definidos
mediante consulta aos objetos do ABAP Dictionary. O suplemento LIKE com as
instruções DATA e TYPES deve ser usado para fazer referência a um objeto do
ABAP Dictionary.
• Sempre que um objeto do ABAP Dictionary é modificado, todos os objetos de
dados e categorias definidas pelo usuário que fazem referência a esse objeto
são alterados para refletir tais modificações.
O usuário pode definir categorias de dados em um grupo de categorias no ABAP
Dictionary em vez de defini-las no programa ABAP. O nome do grupo de categorias
no ABAP Dictionary tem 5 caracteres, no máximo. Os nomes das categorias no
grupo de categorias <typepool> devem iniciar com <typepool> seguido por uma
sublinha. As categorias de um grupo de categorias devem ser declaradas nos
programas ABAP com o comando TYPE-POOLS.
A instrução TABLES declara um objeto de dados interno que atua como uma
interface de tela sempre que os campos da tela se referirem ao mesmo objeto do
Dictionary. TABLES deve ser usada para definir uma área de trabalho apropriada no
programa ABAP para aqueles dados que o usuário digita em uma tela ou que são
passados à tela pelo programa.
Símbolos de texto são um outro tipo de literal. Ao contrário dos literais de texto
simples, os símbolos de texto têm a vantagem de poder ser traduzidos. Os símbolos
de texto permitem retirar textos do texto fonte para armazená-los em outro lugar,
onde possam ser mais facilmente alterados para objetos como listas independentes
de linguagem.
Uma síntese abrangente das regras de conversão para categorias elementares pode
ser encontrada na documentação on-line do comando DATA. Os campos de
categoria C são gravados com justificação à esquerda. Usando-se "converter para
campos da categoria C", o campo é preenchido com espaços em branco se for muito
curto e truncado se for muito longo (ver os exemplos 1 e 2, acima).
Existe uma aritmética separada no processador do ABAP para cada uma das
categorias de dados P, I e F. Uma expressão aritmética é calculada usando-se
apenas uma aritmética simples. A hierarquia que determina qual aritmética será
usada é a seguinte: I, P, F. Os operadores e o campo do resultado passam para a
determinação da aritmética (ver RSAAA04K).
O retorno dos operadores DIV e MOD é sempre um número inteiro (ver a
documentação on-line de COMPUTE). O retorno da função STRLEN é o
comprimento de uma cadeia. Na documentação on-line de COMPUTE encontra-se
uma síntese de todas as funções. Para as operações aritméticas simples, o sistema
permite usar formas abreviadas de ADD, SUBTRACT, MULTIPLY e DIVIDE.
O sistema ABAP não tem uma instrução GOTO ou equivalente. Existem outros
comandos de controle, assim como aqueles acima mencionados. Por exemplo, a
instrução de loop LOOP ... ENDLOOP que lê tabelas internas, e a diferenciação de
caso
AT ... ENDAT para processamento de nível de controle na instrução LOOP.
As expressões lógicas podem ser ligadas com NOT, AND e OR. As expressões em
parênteses podem ser agrupadas tanto quanto possível. Os parênteses que
denotam sub-expressões sempre valem por uma palavra. Assim, devem estar
separados por espaços. Se forem comparados dois campos da categoria C com
comprimentos diferentes, o campo mais curto será encompridado para se igualar ao
mais longo no momento em que a comparação é feita, pelo preenchimento com
espaços, a partir da extrema direita. Existe uma série de outros operadores
comparativos que podem ser usados para comparar cadeias e comparações de bit.
(Ver a documentação on-line da instrução IF).
IF ... ENDIF:
• As instruções ELSE e ELSEIF são opcionais.
• Desde que a expressão lógica esteja informada, a sequência seguinte de
instruções é executada.
• A seção ELSE ou ELSEIF é processada quando a expressão lógica não
estiver mencionada. Se não existir a instrução ELSE ou nenhuma outra
ELSEIF, o programa avança depois da instrução ENDIF.
• O sistema permite incluir qualquer número de instruções ELSEIF entre IF e
ENDIF. No máximo, uma das sequências de instruções será executada.
Exercícios
Utilize este espaço para colocar observações a respeito dos exercícios propostos pelo
instrutor.
Capítulo 5
Modularização e estrutura de programas
Em todos os programas vistos neste curso até o momento, havia apenas um bloco
de processamento além da declaração de dados. Em casos como esse, o bloco não
precisa ser explicitamente declarado. Todavia, em programas mais complexos, são
necessários vários blocos de processamento, com tipo e nome especificados.
Todas as declarações globais são reconhecidas pelo sistema por meio das palavras-
chave declarativas do ABAP. Essas palavras formam um bloco de processamento
lógico (independentemente do local onde elas estão situadas no texto do programa).
Quando o programa é gerado, o sistema pesquisa todo o código de programa para
FIGURA046 – INITIALIZATION
FIGURA047 – START-OF-SELECTION
INITIALIZATION é um evento que pode ser usado para definir um grande número de
valores propostos. Esse bloco de tempo permite definir valores propostos que só
podem ser determinados no tempo de execução. No exemplo anterior, é atribuído o
valor ‘2’ para a variável F3. Em seguida, o sistema supervisor ABAP pode enviar
uma tela de seleção para o servidor de apresentação com essa variável e caso ela
apareça na tela, esse valor será mostrado ‘2’ e ainda é passível de modificação.
• Usar TYPE para que o parâmetro siga um determinado modelo, que pode ser
definido internamente no programa ou pode ser um tipo ABAP predefinido
• Usar LIKE para fazer um parâmetro compatível com um objeto de dados
global ou tipos ABAP Dictionary
• Existe a possibilidade de omitir o tipo. Nesse caso, o parâmetro formal herda
o tipo do parâmetro atual correspondente.
• Se o nome do parâmetro é utilizado após USING ou CHANGING, o
endereço do objeto de dados do programa de chamada é transferido
(transferência de endereço).
Os dados locais são definidos dentro dos subprogramas. A declaração DATA pode
ser utilizada em uma rotina FORM para indicar objetos de dados que são visíveis
apenas dentro dessa rotina. Esses objetos existem somente quando FORM está em
execução. Se um objeto de dados local e um objeto de dados global têm o mesmo
nome, durante a execução do subprograma, apenas o objeto local pode ser
mencionado por esse nome.
Double-Click
Com LIKE ou TYPE, as estruturas de dados podem ser transferidas (por exemplo:
estruturas, linhas de cabeçalho de tabelas internas, áreas de trabalho de tabelas)
com uma descrição da estrutura. Os campos individuais de uma estrutura não são
reconhecidos no subprograma se o tipo do parâmetro formal não é especificado.
• TYPE <ud> A categoria de dados deve ser a mesma do tipo definido pelo
usuário <ud>. É possível declarar tipos genéricos.
• LIKE <Dictionary type> A categoria de dados deve ser compatível com o tipo
ABAP Dictionary.
Exercícios
Utilize este espaço para colocar observações a respeito dos exercícios propostos pelo
instrutor.
Capítulo 6
Tabelas internas.
Na definição, 8 KB de memória estão alocados para cada tabela interna. Caso seja
necessária mais memória durante o tempo de execução, o sistema coloca à
disposição mais blocos de 8 KB.
As tabelas internas são descritas através de vários atributos, um dos quais é o tipo
de linha.
Esse tipo de linha determina a estrutura dos registros de dados que podem ser
armazenados em uma tabela interna. O tipo de linha de uma tabela interna pode ser
composto de qualquer categoria de dados do ABAP, incluindo outras tabelas
internas.
Outro atributo das tabelas internas são as chaves, que ajudam a identificar as
entradas da tabela. O importante na definição de uma chave é a sequência de seus
campos. Por exemplo, a chave CARRID CONNID é diferente da chave CONNID
CARRID.
O sistema permite o acesso aos registros de dados em uma tabela interna de formas
diferentes, similares aos tipos de acesso aos dados para tabelas normais do banco
de dados. O usuário pode acessar um só registro de dados, ou múltiplos, ou todos
os registros da tabela ao mesmo tempo.
Acesso com índice: significa usar o índice do registro de dados que o sistema
mantém para acessar os dados
Acesso com chave: significa usar um termo de pesquisa, em geral uma chave de
tabela ou uma chave de tabela genérica, para ter acesso aos dados.
A categoria de tabela a ser usada depende de como as entradas daquela tabela são
normalmente acessadas. Tabelas standard devem ser usadas se as entradas forem
normalmente acessadas através de índice; se as entradas forem feitas normalmente
através de chaves, recomenda-se a tabela ordenada; se forem feitas exclusivamente
com chaves, devem ser utilizadas tabelas aleatórias de prova.
T a b le T y p es
A N Y T A B LE
IN D E X T A B LE
LE H A S H E D T A B LE
LE
S T A N D A R D T A B LE S O R T E D T A B LE
A c ce ss w ith n n
in d e x
A c ce ss w ith
k ey
U n iq u e /
n o n -u n iq u e k ey N O N - U N IQ U E U N IQ U E | N O N -U N IQ U E U N IQ U E
A c ce ss u sin g m a in ly in d e x m a in ly k e y s o n ly k e y s R
SAP AG
Comando Efeito
APPEND anexa o conteúdo de uma área de trabalho ao final de uma tabela
interna
O usuário pode preencher uma tabela interna com registros de dados de uma tabela
do banco de dados utilizando um loop SELECT para colocar registros individuais de
dados na área de trabalho de uma tabela interna e, depois, anexando o conteúdo da
área de trabalho à tabela interna no loop SELECT.
A instrução APPEND deve ser utilizada para preencher uma tabela interna:
APPEND <wa> TO <itab> acrescenta o conteúdo de uma área de trabalho <wa> ao
final da tabela interna <itab>. Ao declarar uma tabela standard, o usuário não
precisa usar o suplemento STANDARD.
O usuário pode preencher uma tabela interna com todo o conteúdo de uma tabela
do banco de dados utilizando uma única instrução SELECT. Assim, o sistema lê os
registros em lote, não individualmente. Depois, este lote é inserido como um todo na
tabela interna. Este tipo de acesso de leitura é mais eficiente do ponto de vista da
performance do que ler e inserir dados em loop, registro por registro. Considerando
que aqui não é usado qualquer loop, a instrução ENDSELECT não é necessária.
Para ordenar uma tabela interna, deve-se usar a instrução SORT. As adições BY
<f> e ASCENDING ou DESCENDING permitem restringir a ordenação a campos
específicos e determinar a sequência e a hierarquia da ordenação.
FIGURA040 – SY-TABIX
A instrução READ TABLE <itab> deve ser utilizada para ler entradas individuais da
tabela. Todas as entradas de tabela lidas são colocadas na área de trabalho <wa>.
Se o acesso de leitura tiver sido bem sucedido, o campo SY-SUBRC é igual a zero;
todos os outros valores significam que o acesso de leitura não pôde ser executado
com sucesso. O sistema fornece automaticamente ao campo SY-TABIX o valor do
índice da entrada de tabela lida.
READ TABLE <itab> ... INDEX <i>. Lê o número de entrada da tabela <i>.
Como utilizar o acesso com índice para processar entradas individuais da tabela
interna:
FIGURA044 - CLEAR
As tabelas internas podem ser definidas com ou sem uma linha de cabeçalho. Uma
tabela interna com linha de cabeçalho é composta por uma área de trabalho (linha
de cabeçalho) e o corpo real da tabela, ambos endereçados com o mesmo nome.
A interpretação desse nome depende do contexto em que é utilizado. Por exemplo:
em MOVE o nome é interpretado como linha de cabeçalho; em SEARCH é
interpretado como o corpo da tabela.
O usuário pode declarar uma tabela interna com uma linha de cabeçalho através do
suplemento WITH HEADER LINE. Para evitar erros, recomenda-se que o usuário
crie tabelas internas sem linhas de cabeçalho. Entretanto, nas tabelas internas com
linhas de cabeçalho é quase sempre possível usar uma sintaxe reduzida para
certas operações.
Standard
As linhas podem ser acessadas utilizando o índice da tabela ou a chave. Ao utilizar a
chave, o tempo de resposta dependerá da quantidade de entradas da tabela. A chave será
sempre não única.
Sorted
As linhas são sempre gravadas de acordo com a sua chave. As linhas são
acessadas utilizando o índice ou a chave. Ao utilizar a chave, o tempo de resposta terá
relação logarítmica com a quantidade de linhas de tabela, pois é utilizada pesquisa binária. A
chave de uma tabela sorted pode ser tanto UNIQUE quanto NON-UNIQUE. Tabelas sorted
são geralmente conhecidas como index tables.
Hashed
As linhas são acessadas pela chave. O tempo de resposta é constante, não dependendo
do número de entradas na tabela, pois utiliza um algoritmo especial. Neste tipo de tabela a
chave deve sempre ser UNIQUE.
Considerações
Ao ler tabelas tipo Sorted ou Hashed, utilizar WITH TABLE KEY, caso contrário o
sistema utilizará a procura linear ao invés de binary search.
Não preencher tabelas internas tipo Sorted com operações com índice (INSERT wa
INTO tab1 INDEX tabix, APPEND tab1 FROM wa), pois o sort será corrompido.
IMPORTANTE !!!
As Work Áreas (WA) têm o papel do Header Line em uma tabela sem o mesmo.
Todas as leituras e/ou gravações têm necessariamente que passar pela WA.
Uma Tabela Interna pode ser definida através do comando DATA (Como na versão
3.0F), ou através do comando TYPE.
Para leitura de uma tabela transparent, o Select gera dados para a Work Área (wa) e
posteriormente é feito o Append a partir dessa Work Área, efetivando-se a inserção.
A Cláusula INTO TABLE faz a inserção dos dados diretamente, sem passar pela
Work Área. Este segundo exemplo é muito mais performante que o primeiro.
Exercícios
Utilize este espaço para colocar observações a respeito dos exercícios propostos pelo
instrutor.
Capítulo 7
Módulos de Função
É possível antecipar possíveis erros e escrever o programa de modo que eles não
causem erros de tempo de execução. As possíveis exceções são denominadas na
interface do módulo de função e acionadas a partir do texto de programa, por meio
da declaração RAISE. Cada programa que chama o módulo de função consulta sy-
subrc para interpretar as exceções. No módulo de função também é possível
garantir que o sistema exiba uma mensagem de erro se a exceção ocorrer, mesmo
que ela não seja diretamente tratada pelo programa de chamada. Para obter mais
informações, consulte a documentação e pesquise as palavras-chave MESSAGE ...
RAISING.
Assim que um módulo de função está pronto e ativado, ele pode ser testado no
Function Builder. Um modelo de entrada permite especificar os parâmetros IMPORT.
O resultado é transferido para os parâmetros EXPORT e exibido. O sistema
memoriza a exceção ativada, caso ocorra um erro.
BAPI
Definição
A BAPI (Business Application Programming Interface) é a interface que provê acesso
aos processos e dados nas aplicações de negócios de sistemas como o R/3.
BAPIs são definidas como métodos API dos objetos de negócio SAP. Esses Objetos
de Negócio e suas BAPIs são descritas e armazenadas no BOR (Business Object
Repository).
.
Integração
BAPIs podem ser chamadas no R/3 por aplicações externas e outros programas. BAPIs
são padrões de comunicação para aplicações de negócios. A interface de tecnologia BAPI
formam a base para os seguintes desenvolvimentos.
• Programas Visual Basic sendo utilizados como front ends do R/3.grams as frontends
to R/3
• Aplicações Workflow
O gráfico seguinte mostra como a interface BAPI habilita diferentes tipos de aplicação a
serem ligados como um todo.
BOR
Definição
O Business Object Repository (BOR) é o repositório de objetos orientados do R/3.
Ele contém, entre outros objetos, Objetos de Negócio SAP e seus métodos.
• Provê uma visão orientada a objetos dos dados e processos do Sistema R/3.
Integração
Uma BAPI é definida na BOR como um método de um objeto de negócio SAP. Uma
BAPI é implementada, no entanto, como um módulo de função, a qual é armazenada no
Function Builder. Você somente deve definir uma BAPI como um objeto de negócio SAP
na BOR se este módulo de função estiver completamente implementado.
BAPI Browser
Você pode mostrar mais informações nos objetos de negócios e as BAPIs que
pertencem a eles utilizando o BAPI Explorer. A tela é composta por duas partes: a área
hierárquica e a janela de detalhes.
• Atributo Chave: o qual provê um único identificador para cada objeto de negócio.
• Métodos de instância específica: os quais referem-se às chaves identificadas pelos
atributos.
• Métodos de instância não-específica: os quais podem ser chamados por todas as
instâncias de um tipo de objeto.
BAPIs usualmente tem um parâmetro de export chamado RETURN. Isto pode ser
uma estrutura ou tabela interna. O parâmetro de retorno contëm informações de erros que
podem ocorrer durante o processamento da BAPI. Não há parâmetros de EXCEPTIONS
para BAPIs.
BAPIs Standard
• GetList – Retorna o conteúdo dos campos-chave para o objeto que foi escolhido.
• GetDetail – Retorna informações detalhadas (atributos) para os objetos requeridos.
• CreateFromData – Cria um novo objeto no R/3 e retorna informações sobreele.
Ex.
Exercícios
Utilize este espaço para colocar observações a respeito dos exercícios propostos pelo
instrutor.
Capítulo 8
Dialog Programming – On-Line
Runtime environment
S c re e n P a in te r – A B A P /4
S c re e n
P a in te r
S c re e n S c re e n F ie ld
a ttrib u te s la y o u t a ttrib u te
t es F lo w lo g ic
S c re e n n o . 100 PROCESS BEFORE OUTPUT.
NUMBER
S h o rt te x t T est N u m b e r: MODULE INIT.
CHAR
S c re e n ty p e N o rm a l
1 0 c h a ra c te rs
N e x t s c re e n 200
In p u t x PROCESS AFTER INPUT.
...
... MODULE READ.
A B A P /4
G lo b a l d a ta P B O m o d u le s P A I m o d u le s
DATA: NUMBER(10) MODULE INIT OUTPUT. MODULE READ INPUT.
TYPE C. CLEAR NUMBER. SELECT ...
. ENDMODULE. .
.
. . .
ENDMODULE.
. . .
. .
.
SAP AG
II D
DEEN
N TT II C
CAA LL N
NAAM
MEES
S
Airline carrier LH
...
Planned flight
From FRANKFURT
To NEW YORK
Time 08:24:00
...
Criando Programas
Criando Programas
Development class Edit
Program
Functional area
Local private objects
Create
Programs
..
.
Choose
Program SAPMTALA
with TOP Include
Exemplo: O nome do TOP Include para um programa Module Pool cujo nome é
SAPMTALA será MTALATOP.
Atributos do Programa
Atributos do Programa
Title
Test
Type M
Application S
Save
Definindo Telas
Definindo Telas
$TMP User's local objects
programs
SAPMTALA
Create ..
.
screens
..
.
• Crie as telas necessárias para o seu programa Module Pool á partir da lista de
objetos.
• Após você ter digitado o número da tela, o sistema abre uma nova tela com
dados daquela tela.
• Digite uma pequena descrição para a tela.
• Escolha a opção NORMAL, e especifique o número da próxima tela (se
necessário, no momento da execução, o sistema desviará para o número da tela
indicado nesse campo, caso esteja preenchido).
Dict/ProgFields
Key word
- short
- medium
- long
- header
Copy
Field
Fieldattr.
attr. Dict./prog.fields
Dict./prog.fields Field
Field list
list
Text
Text
Entry
Entry
Check
Check
Airline carrier
Radio
Radio
Connection number
Box
Box
Screen
Painter
PROCESS BEFORE OUTPUT.
MODULE INITIALIZE.
• Nos Flow Logics não são permitidos palavras reservadas (IF, PERFORM, WHILE
etc) da mesma forma em que são permitidos nos programas. O Flow Logic,
embora se pareça muito com o programa (o editor é o mesmo), não tem o
mesmo comportamento. Ele é usado basicamente para ordenar o
processamento da tela, e para isso são criados os MODULES, que têm uma
funcão análoga à do PERFORM.
• Para criarmos um MODULE, escreva o seu nome no flow logic no lugar desejado
e efetue um double-click. O sistema criará uma subrotina iniciando com
MODULE <nome> e terminando com ENDMODULE no include apropriado. Isto
pode ser facilmente observado efetuando uma navegação pelo include.
• Se não existirem includes, o sistema poderá criar um (se você permitir) ou
poderá incluir a subrotina no programa principal (o que aliás, não é
recomendado).
Screen 200
• Para telas com estrutura similar, você pode copiar uma tela existente e, se
necessário, modificá-la.
• Para fazer isto, você utiliza o Development Workbench posicionando o cursor na
tela que você deseja copiar e escolha a opção COPY.
• Quando terminar o processo com sucesso, o sistema mostrará a tela como um
novo sub-objeto do module pool e você poderá editá-lo.
Importante: Sempre que você copiar uma tela o flow logic também será copiado, e o
Module que aparece declarado nos flow logics é somente a “chamada” desse
módule, esteja ciente que as subrotinas (modules) podem ser compartilhadas por
várias telas, e que a modificação de uma subrotina com esse nível de amarração
deve ser feita com muita atenção.
MTALATOP
ABAP/4
PROGRAM SAPMTALA.
TABLES: SPFLI.
DATA: ... .
OR
Global data
ABAP/4
DATA: ... .
Create Create
.. ..
. .
PBO modules PAI modules
.. ..
. .
Choose Choose
• Durante o processo de criação dos módulos PAI e/ou PBO, você pode associá-
los aos includes desejados ou deixar que o sistema automaticamente faça isto
por você. Neste caso os módulos no PBO serão criados nos includes com o
sufixo O01 (xxxxxI01), e os do PAI, nos includes com sufixo I01 (xxxxxO01).
ABAP/4
MODULE INITIALIZE OUTPUT.
CLEAR SPFLI.
ENDMODULE.
ABAP/4
MODULE READ_SPFLI INPUT.
SELECT SINGLE * FROM SPFLI
WHERE CARRID = SPFLI-CARRID
AND CONNID = SPFLI-CONNID.
.
.
.
ENDMODULE.
Programs
SAPMTALA
Create ..
.
Transactions
..
.
Sequência de Ações
Sequência de Ações
Screen Action sequence
PROCESS BEFORE OUTPUT. Painter
MODULE A. Execute module A
Send screen
ENTER
Execute module B
Screen
Painter ABAP/4
PROCESS AFTER INPUT. MODULE <module> INPUT.
FIELD <screen field> .
.
MODULE <module>. .
MESSAGE E ... .
ENDMODULE.
1 1
E... message
u
Data transport for Y
e
n Execute module C
c
e Execute module D
• No módulo PAI, campos da tela são transportados com nomes idênticos para
Work areas do programa ABAP.
• Campos não associados a comandos FIELD são transportados primeiro. Todos
os outros campos são copiados somente quando todos os FIELD tiverem sido
executados.
Screen Screen
Painter Painter
PROCESS
PROCESS AFTER
AFTER INPUT.
INPUT. PROCESS
PROCESS BEFORE
BEFORE OUTPUT
OUTPUT
MODULE ..
MODULE OK_CODE.
OK_CODE. ..
..
ABAP/4
MODULE OK_CODE INPUT.
.
. PROCESS
PROCESS AFTER
AFTER INPUT.
INPUT.
. ..
SET SCREEN 200 . ..
..
LEAVE SCREEN.
Display
ABAP/4
DATA: OKCODE(4),
SAVE_OKCODE(4).
Title bar
Menu bar
Standard toolbar
Application toolbar
Definindo Interfaces I
Definindo Interfaces I
Menu bar
- Hide standards
Func Name
< .. > Other <object>
< .. > Create
F key assignment
• Quando necessário, o sistema propõe valores default para o menu bar e também
teclas de função, porém, podem ser modificadas.
Definindo Interfaces II
Definindo Interfaces II
Standard toolbar
...
Application toolbar
...
Exercícios
Utilize este espaço para colocar observações a respeito dos exercícios propostos pelo
instrutor.
Capítulo 09
Modificação Dinâmica em telas
A A
B B
Screen
Painter
Field list: Modification groups
SPFLI_ITAB-CONNID SEL
SPFLI_ITAB-CITYFROM SEL
SPFLI_ITAB-CITYTO SEL
...
• Você pode associar um campo a quatro diferentes grupos. Os nomes dos grupos
podem ter até 3 caracteres e podem ser definidos livremente.
ABAP/4
MODULE MODIFY_SCREEN OUTPUT.
...
LOOP AT SCREEN.
IF SCREEN-GROUP1 = 'SEL'.
SCREEN-INPUT = 1.
ENDIF.
IF SCREEN-NAME = ' SFLIGHT-CARRID '.
SCREEN-ACTIVE = 0.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDMODULE.
Exercícios
Utilize este espaço para colocar observações a respeito dos exercícios propostos pelo
instrutor.
Capítulo 10
Table Control
Select
line(s)
Automatic horizontal
Fixed lead column(s) and vertical scrolling
1
2
1
3
2
4
3
Database 4
table 5 next page
6
7 5
8
6
9 7
. 8
.
.
LOOP ...
ENDLOOP.
PAI PAI
LOOP ...
Read lines from the database
into an internal table update internal table line by
line
ENDLOOP.
• Há somente uma Work Area para edição de linhas no table control. Por esta
razão, você precisa um LOOP...ENDLOOP para cada table control em ambos os
eventos PBO e PAI no respectivo flow logic.
• No PBO, uma linha do table control deve ser preenchida com uma linha da
tabela interna a cada passo do loop.
• Similarmente, o mesmo processo é feito no PAI.
Transport ABAP/4
LOOP ...
table control fields
to screen fields
MODULE OUTPUT_1 .
MODULE OUTPUT_2 .
MODULE OUTPUT_2
Transport remaining
ABAP/4 fields to
screen fields
MODULE INPUT_3
• No PAI todos os campos de tela que não pertencem ao table control e não estão
especificados em qualquer comando FIELD são transportados aos respectivos
work fields do módule pool.
• O conteúdo do table control é transportado linha a linha aos respectivos work
fields do module pool a cada passo do loop.
• As funções standard são automaticamente associadas.
Attributes
Attributes Dict./prog.fields
Dict./prog.fields Field
Fieldlist
list
Text
Text
Entry
Entry
.
. Flight From To
.
Table
Table
.
.
.
• No Editor gráfico, você escolhe TABLE para criar o table control e usa o botão
esquerdo do mouse para posicioná-lo na tela.
• Então após esse procedimento, defina os campos para o table control através do
dicionário ABAP.
Screen
PROCESS BEFORE OUTPUT. Painter
LOOP AT SPFLI_ITAB
WITH CONTROL CONNECTIONS
CURSOR CONNECTIONS -CURRENT_LINE .
ABAP/4
ENDLOOP.
MODULE MODIFY_SPFLI_ITAB INPUT.
PROCESS AFTER INPUT.
LOOP AT SPFLI_ITAB . MODIFY SPFLI_ITAB
FIELD SPFLI_ITAB-MARK INDEX
MODULE MODIFY_SPFLI_ITAB CONNECTIONS -CURRENT_LINE .
ON REQUEST.
ENDLOOP. ENDMODULE.
• No flow logic, você pode ler tabelas internas usando o comando LOOP. Você
define a referencia dos respectivos table controls especificando WITH CONTROL
<ctrl>.
• Você determina qual tabela de entrada vai ser lida especificando CURSOR
<CTRL> - CURRENT LINE. O sistema calcula a linha corrente através do
TOP_LINE + SY-STEPL.
• O sistema calcula o TOP_LINE automaticamente sempre que há alteração na
posição do scroll-bar.
ENDLOOP. ABAP/4
• Se você usa o comando LOOP sem uma tabela interna no flow logic, você
precisa ler os dados no PBO o qual é chamado a cada passo do loop.
• Desta forma o sistema não pode determinar o número de entradas desta tabela,
você precisa então do comando EXIT FROM STEP-LOOP para garantir que
linhas em branco não serão preenchidas no table control.
• Você precisa também determinar o número de linhas para o scrolling vertical.
Screen
Painter
PROCESS BEFORE OUTPUT. Change attributes
of the entire table 1
MODULE CTRL_MODIFY_1 . control
LOOP...
MODULE MODIFY_SCREEN .
Change
Changeattributes
attributes
ENDLOOP.
of
of fields
fields in inthe
the
table 2
tablecontrol
control
PROCESS AFTER INPUT. temporarily
temporarily
LOOP...
...
ENDLOOP. Change attributes
of the entire table 1
MODULE CTRL_MODIFY_2 . control
• Você pode mudar os atributos do table control através dos atributos dos campos.
• Para modificar os atributos de uma célula individual você altera a tabela
SCREEN, normalmente.
Exercícios
Utilize este espaço para colocar observações a respeito dos exercícios propostos pelo
instrutor.
Capítulo 11
Tabstrip
Basicamente é utilizado quando em uma tela com diferentes tipos de dados “poluem”
demasiadamente uma tela. Neste caso são criadas várias “pastas” (tabstrips) que são
facilmente acessadas.
Em cada tela do Tabstrip é criada uma Subtela, que é onde os componentes da mesma são
posicionados. Esses elementos basicamente podem ser:
• Campos
• Step-loops
• Table-controls
• Botões
Na transação SE80 (Object Navigator), crie um programa On-Line (Module Pool) que deverá
ser utilizado para servir de base das telas a serem criadas no Screen Painter.
Após a criação do Programa On-Line, efetuar a criação das telas, as quais conterão os
tabstrips.
Nesta etapa, para o desenho dos tabstrips, deve-se escolher a opção indicada acima.
Definir um nome para a tela principal do Tabstrip e criar tantas pastas quanto necessário,
através do campo indicado.
5 – Definição da Subtela.
Definir uma área onde os campos serão mostrados. Esta área é definida como subtela
(conforme indicado).
Podem ser criadas tantas subtelas quanto pastas a serem utilizadas, porém, para minimizar
os controles e por conseguinte a complexidade do programa, sugerimos que seja criada uma
subtela somente (este procedimento somente é possível pois as pastas compartilham uma
área idêntica – mesmo tamanho, caso contrário isso não seria possível).
Caso haja necessidade de criação de novas pastas, aumente o campo indicado com
o valor desejado.
Nesta etapa, deverá ser criada uma ou mais telas (de acordo com o necessário) para que os
campos sejam armazenados.
Esta tela deverá ser montada dinamicamente no espaço reservado na subtela dos tabstrips.
Efetuar a criação dos campos da forma em que deverão aparecer na tela pronta.
Este procedimento é idêntico ao desenvolvimento das telas de um programa on-line
normal.
A navegação é conseguida através dos comandos acima, que devem ser declarados
no PBO da tela principal.
Ao utilizar seleção dinâmica de tela em um tabstrip control:
No bloco PBO, você deve chamar um módulo antes da chamada à subtela que copia o nome
da subtela que se deseja chamar na variável apropriada.
Deve ser colocado o código da função da página ativa na variável ACTIVETAB da tabstrip
control.
13 – Tabstrip pronto.
Após todos esses passos, é só criar a transação e a tela será mostrada conforme acima.
Exercícios
Utilize este espaço para colocar observações a respeito dos exercícios propostos pelo
instrutor.
Capítulo 12
Sapscript
Essas duas características podem tomar algumas horas do programador, ainda que bem
experiente no trabalho com SAPscript.
É importante se observar também que os formulários são “client dependent”, o que
significa dizer que devem ser transportados a todos os clientes em que se deseja executa-lo,
independentemente de estar na mesma instância que já o tenha. Isso não pareceria ser
muito complicado se não fosse um trabalho a mais controlar a versão de todos no momento
que uma alteração feita. Pior do que eles, são os objetos gerados como os logotipos, que
além de dependentes do cliente, não estão vinculados a nenhuma request, não podendo
nem ser transportados de um cliente para outro.
Por falar em transporte, é sempre bom reforçar que no momento do transporte de um
formulário SAPscript, é necessário assegurar que todas as estruturas utilizadas por ele,
tenham sido transportadas anteriormente. O objetivo é assegurar que tudo que será utilizado
pelo formulário já esteja no cliente, no momento em que este for introduzido, para que não
haja erros. A ordem mais aconselhada para esses transportes seria:
1. Estrutura
2. Layout
3. Programa de povoamento
Também vale a pena chamar a atenção para que essas 3 classes de objetos estejam
em requests separadas no desenvolvimento de um projeto, o que pode evitar problemas
quando algum deles não estiver no desenvolvimento propriamente e necessitar ser reparado.
• Abertura de um formulário
• Inicialização de um formulário
• Seleção dos dados do formulário
• Impressão dos dados nas janelas do formulário
• Fechamento do formulário
Abertura de formulário
Para que se possa inicializar um formulário é necessário que este esteja aberto.
Portanto, é obrigatória a presença de um comando de abertura num programa de
povoamento.
Dois outros parâmetros também muitas vezes utilizados são o dialog e o options.
No primeiro, indica-se se a caixa de diálogo para confirmação da impressão deve ou
não ser apresentado. Caso este deva ser omitido, os dados para impressão serão tomados
de uma estrutura a ser colocada no segundo parâmetro. Nessa estrutura são passados os
dados tais como número de cópias e nome da impressora. A opção de não exibição da caixa
de diálogo está diretamente ligada a utilização do segundo parâmetro. Se a exibição estiver
desabilitada (DIALOG=’ ‘), mas a estrutura ITCPO não estiver preenchida, a caixa de
diálogo será exibida.
Alguns dos campos mais importantes e que normalmente são utilizados na estrutura
ITCPO são:
TDCOPIES - Número de cópias
TDDEST - Dispositivo de saída
TDPREVIEW - Print Preview
TDIMMED - Saída imediata
Inicialização de um formulário
A impressão dos dados nas janelas na maioria das vezes é feita simultaneamente
com a seleção dos dados, ou seja, a medida que os dados são selecionados, são enviados
imediatamente para o formulário.
Neste ponto fica evidente a diferenciação entre os tipos de janela MAIN e demais
janelas.
Para as janelas do tipo MAIN, cada comando de escrita (write_form) significa uma
nova linha no formulário e o valor a ser impresso é o valor que o campo armazena no
momento do comando de impressão.
Por exemplo, digamos que o campo MARA-MATNR tenha o valor ‘1234’ e que um
comando de impressão seja dado para a janela MAIN que irá imprimir este campo. Logo em
seguida uma nova seleção da tabela MARA é feita e o campo MATNR agora vale ‘5678’. Se
uma nova impressão na janela MAIN for executada o resultado será o seguinte:
1234
5678
Já as janelas que não forem do tipo MAIN imprimem os dados uma única vez, no
final da impressão do formulário ou na quebra de página, com os valores armazenados nos
campos no momento do encerramento ou no momento da quebra, e não no momento da
escrita (write_form), ou seja, se no exemplo anterior fosse utilizada uma janela não-MAIN, o
resultado final seria somente 5678.
Na realidade, a utilização de um comando WRITE_FORM numa janela não-MAIN é
utilizada para a escolha de qual elemento de texto será utilizado para a impressão dos
dados.
Exemplo:
Uma janela HEADER não-MAIN contém dois elementos de texto chamados FRASE1
e FRASE2 da seguinte forma:
/E FRASE1
&MARA-MATNR& Teste de Frase 1
/E FRASE2
&MARA-MATNR& Teste de Frase 2
estará sendo indicado ao programa que, ao se escrever o formulário, deve ser impresso o
elemento de texto FRASE1 para a janela HEADER (somente um elemento de texto é
utilizado para cada janela não-MAIN).
No caso do exemplo, se o campo MATNR for igual a ‘1234’ no encerramento do formulário,
seria impressa a seguinte frase:
3 - O Formulário
Trabalhar com um formulário SAPscript não é complicado, desde que se entenda
seus componentes da maneira correta. Um layout é composto por vários componentes,
dentre os quais podemos citar:
3.1. Header
Informações gerais do formulário, como formato e orientação da página em que será
utilizado, parágrafo e fontes default do mesmo (quando não for especificado nenhuma dentro
do form). Nesse tópico aparece também o título do formulário, a classe de desenvolvimento
do mesmo e os idiomas do formulário original e o corrente.
3.2. Parágrafos
São elementos que podem ser criados pelo usuário e apresentam informações dos
textos de uma determinada janela. Nesses parágrafos são determinados tipos de fontes,
tabulações, negrito ou sublinhado, etc...
Para criar um parágrafo novo, utilizar o caminho do menu Processar -> Create
Element, lembrando que em um formulário standard, somente se pode alterar o layout no
idioma original.
Texto
3.4. Janelas
As janelas são a base da construção do layout. As janelas podem ser criadas sem
limites e tem por finalidade dividir espacialmente as regiões de um formulário para operações
independentes.
Essas janelas podem ser criadas basicamente em 3 tipos distintos:
MAIN
Janelas do tipo MAIN são as mais importantes do relatório (janela pela qual o
formulário se guia). Somente é permitido um tipo de janela MAIN por formulário, e é a única
janela obrigatória em uma página. Pode-se criar mais de uma janela MAIN por página, no
entanto essas janelas, na verdade, só são divididas fisicamente, uma vez que seus
elementos e processamentos obedecem aos mesmos comandos, e não podem ter nomes
diferentes. A passagem de uma janela MAIN para outra pode ser automática ou forçada pelo
usuário. Quando o espaço físico de uma janela MAIN está tomado e necessita-se de mais
dados na mesma, o formulário automaticamente passa à próxima janela MAIN do formulário.
É através desse princípio que um relatório ganha número de páginas automaticamente
quando da execução de um relatório desse tipo, conforme os dados são preenchidos. Para
forçar a passagem de uma janela MAIN para outra, o usuário poderá utilizar o comando:
/: NEXT-WINDOW
Pág. 2
VAR
Essa janela apresenta uma característica própria, que necessita de verificação
constante do formulário com seus dados, que podem variar durante a execução do relatório.
Esse tipo de janela deve ser utilizada quando se pretende trabalhar com textos que variam,
como exemplos de mensagens que podem mudar durante o decorrer da execução do
formulário.
CONST
São janelas que não merecem muita preocupação de processamento por parte do
formulário, uma vez que seus dados devem ser mantidos os mesmos desde seu primeiro
preenchimento até o fechamento do formulário. Geralmente nesse tipo de janela são
incluídos objetos e textos que permanecem os mesmos durante todo o relatório,
independente do número de páginas, como logo e rodapés.
Na atual versão do SAP, esta distinção de atenção de processamento do formulário é
só teórica, mas deve ser levada em conta, pois deve ser tratada por versões mais novas do
sistema.
3.5. Páginas
As páginas são elementos responsáveis pelo agrupamento das janelas durante
certos momentos do relatório. Geralmente só são definidas duas páginas, que acabam em
processo reflexivo, por formulário.
Geralmente uma página FIRST, que apresenta um layout de apresentação dos
documentos e outra NEXT, que contém os layouts das outras páginas subseqüentes do
documento. Isso acontece, por exemplo, quando se quer obter um relatório com o logotipo da
empresa na primeira página, mas as seguintes, devem ocupar a folha inteira com os dados
do relatório até o final. Cada uma das páginas criadas devem conter um nome (FIRST, NXT,
...) e pode conter um parágrafo default e um link para a próxima página. Esse link serve para
formar a seqüência em que as páginas do relatório devem ser geradas. Seguindo o exemplo
anterior, deveríamos informar:
FIRST -> NEXT
NEXT -> NEXT
Após a primeira página, seria chamada a segunda, com um layout diferente (sem o
logotipo). A partir dessa, todas apresentariam o mesmo tipo de layout (com dados do
relatório aproveitando a página inteira).
o nome da janela desejada. Uma vez selecionada a janela, se apertarmos o botão Text
Element, uma tela semelhante a do editor de ABAP/4 do SAP irá se abrir, com as linhas onde
a lógica da janela será introduzida.
Nesses elementos do SAPscript, o programador poderá utilizar alguns comandos
semelhantes ao do ABAP/4, com a indicação de que se trata de uma linha de comando para
o formulário (/:, à esquerda da linha). Abaixo, alguns dos comandos que podem ser utilizados
de dentro dos elementos de texto de uma janela em SAPscript:
IF...ELSE…ENDIF
CASE…WHEN
DEFINE
PERFORM…USING…CHANGING
BOX…FRAME
INCLUDE
4 - Manutenção de formulários
A maioria dos formulários é feita pela mesma transação citada anteriormente (SE71).
Nessa ela o nome do formulário e o idioma do mesmo são parâmetros obrigatórios. Nessa
tela são feitas praticamente todas as operações com os formulários do SAP.
Atenção que essa cópia é fiel ao formulário copiado, e não poupa nenhuma
informação que já existisse no formulário que recebe a cópia.
Os outros dois campos de check Box geralmente não são alterados, pois tratam de
informações como cópia do formulário somente no idioma original e exibição ou não de um
log de erros ao final da execução da cópia.
Uma vez entrados os parâmetros, deve-se apertar o botão Executar e obter uma
cópia com sucesso em todos os idiomas existentes do formulário.
O cliente de origem do formulário, quando for cópia de forms standards, deve ser
mantido 000, uma vez que o repositório dos formulários originais do SAP encontram-se todos
no 000, e podem ser lidos de todos os outros.
Utilizar logotipos em formulários SAPscript, não é das tarefas mais simples que se
possa ter. Teoricamente falando, o processo é bastante simples e consiste em gerar no
sistema um objeto no formato hexadecimal, que possa ser interpretado pelo SAPscript,
originando a inclusão de uma imagem. No entanto, devido as limitações expostas no começo
deste documento, isso pode levar um certo tempo até reproduzir o resultado desejado.
Para gerarmos o objeto no client desejado (lembre-se que esse objeto não pode ser
transportado...), devemos executar o programa standard RSTXLDMC, com um arquivo no
formato .TIF.
(A figura não pode ter mais de 16 cores)
Preencher o primeiro campo (file name), com o path complexo do arquivo da imagem
do logotipo. Esse caminho pode ser no servidor ou local.
O segundo campo (type) determina se o logotipo deve ser gerado monocromático
(default) ou colorido.
O último parâmetro que exige ser preenchido é o Text Name, onde é feita a
atribuição do nome do objeto que será referenciado de dentro do formulário (padrão: ZHEX-
MACRO-...).
A geração desse logo está intimamente ligado ao formato do arquivo TIF. Isso quer dizer que
o seu tamanho obtido no formulário está relatório ao tamanho da imagem geradora do objeto.
Tomar cuidado com o número de cores da imagem (16 cores) e lembrar na hora de
fazer os testes, que o logotipo não aparece na tela, somente em impressões no papel.