O que é Logical Database

Uma vez em um projeto, especifiquei um programa para impressão de cheques (isso foi quando quase fui para o lado negro do SAP, quando quase migrei para área funcional de FI). Como os requisitos para impressão do cheque fugia da solução standard da SAP, então havia necessidade de se alterar o programa standard.

Analisando o programa, descobrimos que ele usada uma coisa obscura chamada logical database. Foi aí que meus problemas começaram. Como naquela época não estava muito interessado em expandir meus conhecimentos em ABAP, mas sim em FI, não fui pesquisar mais, então era obscuro para mim também.

O programador então, como também não conhecia do babado e não queria aprender, disse que o uso de logical database deixava o programa muito complexo (sic) e  que seria melhor criar um novo programa do zero.

Em resumo, isso me deu uma baita dor de cabeça, porque o novo programa demorou muito para ficar pronto, pois o standard era muito complexo.

Por isso sempre fugi de LDBs até que um dia tive enfrentá-lo e ai descobri o quanto eu estava errado pensando que era complicado. Mas somos assim mesmo, se não conhecemos não quer dizer que é complicado,  mas que é desconhecido!

O que é LDB

Os LDBs nada mais são do que uma representação hierarquica de algumas tabelas transparentes que já estão no sistema. LDBs são lógicos e não fisicos, isso quer dizer que não é um outro banco de dados separado, mas apenas uma maneira de representá-lo e consultá-lo.

As tabelas que estão no LDB têm necessariamente um relacionamento 1 para N, como mostrado abaixo:

Perceba que as 4 tabelas possuem relacionamento hierárquico, ou seja para cada registro da SCARR temos N de SPFLI e assim por diante.

Usando o LDB

Para usarmos um LDB num programa, primeiro precisamos dizer para o Runtime que estamos baseando nosso programa em um LDB. Fazemos isso nos atributos do programa:

No programa, somente precisamos invocar os eventos GETs. Rode o programa abaixo e veja o resultado:

REPORT  zfldb_example            .

NODES: spfli, sflight, sbook.

INITIALIZATION.
MOVE 'DL' TO carrid-low.
MOVE  'I' TO carrid-sign.
MOVE 'EQ' TO carrid-option.
APPEND carrid.

START-OF-SELECTION.
FORMAT COLOR COL_TOTAL.
WRITE:  / 'START-OF-SELECTION'.
SKIP 1.

END-OF-SELECTION.
FORMAT COLOR COL_TOTAL.
WRITE:  / 'END-OF-SELECTION'.
SKIP 1.

GET spfli.
WRITE: /(9) 'GET SPFLI' COLOR COL_HEADING INTENSIFIED .
FORMAT RESET.
WRITE: 27   spfli-carrid,
spfli-connid.

GET sflight.
WRITE: /9(11) 'GET SFLIGHT' COLOR COL_GROUP INTENSIFIED OFF.
FORMAT RESET.
WRITE: 34 sflight-fldate.

GET sbook.
WRITE: /19(9) 'GET SBOOK' COLOR COL_NORMAL INTENSIFIED  .
FORMAT RESET.
WRITE: 43 sbook-bookid .

GET sflight LATE.
WRITE: /9(16) 'GET SFLIGHT LATE' COLOR COL_GROUP INTENSIFIED OFF.

GET spfli LATE.
WRITE: /(14) 'GET SPFLI LATE' COLOR COL_HEADING INTENSIFIED.

Repare como o programa ficou curto!

Funcionamento do LDB

O Runtime é quem chama esses eventos. Ele chama os eventos, como se tivessemos loops de SELECT…ENDSELECT aninhados:

SELECT spfli

<chama evento GET SPFLI>

SELECT sflight

<chama evento GET SFLIGHT>

SELECT sbook

<chama evento GET SBOOK>

ENDSELECT

ENDSELECT

ENDSELECT

Medo do LDB?!

Voltando ao problema de impressão de cheques, isso poderia ter sido resolvido de maneira muito simples. Era somente necessário encontrar o nó e inserir a nossa lógica.

Num próximo post, vou comentar sobre o programa que está por trás do LDB, inclusive mostrar que não é somente um banco lógico, mas também um rostinho bonito 😉 , ou seja, podemos especificar telas de seleção no LDB.