Patrocinado por
Patrocinado por Inetum

Mesh e remexe

images/thumbnail.jpg - Thumbnail

O ABAP 7.4 trouxe uma série de novidades aplaudidas. Mas de todas, aquela em que menos se fala é o novo tipo de dados MESH. Vamos ver aqui quão injusto é tê-lo votado ao abandono.

O que é

O MESH permite definir relações entre várias tabelas internas à semelhança do que as chaves externas fazem nas bases de dados relacionais.

Como

Funciona assim: primeiro defines o tipo de dados, depois crias a MESH e popula-a e finalmente usas a dita para aceder a registos das tabelas internas.

Define-a

O MESH faz referência a tipos de tabela interna e estes têm de estar definidos.

TYPES ty_t_bkpf TYPE SORTED TABLE OF bkpf
  WITH UNIQUE KEY bukrs gjahr belnr.
TYPES ty_t_bseg TYPE SORTED TABLE OF bseg
  WITH UNIQUE KEY bukrs gjahr belnr buzei.

DATA t_bkpf TYPE ty_t_bkpf.
DATA t_bseg TYPE ty_t_bseg.

TYPES:
  BEGIN OF MESH ty_mesh
    bkpf TYPE ty_t_bkpf ASSOCIATION my_bseg TO bseg
      ON bukrs = bukrs AND gjahr = gjahr AND belnr = belnr,
    bseg TYPE ty_t_bseg ASSOCIATION my_bkpf TO bkpf
      ON bukrs = bukrs AND gjahr = gjahr AND belnr = belnr,
  END OF MESH ty_mesh.

Como se pode ver, o MESH é mais um tipo de dados. Ah, e em vez do TYPE também dá para usar o LIKE se quiseres fazer referência a tabelas internas existentes em vez de a um tipo de dados.

Instancia-a

Agora vamos declarar a variável e populá-la.

DATA m TYPE ty_mesh.
m-bkpf = t_bkpf.
m-bseg = t_bseg.

Usa-a

Em vez de usar a chave de uma tabela interna A para aceder à tabela interna B, usa-se a MESH para navegar de uma para a outra, não sendo preciso comparar explicitamente os campos chave, visto que foram já pré-definidos na declaração da MESH.

LOOP AT t_bkpf ASSIGNING FIELD-SYMBOL(<bkpf>).
  LOOP AT m-bkpf\my_bseg[ <bkpf> ] ASSIGNING FIELD-SYMBOL(<bseg>).
    count = count + 1.
    " If we didn't have it we could fetch the BKPF record like this:
    DATA(bkpf2) =  m-bseg\my_bkpf[ <bseg> ].
  ENDLOOP.
ENDLOOP.

Quanto

Mas, perguntas tu, qual é a vantagem de usar a MESH?

Bem, para começar o código fica um pouco mais simples e claro visto que a relação entre as tabelas passa a declarar-se apenas uma vez ao nível da declaração de dados em vez de ter de ser sempre estabelecida de cada vez que se quer aceder aos dados.

Mas a grande cena é mesmo a velocidade. Fiz uns testes (que partilharei em breve) e, se não me tiver enganado, a MESH é cerca de 27% mais rápida do que o clássico LOOP AT itbl WHERE. Incrível, não?

Portanto, é começar a usá-la.

Obrigado Craiyon por imaginares esta foto.

O Abapinho saúda-vos.