Criando templates de código no SAP Logon e no Eclipse

Há sempre aquele padrão de código que vivemos escrevendo mas ele não é exatamente reutilizável. Um LOOP com alguns IFs internos de controle… um FORM com com alguns parâmetros, alguma mensagem de erro famosa ou aquela classe básica com um construtor. Por pura preguiça de digitar tudo novamente (que já está implicitamente decorado) saímos a procura de um programa que já possui um código que podemos usar como modelo. Ah.. o CTRL+C, CTRL+V é tão prazeroso não é verdade? Não, não é. Aqui vai uma excelente dica que lhe ajudará a ganhar tempo enquanto desenvolve, seja na SE80 usando o SAP Logon ou o ABAP no Eclipse. Quer saber? Leia o resto deste post.

Templates de código

Alguns comandos em ABAP, até em versões um pouco mais antigas do SAP Logon, exibem um tooltip com o sinal de § logo após o comando. Provavelmente você já sabe que caso você for rápido o suficiente e apertar TAB, um template pré-definido de código será inserido automaticamente para você. Mas você sabe como criar novos?

code templeate abap sap logon eclipse 1 - tab

Caso você use o SAP Logon (consequentemente o tcode SE80, a segunda melhor IDE das linguagens que começam com “A”  e terminam com “BAP”) basta seguir o passo-a-passo abaixo.

Criando templates de código no SAP Logon

No canto inferior direito do editor ABAP, há um pequeno ícone amarelo com uma pasta e folha desenhada. Este botão abre a configuração do editor ABAP.

code templeate abap sap logon eclipse 3

Para evitar que você sempre tenha uma reação sobrenatural para apertar TAB, aconselho ir na item “Code Completion” no menu a esquerda e alterar consideravalmente o valor da opção “Automatically Hide Code Hints After”. Assim você terá mais tempo para pensar no que está fazendo e poder apertar TAB com um certo atraso para completar o código com um template.

code templeate abap sap logon eclipse 5

Em sequência, vá na opção “Code Templates”. É aqui que se define os templates de código. Dê uma olhada nos existentes. Como exemplo, você pode criar um template para quando você já sabe que precisará fazer um SELECT e jogar o resultado em uma tabela interna que ainda não foi criada.

Momentaneamente feche o popup e  escreva o template que você deseja em um editor aberto qualquer, como o abaixo. Note que o código não precisa ser “compilável”. Basta que ele facilite sua vida na hora de usá-lo.

 code templeate abap sap logon eclipse 6

Uma vez que o seu template seja escrito, copie-o no clipboard e volte na tela de configurações do editor, opção “Code Templates”.

Clique em adicionar e dê um nome (que você deve lembrar facilmente) e uma descrição o mais detalhada possível.

code templeate abap sap logon eclipse 8

 

code templeate abap sap logon eclipse 9

Salve e pronto! Você tem um template de código!

Para usá-lo, basta digitar o nome do template no editor (no caso, _select_into_table). Uma vez que o nome completo do template seja digitado, a descrição definida será exibida em forma de tooltip. Novamente, basta apertar TAB para que o código seja inserido de acordo com o template.

Tags

É possível também usar tags no seu template. Isso é útil quando seu template necessita de informações dinâmicas, como o dia atual ou o código do chamado que você esteja atendendo.

Para ilustrar este cenário, vamos supor que na sua empresa ninguém saiba como usar o versionador de código ABAP e por isso seja necessário incluir comentários de código como o abaixo englobando o trecho de código que precisa ser alterado.

” BEGIN OF TICKET-12345 – Date: dd/mm/aaaa

” … changed source code

” END OF TICKET-12345 – Date: dd/mm/aaaa.

code templeate abap sap logon eclipse 12

Como o número do chamado e a data atual são dinâmicas, basta incluir tags no seu template. No dropdown exibido no botão “Insert Tag” há algumas tags pré-definidas, como %DateTime%. Pelo fato de DateTime estar entre %’s, o editor irá interpretar a informação como uma variável. Conforme abaixo.

code templeate abap sap logon eclipse 14

Quando você define uma variável que o editor não é capaz de interpretar, como %Ticket ID%, um input box é exibido toda vez que o template for chamado.

code templeate abap sap logon eclipse 18

 

code templeate abap sap logon eclipse 20

 

code templeate abap sap logon eclipse 21

* Não há uma variável pré-definida para somente a data, mas fica mais fácil remover só o horário ou deixar no fonte mesmo. Na minha opinião é melhor não usar estes comentários que poluem o código e usar o versionador quando preciso… mas, tais comentários são normas em muitas empresas.

Mas é claro que o ABAP101 não vai dar uma dica como esta sem nada mais a acrescentar não é mesmo? Vamos ver como o mesmo conceito se aplica no ABAP no Eclipse para quem já está usando.

Criando templates de código no ABAP no Eclipse

O Eclipse é mais inteligente que a SE80 por isso a qualquer momento você pode apertar CRTL+SPACE para acionar a função de autocompletar. Para criar templates, vá no menu “Window” >> “Preferences”. No menu a esquerda vá em “ABAP Development” >> “Source Code Editor” >> “Templates”.

Tags

Tags (variáveis) no template de código do Eclipse são denotadas com ${variável}. Existem mais possibilidades de variáveis para quem usa o Eclipse (data, hora, ano, usuário, etc). Ao usar um template com uma variável desconhecida você preencherá seu conteúdo após o template ser inserido, sem a presença de popups portanto.

code templeate abap sap logon eclipse 22

 

Exemplos de Templates

Aqui vão alguns exemplos de templates para você adicionar no seu editor predileto (adequados ao eclipse).

class ${class_name} definition.

public section.
    methods constructor.

protected section.

private section.

endclass.

class ${class_name} implementation.

method constructor.

endmethod.

endclass.

 

*&---------------------------------------------------------------------*
& Report  ${zprogram}
*&
*&---------------------------------------------------------------------*
*& Autor: 
*& Transação:
*& Módulo:
*& Decrição:
*&---------------------------------------------------------------------*

 

class ${zcl_class_name_test} definition deferred.
class zcl_tested_global_class definition local friends ${zcl_class_name_test}.
CLASS ${zcl_class_name_test} DEFINITION FOR TESTING
  FINAL
  CREATE PUBLIC
  DURATION SHORT
  RISK LEVEL HARMLESS
.
  PUBLIC SECTION.

    METHODS mut1 FOR TESTING .
    METHODS mut2 FOR TESTING .
    METHODS mut3 FOR TESTING .

  PROTECTED SECTION.

*  GIVEN
    METHODS given_reusable
      IMPORTING
        !im_ TYPE .
    METHODS given_1.
    METHODS given_2.
    METHODS given_3.

*  WHEN
    METHODS when_mut1.

*  THEN
    METHODS then_reusable
        IMPORTING
        !im_ TYPE .
    METHODS then_1.
    METHODS then_2.
    METHODS then_3.

  PRIVATE SECTION.
    METHODS setup.
    METHODS teardown.

    DATA o_ref_to_tested_class TYPE REF TO zcl_.
    DATA o_exception TYPE REF TO zcx_ .
ENDCLASS.

CLASS ${zcl_class_name_test} IMPLEMENTATION.

  METHOD setup.
    CLEAR me->o_ref_to_tested_class.
    CLEAR me->o_exception.
  ENDMETHOD.       "setup

  METHOD teardown.

  ENDMETHOD.       "teardown

************************************************
* Methods Under Test
************************************************
  METHOD mut1.

  ENDMETHOD.                    "mut1

  METHOD mut2.

  ENDMETHOD.                    "mut2

  METHOD mut3.

  ENDMETHOD.                    "mut3

************************************************
* GIVEN
************************************************

  METHOD given_1.

  ENDMETHOD.                    "given_1

  METHOD given_2.

  ENDMETHOD.                    "given_2

  METHOD given_3.

  ENDMETHOD.                    "given_3

************************************************
* WHEN
************************************************

  METHOD when_mut1.

  ENDMETHOD.                    "when_mut1

************************************************
* THEN
************************************************
  METHOD then_reusable.

  ENDMETHOD.                    "then_reusable

  METHOD then_1.

    cl_aunit_assert=>assert_equals(
      EXPORTING
        exp                  =     " Data Object with Expected Type
        act                  =     " Data Object with Current Value
*    msg                  =     " Message in Case of Error
*    level                = CRITICAL    " Error Severity
*    tol                  =     " Tolerance Range for Floating Point Numbers
*    quit                 = METHOD    " Flow Control in Case of Error
*    ignore_hash_sequence = ABAP_FALSE    " Ignore change sequence in hash tables
*  RECEIVING
*    assertion_failed     =     " Condition not met
    ).

  ENDMETHOD.                    "then_1

  METHOD then_2.

    cl_aunit_assert=>assert_bound(
      EXPORTING
        act              =     " Reference Variable to Be Checked
*    msg              =     " Error Message
*    level            = CRITICAL    " Error Severity
*    quit             = METHOD    " Flow Control in Case of Error
*  RECEIVING
*    assertion_failed =     " Condition not met
    ).

  ENDMETHOD.                    "then_2

  METHOD then_3.
    cl_aunit_assert=>assert_not_bound(
      EXPORTING
        act              =     " Reference Variable to Be Checked
*    msg              =     " Error Message
*    level            = CRITICAL    " Error Severity
*    quit             = METHOD    " Flow Control in Case of Error
*  RECEIVING
*    assertion_failed =     " Condition not met
    ).

  ENDMETHOD.                    "then_3

ENDCLASS.

 Envie seus templates!

Caso você use templates de código, cole seus preferidos no campo de comentário. Assim, todos podem economizar tempo também! 

 

 

Fábio Pagoti

Formado em Sistemas de Informação pela Universidade de São Paulo. Comecei no mundo da programação com Java mas logo caí no mundo ABAP. Estagiei na Nestlé por 2 anos e foi lá onde conheci o Furlan. Depois de efetivado fui morar no Canadá por 1 ano onde pude aprender a área de testes em desenvolvimento de software. Hoje sou consultor e instrutor ABAP, amante de projetos Open Source, Wordpress, Data Mining e da esfera SAP. Siga-me no twitter: @fabiopagoti

Você pode gostar...

4 Resultados

  1. Aline Cristina disse:

    Que belezaaaa isso!
    Vai ajudar muito para inserir códigos simples que insistem em sumir da cabeça quando preciso!
    Obrigada pela dica!

    • Fábio Pagoti disse:

      De nada Aline.

      Quando criar templates, poste aqui em forma de comentário para outras pessoas também poderem os utilizar.

      Abraços!

  2. Ricardo Perrella disse:

    Show essa dica !
    Curti !