Arquivo da categoria ‘Abap’

ALV Grid Control

A ferramenta fornece operações de lista comuns como funções genéricas e pode ser reforçada por opções auto definidas. Isso permite que você use o ALV Grid Control em uma grande variedade de programas de aplicação. O ALV Grid Control também é usado como uma ferramenta para a mudança e criação de tabelas. No entanto, essa funcionalidade é atualmente utilizado em projetos-piloto e ainda não foi liberado para os clientes.

SAP List Viewer (ALV) é um elemento integrante do ambiente de programação ABAP Objects e este controle se divide basicamente em três partes, é composto de um cabeçalho de títulos, uma barra de ferramentas e uma grade de dados.

Você pode usar o AVL para exibir os seguintes componentes:  tabelas simples e bidimensionais,  listas hierárquica sequenciais e estrutura em árvore.

ALV Grid Control

ALV Grid Control

Considerações

O ALV Grid Control usa controles de tecnologia para alcançar exibição state-of-the-art-on-screen. Como todos os invólucros de controle, o Grid Control ALV oferece métodos através de uma classe global no sistema, que pode ser usado para afetar seu comportamento.

SAP AVL NEW API

A API antiga ainda pode ser usada, no entanto, a SAP recomenda usar o novo modelo de objeto unificado da classe cl_gui_alv_grid para a programação de todos os seus aplicativos ALV. Assim, mesmo se você planeja usar o ALV Grid Control, você pode usar a nova API simplificada.
A SAP não garante que os métodos, eventos e atributos desta classe que não são públicas permanecerão inalterados ou estará disponível em versões futuras. É por isso que você não deve derivar da classe para acessar objetos protegidos da classe. Usando esses objetos faz com que seja mais difícil para atualizar seus programas para versões posteriores da classe.

Exemplo:

Neste exemplo usamos um ALV Grid Control para exibir dados de uma tabela do SAP Netweaver 7. Você pode usar a variant para salvar os layouts do seu AVL Control, explicações extras contidas no comentário do código fonte.

Obs: Você encontra um programa para preencher com dados  a tabela do exemplo abaixo SPFLI em nossos posts anteriores.

Abap

*&---------------------------------------------------------------------*
*& Report  ZALVGRID
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& ALV Grid Control
*&---------------------------------------------------------------------*

REPORT  ZALVGRID.

* Declara tabela
TABLES : SPFLI.

* Declara pools
TYPE-POOLS : SLIS.

* Declara tabela interna
DATA : WA_SPFLI TYPE SPFLI,
       IT_SPFLI TYPE TABLE OF SPFLI.

* Declara AVL GRID
DATA: CAMPOS TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE,
      DA_LAYOUT    TYPE SLIS_LAYOUT_ALV,
      DA_REPID     LIKE SY-REPID,

* Declara variant
      DA_SALVA TYPE C VALUE 'X',
      DA_VARIANT TYPE DISVARIANT,
      DAZ_VARIANT TYPE DISVARIANT.

* Cria seleção - nome da variant -
* Selecione vazio caso não tenha salvo nenhum layout

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE titulo .

SELECTION-SCREEN COMMENT 1(79) com1.

PARAMETERS: VARIANT LIKE DISVARIANT-VARIANT.

SELECTION-SCREEN END OF BLOCK B1.

** Retorna Variant
INITIALIZATION.
  DAZ_VARIANT-REPORT = SY-REPID.

  CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET'
    EXPORTING
      I_SAVE     = DA_SALVA
    CHANGING
      CS_VARIANT = DAZ_VARIANT
    EXCEPTIONS
      NOT_FOUND  = 2.

  IF SY-SUBRC = 0.
    VARIANT = DAZ_VARIANT-VARIANT.
  ENDIF.

* Inicia variaveis da seleção
LOAD-OF-PROGRAM.
titulo = 'Variant permite salvar o Layout'.
com1 = 'Utilize o menu Settings/Layout/Save'.

* Incio do programa
START-OF-SELECTION.

* Chama procedimentos
  PERFORM RetornaDados.
  PERFORM CriaCampos.
  PERFORM MostraGrid.

* Cria campos da grid
FORM CriaCampos.

  CAMPOS-FIELDNAME   = 'CARRID'.
  CAMPOS-SELTEXT_M   = 'Linha Area'.
  CAMPOS-COL_POS     = 0.
  APPEND CAMPOS TO CAMPOS.
  CLEAR  CAMPOS.

  CAMPOS-FIELDNAME   = 'CONNID'.
  CAMPOS-SELTEXT_M   = 'Conexão'.
  CAMPOS-COL_POS     = 1.
  APPEND CAMPOS TO CAMPOS.
  CLEAR  CAMPOS.

  CAMPOS-FIELDNAME   = 'CITYFROM'.
  CAMPOS-SELTEXT_M   = 'Saida'.
  CAMPOS-COL_POS     = 2.
  CAMPOS-OUTPUTLEN   = 30.
  APPEND CAMPOS TO CAMPOS.
  CLEAR  CAMPOS.

  CAMPOS-FIELDNAME   = 'CITYTO'.
  CAMPOS-SELTEXT_M   = 'Chegada'.
  CAMPOS-COL_POS     = 3.
   CAMPOS-OUTPUTLEN   = 30.
  APPEND CAMPOS TO CAMPOS.
  CLEAR  CAMPOS.

  CAMPOS-FIELDNAME   = 'DISTANCE'.
  CAMPOS-SELTEXT_M   = 'Distancia'.
  CAMPOS-COL_POS     = 4.
  APPEND CAMPOS TO CAMPOS.
  CLEAR  CAMPOS.

  CAMPOS-FIELDNAME   = 'DISTID'.
  CAMPOS-SELTEXT_M   = 'Medida'.
  CAMPOS-COL_POS     = 5.
  APPEND CAMPOS TO CAMPOS.
  CLEAR  CAMPOS.

ENDFORM.

* Mostra AVL GRID
FORM MostraGrid .

  DA_REPID = SY-REPID.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM      = DA_REPID
      I_CALLBACK_TOP_OF_PAGE  = 'TOP-OF-PAGE'
      I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
      IT_FIELDCAT             = CAMPOS[]
      I_SAVE                  = 'X'
      IS_VARIANT              = DA_VARIANT
    TABLES
      T_OUTTAB                = IT_SPFLI
    EXCEPTIONS
      PROGRAM_ERROR           = 1
      OTHERS                  = 2.

ENDFORM.

* Retorna dados
FORM RetornaDados.

  SELECT * FROM SPFLI INTO TABLE IT_SPFLI.

ENDFORM.

* Cabeçalho -  ALV Report Header
FORM TOP-OF-PAGE.
* Declara cabeçalho AVL

 DATA: DA_TOP TYPE SLIS_T_LISTHEADER,
        WA_TOP TYPE SLIS_LISTHEADER.

  WA_TOP-TYP  = 'H'.
  WA_TOP-INFO = 'Desenvolvimento Aberto'.
  APPEND WA_TOP TO DA_TOP.
  CLEAR WA_TOP.

  WA_TOP-TYP  = 'H'.
  WA_TOP-INFO = 'SPFLI - Voos e Conexões'.
  APPEND WA_TOP TO DA_TOP.
  CLEAR WA_TOP.

  WA_TOP-TYP  = 'S'.
  WA_TOP-KEY = 'Data do dia : '.
  CONCATENATE SY-DATUM+6(2) '.' SY-DATUM+4(2) '.' SY-DATUM(4) INTO WA_TOP-INFO.
  APPEND WA_TOP TO DA_TOP.
  CLEAR: WA_TOP.

  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      IT_LIST_COMMENTARY = DA_TOP.

ENDFORM.

Em computação, um tree view (literalmente do inglês vista de árvore) é um elemento de interface gráfica (isto é um componente widget) que permite ao usuário mostrar dados hierárquicos em forma de árvore, expandir ou recolher os ramos e nós. Dependendo do wiget toolkit ou aplicação em uso, existem muitos estilos de apresentação gráfica de tree views.

SAP Tree

É um controle que permite que você exiba estruturas de árvore em uma tela. Ele foi desenvolvido pela SAP, e enquanto ela cumpre os requisitos básicos de um controle de árvore (Treeview), não foi adaptado para aplicações individuais. Existem três versões diferentes do SAP Tree:

Classes do SAP Tree

  • CL_GUI_SIMPLE_TREE – Classe  que instancia um Treeview tradicional com uma única coluna.
  • CL_GUI_COLUMN_TREE – Classe que instancia um Treeview com exibição de colunas.
  • CL_GUI_LIST_TREE – Classe que instancia um Treeview com uma exibição de listas.

Screen Painter

Para usar o SAP Tree siga os seguintes passos:

  1. Crie um novo programa chamado ztreeview.
  2. Crie uma tela 100 para este programa.
  3. Preencha o elemento tipo OK para OK_CODE para a tela 100.
  4. Em Layout, arraste para o design um Text Field, um Custom Control e um Input/Output Field.
  5. Nomeie o Custom Control de: DISCO.
  6. Nomeie o Input/Output Field de: RODAPE.
  7. Use a figura abaixo para criar o seu Layout:

    SAP Tree- Layout

    SAP Tree- Layout

  8. Em Flow Logic crie os elementos PBO e PAI default.
  9. Ative a tela 100.
  10. Digite o código abaixo no seu programa, ative e teste.
SAP Tree - Programa

SAP Tree – Programa

Exemplo:

Neste exemplo usamos uma visão de arvore para exibir uma discografia musical, você pode abrir e fechar os nós do modelo de dados em visão de  árvore, um duplo clique do mouse em cada nó dispara um evento para que exibe a chave do nó corrente em um rodapé. No código abaixo os comentários completam a explicação do componente SAP Tree e o evento duplo clique.

Abap

*&---------------------------------------------------------------------*
*& Report  ZTREEVIEW
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Treeview
*&---------------------------------------------------------------------*

REPORT  ZTREEVIEW.

* Declara componentes e eventos de botões
DATA: DISCO TYPE REF TO cl_gui_custom_container,
      Arvore TYPE REF TO cl_simple_tree_model,
      g_ok_code TYPE sy-ucomm.

DATA rodape TYPE string.

* Declara eventos para duplo clique

CLASS duploclique DEFINITION.

  PUBLIC SECTION.

    METHODS:
      handle_node_double_click
        FOR EVENT node_double_click
        OF cl_simple_tree_model
        IMPORTING node_key.

ENDCLASS.

* Implementação da classe de eventos

CLASS duploclique IMPLEMENTATION.

  METHOD handle_node_double_click.

    RODAPE = node_key.

  ENDMETHOD.

ENDCLASS.

* Chama evento em um ponto particular do programa.
CLASS cl_gui_cfw DEFINITION LOAD.

* Instacia da classe eventos.
DATA eventos TYPE REF TO duploclique.

START-OF-SELECTION.

* Cria objeto da classe
  CREATE OBJECT Eventos.

  CALL SCREEN 100.

MODULE STATUS_0100 OUTPUT.
*  SET PF-STATUS 'xxxxxxxx'.
*  SET TITLEBAR 'xxx'.

* Cria o SAP Tree
  IF ARVORE IS INITIAL.
    PERFORM criaArvore.
  ENDIF.

ENDMODULE.                 " STATUS_0100  OUTPUT

MODULE USER_COMMAND_0100.

* Declara variavel de captura do evento
  DATA: return_code TYPE i.

* chama o evento.

  CALL METHOD cl_gui_cfw=>dispatch
    IMPORTING
      return_code = return_code.

* Caso nennhum evento seja detectado limpa OK_CODE.
  IF return_code <> cl_gui_cfw=>rc_noevent.

    CLEAR g_ok_code.
    EXIT.

  ENDIF.

  CASE g_ok_code.

* Termina o programa e destroi os componentes
    WHEN 'BACK'.
      IF NOT DISCO IS INITIAL.

        CALL METHOD DISCO->free
          EXCEPTIONS
            cntl_system_error = 1
            cntl_error        = 2.

        CLEAR DISCO.
        CLEAR ARVORE.

      ENDIF.
      LEAVE PROGRAM.

  ENDCASE.

* Limpa o ok_code
  CLEAR g_ok_code.

ENDMODULE.

FORM criaArvore.

* Declara eventos
  DATA: event TYPE cntl_simple_event,
          events TYPE cntl_simple_events.

* Cria Objeto da classe SAP Tree
  CREATE OBJECT ARVORE
    EXPORTING
      NODE_SELECTION_MODE = cl_simple_tree_model=>node_sel_mode_single
    EXCEPTIONS
      illegal_node_selection_mode = 1.

* Cria objeto Custom Control
  CREATE OBJECT DISCO
    EXPORTING
      CONTAINER_NAME = 'DISCO'.

  CALL METHOD ARVORE->CREATE_TREE_CONTROL
    EXPORTING
      PARENT = DISCO.

* Adicona nodes

  PERFORM adicionaNodes.

* Cria eventos
  event-eventid = cl_simple_tree_model=>eventid_node_double_click.
  event-appl_event = 'X'.              " process PAI if event occurs

* Adiciona Eventos
  APPEND event TO events.

* Registra Eventos
  CALL METHOD ARVORE->set_registered_events
    EXPORTING
      events                    = events
    EXCEPTIONS
      illegal_event_combination = 1
      unknown_event             = 2.


* Adicina eventos na classe da aplicação para capturar evento duplo clique
  SET HANDLER eventos->handle_node_double_click FOR ARVORE.


  CALL METHOD ARVORE->EXPAND_NODE
    EXPORTING
      NODE_KEY = 'Root'.


ENDFORM.

FORM adicionaNodes.

* Insere node principal

  CALL METHOD ARVORE->ADD_NODE
    EXPORTING
      NODE_KEY = 'Root'
      ISFOLDER = 'X'
      TEXT     = 'Discografia'.

* Insere nodes para as bandas

  CALL METHOD ARVORE->ADD_NODE
    EXPORTING
      node_key          = 'BANDA1'
      relative_node_key = 'Root'
      relationship      = cl_simple_tree_model=>relat_last_child
      isfolder          = 'X'
      text              = 'Beatles'.

  CALL METHOD ARVORE->ADD_NODE
    EXPORTING
      node_key          = 'BANDA2'
      relative_node_key = 'Root'
      relationship      = cl_simple_tree_model=>relat_last_child
      isfolder          = 'X'
      text              = 'Rolling Stones'.

* Insere Nodes para os Albuns

  CALL METHOD ARVORE->ADD_NODE
    EXPORTING
      node_key          = 'ALBUM1'
      relative_node_key = 'BANDA1'
      relationship      = cl_simple_tree_model=>relat_last_child
      isfolder          = 'X'
      text              = 'Please, Please Me'.


  CALL METHOD ARVORE->ADD_NODE
    EXPORTING
      node_key          = 'ALBUM2'
      relative_node_key = 'BANDA2'
      relationship      = cl_simple_tree_model=>relat_last_child
      isfolder          = 'X'
      text              = 'The Rolling Stones'.

* Insere nodes para o Album 1

  CALL METHOD ARVORE->ADD_NODE
    EXPORTING
      node_key          = 'MUSICA1'
      relative_node_key = 'ALBUM1'
      relationship      = cl_simple_tree_model=>relat_last_child
      isfolder          = ''
      text              = 'I Saw Her Standing There'.


  CALL METHOD ARVORE->ADD_NODE
    EXPORTING
      node_key          = 'MUSICA2'
      relative_node_key = 'ALBUM1'
      relationship      = cl_simple_tree_model=>relat_last_child
      isfolder          = ''
      text              = 'Misery'.

  CALL METHOD ARVORE->ADD_NODE
    EXPORTING
      node_key          = 'MUSICA3'
      relative_node_key = 'ALBUM1'
      relationship      = cl_simple_tree_model=>relat_last_child
      isfolder          = ''
      text              = 'Anna (Go to Him)'.

  CALL METHOD ARVORE->ADD_NODE
    EXPORTING
      node_key          = 'MUSICA4'
      relative_node_key = 'ALBUM1'
      relationship      = cl_simple_tree_model=>relat_last_child
      isfolder          = ''
      text              = '...'.

*  Insere node para o Album 2

  CALL METHOD ARVORE->ADD_NODE
    EXPORTING
      node_key          = 'MUSICA5'
      relative_node_key = 'ALBUM2'
      relationship      = cl_simple_tree_model=>relat_last_child
      isfolder          = ''
      text              = 'Route 66'.

  CALL METHOD ARVORE->ADD_NODE
    EXPORTING
      node_key          = 'MUSICA6'
      relative_node_key = 'ALBUM2'
      relationship      = cl_simple_tree_model=>relat_last_child
      isfolder          = ''
      text              = 'I Just Want to Make Love to You'.

  CALL METHOD ARVORE->ADD_NODE
    EXPORTING
      node_key          = 'MUSICA7'
      relative_node_key = 'ALBUM2'
      relationship      = cl_simple_tree_model=>relat_last_child
      isfolder          = ''
      text              = 'Honest I Do'.

  CALL METHOD ARVORE->ADD_NODE
    EXPORTING
      node_key          = 'MUSICA8'
      relative_node_key = 'ALBUM2'
      relationship      = cl_simple_tree_model=>relat_last_child
      isfolder          = ''
      text              = '...'.

ENDFORM.

Picture Control

Você define uma instância com referência à classe cl_gui_picture. Uma instância SAP Picture administra todas as informações relativas a uma imagem na tela. Você pode chamar os métodos desta instância para definir e alterar os atributos da imagem.

Para usar o SAP Picture, você deve ter pelo menos o conhecimento básico de ABAP Objects. Você também deve estar familiarizado SAP Control Framework.

picturecontrol

SAP Picture Control

 

Lifetime Managment

O gerenciamento da vida útil controla o tempo de vida de um controle personalizado no frontend. Quando um controle chega ao fim da sua vida útil, o sistema SAP destrói o controle automaticamente no frontend.

load_picture_from_url 

Você pode usar esse método para exibir um gráfico em formato GIF, WMF, ou em formato JPG no SAP Picture.

Screen Painter

Para usar o SAP Picture Control siga os seguintes passos:

  1. Crie um programa chamado Zpicturecontrol.
  2. Crie uma tela de numero 100 para este programa no Screen Painter.
  3. Arraste um componente Text Fiels, um componente Box, um Componente Custom Control e um PushButton.
  4. Nomeie o Custom Control como IMAGEM, nomeie os outros componentes como desejar.
  5. No componente PushButton nomeie sua propriedade function code de F_SAIR.
  6. Use a figura abaixo para montar o design de tela:

    picturecontrol-design

    SAP Picture Control – Design

  7. Na aba Element List preencha ao campo tipo OK com OK_CODE.
  8. Na aba Flow Logic crie um PBO MODULE para seu programa, apagando o caractere de comentário da linha MODULE STATUS 100 e clique duas vezes na variável STATUS 100.
  9. Salve o programa, volte para o Screen Painter e ative sua tela.
  10. Vá para o programa e utilize o código abaixo.
  11. Ative e teste o programa.

Exemplo:

Neste exemplo criamos um programa que através de um Container utiliza um componente Custom para exibir uma imagem da Web utilizando sua URL para acesso a imagem,  utilizando o objeto Abap SAP Picture Control instanciado da classe cl_gui_picture.

Abap

*&---------------------------------------------------------------------*
*& Report  ZPICTURECONTROL
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Picture Control
*&---------------------------------------------------------------------*

REPORT  ZPICTURECONTROL.

* Declara Eventos do botão
DATA: ok_code LIKE sy-ucomm,
      clique_ok LIKE sy-ucomm.

* Declara componentes

* Container
DATA imagem TYPE REF TO cl_gui_custom_container.

* Imagem
DATA figura TYPE REF TO cl_gui_picture.

* Chama a tela 100
CALL SCREEN 100.

MODULE STATUS_0100 OUTPUT.
*  SET PF-STATUS 'xxxxxxxx'.
*  SET TITLEBAR 'xxx'.

* Cria objeto do container
  CREATE OBJECT imagem
    EXPORTING
      container_name = 'IMAGEM'
      lifetime       = imagem->LIFETIME_DYNPRO.

* Cria objeto da imagem
  CREATE OBJECT figura
    EXPORTING
      parent   = imagem
      lifetime = figura->LIFETIME_DYNPRO.

* Chama imagem da url
  CALL METHOD figura->load_picture_from_url
    EXPORTING
      url   = 'https://desenvolvimentoaberto.org/wp-content/uploads/2014/04/images.jpg'
    EXCEPTIONS
      error = 1.

* limpa evento
  clique_ok = ok_code.
  CLEAR ok_code.

* Eventos dos botões ou teclas
  CASE clique_ok.

    WHEN 'F_SAIR'.
      LEAVE PROGRAM.

  ENDCASE.

ENDMODULE.                 " STATUS_0100  OUTPUT

A classe CL_ABAP_BROWSER encapsula o uso da classe CL_GUI_HTML_VIEWER. O método estático SHOW_HTML pode ser usado para exibir um arquivo HTML em uma caixa de diálogo. Dados externos, neste caso, uma imagem carregada a partir do Repositório MIME ou um endereço da web, pode ser passado e exibido. Os eventos SAPEVENT também podem ser manuseados pelo desenvolvedor.

É possível exibir um arquivo HTM,  XML ou uma URL usando os métodos estáticos da classe CL_ABAP_BROWSER.

htmlbrowser

SAP – Browser

 

Exemplo:

Neste exemplo criamos uma variável String contendo o código Html e a exibimos como em um browser.

Abap

*&---------------------------------------------------------------------*
*& Report  ZHTML
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& SAP HTML Browser
*&---------------------------------------------------------------------*

REPORT  ZHTML.

* Classe html Browser
CLASS HtmlBrowser DEFINITION.

  PUBLIC SECTION.

    CLASS-METHODS Browser.

  PRIVATE SECTION.

    TYPES: pict_line(1022) TYPE x,
           pict_tab TYPE STANDARD TABLE OF pict_line .

    CLASS-DATA pict TYPE pict_tab.

    CLASS-METHODS get_pict_tab
     IMPORTING
       mime_url TYPE csequence
     EXPORTING
       pict_tab TYPE STANDARD TABLE .

ENDCLASS.

* Implementação html browser
CLASS HtmlBrowser IMPLEMENTATION.

  METHOD Browser.

    " Declara variaveis para a pagina html
    DATA html_pagina   TYPE string.
    DATA titulo      TYPE cl_abap_browser=>title.
    DATA ext_data   TYPE cl_abap_browser=>load_tab.
    DATA ext_line   TYPE cl_abap_browser=>load_tab_line.
    DATA error_list TYPE cl_abap_browser=>html_table.

    FIELD-SYMBOLS <error> LIKE LINE OF error_list.

    titulo = 'Desenvolvimento Aberto'.

    get_pict_tab( EXPORTING mime_url = ''
                  IMPORTING pict_tab = pict ).

    ext_line-name = 'PICT.GIF'.
    ext_line-type = 'image'.

    GET REFERENCE OF pict INTO ext_line-dref.
    APPEND ext_line TO ext_data.

    " Cria pagina html
    html_pagina =
      '<html>' &&
      '<body>' &&
      '<H1><font SIZE=5 color="#000080">HTML - SAP</font></H1>' &&
      '<h3>Desenvolvimento Aberto</h3>' &&
      'Abap - Java - C++ - C# - Python - JavaScript - Transact, PL, DB2 SQL ...' &&
      '<br><img src="https://desenvolvimentoaberto.org/wp-content/uploads/2014/02/can-stock-photo_csp116670342.jpg" >' &&
      '<h4>Cl_Abap_Browser<h4>' &&
      'A classe CL_ABAP_BROWSER classe encapsula o uso da classe CL_GUI_HTML_VIEWER.' &&
      '<p>O método estático SHOW_HTML pode ser usado para exibir um arquivo HTML em uma caixa de diálogo.</p>' &&
      '<p>Dados externos, neste caso, uma imagem carregada a partir do Repositório MIME, pode ser passado e exibido.</p>'  &&
      '</body>' &&
      '</html>'.

    " Exibe pagina html
     cl_abap_browser=>show_html(
      EXPORTING
        html_string = html_pagina
        title       = titulo
        buttons     = cl_abap_browser=>navigate_html
        format      = cl_abap_browser=>landscape
        size        = cl_abap_browser=>medium
        data_table  = ext_data
      IMPORTING
         html_errors = error_list ).

  ENDMETHOD.

  " Manipula imagens da pagina.
  METHOD get_pict_tab.

    DATA pict_wa   TYPE xstring.
    DATA length   TYPE i.
    DATA mime_api TYPE REF TO if_mr_api.

    mime_api = cl_mime_repository_api=>get_api( ).
    mime_api->get( EXPORTING i_url = mime_url
                   IMPORTING e_content = pict_wa
                   EXCEPTIONS OTHERS = 4 ).

    IF sy-subrc = 4.
      RETURN.
    ENDIF.

    CLEAR pict_tab.

    length = xstrlen( pict_wa ).

    WHILE length >= 1022.

      APPEND pict_wa(1022) TO pict_tab.
      SHIFT pict_wa BY 1022 PLACES LEFT IN BYTE MODE.
      length = xstrlen( pict_wa ).

    ENDWHILE.

    IF length > 0.
      APPEND pict_wa TO pict_tab.
    ENDIF.

  ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

* Inicializa Browser
  HtmlBrowser=>BROWSER( ).

Custom Control

É um controle personalizado que reserva uma área em uma tela. Você pode cria-los no Screen Painter, e, como todos os outros objetos de tela, eles têm um nome único. Você usa controles personalizados para incorporar controles. Um controle é um componente de software no servidor de apresentação, que pode ser tanto um controle ActiveX ou um JavaBean, dependendo do SAPgui que você estiver a utilizando. Eles permitem que você execute tarefas, como edição de textos, localmente no servidor de apresentação. O controle é impulsionado pela lógica do aplicativo, que ainda é executado no servidor de aplicativos.

Controles

Os controles são componentes de software binários independentes que podem ser reutilizados. Os desenvolvedores podem criar controles em seus aplicativos e usar as funções que eles fornecem. Normalmente, os controles são usados ​​para projetar a interface do usuário. No entanto, usando controles não se restringe a componentes necessariamente visíveis.

Screen Painter

Para usar o Custom Control siga os seguintes passos:

  1. Crie um programa chamado Zcustomcontrole.
  2. Na transação SE51 crie a tela 100 para este programa.
  3. Você pode criar um titulo e um menu opcional, este post não abrange a criação dos mesmos.
  4. Coloque 5 componentes Text Fields na tela.
  5. Coloque um componente Input/Output Field e o nomeie de CAMPO.
  6. Coloque um componente Custom Control e o nomeie de EDITOR.
  7. Use a figura abaixo para dispor os componentes na tela e preencher os textos dos componentes Text Fields:

    custom-design

    Custom Control

  8. Na aba Flow Logic da tela 100 digite o código correspondente.
  9. No programa digite o código abaixo.
  10. Ative a tela e o programa e teste.
custom-programa

Custom Control – Programa

 

Exemplo:

Neste exemplo criamos um Custom Control para um componente do próprio do NetWeaver  7 que é um editor de textos, mas você pode usar para exibir seus próprios componentes sejam eles visuais ou não.

Abap

Tela 100 – Flow Logic

PROCESS BEFORE OUTPUT.
  MODULE STATUS_0100.

PROCESS AFTER INPUT.
  MODULE CANCEL AT EXIT-COMMAND.
  MODULE USER_COMMAND_0100.

Programa – ZCustomcontrole

*&---------------------------------------------------------------------*
*& Report  ZCUSTOMCONTROLE
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Custom Control
*&---------------------------------------------------------------------*

REPORT  ZCUSTOMCONTROLE.

* Declara eventos para os botões e teclas
DATA: ok_code LIKE sy-ucomm,
      clique_ok LIKE sy-ucomm.

* Declara componentes
DATA: init,
      container TYPE REF TO cl_gui_custom_container,
      editor    TYPE REF TO cl_gui_textedit.

DATA: evento_tab TYPE cntl_simple_events,
      evento     TYPE cntl_simple_event.

* Declara tabela interna
DATA: linha(256),
      texto_tab LIKE STANDARD TABLE OF linha,
      campo LIKE linha.

* Classe de manipulação de eventos
* Evento baseados em HOT KEYS (teclas)

* Declaração da classe
CLASS event_handler DEFINITION.

  PUBLIC SECTION.
    METHODS: handle_f1 FOR EVENT f1 OF cl_gui_textedit
                       IMPORTING sender,
             handle_f4 FOR EVENT f4 OF cl_gui_textedit
                       IMPORTING sender.
ENDCLASS.

* Declaração da implementação
CLASS event_handler IMPLEMENTATION.
  METHOD handle_f1.

    DATA row TYPE i.

    MESSAGE i888(sabapdocu) WITH 'Disparado evento F1'.

    CALL METHOD sender->get_selection_pos
         IMPORTING from_line = row.

    CALL METHOD sender->get_line_text
         EXPORTING line_number = row
         IMPORTING text = campo.

    CALL METHOD cl_gui_cfw=>set_new_ok_code
         EXPORTING new_code = 'F1'.

    CALL METHOD cl_gui_cfw=>flush.

  ENDMETHOD.

  METHOD handle_f4.

    DATA row TYPE i.

    MESSAGE i888(sabapdocu) WITH 'Disparado evento F4'.

    CALL METHOD sender->get_selection_pos
         IMPORTING from_line = row.

    CALL METHOD sender->get_line_text
         EXPORTING line_number = row
         IMPORTING text = campo.

    CALL METHOD cl_gui_cfw=>flush.

  ENDMETHOD.

ENDCLASS.

* Declara eventos

DATA handle TYPE REF TO event_handler.

* Inicio da seleção
START-OF-SELECTION.

* Adiciona texto na tabela interna

  linha = '--------------------------------------------------'.
  APPEND linha TO texto_tab.
  linha = 'Desenvolvimento Aberto'.
  APPEND linha TO texto_tab.
  linha = 'Area de texto'.
  APPEND linha TO texto_tab.
  linha = '--------------------------------------------------'.
  APPEND linha TO texto_tab.
  linha = '...'.
  APPEND linha TO texto_tab.

* Chama tela
  CALL SCREEN 100.

* Modulos - Flow Logic

MODULE status_0100 OUTPUT.

* Cria controle custom

  IF init is initial.
    init = 'X'.

    CREATE OBJECT:
           container EXPORTING container_name = 'EDITOR',
           editor    EXPORTING parent = container,
           handle.

    evento-eventid = cl_gui_textedit=>event_f1.
    evento-appl_event = ' '.                     "system event

    APPEND evento TO evento_tab.
    evento-eventid = cl_gui_textedit=>event_f4.
    evento-appl_event = 'X'.                     "application event

    APPEND evento TO evento_tab.

    CALL METHOD: editor->set_registered_events
                 EXPORTING events = evento_tab.

    SET HANDLER handle->handle_f1
                handle->handle_f4 FOR editor.

  ENDIF.

  CALL METHOD editor->set_text_as_stream
              EXPORTING text = texto_tab.

ENDMODULE.

MODULE cancel INPUT.

  LEAVE PROGRAM.

ENDMODULE.

MODULE user_command_0100 INPUT.

* limpa evento
  clique_ok = ok_code.
  CLEAR ok_code.

* Eventos dos botões ou teclas
  CASE clique_ok.

    WHEN 'INSERT'.
      CALL METHOD editor->get_text_as_stream
                  IMPORTING text = texto_tab.

    WHEN 'F1'.
      MESSAGE i888(sabapdocu) WITH 'F1 - Evento do sistema'.

    WHEN OTHERS.
      MESSAGE i888(sabapdocu) WITH 'Evento da aplicação - Recorta o texto'.
      CALL METHOD cl_gui_cfw=>dispatch.

  ENDCASE.

ENDMODULE.

SubScreenArea

É um componente da categoria de elementos complexos de tela do Screen Painter que permite marcar uma área da tela que será substituída por uma sub-tela em tempo de execução. Uma SubScreenArea permite que você tenha um efeito de painéis sobrepostos uns aos outros.

Screen Painter

Para usar o componente SubScreenArea siga os seguintes passos:

  1. Crie um programa chamado Zsubscreen.
  2. Na transação Se51 crie a tela numero 100, está será sua tela principal.
  3. A tela principal contém um Text Field, um Box, um SubScreenArea e um PushButton.
  4. Para o botão coloque o function code F_SAIR e nomeie o SubScreenArea de SSA1, nomeie os outros componentes da tela como desejar.
  5. Disponha os elementos como no layout abaixo:

    subscreen-100

    Tela – 100

  6. Crie a tela 110 com o tipo de tela da aba Attributes: SubScreen.
  7. Para esta coloque 2 Text Fields, um Box, e um PushButton.
  8. Nomeie o Box de SSA1 e insira o function code do botão de F_S1A, nomeie os outros componentes como desejar.
  9. Use a figura abaixo para o design:

    subscreen-110

    Tela – 110

  10. Crie a tela 120 com o tipo de tela da aba Attributes: SubScreen.
  11. Para esta coloque 2 Text Fields, um Box, e um PushButton.
  12. Nomeie o Box de SSA1 e insira o function code do botão de F_S2V, nomeie os outros componentes como desejar.
  13. Use o seguinte Layout:

    subscreen-120

    Tela – 120

  14. Ative todas as telas.
  15. Na tela 100 use o código abaixo para o Flow Logic.
  16. Use o código abaixo para o programa.
  17. Ative e teste o programa.

Exemplo:

Neste exemplo criamos um programa básico  de 3 telas com 2 sub telas e fazemos este programa se comportar como um Wizard sobrepondo os painéis de acordo com a necessidade do programador.

Abap

Flow Logic – Tela 100

PROCESS BEFORE OUTPUT.
 MODULE STATUS_0100.
CALL SUBSCREEN SSA1 INCLUDING sy-repid painel.
*
PROCESS AFTER INPUT.
 MODULE USER_COMMAND_0100.
CALL SUBSCREEN SSA1.

Programa- ZSubScreen

*&---------------------------------------------------------------------*
*& Report  ZSUBSCREEN
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Sub Screens - Painéis
*&---------------------------------------------------------------------*

REPORT  ZSUBSCREEN.

* Declara eventos dos botões
DATA: ok_code TYPE sy-ucomm,
      clique_ok TYPE sy-ucomm.

* Cria componente Painel (SubScreens)
DATA painel(4) TYPE n VALUE '0110'.

* Chama tela 100
CALL SCREEN 100.

MODULE STATUS_0110 OUTPUT.
* Crie um menu para este programa.
*  SET PF-STATUS 'xxxxxxxx'.
*  SET TITLEBAR 'xxx'.

ENDMODULE.                 " STATUS_0110  OUTPUT

MODULE USER_COMMAND_0100 INPUT.

* Previne OK_CODE de sujeiras PAI
clique_ok = ok_code.
CLEAR ok_code.

* Eventos dos botões
CASE clique_ok.

  WHEN 'F_SAIR'.
   LEAVE PROGRAM.

  WHEN 'F_S1A'.
    painel = '0120'.

  WHEN 'F_S2V'.
    painel = '0110'.

ENDCASE.

ENDMODULE.                 " USER_COMMAND_0100  INPUT

Ícones de status são elementos de visualização que você pode usar para representar o estado de um programa graficamente. Em princípio, você pode usar qualquer um dos ícones disponíveis no SAP GUI, mas a escolha deve ser limitada a ícones especificados para esta finalidade.

Você só pode criar ícones de status no Screen Painter. Quando você cria um ícone, você atribui um nome e um campo de tela para ele. Este campo de tela é conhecido como um campo de status. O comprimento visível do campo de tela determina a quantidade de espaço que o ícone pode ocupar na tela. Assim como o próprio ícone, você também pode colocar um texto no campo.

Screen Painter

Para criar um ícone de status siga os seguintes passos:

  1. Cria um programa chamado Zicones.
  2. No Screen Painter crie uma tela com o numero de 100.
  3. Coloque um componente Box, um componente Text Field, um componentes Status Icon e um componente PushButton.
  4. Use a imagem abaixo para criar o Layout:

    icone_design

    Status Icon – Design

  5. Nomeie o Status Icon de MEU_ICONE.
  6. Nomeie os outros componentes como desejar.
  7. Preencha a aba Flow Logic da sua tela com o código abaixo.
  8. Ative sua tela.
  9. Digite o código para o programa de acordo com o programa abaixo.
icone_programa

Statu Icon – Programa

 

Exemplo

Neste exemplo usamos o conteúdo dos valores dos campos são alterados no evento PAI, e consequentemente um novo ícone é definido no caso no evento PBO.

Abap

Aba – Flow Logic

PROCESS BEFORE OUTPUT.
  MODULE set_icone.

PROCESS AFTER INPUT.
   MODULE cancelar AT EXIT-COMMAND.
   MODULE mudar.

Programa – Zicones

*&---------------------------------------------------------------------*
*& Report  ZICONES
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Status Icons
*&---------------------------------------------------------------------*

REPORT  ZICONES.

* Declara variaveis 
DATA value TYPE i VALUE 1.

* Declara Componente e propriedades
DATA: MEU_ICONE TYPE icons-text,
       icone_nome(20) TYPE c,
       icone_texto(100) TYPE c.

* Chama a tela
CALL SCREEN 100.

MODULE set_icone OUTPUT.

* Você pode criar um menu para este programa
  "SET PF-STATUS 'xxx'.

* Define as propriedades do componente
  CASE value.
     WHEN 1.
       icone_nome = 'ICON_GREEN_LIGHT'.
       icone_texto =  'Icone verde - Ação esta correta'.
     WHEN 2.
       icone_nome = 'ICON_YELLOW_LIGHT'.
       icone_texto =  'Icone amarelo - Ação esta imcompleta'.
     WHEN 3.
       icone_nome = 'ICON_RED_LIGHT'.
       icone_texto = 'Icone vermelho - Ação esta errada'.
   ENDCASE.

* Executa ação do componente
  CALL FUNCTION 'ICON_CREATE'
        EXPORTING
             name                  = icone_nome
             text                  = icone_texto
             info                  = 'Status'
             add_stdinf            = 'X'
        IMPORTING
             result                = MEU_ICONE
        EXCEPTIONS
             icon_not_found        = 1
             outputfield_too_short = 2
             OTHERS                = 3.

ENDMODULE.

* Fecha o programa
MODULE cancelar INPUT.
   LEAVE PROGRAM.
 ENDMODULE.

* Muda o status das propriedades do componente
MODULE mudar.
   CASE value.
     WHEN 1.
       value = 2.
     WHEN 2.
       value = 3.
     WHEN 3.
       value = 1.
   ENDCASE.
ENDMODULE.

Um menu de contexto ou um menu pop-up é um menu em uma interface gráfica do usuário (GUI) que aparece em cima de interação do usuário, como uma operação de clique com o botão direito do mouse. Um menu de contexto oferece um conjunto limitado de opções que estão disponíveis no estado atual, ou contexto, do sistema operacional ou aplicativo. Normalmente, as opções disponíveis são as ações relacionadas com o objeto selecionado.

Os menus de contexto foram introduzidos no ambiente Smalltalk do computador Xerox Alto, onde eram chamados menus pop-up. O sistema operacional NEXTSTEP desenvolveu a ideia, incorporando a funcionalidade em que o botão do meio ou o da direita traziam o menu principal na posição do mouse, eliminando a necessidade de mover o ponteiro por toda a tela. Esse menu principal era vertical e mudava de acordo com o texto da operação do sistema.

ContextMenu

Em Abap um menu de contexto é considerado um elemento complexo da coleção de componentes do Netweaver 7. Um menu de contexto não é um componente que você arrasta em uma tela no Screen Painter, mas sim um evento de cada componente dentro do Screen Painter chamado:

  • ON_CTMENU_seunomedemenu

É também composto de um Status de GUI onde você cria um menu do tipo menu de contexto e da instrução Abap, FORM chamando o evento ON_CT_MENU_seunomedemenu de cada componente e atribuído a um Status de GUI. É possível criar um menu dinâmico usando a classe cl_ctmenu para instanciar um novo objeto de menu e usar seus métodos para manipular o novo menu.

Criando um Menu de Contexto

Para criar um menu de contexto precisamos de vários objetos Abap e você já deve ter o conhecimento de como criar um menu, criar um titulo, criar uma tela e criar o OK_CODE.

  1. Entre na transação SE38 e crie um programa chamado ZCONTEXTMENU.
  2. Entre na transação SE41 e crie um Status de tela chamado MENU_100 e crie o menu DA_MENU e a função SAIR.
  3. Crie um menu de contexto chamado CONTEXT_MENU_1  e cria as funções FUNCAO1, FUNCAO2 e FUNCAO3.
  4. Crie um titulo chamado TITULO100.
  5. Ative os dois menus e o titulo
  6. Entre na transação SE51 e crie um layout, o PBO_Module Status_100 e o campo OK_CODE e use a figura abaixo para referencia:

    menucontexto_layout

    Tela 100 – Layout

  7. Coloque um componente Box e nomeie corretamente e em sua propriedade ON_CTMENU_, coloque CONTEXTO1.
  8. Coloque cada componente TextField e os nomeie como quiser.
  9. Nomeie cada Input/Output Field de CAIXA1, CAIXA2, CAIXA3 e CAIXA4.
  10. No componente CAIXA4, em sua propriedade ON_CTMENU_, coloque CONTEXTO1.
  11. Coloque um botão e em sua function code coloque SAIR.
  12. Ative a tela e volte para a transação SE38 e escreva o código abaixo.
menucontexto

ContextMenu – Programa

 

Exemplo:

Neste exemplo criamos um status de Gui para o menu DA_TELA contento a função SAIR, um Status de GUI para o menu de contexto CONTEXT_MENU_1 contento 3 funções e criamos uma tela 100 para os componentes como mostra a figura de layout acima. Para cada função criamos uma ação, não se esqueça de preencher o campo tipo OK com o nome OK_CODE na aba Element List da tela 100 e também de criar o PBO_MODULE para o Status_100 na aba Flow Logic.

Obs: O componente Box associado a um menu de contexto faz todos os componentes dentro dele herdarem o menu.

Abap

*&---------------------------------------------------------------------*
*& Report  ZCONTEXTMENU
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Menu de Contexto / Popup Menu
*&---------------------------------------------------------------------*

REPORT  ZCONTEXTMENU.

* Declara componentes Input/Output field
DATA: CAIXA1 TYPE STRING,
      CAIXA2 TYPE STRING,
      CAIXA3 TYPE STRING,
      CAIXA4 TYPE STRING.

* Delcara variavel que captura o nome do programa
DATA: prog TYPE sy-repid.

* Delclara Eventos dos botões
DATA: ok_code TYPE sy-ucomm,
      clique_ok TYPE sy-ucomm.

* Alimenta variavel
prog = sy-repid.

* Chama a tela 100
CALL SCREEN 100.

* Modulo de Saida da tela
MODULE STATUS_0100 OUTPUT.

  " Chama o menu da tela e o Titulo
  SET PF-STATUS 'MENU_100'.
  SET TITLEBAR 'TITULO100'.

* Limpa o evento contra possiveis sujeiras
 clique_ok = ok_code.
  CLEAR ok_code.

* Cria Eventos dos botões
  CASE clique_ok.
    WHEN 'FUNCAO1'.
      CAIXA1 = CAIXA4.

   WHEN 'FUNCAO2'.
      CAIXA2 = CAIXA4.

   WHEN 'FUNCAO3'.
      CAIXA3 = CAIXA4.

    WHEN 'SAIR'.
      LEAVE PROGRAM.
  ENDCASE.

ENDMODULE.                 " STATUS_0100  OUTPUT

* Cria o Evento on click do menu de contexto referenciando o evento
* declarado no componente e o menu criado no Menu Painter
FORM on_ctmenu_contexto1 USING l_menu TYPE REF TO cl_ctmenu.
  CALL METHOD:l_menu->load_gui_status
                        EXPORTING program = prog
                                  status  = 'CONTEXT_MENU_1'
                                  menu    = l_menu.
ENDFORM.

Table Controls

Controles de tabela são usados para exibir grandes quantidades de dados em tabelas. Como todos os elementos da tela, eles são definidos no Screen Painter. Dentro de um controle de tabela, você pode exibir campos de entrada / saída, botões de rádio, caixas de seleção, grupos de botões de rádio e botões comuns. Você pode ter até 255 colunas e cada coluna pode ter um título. A primeira linha é sempre a linha de cabeçalho.

Elementos Complexos

A Sap classifica o Table Control como um elemento complexo da coleção de componentes do Screen Painter, na verdade o Table Control se comparado a componentes equivalentes de outras linguagens de programação e não precisa ser tão moderna assim, diria que o Table Control é no mínimo confuso e incompleto e concordando plenamente com a afirmação da própria Sap, é muito complexo do ponto de vista de um componente, quando digo incompleto não é por falta de funcionalidades, digo incompleto pela necessidade de vários tipos de interações e de outros componentes ou código auxiliar para que seja funcional.

O Table Control pode ser usado para manipular dados de uma tabela do banco de dados ou dados inseridos em tempo de execução, caso o desenvolvedor precise de uma grade para expô-los. O ponto é que Table Control não sabe determinar sozinho de qual fonte os dados estão sendo fornecidos, nem mesmo se você atribui-lo a uma tabela diretamente do Screen Painter usando o botão para acesso ao dicionário de dados, o Table Control preenche os dados de estrutura da tabela dentro do componente mas não sabe como usa-los, isto o torna um dos componentes menos intuitivos do Screen Painter, confirmando esta afirmação pelo próprio componente possuir a opção de um Wizard para ser usado.

Deste modo o Table Control não possui um padrão  quanto a conectividade do banco de dados ele deve ser usado obrigatoriamente através de uma tabela interna, estando desconectado do set de dados, necessita de um componente externo para efetuar o controle de suas linhas de dados, o componente MARK, que possuir o tamanho de um caractere e precisa ser referenciado dentro do componente Table Control.

O Table Control exige varias linhas de comandos para manipular seus  dados e depois guarda-los definitivamente em uma tabela do banco de dados, ao contrario de outros componentes do Screen Painter como o Input/Output Field que se conectam diretamente ao set dados e não é preciso uma tabela interna para manipula-los. Apesar de não ser usual em Abap alterar os dados de componentes sem uma tabela interna, mas é totalmente possível:

O código abaixo mostra um comando Open SQL que executa o conceito de componentes atrelados a um Dataset:

INSERT INTO SPFLI VALUES SPFLI.

Este comando funciona com Input/Output Field conectado ao dicionário de dados, porque o componente esta ligado ao set de dados e cursor do banco dados sabe exatamente qual row o usuário esta manipulando, este comando seria equivalente em outras linguagens de programação à seguinte sintaxe:  SPFLI.POST.

Exemplo: https://desenvolvimentoaberto.wordpress.com/2014/03/16/visual-menu-painter-abap-development-workbench-abap/

Como podemos ver o Table Control não segue o padrão do componente Input/Output Field de como se conecta ao banco de dados, mas é um componente funcional e  que possui toda a magnitude da empresa SAP, quando se é gasto varias linhas de código para programa-lo.

Screen Painter.

Para usar um componente Table Control siga os seguintes passos:

  1. Crie um programa chamado Zcontrole.
  2. Crie uma tela para este programa com o numero de 100.
  3. No layout da tela coloque um Table Control e mude seu nome para TCTRL.
  4. Clique no botão do dicionário de dados e escolha a tabela FLIGHTS.
  5. Selecione todos os campos da tabela e clique em Ok.
  6. Solte os campo dentro do componente Table Control.

    tablecontrol

    Layout – Table Control

  7. Na aba Flow Logic digite o código abaixo.
  8. No programa Zcontrole digite o código abaixo referente ao programa.
  9. Por default no NetWeaver a tabela Flights não contem dados, use o programa Zvoos para inserir dados para teste.

    tablecontrol_programa

    Programa

Exemplo:

Neste exemplo usamos um Table Control apenas para ler os dados de uma tabela e usamos alguns recursos de Scrolling do componente, você pode criar um Menu para esta tela para as funcionalidades do programa.

Abap

Screen 100 – Flow Logic

PROCESS BEFORE OUTPUT.
  MODULE status_0100.
   LOOP WITH CONTROL flights.
    MODULE fill_table_control.
  ENDLOOP.

PROCESS AFTER INPUT.
  MODULE cancel AT EXIT-COMMAND.
  LOOP WITH CONTROL flights.
    MODULE read_table_control.
  ENDLOOP.
  MODULE user_command_0100.

Programa – ZControle

*&---------------------------------------------------------------------*
*& Report  ZCONTROLE
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Table Control
*&---------------------------------------------------------------------*

REPORT  ZCONTROLE.

* Controle precisa ser chamado antes da tabela
CONTROLS TCTRL TYPE TABLEVIEW USING SCREEN 100.

* Cria eventos
DATA:  ok_code TYPE sy-ucomm,
       clique_ok TYPE sy-ucomm.

* Cria tabela interna
DATA: itab TYPE TABLE OF flights,
      fill TYPE i.

* Cria tabela
TABLES flights.

* define linhas e limites do controle
DATA: lines TYPE i,
      limit TYPE i.

* Seleciona dados da tabela para a tabela interna
SELECT * FROM flights INTO CORRESPONDING FIELDS OF TABLE itab.

* chama a tela
CALL SCREEN 100.

MODULE status_0100 OUTPUT.

   "SET PF-STATUS 'SCREEN_100'.

   " Retorna quantidade de linha de uma tabela interna
   DESCRIBE TABLE itab LINES fill.
   tctrl-lines = fill.

 ENDMODULE.

MODULE fill_table_control OUTPUT.

   " Preenche a tabela
   READ TABLE itab INTO flights INDEX tctrl-current_line.

 ENDMODULE.

" Sai do programa
MODULE cancel INPUT.

     LEAVE PROGRAM.

 ENDMODULE.

MODULE read_table_control INPUT.

   lines = sy-loopc.
   MODIFY itab FROM flights INDEX tctrl-current_line.

 ENDMODULE.

MODULE user_command_0100 INPUT.

   clique_ok = ok_code.
   CLEAR ok_code.

   CASE clique_ok.

     WHEN 'NEXT_LINE'.
       tctrl-top_line = tctrl-top_line + 1.
       limit = fill - lines + 1.
       IF tctrl-top_line > limit.
          tctrl-top_line = limit.
       ENDIF.

    WHEN 'PREV_LINE'.
      tctrl-top_line = tctrl-top_line - 1.
       IF tctrl-top_line < 0.
         tctrl-top_line = 0.
       ENDIF.

    WHEN 'NEXT_PAGE'.
      tctrl-top_line = tctrl-top_line + lines.
      limit = fill - lines + 1.
       IF tctrl-top_line > limit.
        tctrl-top_line = limit.
      ENDIF.

    WHEN 'PREV_PAGE'.
      tctrl-top_line = tctrl-top_line - lines.
      IF tctrl-top_line < 0.
         tctrl-top_line = 0.
       ENDIF.

    WHEN 'LAST_PAGE'.
      tctrl-top_line =  fill - lines + 1.

    WHEN 'FIRST_PAGE'.
      tctrl-top_line = 0.

   ENDCASE.

ENDMODULE.

Programa – Zvoos

*&---------------------------------------------------------------------*
*& Report  ZVOOS
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Insere Voos - tabela flights
*&---------------------------------------------------------------------*

REPORT  ZVOOS.

TABLES FLIGHTS.

DATA MATRIZ  TYPE FLIGHTS.

DELETE FROM FLIGHTS.

MATRIZ-ID = 00001.
MATRIZ-DAT ='20140330'.
MATRIZ-PILOT = 'MARIO BRIGADEIRO'.
MATRIZ-COPILOT = 'RONALDO ARANTES'.
MATRIZ-ATTEND1 = 'LUANA ALMEIDA'.
MATRIZ-ATTEND2 = 'LIVIA STEIN'.
MATRIZ-ATTEND3 = 'CAMILLA ARRANTES'.
MATRIZ-ATTEND4 = 'PATRICIA CARVALHO'.

INSERT INTO FLIGHTS VALUES MATRIZ.

MATRIZ-ID = 00002.
MATRIZ-DAT ='20140330'.
MATRIZ-PILOT = 'ARMANDO RODRIGUES'.
MATRIZ-COPILOT = 'CESAR MAURO'.
MATRIZ-ATTEND1 = 'PRICILA MOUTA'.
MATRIZ-ATTEND2 = 'ROBERTA HELENA'.
MATRIZ-ATTEND3 = 'PAULA NUNES'.
MATRIZ-ATTEND4 = 'MARIA OLIVEIRA'.

INSERT INTO FLIGHTS VALUES MATRIZ.

MATRIZ-ID = 00003.
MATRIZ-DAT ='20140330'.
MATRIZ-PILOT = 'PAULO RICARDO'.
MATRIZ-COPILOT = 'PEDRO PAULO'.
MATRIZ-ATTEND1 = 'MARA MOTA'.
MATRIZ-ATTEND2 = 'OLIVIA SANTOS'.
MATRIZ-ATTEND3 = 'CARLA PEREIRA'.
MATRIZ-ATTEND4 = 'SABRINA LAURA'.

INSERT INTO FLIGHTS VALUES MATRIZ.

WRITE : / 'Dados gravados com sucesso.'.

 

Visual – TabStrip – Screen Painter – Abap

Publicado: 26 de março de 2014 em Abap

Um controle TabStrip é um objeto de tela que consiste em duas ou mais páginas. Cada página da guia consiste em um título da guia e uma área de página. Se a área ocupada pelo controle TabStrip é muito estreita para exibir todos os títulos das guias, aparece uma barra de rolagem, o que lhe permite alcançar os títulos que não são exibidos. Há também um botão que lhe permite exibir uma lista de todos os títulos de tabulação.

Não se pode negar que o SAP R/3  possui tecnologia de ponta em muitos aspectos, mas quando você começa a se aprofundar em Abap, você nota que a linguagem possui varias funções marcadas como obsoletas pelo próprio fabricante e apesar dos contínuos investimentos da SAP em tecnologia de ponta como por exemplo dominar a tecnologia de nuvens no qual a SAP hoje é líder mundial, podemos ver claramente que ela deixou estacionado a construção ou um upgrade dos componentes visuais, principalmente se comparado com a tecnologia de outras linguagens de programação. Manter a compatibilidade com versões anteriores tudo bem e é muito comum, mas como podemos ver o TabStrip é um dos componentes visuais mais confusos da coleção de objetos Abap.

Existem dois modos de usar o TabStrip, paginando no SAPgui ou no Application Server:

Sap Gui

Você precisa atribuir uma  SubScreenArea separado para cada título da guia, e definir os códigos de função dos títulos das guias com o tipo P (função GUI local). Na lógica de fluxo de tela, você deve chamar todos as telas do evento PBO. Isso significa que todas as páginas de guia residem localmente no SAPgui.

Application Server

Uma SubScreenArea é compartilhada por todos os títulos das guias e chamado no evento PBO. Você define os códigos de função dos títulos das guias individuais sem um tipo de função especial. Quando o usuário escolhe uma página da guia, o evento PAI é acionado, e você deve incluir um módulo em sua lógica de fluxo que ativa a página de guia apropriada e atribui a subtela correta para a área de subtela.

Screen Painter

Neste ponto supomos que você já saiba criar uma tela no Screen Painter , para criar um programa usando uma TabStrip siga os passos abaixo:

  1. Crie um programa chamado Ztab na transação SE38.
  2. Na transação SE51, crie uma tela no Screen Painter com o numero 100 para o programa Ztab e crie um PBO Module Main Program, e na aba Flow Logic digite o primeiro código abaixo, salve o programa.
  3. Volte para a transação SE51 e  clique em Layout e insira na tela um TabStrip e para cada aba insira um componente SubScreenArea, use a figura abaixo:

    tabstrip100

    Screen 100

  4. Nomeie a TabStrip de TABSTRIP, cada Aba de TAB1 e TAB2, function codes de F_TAB1 e F_TAB2.
  5. Nomeie cada SubScreenArea de SUBS1 e SUBS2 e ligue respectivamente cada campo Ref Field de cada aba com sua SubScreenArea.
  6. Crie uma nova Screen Painter tipo SubScreen para o programa Ztab com o numero 200, e crie seu layout como na figura abaixo:

    tabstrip200

    Screen 200

  7. Crie uma nova Screen Painter tipo SubScreen para o programa Ztab com o numero 300, e crie seu layout como na figura abaixo:

    tabstrip300

    Screen 300

  8. Ative todas as telas e volte para a SE38 e complete o código com o programa abaixo.

Exemplo:

Neste exemplo criamos uma TabStrip do lado do SAPgui e passamos o valor de um campo para outro através de uma sub-tela para uma sub-tela usando o evento onclick da guia do TabStrip. Uma dica é testar a logica de funcionamento do TabStrip no código da aba Flow Logic da tela 100, se você comentar as chamadas das sub-telas do PAI (Process After Input) não é possível passar os valores entre as guias.

Abap

Screen 100 – Flow logic

PROCESS BEFORE OUTPUT.
 MODULE STATUS_0100.
   CALL SUBSCREEN SUBS1 INCLUDING SY-REPID '200'.
   CALL SUBSCREEN SUBS2 INCLUDING SY-REPID '300'.
*
PROCESS AFTER INPUT.
MODULE USER_COMMAND_0100.
  CALL SUBSCREEN SUBS1.
  CALL SUBSCREEN SUBS2.

Programa – Ztab

*&---------------------------------------------------------------------*
*& Report  ZTAB
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& TabStrip
*&---------------------------------------------------------------------*

REPORT  ZTAB.

" Declara variaveis para os eventos
DATA OK_CODE LIKE SY-UCOMM.
DATA CLIQUE_OK LIKE SY-UCOMM.

" Declara componentes
DATA TEXTO1 TYPE STRING.
DATA TEXTO2 TYPE STRING.

" Declara controle do tabstrip
CONTROLS TABSTRIP TYPE TABSTRIP.

" Chama as telas
CALL SCREEN 100.
CALL SCREEN 200.
CALL SCREEN 300.

" Inicia PBO modulo 100
MODULE STATUS_0100 OUTPUT.
*  SET PF-STATUS 'xxxxxxxx'.
*  SET TITLEBAR 'xxx'.

" Limpa o evento contra possiveis sujeiras PAI
CLIQUE_OK = OK_CODE.
CLEAR OK_CODE.

" Verifica eventos dos botões - uma guia é igual a um botão
CASE CLIQUE_OK.
  WHEN 'F_TAB1'.
    TABSTRIP-ACTIVETAB = 'F_TAB1'.
    TEXTO1 = TEXTO2.
  WHEN 'F_TAB2'.
    TABSTRIP-ACTIVETAB = 'F_TAB2'.
    TEXTO2 = TEXTO1.
  WHEN 'F_SAIR'.
    LEAVE PROGRAM.
ENDCASE.

ENDMODULE.                 " STATUS_0100  OUTPUT