Como gerar um wrapper de BAPI com ACO_PROXY
Tutorial passo a passo da ACO_PROXY: como gerar um wrapper de BAPI/FM, liberar para o cloud (C1) e consumir a partir do seu código ABAP
Este post é o "como fazer". A discussão de quando vale usar wrapper (depois de descartar BO Interface e APIs released) está no pilar: Pare de cravar BAPI na especificação: BO Interface, API e wrappers no S/4HANA Cloud .
Quando esse caminho faz sentido
Resumo de uma linha: quando a BAPI/FM clássica que você precisa não tem BO Interface nem API released equivalente, e mesmo assim você precisa chamá-la a partir de código ABAP Cloud (strict mode). Trate como dívida técnica — no dia em que a SAP liberar o objeto, troca.
Pré-requisitos
S/4HANA 2022/2023 (Private Edition ou on-premise) com Developer Extensibility habilitada e as SAP Notes da
ACO_PROXYaplicadas.A FM/BAPI alvo precisa ser RFC-enabled ("Módulo de Acesso Remoto"). Se não for, contorna com uma FM Z — passo logo abaixo.
Nesses casos é bom criar um pacote global para que fique acessível para demais processos
E se a FM não for RFC-enabled?
Muita função standard é local — a ACO_PROXY não aceita. Solução é criar uma "casca" Z RFC-enabled e usar essa:
Crie um Function Group Z.
Dentro dele, crie uma Function Module Z marcada como Módulo de Acesso Remoto (RFC).
Replique exatamente os parâmetros da FM standard (nome do parâmetro e tipos). Seja consistente com a nomenclatura do projeto.
No código-fonte da FM Z, só faça a chamada da FM standard repassando os parâmetros. Nada mais.
É essa FM Z que entra na
ACO_PROXYno próximo passo.
Passo 1 — Reserve o nome da classe na SE24
Antes de abrir a ACO_PROXY, vá na SE24 e:
Crie uma classe com o nome final do wrapper (ex.:
Z_WRP_J_1B_NFE_CREATFROMDATA).Ative.
Apague a classe ali mesmo, na SE24.
O motivo é reservar o nome no pacote/transporte correto. A ACO_PROXY vai gerar a classe definitiva, com esse mesmo nome, no passo seguinte.
Passo 2 — Abra a ACO_PROXY e preencha os três campos principais
Get Metadata:
locally.Function Modules (1): a FM que será encapsulada (no exemplo:
BAPI_J_1B_NF_VREATEFROMDATA). Se foi você que criou uma FM Z no item anterior, é ela aqui.Create:
Class.Name of Proxyclass (2): o mesmo nome que você reservou na SE24 (ex.:
Z_WRP_J_1B_NFE_CREATFROMDATA).Package (3): seu pacote de wrappers (ex.:
Z_WRAPPERS).Create Interface e Create Factory Class: desmarcados.
Passo 3 — Marque as opções obrigatórias
Em Options, deixe ligado:
✅ Pass Destination via Constructor — obrigatório no Public Cloud / BTP. A destination chega via
IF_RFC_DESTno construtor da classe.✅ Class-Based Exceptions — troca as exceptions clássicas pelas
cx_aco_*, que você trata normalmente em ABAP Cloud.✅ Do not Create Shadows of C1 Released Types — evita tipos duplicados.
✅ C1 Release — libera a classe gerada para consumo a partir de código cloud. É o ponto central de tudo isso.
Mantenha desmarcadas: Create Retrieve Result Method, Add Keep Task Option, bgRFC, Classic Exceptions, Bapi Exceptions.
Passo 4 — Enter, e a classe está pronta
Enter na ACO_PROXY e ela gera a classe wrapper com C1 release no pacote informado. Ative, atribua a um transporte e tá feito: você tem uma classe consumível a partir de código ABAP Cloud.
Consumindo o wrapper
O construtor recebe a destination, e o método público da classe tem o mesmo nome da FM que você embrulhou. O esqueleto fica assim:
TRY.
DATA(lo_wrap) = NEW z_wrp_j_1_b_nf_createfromdata( io_dest = lo_dest ).
lo_wrap->bapi_j_1_b_nf_createfromdata(
EXPORTING
" parâmetros de export da FM original
IMPORTING
" parâmetros de import da FM original
).
CATCH cx_aco_application_exception INTO DATA(lx_app).
" erro de negócio retornado pela FM
CATCH cx_aco_system_failure INTO DATA(lx_sys).
" erro de sistema
CATCH cx_aco_communication_failure INTO DATA(lx_com).
" erro de comunicação
ENDTRY.Os nomes de parâmetro são exatamente os da FM original (ou da sua FM Z, se você foi pelo caminho da casca). A ferramenta entrega tudo tipado.
Fechando
Wrapper feito não é fim de história. Anota o nome dele numa lista de "trocar quando sair o objeto released" e revisa a cada release da SAP — uma BAPI sem successor hoje pode ganhar um BO Interface amanhã. E, se a função que você precisa não aparecer em lugar nenhum (nem BO Interface, nem API, nem na lista de classic APIs aprovadas para wrapping), registra a necessidade na SAP Customer.
Comentários 0
Ainda sem comentários
Seja o primeiro a comentar este artigo.
Entre na conversa
Faça login para deixar seu comentário neste artigo.