Estou escrevendo esta postagem de blog para demonstrar como podemos estruturar um relatório ABAP de forma orientada a objetos que nos ajude a resolver um problema da vida real. Quero afirmar, em primeiro lugar, que não acredito que meu exemplo abranja todas as melhores práticas de POO, mas é uma tentativa honesta de um programador ABAP procedural fazer a transição para o mundo orientado a objetos.
A solicitação era criar um relatório que ajudasse a conciliar lançamentos em aberto de um parceiro comercial entre si. O parceiro comercial estava configurado no sistema com os papéis de Cliente e Fornecedor. Portanto, o propósito do nosso programa é encontrar se foram gerados lançamentos contábeis para um parceiro comercial tanto como cliente quanto como fornecedor e se o valor total desses lançamentos é zero. Portanto, você pode entender que se encontrarmos tais lançamentos, devemos conciliá-los executando o código de transação FB05.
Os lançamentos contábeis deveriam ser conciliados de acordo com um dos seguintes critérios:
-
ZUONR - Atribuição
-
XREF2 - Chave de referência 2
-
XBLNR - Referência
A imagem abaixo mostra a tela de seleção de nosso programa personalizado:
Organizei meu código de forma semelhante ao Padrão de Objeto MCV e digo semelhante, porque minhas três classes não fazem exatamente o que se espera se seguirmos estritamente esse padrão.
Então, criei essas três classes para ajudar na lógica do programa:
-
lcl_read_data
--> Lê lançamentos em aberto para fornecedores e clientes e salva os dados lidos nos atributos de instância
mt_bsik
(Fornecedores) e
mt_bsid
(Clientes)
-
lcl_process_data
--> Usa a classe anterior como um atributo de instância para ter acesso aos dados do cliente e do fornecedor. A classe então combina os dados dessas duas fontes e identifica quais linhas podem ser conciliadas entre si. Por fim, se o usuário não tiver executado um teste, esses itens identificados são excluídos através do código de transação FB05. Após todo o processamento, os dados são salvos no atributo de instância
mt_total
.
-
lcl_display_data
--> Usa a classe lcl_process_data como um atributo de instância para ter acesso aos dados processados e exibi-los em um ALV.
Criei o objeto principal ZFI_PAREGGIO_CLNT_FORN e alguns Includes para modularizar o programa. Abaixo, o código deste objeto:
&----------------------------------------------------------------------*
REPORT zfi_pareggio_clnt_forn.
INCLUDE zfi_pareggio_clnt_forn_top.
INCLUDE zfi_pareggio_clnt_forn_sel.
INCLUDE zfi_pareggio_clnt_forn_def.
INCLUDE zfi_pareggio_clnt_forn_imp.
INCLUDE zfi_pareggio_clnt_forn_form.
INITIALIZATION.
DATA(gt_list) = VALUE vrm_values(
( key = 'ZUONR' text = TEXT-t01