No ABAP e suas melhores práticas. Você sabe a diferença entre Workarea, field-symbol e Reference into?

 

Ao estudar sob boas práticas de desenvolvimento e ABAP Tuning me deparei com o seguinte comando REFERENCE INTO, porém quando fui conversar com alguns desenvolvedores e pesquisar nos fóruns percebi que este assunto não era muito conhecido, resolvi então fazer este post para apresentar esta funcionalidade.

Antes de mais nada vale lembrar que o REFERENCE INTO foi habilitado a partir do release 610. É uma forma de se trabalhar com os dados de uma tabela interna utilizando um objeto como referência, esta forma seria mais uma além das já conhecidas Workareas e Field-symbols que comumente utilizamos para esta situação, a ideia deste post é lhe apresentar mais esta forma, uma vez que a mesma pode ser desenvolvida por vocês ou pode ajudar na leitura de um debug.

 

Vamos então ver o conceito de cada uma segundo o help da SAP (https://help.sap.com):

 

WORKAREA à As workares da tabela são objetos de dados estruturados de um tipo de estrutura simples, um tipo de tabela de banco de dados ou um tipo de visualização do Dicionário ABAP, pode ser declarado usando as instruções TABLES ou NODES. Se declarado usando NODES, outros tipos de dicionário ABAP também são possíveis, vamos ver um exemplo utilizando uma tabela:

Exemplo: DATA: wl_mara TYPE mara.

 

FIELD-SYMBOLS à São espaços reservados ou nomes simbólicos para objetos de dados existentes (ou partes de objetos de dados existentes), declarados pela instrução FIELD-SYMBOLS ou pelo operador de declaração FIELD-SYMBOL. Uma área de memória é atribuída a um símbolo de campo no tempo de execução do programa. Um símbolo de campo não reserva nenhum espaço físico para um campo, mas é um tipo de rótulo dinâmico para uma área de memória hospedando um objeto de dados específico (ou parte do objeto). Um field-symbol pode ser usado em vez de objetos de dados nas posições de operandos de instruções. Quando uma declaração desse tipo é executada, uma área de memória deve ser atribuída ao símbolo de campo pela instrução ASSIGN ou pela atribuição ASSIGNING ao processar tabelas internas.

Exemplo: FIELD-SYMBOL: <fls_mara> TYPE mara.

 

REFERENCE INTO à É um ponteiro para um objeto de dados, da mesma forma que trabalhamos na orientação a objetos.

Exemplo: DATA: o_mara TYPE REF TO mara.

 

Agora que temos uma noção do que é cada uma delas podemos por fim compara-las, deste modo cada um poderá ver qual se adequa a sua necessidade de demanda. Iremos trabalhar com um exemplo simples acessando a tabela E070 com 2000 registros para ter uma base de tempo que cada uma das formas leva para efetuar o processamento.

 

Vamos ao que interessa.

REPORT  zcomparacao_w_f_r.

DATA: itl_e070 TYPE TABLE OF e070.

DATA: wl_e070 TYPE e070. “Declaração da nossa Workarea

DATA: vl_flag     TYPE flag,

vl_ini_time TYPE timestampl,

vl_fim_time TYPE timestampl,

vl_dif_w    TYPE p DECIMALS 5,

vl_dif_f    TYPE p DECIMALS 5,

vl_dif_r    TYPE p DECIMALS 5.

DATA: o_e070 TYPE REF TO e070. “Declaração do REFERENCE INTO

FIELD-SYMBOLS: <fsl_e070> TYPE e070.“Declaração do FIELD-SYMBOL

SELECT * FROM e070 INTO TABLE itl_e070 UP TO 2000 ROWS.

IF sy-subrc is INITIAL.

“Iinicio processamento WORKAREA

GET TIME STAMP FIELD vl_ini_time.

LOOP AT itl_e070 INTO wl_e070.

  IF vl_flag = ‘X’.

    wl_e070-as4user = sy-uname.

    MODIFY itl_e070 FROM wl_e070.

  ELSE.

      vl_flag = ‘X’.

  ENDIF.

ENDLOOP.

GET TIME STAMP FIELD vl_fim_time.

vl_dif_w = vl_fim_time – vl_ini_time.

“Fim processo WORKAREA

CLEAR: vl_flag,

vl_ini_time,

vl_fim_time.

* Inicio processo FIELD-SYMBOLS

GET TIME STAMP FIELD vl_ini_time.

LOOP AT itl_e070 ASSIGNING <fsl_e070>.

  IF vl_flag = ‘X’.

    <fsl_e070>-as4user = sy-uname.

  ELSE.

    vl_flag = ‘X’.

  ENDIF.

ENDLOOP.

GET TIME STAMP FIELD vl_fim_time.

vl_dif_f = vl_fim_time – vl_ini_time.

“Fim processo FIELD-SYMBOLS

CLEAR: vl_flag,

vl_ini_time,

vl_fim_time.

* Inicio Processo REFERENCE INTO

GET TIME STAMP FIELD vl_ini_time.

LOOP AT itl_e070 REFERENCE INTO o_e070.

  IF vl_flag = ‘X’.

    o_e070->as4user = sy-uname.

  ELSE.

    vl_flag = ‘X’.

  ENDIF.

ENDLOOP.

GET TIME STAMP FIELD vl_fim_time.

vl_dif_r = vl_fim_time – vl_ini_time.

* FIM processo REFERENCE INTO

WRITE: /(30) ‘Work area’, vl_dif_w.

WRITE: /(30) ‘Field-Symbol’, vl_dif_f.

WRITE: /(30) ‘Reference’, vl_dif_r.

ENDIF.

 

Segue resultado da execução deste programa:

 

Após avaliar o resultado podemos perceber que a utilização do Field-Symbol é melhor opção , isto ocorre por não alocar desnecessariamente memória como ocorre na workarea. Também é possível observar que o REFERENCE INTO é mais performático que a workarea, devido a ser uma referência de objeto,  porém o seu conceito é muito simples uma vez que é o mesmo empregado quando desenvolvemos em ABAP OO.

Mas se é simples, então porque ele não é muito utilizado? Seria por que o desenvolvedor ABAP possui pouco conhecimento OO?

 

Vale lembrar que este resultado não é estático e pode alterar de acordo com o ambiente em que está sendo executado, deixo como dica você pegar este código e executar no seu ambiente para ver o comportamento desses parâmetros.

 

 

 


Voltar