Você está na página 1de 30

Turma 6 – Aula 5

Hoje vamos finalizar a tela de Modificação (0030).

Na transação SE80, entre no programa principal e abra a tela 0030:

Clique duplo em USER_COMMAND_0030.

Vamos adicionar função para o Botão BACK e SAVE.

Segue abaixo o código fonte para USER_COMMAND_0030.

*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0030 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0030 INPUT.

CASE sy-ucomm.
WHEN 'BACK' OR 'OTHER'.
IF wa_func NE wa_func_aux. "Houve alteração
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
textline1 = 'Dados alterados'
textline2 = 'Deseja sair'
titel = 'Confirma saída?'
cancel_display = ' '
IMPORTING
answer = v_answer.
IF v_answer EQ 'J'. "Sair sem salvar
PERFORM limpa_variaveis.
IF sy-ucomm EQ 'BACK'.
LEAVE TO SCREEN 0.
ENDIF.
ENDIF.
ELSE. "Não Houve alteração
PERFORM limpa_variaveis.
IF sy-ucomm EQ 'BACK'.
LEAVE TO SCREEN 0.
ENDIF.
ENDIF.
WHEN 'ENTER'.
IF wa_func_aux IS INITIAL.
PERFORM busca_funcionario.
ELSE.
PERFORM verifica_dados CHANGING v_erro.
ENDIF.
WHEN 'SAVE'.
PERFORM verifica_dados CHANGING v_erro.
PERFORM salva_dados USING v_erro 'U'.
* WHEN 'OTHER'.
* PERFORM limpa_variaveis.
WHEN OTHERS.
ENDCASE.

ENDMODULE. " USER_COMMAND_0030 INPUT

Clicando em Layout na Tela 0030:


Selecione o campo e na janela de atributos, clique em Programa:

Marque “Só campo de Saída”. Isso vale para os dois campos.

Criar tela de Demissão:


Inicie a tela 0010 em Lógica de processamento:

Clique duplo em USER_COMMAND_0010.

Insira o seguinte código após a chamada da tela 0030:

WHEN 'FDEMI'. "Demitir Funcionário


CALL SCREEN '0040'.

Em características:

Clique no botão Layout:


Atributos do Botão Salvar:

Atributos do Botão Cancelar:


Atributos Checkbox Demitir Funcionário:

Em lógica de Processamento:
Clique duplo em STATUS_0040 para criar o objeto PBO.

Selecione o include PBO e clique em Ok.

Insira os códigos conforme a seguir:


Criar os Objetos TELA_0040 e TIT_0040.

No Status, vamos ativar somente o botão ENTER.


Salve e ative.

Voltar para a lógica de processamento. Vamos criar o USER_COMMAND_0040.


*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0040 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module USER_COMMAND_0040 input.

CASE sy-ucomm.
WHEN 'ENTER'.
PERFORM busca_funcionario.
WHEN 'CANCEL'.
PERFORM limpa_variaveis.
LEAVE TO SCREEN 0.
WHEN 'SAVE'.
IF NOT wa_func_aux IS INITIAL.
PERFORM salva_dados USING space 'U'.
"Neste caso, o primeiro parâmetro enviaria
"o campo V_ERRO, mas como não temos validação
"dos campos, não teremos retorno de erro. Por
"este motivo enviamos o valor ' ', seguido
"de 'U', de UPDATE.
ELSE.
MESSAGE i002(zmsg00) WITH
'Digite um código válido.'.
ENDIF.
WHEN 'DEMIT'.
IF wa_func-demit EQ 'X'.
wa_func-dtdem = sy-datlo.
ELSE.
CLEAR wa_func-dtdem.
ENDIF.
WHEN OTHERS.
ENDCASE.

endmodule. " USER_COMMAND_0040 INPUT


Códigos Fonte:

Programa: ZT6ADV0003

*&---------------------------------------------------------------------*
*& PoolMóds. ZT6ADV0003
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

PROGRAM ZT6ADV0003.

*** Include para Tabelas, Tipos, Variáveis, Tab Internas, etc.


INCLUDE zt6adv0003_top.

*** Include para os Processos PBO.


INCLUDE zt6adv0003_pbo.

*** Include para os Processos PAI.


INCLUDE zt6adv0003_pai.

*** Include para as funções e Forms.


INCLUDE zt6adv0003_fct.

INCLUDE zt6adv0003_top.

*&---------------------------------------------------------------------*
*& Include ZT6ADV0003_TOP
*&---------------------------------------------------------------------*

TABLES: zt6func00, "Cadastro de Funcionários


zt6cargo00, "Cadastro de Cargos
zt6depto00. "Cadastro de Departamentos

*** Estrutura para ser utilizada nos campos


*** das telas.
DATA: wa_func TYPE zt6func00,
wa_func_aux TYPE zt6func00.
"utilizado na tela de modificação

*** Variável FLAG para testes de erros


DATA: v_erro type c.

*** Variável de retorno de função POPUP


DATA: v_answer TYPE c.

*** Variável para verificar modo de tela


*** (alteração / Exibição)
DATA: v_change TYPE c.
INCLUDE zt6adv0003_pbo.

*&---------------------------------------------------------------------*
*& Include ZT6ADV0003_PBO
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_0010 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0010 OUTPUT.
SET PF-STATUS 'TELA_0010'.
SET TITLEBAR 'TIT_0010'.
ENDMODULE. " STATUS_0010 OUTPUT
*&---------------------------------------------------------------------*
*& Module STATUS_0020 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0020 OUTPUT.
SET PF-STATUS 'TELA_0020'.
SET TITLEBAR 'TIT_0020'.
ENDMODULE. " STATUS_0020 OUTPUT
*&---------------------------------------------------------------------*
*& Module STATUS_0030 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0030 OUTPUT.
DATA fcode TYPE TABLE OF sy-ucomm.
REFRESH fcode.

IF v_change EQ 'X'. "Tela de alteração


SET TITLEBAR 'TIT_0030_A'.
ELSE. "Tela de Exibição
SET TITLEBAR 'TIT_0030_B'.
APPEND 'CANCEL' TO fcode.
APPEND 'SAVE' TO fcode.
ENDIF.

SET PF-STATUS 'TELA_0030' EXCLUDING fcode.

ENDMODULE. " STATUS_0030 OUTPUT


*&---------------------------------------------------------------------*
*& Module change_screen_mode OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE change_screen_mode OUTPUT.
"Passar campo a campo para mudar os atributos
LOOP AT SCREEN.
IF v_change EQ ' '. "Tela de Exibição
IF screen-name EQ 'WA_FUNC-CODRE'.
screen-input = 1. "Campo fica aberto
ELSE.
screen-input = 0. "Campo fica fechado
ENDIF.
ELSE. "Tela de Alteração
"A tela está vazia
IF wa_func_aux IS INITIAL.
IF SCREEN-name EQ 'WA_FUNC-CODRE'.
SCREEN-INPUT = 1. "Campo fica aberto
ELSE.
SCREEN-INPUT = 0. "Campo fica fechado
ENDIF.
ELSE.
IF SCREEN-name EQ 'WA_FUNC-CODRE'.
SCREEN-INPUT = 0. "Campo fica fechado
ELSE.
SCREEN-INPUT = 1. "Campo fica aberto
ENDIF.
ENDIF.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDMODULE. " change_screen_mode OUTPUT
*&---------------------------------------------------------------------*
*& Module STATUS_0040 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module STATUS_0040 output.
SET PF-STATUS 'TELA_0040'.
SET TITLEBAR 'TIT_0040'.
endmodule. " STATUS_0040 OUTPUT

INCLUDE zt6adv0003_pai.

*&---------------------------------------------------------------------*
*& Include ZT6ADV0003_PAI
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0010 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0010 INPUT.
* Variável de Sistema SY-UCOMM --> User Command
* Esta variável grava a ultima ação do usuário.

CASE sy-ucomm.
WHEN 'BACK'. "Botão Back foi pressionado (F3)
LEAVE PROGRAM. "Sai do programa
WHEN 'FCREATE'. "Criar Funcionário
CALL SCREEN '0020'.
WHEN 'FCHANGE' OR 'FSHOW'.
IF sy-ucomm EQ 'FCHANGE'.
v_change = 'X'.
ELSE.
v_change = ' '.
ENDIF.
CALL SCREEN '0030'.
WHEN 'FDEMI'. "Demitir Funcionário
CALL SCREEN '0040' STARTING AT 5 5.
WHEN OTHERS.
ENDCASE.

ENDMODULE. " USER_COMMAND_0010 INPUT


*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0020 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0020 INPUT.

CASE sy-ucomm.
WHEN 'BACK'.
* set SCREEN '0010'.
* leave screen.
* leave to screen '0010'.
* call screen '0010'.
IF NOT wa_func IS INITIAL.

CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'


EXPORTING
textline1 = text-m01
textline2 = text-m02
titel = text-t01
cancel_display = ' '
IMPORTING
answer = v_answer.

IF v_answer EQ 'J'. "Sair sem salvar.


PERFORM limpa_variaveis.
LEAVE TO SCREEN 0. "Volta para a tela anterior
ENDIF.

ENDIF.

WHEN 'ENTER'.
PERFORM verifica_dados CHANGING v_erro.
WHEN 'SAVE'.
PERFORM verifica_dados CHANGING v_erro.
PERFORM salva_dados USING v_erro 'I'.
WHEN OTHERS.
ENDCASE.

ENDMODULE. " USER_COMMAND_0020 INPUT


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

CASE sy-ucomm.
WHEN 'CANCEL'.
LEAVE TO SCREEN 0.
WHEN OTHERS.
ENDCASE.

ENDMODULE. " saida_0020 INPUT


*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0030 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0030 INPUT.

CASE sy-ucomm.
WHEN 'BACK' OR 'OTHER'.
IF wa_func NE wa_func_aux. "Houve alteração
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
textline1 = 'Dados alterados'
textline2 = 'Deseja sair'
titel = 'Confirma saída?'
cancel_display = ' '
IMPORTING
answer = v_answer.
IF v_answer EQ 'J'. "Sair sem salvar
PERFORM limpa_variaveis.
IF sy-ucomm EQ 'BACK'.
LEAVE TO SCREEN 0.
ENDIF.
ENDIF.
ELSE. "Não Houve alteração
PERFORM limpa_variaveis.
IF sy-ucomm EQ 'BACK'.
LEAVE TO SCREEN 0.
ENDIF.
ENDIF.
WHEN 'ENTER'.
IF wa_func_aux IS INITIAL.
PERFORM busca_funcionario.
ELSE.
PERFORM verifica_dados CHANGING v_erro.
ENDIF.
WHEN 'SAVE'.
PERFORM verifica_dados CHANGING v_erro.
PERFORM salva_dados USING v_erro 'U'.
* WHEN 'OTHER'.
* PERFORM limpa_variaveis.
WHEN OTHERS.
ENDCASE.

ENDMODULE. " USER_COMMAND_0030 INPUT


*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0040 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0040 INPUT.

CASE sy-ucomm.
WHEN 'ENTER'.
PERFORM busca_funcionario.
WHEN 'CANCEL'.
PERFORM limpa_variaveis.
LEAVE TO SCREEN 0.
WHEN 'SAVE'.
IF NOT wa_func_aux IS INITIAL.
PERFORM salva_dados USING space 'U'.
"Neste caso, o primeiro parâmetro enviaria
"o campo V_ERRO, mas como não temos validação
"dos campos, não teremos retorno de erro. Por
"este motivo enviamos o valor ' ', seguido
"de 'U', de UPDATE.
ELSE.
MESSAGE i002(zmsg00) WITH
'Digite um código válido.'.
ENDIF.
WHEN 'DEMIT'."Campo CheckBox.
IF wa_func-demit EQ 'X'.
wa_func-dtdem = sy-datlo.
ELSE.
CLEAR wa_func-dtdem.
ENDIF.
WHEN OTHERS.
ENDCASE.

ENDMODULE. " USER_COMMAND_0040 INPUT

INCLUDE zt6adv0003_fct.

*&---------------------------------------------------------------------*
*& Include ZT6ADV0003_FCT
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form verifica_dados
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM verifica_dados CHANGING l_erro.
CLEAR v_erro.

SELECT SINGLE * FROM zt6cargo00 WHERE


cargo EQ wa_func-cargo.
IF sy-subrc NE 0. "Não encontrou o registro
MESSAGE i002(zmsg00) WITH
'Cargo não encontrado.'.
l_erro = 'X'.
CLEAR: zt6cargo00.
ENDIF.

SELECT SINGLE * FROM zt6depto00 WHERE


depto EQ wa_func-depto.
IF sy-subrc NE 0. "Não encontrou o registro
MESSAGE i002(zmsg00) WITH
'Departamento não encontrado.'.
l_erro = 'X'.
CLEAR: zt6depto00.
ENDIF.

ENDFORM. " verifica_dados


*&---------------------------------------------------------------------*
*& Form salva_dados
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_V_ERRO text
*----------------------------------------------------------------------*
FORM salva_dados USING p_v_erro v_tprec.
IF p_v_erro IS INITIAL. "Não tem erro
MOVE-CORRESPONDING wa_func TO zt6func00.
IF v_tprec EQ 'I'. "é novo registro
PERFORM calcula_codre.
INSERT zt6func00.
ELSE. "é modificação
UPDATE zt6func00.
ENDIF.

IF sy-subrc EQ 0.
MESSAGE s002(zmsg00) WITH
'Funcionário'
zt6func00-codre
zt6func00-nome
'gravado com sucesso'.
PERFORM limpa_variaveis.
ELSE.
MESSAGE i002(zmsg00) WITH
'Erro ao gravar funcionário'
zt6func00-codre
zt6func00-nome.
ENDIF.

ELSE. "Existem erros na tela


MESSAGE i002(zmsg00) WITH
'Existem erros. Não é possível gravar'.
ENDIF.
ENDFORM. " salva_dados
*&---------------------------------------------------------------------*
*& Form calcula_codre
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM calcula_codre .

SELECT MAX( codre ) INTO wa_func-codre


FROM zt6func00.
IF sy-subrc NE 0. "Tabela vazia
zt6func00-codre = '0000000001'.
ELSE.
zt6func00-codre = wa_func-codre + 1.
ENDIF.

ENDFORM. " calcula_codre


*&---------------------------------------------------------------------*
*& Form limpa_variaveis
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form limpa_variaveis .

CLEAR: wa_func, wa_func_aux, v_erro, v_answer.

endform. " limpa_variaveis


*&---------------------------------------------------------------------*
*& Form busca_funcionario
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form busca_funcionario .

IF wa_func-codre IS INITIAL.
MESSAGE I002(zmsg00) WITH
'Digite algum código para continuar.'.
ELSE.
SELECT SINGLE * INTO wa_func
FROM zt6func00
WHERE codre EQ wa_func-codre.
IF sy-subrc NE 0.
MESSAGE I002(zmsg00) WITH
'Código não encontrado.'.
PERFORM limpa_variaveis.
ELSE.
wa_func_aux = wa_func.
ENDIF.
ENDIF.

endform. " busca_funcionario


Criar ajuda de pesquisa para Código do Funcionário (CODRE)

Execute a transação SE11:

Clique em Criar.

Selecione ajuda de pesquisa elementar:

No campo Método de seleção, clique no Matchcode Object ou F4:


Selecione Pesquisa por tabelas de Banco d...

Insira o nome da tabela e clique em OK.

Selecione a linha da tabela e clique em OK.


Insira os campos desejados para visualização:

Salvar e ativar.
BATCH INPUT e CALL TRANSACTION

Execute a transação SE38 para criarmos novo programa:

Clique em Criar.
*&---------------------------------------------------------------------*
*& Report ZT6ADV0005
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT zt6adv0005.

*** Tela de Seleção


PARAMETERS: s_filen TYPE string OBLIGATORY DEFAULT
'C:\Temp\BI_Func.txt' LOWER CASE,
s_mode TYPE ctu_mode OBLIGATORY DEFAULT 'A'.

*** Declaração de tabelas internas e variáveis globais


DATA: BEGIN OF ti_file OCCURS 0,
nome(40) TYPE c,
dtadm(10) TYPE c,
dtdem(10) TYPE c,
cargo(3) TYPE n,
depto(3) TYPE n,
salar(13) TYPE n,
moeda(3) TYPE c,
dtnas(10) TYPE c,
depen(2) TYPE n,
ender(35) TYPE c,
bairr(35) TYPE c,
cep(10) TYPE c,
cidade(35) TYPE c,
estado(2) TYPE c,
END OF ti_file.

*** Tabelas internas para processamento do Batch Input


DATA: h_bdc LIKE bdcdata OCCURS 0 WITH HEADER LINE, " Dados da transação
h_msg LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE. "Mensagens B.I.

*** Verificar dados na tela de seleção


AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_filen. "Cria um botão Matchcode
"para o campo indicado
CALL FUNCTION 'GUI_FILE_LOAD_DIALOG'
EXPORTING
window_title = 'Abrir Arquivo de Funcionários'
default_extension = 'TXT'
default_file_name = s_filen
IMPORTING
fullpath = s_filen.

*** Iniciar leitura do Arquivo


START-OF-SELECTION.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = s_filen
TABLES
data_tab = ti_file.

IF NOT ti_file[] IS INITIAL.


DATA: v_salar TYPE p DECIMALS 2.

LOOP AT ti_file.

REPLACE ALL OCCURRENCES OF '/' IN ti_file-dtadm WITH '.'.


REPLACE ALL OCCURRENCES OF '/' IN ti_file-dtnas WITH '.'.

v_salar = ti_file-salar. "0000080012 -> v_salar = 80012.00


v_salar = v_salar / 100. "800.12 -> Exibido como 800,12
WRITE v_salar to ti_file-salar.

PERFORM insert_line USING:


'X' 'ZT6ADV0003' '0010',
' ' 'BDC_OKCODE' '=FCREATE',
'X' 'ZT6ADV0003' '0020',
' ' 'WA_FUNC-NOME' ti_file-nome,
' ' 'WA_FUNC-DTADM' ti_file-dtadm,
' ' 'WA_FUNC-CARGO' ti_file-cargo,
' ' 'WA_FUNC-DEPTO' ti_file-depto,
' ' 'WA_FUNC-SALAR' ti_file-salar,
' ' 'WA_FUNC-MOEDA' ti_file-moeda,
' ' 'WA_FUNC-DTNAS' ti_file-dtnas,
' ' 'WA_FUNC-DEPEN' ti_file-depen,
' ' 'WA_FUNC-ENDER' ti_file-ender,
' ' 'WA_FUNC-BAIRR' ti_file-bairr,
' ' 'WA_FUNC-CEP' ti_file-cep,
' ' 'WA_FUNC-CIDADE' ti_file-cidade,
' ' 'WA_FUNC-ESTADO' ti_file-estado,
' ' 'WA_FUNC-PAIS' 'BR',
' ' 'BDC_OKCODE' '=ENTER',
'X' 'ZT6ADV0003' '0020',
' ' 'BDC_OKCODE' '=SAVE',
'X' 'ZT6ADV0003' '0020',
' ' 'BDC_OKCODE' '/ECANCEL',
'X' 'ZT6ADV0003' '0010',
' ' 'BDC_OKCODE' '=BACK'.

CALL TRANSACTION 'ZT600' USING h_bdc MODE s_mode.

REFRESH h_bdc.
CLEAR h_bdc.

ENDLOOP.
ENDIF.

*-----------------------------------------------------------------------
* Form INSERT_LINE
*-----------------------------------------------------------------------
* Preenche uma linha da tabela H_BDC com os dados da transação
*-----------------------------------------------------------------------
* Leitura
* LC_START, Indica se é informação sobre tela ou programa
* LC_NAME , Nome do programa ou campo
* LC_VALUE, Nome da tela ou valor do campo
* Escrita
* H_BDC, Dados da transação
*----------------------------------------------------------------------*
FORM insert_line USING lc_start TYPE C lc_name TYPE C lc_value.

CLEAR h_bdc.
MOVE lc_start TO h_bdc-dynbegin.
IF lc_start = 'X'.
MOVE:
lc_name TO h_bdc-PROGRAM,
lc_value TO h_bdc-DYNPRO.
ELSE.
MOVE:
lc_name TO h_bdc-fnam,
lc_value TO h_bdc-fval.
ENDIF.
APPEND h_bdc.

ENDFORM. " INSERT_LINE


BATCH INPUT VIA SHDB

Execute a transação SHDB

Clique em Nova Gravação

Clique em Executar Registro


Quando Encerrar o processamento a seguinte tela será exibida:
Clique em Salvar e depois em Voltar.

Selecione o Registro que criou:

Clique em Programa.
Insira o nome e Aceitar de gravação.

Clique em Texto fonte.


Clique em Objeto local.

Código fonte está pronto e ativo.

Caso queira implementar o código fique a vontade pois é um programa Z*.

Você também pode gostar