Você está na página 1de 41

DESENVOLVIMENTO DE MODULE POOL..............................................................

2
CONCEITO.........................................................................................................................2
CRIANDO UM MODULE POOL...........................................................................................2
CONCEITO DE INCLUDE TOP.............................................................................................3
LÓGICA DO PROGRAMA DE EXEMPLO..............................................................................3
CRIANDO TELA 100 – CADASTRO....................................................................................4
CARACTERÍSTICAS DA TELA.............................................................................................5
CRIADO OS CAMPOS NA TELA..........................................................................................6
COMPLETANDO A CRIAÇÃO DA TELA.............................................................................12
Variáveis....................................................................................................................12
PBO e PAI..................................................................................................................12
Barra de Status..........................................................................................................12
Barra de títulos..........................................................................................................15
PBO – Process Before Output...................................................................................15
MODULE STATUS_0100.....................................................................................15
MODULE HABILITAR........................................................................................16
PAI – Process After Input..........................................................................................18
MODULE TRATA_SAIDA...................................................................................18
CHAIN e FIELD....................................................................................................19
MODULE USER_COMMAND_0100..................................................................22
PERFORM CHECAR...........................................................................................22
PERFORM TRANSF_VALORES........................................................................24
PERFORM SALVAR.............................................................................................25
Objetos de Bloqueio..........................................................................................25
PERFORM ALTERAR..........................................................................................29
PERFORM DELETAR..........................................................................................29
PERFORM DEFINE_SELECAO.........................................................................31
SELECT Dinâmico............................................................................................32
CRIANDO A TELA 200 - CONSULTA INDIVIDUAL...........................................................33
Detalhes específicos da tela......................................................................................33
Montagem da tela 200...............................................................................................33
Criando uma Table Control....................................................................................34
PBO e PAI da tela 200...............................................................................................37
PBO – Process Before Output...................................................................................38
MODULE STATUS_0200.....................................................................................38
PAI – Process After Input..........................................................................................39
MODULE USER_COMMAND_0200..................................................................39
PERFORM SELECIONA_REG...........................................................................39
PERFORM RELATORIO_IND............................................................................40

435312777.doc 1 / 41
Desenvolvimento de Module Pool
Conceito
 Module Pool, também conhecido como “programa on-line”, são programas formados por diversos
módulos de programação e telas com a função de “Input” de dados para o R3.
 O desenvolvimento de module pool é todo estruturado, sendo utilizado a transação SE80 para a
criação.
 Você pode fazer todo o module pool utilizando um único programa, mas isso não é recomendável.

Criando um Module Pool


 Para se criar um novo programa, selecionar o tipo “Programa” e informar o nome na janela
específica. Clicar no botão “Exibir”. A transação irá informar “Programa XXXXX não existe.
Criar o objeto ?”. Clique no botão “Sim”.

435312777.doc 2 / 41
Conceito de Include Top
 O próximo passo é informar se o programa terá o “Include Top”. Este include existe para
armazenar todas as declarações globais que existirão no programa.
 Você tem a opção de utilizar o include TOP para essas declarações ou o programa carregador dos
demais includes. O ideal é a utilização do TOP.

 Defina o nome do include com o mesmo nome do programa principal, separando a string “TOP”
com um underline ( _ ).
 Defina as características do programa na tela que vier a seguir. Observe que a categoria do
programa é “Pool de Modulos” e não “Programa executável” como nos relatórios.

Lógica do Programa de Exemplo


 O programa que iremos utilizar para montar o on-line será um cadastro simples, que atualizará a
tabela “ZCADASTRO”.
 A estrutura da tabela é a seguinte:

435312777.doc 3 / 41
 O programa será dividido nas seguintes partes/telas:
o Tela 100 – Cadastro/Alteração/Exclusão dos registros
o Tela 200 – Consulta Individual dos registros e chamada de relatório interno
o Tela 300 – Consultas por sexo e chamada de relatório externo.

Criando Tela 100 – Cadastro


 Para se criar uma tela, clique o botão direito do mouse sobre o nome do programa na árvore do
programa e selecione “Criar -> Telas”.

 A numeração da tela é livre ao desenvolvedor. Iremos denomina-la de tela 0100.

435312777.doc 4 / 41
Características da tela
 Ao criar uma nova tela, devemos definir as características que essa tela vai ter.
o Descrição Breve: título que identificará a tela.
o Tipo de tela:
 Normal: Ao ativar este atributo, a tela é marcada como tela normal. Esta
configuração é a configuração standard.
 Subtela: Ao ativar este atributo, a tela é marcada como subtela. Uma subtela
pode ser executada como parte de uma outra tela. Para isso, é preciso estar
definida uma área respectiva na tela. Uma tela pode chamar várias subtelas em
áreas diferentes. A chamada pode ser controlada de modo dinâmico, de modo a
só ser determinada na execução de transação qual a subtela a utilizar. Uma
subtela pode ser executada em várias telas.
 Caixa de diálogo modal: Ao ativar este atributo, a tela é utilizada como caixa de
diálogo modal. Em oposição ao popup normal, uma caixa de diálogo modal
obtém uma barra de ferramentas própria e um título. Não existe qualquer barra
de menu e não são possíveis entradas no campo de comando.
o Opções:
 Manter Dados: Ao ativar esta opção, são suportadas para a tela no tempo de
execução as seguintes entradas de menu:
Sistema->Especificações do usuário->Manter dados->Definir dados
->Eliminar dados
Deste modo, é possível manter no sistema as entradas efetuadas na tela. No
próximo processamento da tela (também em outro modo), o sistema insere
automaticamente nos campos de entrada as entradas mantidas. Se a opção não
for ativada, as entradas de menu não têm efeito no tempo de execução da tela.

 Desativar Compactação da tela para tempo de execução: Se o atributo


"Desativar compactação de tempo de execução" não estiver definido, no tempo
de execução a tela é exibida em forma comprimida desde que:

 tenha pelo menos um campo (campo de texto, campo de entrada/saída,


elemento gráfico, subtela,quadro, ...) que é invisível ou

 tenha uma área de subtela cuja altura é maior do que a da subtela


utilizada.
 atributo não definido é o caso standard. Só em casos justificados se
deve desistir da compressão da tela no tempo de execução.
 Modelo – Não Executável: Este atributo é essencialmente determinado para a
utilização interna SAP.
 Manter Posição de Rolagem: Este atributo foi pensado para telas longas, nas
quais foi perdida a posição de rolagem através de algumas ações. Indica que a
posição de rolagem da tela principal deve ser mantida, se a tela for exibida
várias vezes seguidas.

o Outros Atributos:

435312777.doc 5 / 41
 Tela Seguinte: Neste campo, tem de ser indicado de forma estática o nº da
próxima tela no processo de transação. O nº da tela seguinte 0 provoca o
encerramento da transação ou o retorno de uma tela ou programa chamado para
um nível anterior à posição da chamada.
 Posição do Cursor: Se o curso não deve ser posicionado no primeiro campo da
tela pronto para entrada, mas sim em um outro campo, o nome desse campo tem
de ser indicado.
 Grupo de telas: É possível entrar uma seqüência de 4 caracteres no máximo,
disponível durante o tempo de execução da tela no campo SY-DYNGR.
Através do termo a entrar neste campo, podem ser atribuídas várias telas a um
mesmo grupo (de telas), que pode ser utilizado, por exemplo, para efetuar uma
modificação comum a todas as telas desse grupo.

 As características da tela que iremos criar são as seguintes:

Criado os campos na tela


 A criação de campos na tela é semelhante a diversas linguagens visuais existente. Existe uma barra
de ferramentas com os elementos de tela existente no SAP R3:

Ponteiro para reiniciar o desenho. Utilizado para redimensionar, mover, marcar objetos.

435312777.doc 6 / 41
Campo texto. Utilizado como label de campos.

Campo de entrada e saída. Utilizado como campo de inserção e saída de informações na tela.

Campo seleção. Utilizado como check box.

Botão Rádio. Utilizado para escolha entre várias opções

Botão. Utilizado com chamada de eventos.

Registro. Utilizado como tabstrip para modular informações dentro da tela.

Assistente de registro. Utilizado para auxiliar a criação de registro.

Quadro. Utilizado para moldurar informações.

Área de subtela. Utilizado para marcar a área de onde uma subtela irá ser posicionada.

Table Control. Utilizado para exibir/entrar com registros para tabela.

Assistente de table control. Utilizado para auxiliar a criação de uma table control.

Custom Control. Utilizado para marcar a área onde um objeto será inserido.

Ícone Status. Utilizado para inserir um ícone de status na tela.

 Utilizando as ferramentas apresentadas acima, devemos criar os seguintes objetos na tela:

435312777.doc 7 / 41
 Os parâmetros dos campos serão os seguintes:

435312777.doc 8 / 41
435312777.doc 9 / 41
435312777.doc 10 / 41
 Todos os objetos de entrada, exceto o código, deverão estar com o parâmetro de entrada
desabilitado, de forma a não aceitar nenhuma informação sem que o usuário informe antes o
código. Para desabilitar, vá na pasta “Programa” dos itens de “Atributos” desmarque o flag de
“Campo de Entrada”.

435312777.doc 11 / 41
 Quando utilizamos o objeto Radio na tela, devemos sempre agrupa-los para que somente um possa
ficar marcado num grupo de rádios associados. Vá à opção “Processar/Agrupamento/Grupo de
botões de rádio/Definir” para marcar o agrupamento dos rádios.

Completando a criação da tela

Variáveis

435312777.doc 12 / 41
 Cada objeto existente na tela, deverá ter uma variável correspondente, com o
mesmo formato e nome, declarado no include “TOP” do module pool.

DATA: v_codigo(10),
v_nome(40),
v_rua(40),
v_bairro(25),
v_cidade(25),
v_est(2),
v_cep(9),
v_tel(13),
v_cel(13),
v_email(40),
v_masc(1),
v_fem(1),
v_neg(1),
v_serv(1),
v_pros(1).

PBO e PAI
 Toda tela possui 2 eventos principais: o Process Before Output e o Process After Input.
 O PBO é executado sempre antes da exibição da tela e após a execução do PAI e serve para
preparar os objetos na tela. Tudo que deve ser preparado para a exibição da tela, como a ativação
da barra de status, os objetos de devem de estar exibidos ou inibidos, visíveis e invisíveis são
tratados no PBO.
 Tanto o PBO quanto o PAI possuem um número limitado de comandos que podem ser executados
e, quando da necessidade de se executar uma gama maior de comandos, devemos cria-los dentro
de módulos que são declarados em ambos os eventos.
 Os comandos que podem ser utilizados no PBO são basicamente o comando LOOP e o comando
MODULE.
 No PAI são executadas todas as verificações após o usuário acionar alguma ação, como o Enter ou
algum botão selecionado.
 Os comandos que podem ser utilizados no PAI são basicamente o comando LOOP, o comando
MODULE, o comando FIELD e o comando CHAIN.

Barra de Status
 Cada tela deve ter uma barra de status. A barra de status compreende-se por menu, barra standard e
barra da aplicação.
 Para criar uma barra de status, clique com o botão direito sobre o nome do programa principal e
selecione “Criar/Status GUI”.

435312777.doc 13 / 41
 Ao aparecer a primeira tela, nomeie a status de ‘0100’ e o texto de ‘Barra de status da tela 100’.

 Na tela seguinte, aparecerão as opções principais para criarmos: Barra de Menu, Barra de Botões e
Teclas de Função.
 Na opção “Barra de Menu” iremos atribuir as opções que irão aparecer no menu principal. Essas
opções, quando não possuírem sub-opções, deverão ter um código associado. Esse código será
recuperado dentro do PAI sempre que o usuário selecionar a opção.

 Na opção “Barra de Botões” iremos atribuir os botões que aparecerão na barra de botões da
aplicação.

435312777.doc 14 / 41
 Para atribuir o ícone, primeiro digite o código da ação e em seguida de um duplo clique sobre. Em
seguida aparecerá a seguinte tela:

Texto que
aparece ao lado
Nome do do ícone
Ícone

Texto de
hint

 Na opção “Teclas de Opção”, iremos definir quais os botões da barra de botões standard que
ficaram ativos e qual o código de cada um.

 Os botões também podem ser classificados quanto a categoria da função. Essa categoria de função
define um grupo de botões que pode ser executado no PAI de forma conjunta. Basicamente
utilizamos isso nos botões de saída, como o BACK e o EXIT. Para isso, após definirmos o código
do botão, dê um duplo-click sobre que aparecerá a seguinte tela:

435312777.doc 15 / 41
 Na categoria da função dos botões “BACK” e “EXIT”, coloque a categoria “E”.

Barra de títulos
 A barra de títulos define o título a ser utilizado pela tela.
 Para criar a barra de título, clique com o botão direito sobre o nome do programa principal e
selecione “Criar/Títulos GUI”.

 Defina o título com “Manutenção do Cadastro”.

PBO – Process Before Output

MODULE STATUS_0100
 Na programação da PBO da tela 100, iremos colocar a chamada da barra de status de da barra de
títulos e a habilitação dos campos.
 Para chamada das barras, crie um módulo chamado “MODULE status_0100.”.
 Para criar a programação do módulo, dê um duplo clique sobre o nome do módulo. Irá aparecer a
tela solicitando em qual include que iremos inserir a chamada do módulo. É recomendável que
exista um include para armazenar todas as chamadas da PBO. Vamos nomear esse include,
colocando o mesmo nome do programa com o final “_O01” (isso não é regra).

435312777.doc 16 / 41
 No include iremos fazer a configuração da barra de status e da barra de títulos,
utilizando o comando “SET” para isso:

*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module STATUS_0100 output.
SET PF-STATUS '0100'.
SET TITLEBAR '100'.
endmodule. " STATUS_0100 OUTPUT
 SET PF-STATUS configura qual a barra de status que iremos utilizar e SET TITLEBAR define
qual a barra de títulos.

MODULE HABILITAR
 Voltando a PBO da tela, iremos declarar o outro módulo do evento. Neste módulo iremos definir o
módulo “MODULE habilitar” que irá habilitar ou desabilitar os campos da tela. Quando a tela foi
criada, todos os objeto de entrada (cmp de ent/saida, check e rádio) foram definidos como campo
somente de saída. Isso ocorreu para que o usuário primeiro entre com o código e faça a checagem
se o mesmo está cadastrado ou não. Se estiver ele será de alteração, caso contrário será de
inclusão.
 Na criação da tela, todos os objetos que foram definidos com somente de saída, tiveram um grupo
associado: o “G1”. Esse grupo foi definido para facilitar a habilitação para entrada. Com o grupo,
faremos a alteração verificando somente essa informação e não o nome do campo.

 Crie o módulo, inserindo no mesmo include do módulo anterior, com o código


abaixo:

435312777.doc 17 / 41
*&---------------------------------------------------------------------*
*& Module habilitar OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module habilitar output.

* Loop nos elementos da tela.


loop at screen.

* Se o grupo do elemento for G1


if screen-group1 = 'G1'.

* Se a variável v_hab esta com valor X


if v_hab = 'X'.

* Habilita para entrada de dados


screen-input = 1.

else.

* Desabilita para entrada de dados


screen-input = 0.

endif.

* Modifica elementos da tela


modify screen.

endif.

endloop.

endmodule. " habilitar OUTPUT

 A variável “V_HAB” deve ser declarada no include “TOP” como CHAR de 1 posição. Essa
variável vai ser alimentada ou não na PAI, quando o usuário clicar sobre o botão checar.

PAI – Process After Input


 No PAI da tela 0100 iremos fazer todos os tratamentos necessários para o desenvolvimento. O PAI
é executado após uma ação do usuário. Neste evento iremos: fazer checagem do preenchimento
dos campos EST, CEP, TEL e CEL, verificar os botões ou opções do menu selecionadas e chamar
os procedimentos corretos.
 O código do PAI é o seguinte:

PROCESS AFTER INPUT.

MODULE trata_saida AT EXIT-COMMAND.

FIELD v_est VALUES ('RJ','SP').

FIELD: v_cep MODULE testa_cep ON INPUT.

435312777.doc 18 / 41
CHAIN.

FIELD: v_tel,
v_cel.

MODULE testa_tel ON CHAIN-INPUT.

ENDCHAIN.

MODULE user_command_0100.

MODULE TRATA_SAIDA
 Primeiro, verificar se o usuário quer sair do programa. Como os botões de saída foram
configurados com categoria de função igual a “E” de “Exit” (saída), iremos criar um módulo para
verificar se algum desses botões foi pressionado. A criação do módulo “TRATA_SAIDA” com a
cláusula “AT EXIT-COMMAND” possibilita a checagem de todos os comandos que foram criados
com a categoria “E”.
 Dentro do módulo, teremos a seguinte codificação.

*&---------------------------------------------------------------------*
*& Module TRATA_SAIDA INPUT
*&---------------------------------------------------------------------*
MODULE trata_saida INPUT.

IF sy-dynnr EQ '0100'.

LEAVE PROGRAM.

ELSEIF sy-dynnr EQ '0200'.

CASE sy-ucomm.

WHEN 'BACK'.

LEAVE TO SCREEN 100.

WHEN 'EXIT'.

LEAVE PROGRAM.

WHEN 'CANCEL'.

PERFORM limpa_tela_200.

ENDCASE.

ELSEIF sy-dynnr EQ '0300'.

CASE sy-ucomm.

WHEN 'BACK'.

435312777.doc 19 / 41
LEAVE TO SCREEN '0100'.

WHEN 'EXIT'.

LEAVE PROGRAM.

WHEN 'CANCEL'.

ENDCASE.

ENDIF.

ENDMODULE. " TRATA_SAIDA INPUT

 Como esse módulo será utilizado por todas as telas do programa, faz-se necessário saber qual a
tela que esta chamando o módulo. Para isso inserimos a variável de sistema “SY-DYNNR”, que
retorna o número da tela atual. No caso da tela 0100, qualquer comando de saída (Exit ou Back)
sairá do programa, usando o comando “LEAVE PROGRAM”. Nas telas 0200 e 0300 o comando
“BACK” volta para a tela 0100 com o comando “LEAVE TO SCREEN ‘0100’ ”, já o comando
“EXIT” sai do programa.

CHAIN e FIELD
 Em seguida, faremos a verificação dos valores válidos para a entrada o estado. Usaremos o
comando “FIELD” com a cláusula “VALUES”. Os valores inseridos entre parênteses são os
valores aceitos pelo programa. Isso criará na tela um Match Code com os valores válidos.
 O próximo passo é testar o conteúdo do campo CEP. Nele teremos que ter uma
string de 9 caracteres, o sexto campo deverá ser um “-“ e nenhum caracter
diferente de número ou ‘-‘. Veja o código abaixo:

*&---------------------------------------------------------------------*
*& Module testa_cep INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE testa_cep INPUT.
DATA: v_len TYPE i.

v_len = strlen( v_cep ).

IF v_len < 9.

MESSAGE e000(zlan) WITH 'Tamanho do CEP errado.'.

ENDIF.

IF v_cep+5(1) NE '-'.

MESSAGE e000(zlan) WITH 'Use o separador - na sexta casa'.

ENDIF.

435312777.doc 20 / 41
IF v_cep CN '1234567890-'.

MESSAGE e000(zlan) WITH 'Caracteres inválidos...'.

ENDIF.
ENDMODULE. " testa_cep INPUT
 Para testar o telefone e o celular, vamos utilizar o mesmo módulo. Nestes casos
em que mais de um campo necessitam utilizar o mesmo módulo do FIELD,
precisamos agrupa-los dentro do controle “CHAIN” e “ENDCHAIN”. Cada
grupo de FIELD e MODULE compõe vários campos. No caso abaixo,
verificamos se os dados estão utilizando a máscara correta.

*&---------------------------------------------------------------------*
*& Module testa_tel INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE testa_tel INPUT.

IF v_tel NE space.

IF v_tel(1) NE '(' OR
v_tel+3(1) NE ')' OR
v_tel+8(1) NE '-'.

MESSAGE e000(ysf) WITH 'Use a máscara (XX)XXXX-XXXX no telefone'.

ENDIF.

ENDIF.

IF v_cel NE space.

IF v_cel(1) NE '(' OR
v_cel+3(1) NE ')' OR
v_cel+8(1) NE '-'.

MESSAGE e000(ysf) WITH 'Use a máscara (XX)XXXX-XXXX no celular'.

ENDIF.

ENDIF.

ENDMODULE. " testa_tel INPUT

435312777.doc 21 / 41
 Todas as outras checagens serão feitas no “MODULE USER_COMMAND_0100”.

MODULE USER_COMMAND_0100.

*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

* se o valor do código na tela estiver vazio, sai do modulo.


CHECK NOT v_codigo IS INITIAL OR ( sy-ucomm NE 'UNIQUE' OR
sy-ucomm NE 'ALL' ).

* verifica qual o comando (ação) pressionado pelo usuário


CASE sy-ucomm.

WHEN 'CHECAR'. " Clicou no botão de checar

PERFORM checar.

WHEN 'SAVE'. " Clicou no botão de salvar

PERFORM salvar.

WHEN 'CHANGE'. " Clicou no botão de alterar

PERFORM alterar.

WHEN 'DELETE'. " Clicou na opção excluir do menu

PERFORM deletar.

WHEN 'UNIQUE'. " Clicou na opção Individual do menu

PERFORM rel_individual.

WHEN 'ALL'. " Clicou no botão todos.

PERFORM rel_geral.

ENDCASE.

ENDMODULE. " USER_COMMAND_0100 INPUT

PERFORM CHECAR
 No perform “CHECAR”, que deve ser criado, dê um duplo clique sobre o nome do perform. Irá
aparecer a tela solicitando em qual include que iremos inserir a chamada do perform. É
recomendável que exista um include para armazenar todas as chamadas de performs. Vamos
nomear esse include, colocando o mesmo nome do programa com o final “_I01” (isso não é
regra). Todos os outros performs deverão ser gravados no mesmo include.

435312777.doc 22 / 41
 Neste perform iremos verificar se o código digitado existe, existindo iremos armazenar o conteúdo
nas variáveis de tela e não habilitar os controles, pois o usuário será obrigado a pressionar a tecla
“ALTERAR” para fazer isso, caso contrário, ou seja, não exista, iremos habilitar os outros campos
para que o usuário digite o novo registro.
 Criar, no include TOP as seguintes declarações:

DATA: v_codigo(10),
v_nome(40),
v_rua(40),
v_bairro(25),
v_cidade(25),
v_est(2),
v_cep(9),
v_tel(13),
v_cel(13),
v_email(40),
v_masc(1),
v_fem(1),
v_neg(1),
v_serv(1),
v_pros(1),
v_hab(1), “Criar essa, pois as outras já existem
v_ucomm(10). “Criar essa, pois as outras já existem
DATA: wa_zcadastro LIKE zcadastro. “ Criar
 No perform “CHECAR”, colocaremos o código abaixo:

FORM checar.

* busca na tabela zcadastro se existe registro com o mesmo valor do


* código digitado na tela de seleção
SELECT SINGLE *
FROM zcadastro
INTO wa_zcadastro
WHERE codigo = v_codigo.

* se encontrar, transfere os valores da estrutura que recebeu os


* valores da tabela para as variáveis de tela.
IF sy-subrc EQ 0.

PERFORM transf_valores.
v_hab = ' '.

ELSE.
* Se não encontrou significa que é novo registro. v_hab igual a X
* indica que é para habilitar a tela e v_comm com NOVO significa que
* na hora de salvar será um INSERT
v_hab = 'X'.
v_ucomm = 'NOVO'.

ENDIF.

ENDFORM. " checar

435312777.doc 23 / 41
 Observe no código a variável “v_hab”. Ela indica se os controles (campos) na tela 0100 irão ser
habilitados ou não. Isso obrigará, caso o código já exista, que se o usuário quiser alterar, ele deve
pressionar o botão “Alterar” antes de iniciar as alterações.

PERFORM TRANSF_VALORES
 No perform “transf_valores” iremos transferir os valores que estão na estrutura
“WA_CADASTRO”, que foi preenchida no select, para as variaveis de tela.

FORM transf_valores.

* transfere os valores da estrutura para a tela


v_nome = wa_zcadastro-nome.
v_rua = wa_zcadastro-rua.
v_bairro = wa_zcadastro-bairro.
v_cidade = wa_zcadastro-cidade.
v_est = wa_zcadastro-estado.
v_cep = wa_zcadastro-cep.
v_tel = wa_zcadastro-telefone.
v_cel = wa_zcadastro-celular.
v_email = wa_zcadastro-email.
v_neg = wa_zcadastro-negociacao.
v_serv = wa_zcadastro-servico.
v_pros = wa_zcadastro-prospectar.

IF wa_zcadastro-sexo = 'M'.

v_masc = 'X'.

ELSE.

v_fem = 'X'.

ENDIF.

ENDFORM. " transf_valores

435312777.doc 24 / 41
PERFORM SALVAR

 No perform “SALVAR” iremos efetuar a gravação ou alteração do registro fisicamente na tabela.


 O comando utilizado para inserir na tabela é o “INSERT” e o comando de alteração é o
“UPDATE”.
 A sintaxe do comando INSERT é:

INSERT INTO <tabela> [VALUES <valores>].

 O uso ideal do comando INSERT é criar uma estrutura como os mesmos campos da tabela na qual
o registro será inserido. Essa estrutura conterá os valores a serem gravados.
 Pode ser feito também o armazenamento diretamente sobre a estrutura da tabela instanciada pelo
comando TABLES, neste caso, a sintaxe do INSERT pode ser da seguinte forma:

INSERT <tabela>.

 A sintaxe do comando UPDATE é:

UPDATE <tabela> [SET <campos> = <valor>]


[WHERE <condição>].

 O comando UPDATE pode ser utilizado de forma semelhante ao comando INSERT. Se


transferirmos todos os valores para uma estrutura, inclusive as chaves da tabela, poderemos usar o
UPDATE com a estrutura da tabela instanciada pelo comando TABLES:

UPDATE <tabela>.

 No perform SALVAR, quando for a alteração do registro, podemos efetuar um bloqueio do


registro que estamos gravando, para que nenhum outro usuário tente alterar no mesmo momento.
Essa técnica chama-se “OBJETOS DE BLOQUEIO”.

Objetos de Bloqueio

o O conceito de bloqueio é simples. Uma função é executada em determinado ponto do


programa. Essa função bloqueia o registro para gravação ou leitura. Qualquer usuário que
deseje utilizar o mesmo registro fica impedido de utilizar. Quando o primeiro usuário, o
que bloqueou o registro, abandonar o processamento, será executada outra função, que
desta vez desbloqueia o registro.
o Essas funções são de fácil localização. Toda função de bloqueio, começa com
“ENQUEUE” e de desbloqueio com “DEQUEUE”.
o Não existindo o objeto de bloqueio, crie um novo na transação SE11, opção “Objeto de
Bloqueio”
o Todo objeto de bloqueio deve começar com a letra “E”.

435312777.doc 25 / 41
Nome da
Tabela do
Objeto

Tipo do
bloqueio

435312777.doc 26 / 41
Campos
chave da
tabela

o No exemplo acima, serão criadas duas funções: “ENQUEUE_EZTESTELAN00” que


será usada para bloqueio e “DEQUEUE_EZTESTELAN00“ que será usada para
desbloqueio.
 No perform “SALVAR”, o código será o seguinte:

FORM salvar.

* Transfere os valores da estrutura para as variáveis de tela


wa_zcadastro-codigo = v_codigo.
wa_zcadastro-nome = v_nome.
wa_zcadastro-rua = v_rua.
wa_zcadastro-bairro = v_bairro.
wa_zcadastro-cidade = v_cidade.
wa_zcadastro-estado = v_est.
wa_zcadastro-cep = v_cep.
wa_zcadastro-telefone = v_tel.
wa_zcadastro-celular = v_cel.
wa_zcadastro-email = v_email.
wa_zcadastro-negociacao = v_neg.
wa_zcadastro-servico = v_serv.
wa_zcadastro-prospectar = v_pros.

IF v_masc = 'X'.

wa_zcadastro-sexo = 'M'.

ELSE.

wa_zcadastro-sexo = 'F'.

ENDIF.

* Se o valor da variável v_ucomm for NOVO significa que é para

435312777.doc 27 / 41
* inserir
* novo registro na tabela; se for ALTERAR, modificar registro
* da tabela
IF v_ucomm = 'NOVO'.

INSERT INTO zcadastro VALUES wa_zcadastro.

ELSEIF v_ucomm = 'ALTERAR'.

* transfere da estrutura da estrutura da tabela declarada *


* com tables
zcadastro = wa_zcadastro.

CALL FUNCTION 'ENQUEUE_EZTESTELAN00'


EXPORTING
mode_zcadastro = 'E'
mandt = sy-mandt
codigo = zcadastro-codigo
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.

IF sy-subrc <> 0.
MESSAGE w000(ysf) WITH 'Bloqueado...'.
ENDIF.

IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

UPDATE zcadastro.

CALL FUNCTION 'DEQUEUE_EZTESTELAN00'


EXPORTING
MODE_ZCADASTRO = 'E'
MANDT = SY-MANDT
CODIGO = zcadastro-codigo.

ENDIF.

* se o retorno do insert ou do update for 0, efetua o commit,


* caso contrário, executa o rollback
IF sy-subrc EQ 0.

COMMIT WORK.

ELSE.

ROLLBACK WORK.

ENDIF.

435312777.doc 28 / 41
* limpa as variaveis de tela, a v_hab para desabilitar a tela e
* v_ucomm para receber novo comando
CLEAR: v_codigo, v_nome, v_rua, v_bairro, v_cidade, v_est,
v_cep, v_tel, v_cel, v_email, v_neg, v_serv,
v_pros, v_hab, v_ucomm.

ENDFORM. " salvar

PERFORM ALTERAR
 O perform alterar é muito simples. Sua função é exclusivamente indicar a habilitação dos
campos e indicar na variável “V_UCOMM” que sua função é ALTERAR.
 Essa variável é testada no perform “SALVAR” para indicar se deverá ser
utilizado o comando INSERT ou UPDATE.

FORM alterar.

* Se a estrutura não estiver vazia, modifica a v_hab para habilitar a


* tela e transfere a instrução ALTERAR para a v_ucomm para na hora do
* salvar fazer o UPDATE
IF NOT wa_zcadastro IS INITIAL.

v_hab = 'X'.
v_ucomm = 'ALTERAR'.

ENDIF.
ENDFORM. " alterar

PERFORM DELETAR
 No perform DELETAR, iremos ver outro comando de manipulação de tabelas de banco de dados,
que é o comando DELETE.
 A sintaxe do comando DELETE é:

DELETE FROM <tabela> WHERE <cond>.


 Neste perform, antes de efetuar a deleção do registro, por questão de segurança, iremos questionar
a escolha do comando. Para isso iremos usar uma função standard, chamada
“POPUP_TO_CONFIRM_STEP”. Essa função irá abrir uma janela onde o usuário responde a uma
pergunta. O teste da resposta é feito com: (J) para sim, (N) para não e (C) para cancelar.

435312777.doc 29 / 41
 O código do perform será o seguinte:

FORM deletar.

DATA: lc_answer.
* Se na for novo registro
CHECK NOT v_ucomm = 'NOVO'.

* exibe mensagens para confirmação da exclusão. a resposta ficará na


* variável lc_answer.
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
textline1 = 'Confirma Exclusão ?'
titel = 'Exclusão'
IMPORTING
answer = lc_answer.

* O J significa o retorno do SIM


IF lc_answer = 'J'.

* exclui da tabela onde o código for igual ao código da tela.


DELETE FROM zcadastro WHERE codigo = v_codigo.
* se o retorno do delete for 0, efetua o commit, caso
* contrário, executa o rollback
IF sy-subrc EQ 0.

COMMIT WORK.

ELSE.

ROLLBACK WORK.

ENDIF.

ENDIF.

* limpa as variáveis de tela, a v_hab para desabilitar a tela e a


* v_ucomm para receber novo comando
CLEAR: v_codigo, v_nome, v_rua, v_bairro, v_cidade, v_est,
v_cep, v_tel, v_cel, v_email, v_neg, v_serv,
v_pros, v_hab, v_ucomm.

ENDFORM. " deletar

435312777.doc 30 / 41
PERFORM REL_INDIVIDUAL.

 Esse perform irá fazer a chamada de uma nova tela, a tela 0200.
 O comando que chama uma nova tela é o comando “CALL SCREEN”.
 Para retornar a tela chamadora, utilizamos o comando “LEAVE SCREEN”. Se quisermos voltar a
uma tela que não é a chamadora, utilizamos o comando “LEAVE TO SCREEN <n>”.
 O código do perform será o seguinte:

FORM rel_individual.

PERFORM limpa_variaveis.
CALL SCREEN 200.

ENDFORM. " rel_individual

PERFORM REL_GERAL.

 Esse perform irá fazer a chamada de uma nova tela, a tela 0300.
 Nesta tela teremos uma “TABSTRIP” associada.
 O conceito de TABSTRIP iremos ver no capítulo associado a tela 0300.
 O código do perform será o seguinte:

FORM rel_geral.

REFRESH ti_zcadastro.
wc_dynnr = '0310'.
PERFORM define_selecao USING 'MASC'.
tabstrip1-activetab = 'MASC'.

CALL SCREEN 300.


ENDFORM. " rel_geral
 Como na abertura da tela 0300 iremos carregar os dados do cadastro, iremos construir um
perform que utilizará o conceito de SELECT DINÂMICO para selecionar os dados da tabela.

PERFORM DEFINE_SELECAO.
 O perform DEFINE_SELECAO irá carregar a tabela interna utilizada na tela 0300 com as
informações vidas do cadastro, separada por sexo.
 O perform recebe um parâmetro no momento da chamada. Esse parâmetro pode ser “MASC”
ou “FEM”, o que irá orientar na hora da seleção.

435312777.doc 31 / 41
SELECT Dinâmico

 Utilizar o conceito de SELECT Dinâmico significa montar a cláusula WHERE antes da seleção
dos dados.
 Isso ocorre quando temos de utilizar diversas formas do mesmo select. Ao invés de criarmos
vários comandos SELECTs, criamos uma única chamada, com o conteúdo da cláusula WHERE
dentro de uma tabela interna.
 Essa tabela interna deverá conter uma única linha, com um campo do tipo caracter de 72 posições.
 Ao montar o SELECT, sempre que precisar inserir uma variável, a mesma deve estar entre 4 aspas
simples de cada lado.
 Toda a cláusula WHERE deve ser montada dentro da tabela interna, podendo ser utilizada mais de
uma linha se necessário.
 Na chamada do SELECT, na cláusula WHERE, colocar entre parênteses o nome da tabela interna
criada.

FORM define_selecao USING p_sexo.

DATA: BEGIN OF ti_select OCCURS 0,


linha(72),
END OF ti_select.

DATA: v_sexo(1).

IF p_sexo = 'MASC'.

v_sexo = 'M'.

ELSE.

v_sexo = 'F'.

ENDIF.

CONCATENATE '''' v_sexo '''' INTO ti_select-linha.


CONCATENATE 'SEXO EQ' ti_select-linha INTO ti_select-linha
SEPARATED BY space.
APPEND ti_select.

SELECT *
FROM zcadastro
INTO TABLE ti_zcadastro
WHERE (ti_select).

ENDFORM. " define_seleção

435312777.doc 32 / 41
Criando a tela 200 - Consulta Individual

Detalhes específicos da tela

 A tela 200 será uma consulta utilizando um objeto chamado TABLE CONTROL,
que é um grid que contém as informações de uma determinada tabela interna.
 Na tela 200, após o usuário selecionar o registro, o mesmo poderá emitir um
relatório.
 Esse relatório será uma chama de relatório interno dentro do ON-LINE.

Montagem da tela 200

 Como a maioria dos objetos já foram ensinados como se cria, alguns serão
informados somente o objeto, o nome e o texto deste.
 A tela 200 terá os seguintes objetos:
o Dois campos textos, com textos “Código” e outro “Nome”.
o Dois campos de entrada/saída, um chamado “V_CODIGO” e outro
“V_NOME”.
o Uma TABLE CONTROL, chamada de “TC1”

Campos de V_CODIGO
texto
V_NOME

TC1

435312777.doc 33 / 41
Criando uma Table Control
 O processo de criação de uma Tabela Control é o seguinte:
 Insira o objeto na posição que desejar na tela;
 Nomeie o objeto. No nosso caso será chamado de TC1.
 Marque os checkbox de separadores de linha Horizontal e Vertical.
 Marque o radiobutton de marcadores de colunas simples. No nosso caso será
simples pois o usuário selecionará somente um registro.
 O próximo passo é colocar as colunas. Para essa fase podemos fazer de diversas
formas. A que utilizaremos é pegar os campos de uma tabela interna.
 Toda TABLE CONTROL deve de ter uma tabela interna associada. Isso será
necessário para mantermos os dados do objeto durante o processamento.
 Deve ser criada uma tabela interna de nome TI_ZCAD, no perform TOP do
programa. Essa tabela irá conter os campos da tabela ZCADASTRO e mais o
campo FLAG. O campo FLAG servirá como marcador de coluna da TABLE
CONTROL.

DATA: BEGIN OF ti_zcad OCCURS 0,


flag(1).
INCLUDE STRUCTURE zcadastro01.
DATA: END OF ti_zcad.
 Selecionar no menu a opção “Saltar - Janela Secundária - Campos dict./programa”

 Digitar o nome da tabela interna (TI_ZCAD) e clicar em chamar do programa.


 Ao aparecer a estrutura, marcar todos os campos que se deseja colocar na TABLE
CONTROL. No nosso exemplo iremos inserir os campos CODIGO, NOME e
SEXO.
 Após marcar os campos desejados, clique no botão OK
 Inserir os campos selecionados dentro da TABLE CONTROL.
 Ao soltar os campos dentro do objeto, diversas colunas serão inseridas (no nosso
caso 3).

435312777.doc 34 / 41
Coluna do
Nome
Coluna do
Código Coluna do
Sexo

 O próximo passo é colocar os cabeçalhos nas colunas. Inserir um objeto de campo


texto (LABEL) sobre cada coluna e colocar os títulos nelas (Código, Nome e
Sexo).

 Agora iremos definir uma coluna de marcador de linha. Na tabela temos o campo
FLAG que servirá como marcador de linha. Nas propriedades da TABLE
CONTROL, na área de marcador de coluna, marcar o checkbox e colocar o nome
do campo (TI_ZCAD-FLAG).

435312777.doc 35 / 41
 Após salvar a tela, iremos acabar de preparar a TABLE CONTROL fora do
SCREEN PAINTER.
 Declarar a TABLE CONTROL no perform TOP do programa, da seguinte forma:

*declarar a Table Control e a tela em que ela esta

CONTROLS TC1 TYPE TABLEVIEW USING SCREEN 200.


 O comando CONTROLS é utilizado para declarar TABLES CONTROL e
TABSTRIP. Para TABLE CONTROL o tipo será TABLEVIEW e para TABSTRIP
será TABSTRIP. No caso do TABLE CONTROL é necessário apontar a tela a
qual ele pertence.
 O próximo passo é preparar o TABLE CONTROL no PBO e PAI da tela. Sempre
que o objeto for criado, temos de inserir um LOOP/ENDLOOP em ambos evento
da tela para cada TABLE CONTROL que a tela possuir.
 O LOOP/ENDLOOP da PBO deverá ser da seguinte forma:

LOOP AT ti_zcad

WITH CONTROL tc1


CURSOR tc1-current_line.
ENDLOOP.
 O LOOP/ENDLOOP da PAI será um loop simples.

LOOP AT ti_zcad.

MODULE trata_registro.

ENDLOOP.

 O MODULE entre o loop não é obrigatório. No caso do nosso programa ele


servirá para gravar na tabela qual o registro que foi marcado para futura ação (no
nosso caso para ser emitido em relatório).
 O código do módulo será:

435312777.doc 36 / 41
MODULE trata_registro INPUT.

* modify tabela interna guardo quem escolho na linha corrente da tc1


MODIFY ti_zcad INDEX tc1-current_line.

ENDMODULE. " trata_registro INPUT

 O MODIFY irá modificar o conteúdo da linha que estamos lendo na tabela


interna. Se o usuário marcar o registro, o mesmo irá alterar o valor do campo
FLAG na tabela interna. O complemento INDEX TC1-CURRENT_LINE indica
qual registro que será modificado. Isso é necessário, pois os comandos LOOP que
foram colados na PBO e PAI apesar de apontar para a tabela interna, ele na
verdade esta percorrendo as linhas do TABLE CONTROL, que utiliza a tabela
como referência e não na própria tabela interna.

PBO e PAI da tela 200


 O código da PBO e PAI da tela 200 será o seguinte:

PROCESS BEFORE OUTPUT.

MODULE status_0200.

LOOP AT ti_zcad WITH CONTROL tc1 CURSOR tc1-current_line.


ENDLOOP.

PROCESS AFTER INPUT.

MODULE trata_saida AT EXIT-COMMAND.

LOOP AT ti_zcad.

MODULE trata_registro.

ENDLOOP.

MODULE user_command_0200.

PBO – Process Before Output


 Na PBO da tela 200 iremos fazer a configuração da barra de status e o loop da
TABLE CONTROL, somente.

MODULE STATUS_0200
 Fazer a chamada da barra de status STATUS2 e da barra de título 200.

MODULE status_0200 OUTPUT.

SET PF-STATUS 'STATUS2'.


SET TITLEBAR '200'.

435312777.doc 37 / 41
ENDMODULE. " status_0200 OUTPUT
 Criar a STATUS2 conforme abaixo:

 Criar a barra de título 200 conforme abaixo:

PAI – Process After Input


 Na PAI da tela 200 iremos aproveitar o mesmo perform para verificação que foi criado para a tela
100, uma vez que ele esta preparado para todas as telas.

MODULE USER_COMMAND_0200

435312777.doc 38 / 41
 Neste módulo iremos verificar as ações do usuário e desviar o programa para o
performs corretos.

MODULE user_command_0200 INPUT.

CASE sy-ucomm.

WHEN 'BUSCAR'.

PERFORM seleciona_reg.

WHEN 'SELEC'.

PERFORM relatorio_ind.

ENDCASE.

ENDMODULE. " USER_COMMAND_0200 INPUT

PERFORM SELECIONA_REG.
 Neste perform iremos fazer a seleção dos registros de acordo com as informações passadas na tela
pelo usuário. Se ele entrar com código, iremos fazer uma pesquisa simples, através do campo
CODIGO. Se ele informar o nome, iremos fazer uma busca com LIKE no campo NOME. Essa
busca com LIKE não é recomendada quando se trata de tabelas muito grandes, uma vez que a
performance com o LIKE é baixíssima.
 Para a busca com o LIKE, temos de inserir o caracter “%” na posição de cada “*” que o usuário
informar na tela. A substituição do * pelo % é feita com o comando TRANSLATE.

FORM seleciona_reg.

DATA: lc_nome LIKE v_nome.

IF v_codigo IS INITIAL.

lc_nome = v_nome.

TRANSLATE lc_nome USING '*%'.

SELECT *
FROM zcadastro01
INTO CORRESPONDING FIELDS OF TABLE ti_zcad
WHERE nome LIKE lc_nome.

ELSE.

SELECT *
FROM zcadastro01
INTO CORRESPONDING FIELDS OF TABLE ti_zcad
WHERE codigo = v_codigo.

435312777.doc 39 / 41
ENDIF.

ENDFORM. " seleciona_reg

PERFORM RELATORIO_IND.
 Neste perform, iremos fazer a chamada de um report interno ao On-Line. Para
ativar o report, utilizaremos o comando “LEAVE TO LIST-PROCESSING”. A partir
deste ponto, podemos trabalhar como em um report, utilizando comandos como o
WRITE e ULINE, tratar eventos, como o TOP-OF-PAGE, AT LINE-
SELECTION e AT USER-COMMAND.

FORM relatorio_ind.

LEAVE TO LIST-PROCESSING.

ULINE.

READ TABLE ti_zcad WITH KEY flag = 'X'.

CHECK sy-subrc = 0.

WRITE: / 'Codigo:', ti_zcad-codigo,


/ 'Nome: ', ti_zcad-nome,
/ 'Rua: ', ti_zcad-rua,
/ 'Bairro:', ti_zcad-bairro.
ENDFORM. " relatorio_ind

435312777.doc 40 / 41
435312777.doc 41 / 41

Você também pode gostar