Você está na página 1de 29

Turma 6 – Aula 4

Vamos continuar, fazendo ajustes finos na tela 0020.

Para ignorar o preenchimento dos campo obrigatório, insira o comando CANCEL dentro do
Status da tela 0020:

Em tipo de função, selecionar “E”  Comando Exit.

Salvar e ativar o Status.

Em Logica de Processamento, criar um novo modulo (SAIDA_0020), conforme a seguir:


Este modulo será criado no include PAI.

Na tela 0020, em Layout, vamos inserir os campos de descrição de CARGO e DEPTO:

Descrição de Cargo: ZT6CARGO00-DESCR

Descrição de Departamento: ZT6DEPTO00-DESCR.


Nos campos Cargo e Departamento, vamos associar uma ajuda de pesquisa:

Para o campo CARGO, utilizar a ajuda de pesquisa ZT6HCARGO00, conforme a seguir:

O mesmo será feito com o campo de Departamento. Para o campo Departamento, utilizar a
ajuda de pesquisa ZT6HDEPTO00. O Apêncice A ensina como desenvolver uma Ajuda de
Pesquisa Elementar.
Exercício 2 – Criar tela de Exibição / Alteração

O primeiro passo é saber qual tela chamará a tela de Alteração/Exibição. No nosso caso, a tela
principal é a tela 0010. Portanto precisamos entrar no lógica de processamento da Tela 0010:

Depois entramos no USER_COMMAND_0010.

Inserir a chamada da tela 0030 conforme a seguir:

Clique Duplo em 0030. Na tela a seguir, clique em Sim para criar o objeto.

Nas características da Tela 0030, preencha conforme a seguir:


Em lógica de Processamento, o código ficará conforme a seguir:

Vamos criar o STATUS_0030.


Clique duplo em TELA_0030 para criar o PF-STATUS:
Salvar e ativar.
Criar os títulos:
O Modulo PBO da tela 0030 ficou da seguinte forma:

Voltar para lógica de Processamento da Tela 0030.

Clique duplo em USER_COMMAND_0030 para criar o PAI:


Vamos definir o Layout da Tela 0030:

Desenhar tela conforme a seguir:

Para inserir o campo CODRE, clique em:

ou
tecla F6.
Selecione a tabela WA_FUNC campo CODRE.

Insira um LABEL

Nome do Label: LBL01  Descrição: Código Funcionário.

Voltando para lógica de processamento, vamos incluir a seguinte linha no PBO:


Vamos voltar para a Logica de processamento.
Vamos incluir um novo botão na barra de Status da tela 0030:

Selecione Texto Estático na próxima tela.

Na tela a seguir preencha com os seguintes dados:

Clique no Icone abaixo da palavra OTHER e preencha conforme a seguir:


Clique em Salvar e depois ativar.

Voltar para a lógica de Processamento da tela 0030.

Clique duplo em USER_COMMAND_0030 e acrescentar a validação do botão OTHER.


Códigos Fontes:

PROGRAMA PRINCIPAL: 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
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 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'.
      LEAVE TO SCREEN 0.
    WHEN 'ENTER'.
      PERFORM busca_funcionario.
    WHEN 'OTHER'.
      PERFORM limpa_variaveis.
    WHEN OTHERS.
  ENDCASE.

ENDMODULE.                 " USER_COMMAND_0030   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
APENDICE A – Criação de Ajuda de Pesquisa

Execute a transação SE11:

Em método de Seleção, selecione Pesquisa por tabela banco dados:


Digite o nome da tabela:

A busca resultará na seguinte tela:


Clique em Transferir.

Preencha os parâmetros conforme a seguir.

Salve e ative.
Para testar, pressione F8 ou clique em .

Clique em Testar ou tecle ENTER:

Ao selecionar uma linha o resultado será transmitido para a tela:


O mesmo será feito para a tabela de Departamentos:

Você também pode gostar