Contratos de liberação de API: o que o C0, o C1, o C2, o C3 e o C4 garantem
Por trás de toda "API liberada" existe um contrato e uma visibilidade. Os cinco contratos, quem pode usar cada objeto, os estados de liberação, onde consultar e quem de fato impede uma mudança incompatível.
"Use só API liberada" é a regra mais repetida do ABAP Cloud e do Clean Core. Mas liberada como, para quem e com que garantia? Um objeto da SAP pode estar liberado para o ABAP Cloud e não para os apps de Key User, ou o contrário. Pode estar liberado para uso remoto e não para uso no próprio sistema. E um objeto Z liberado pela empresa não tem a mesma proteção de um objeto liberado pela SAP. Tudo isso está no contrato de liberação.
O que é um contrato de liberação
Um contrato de liberação (release contract) é uma classificação que o dono de um objeto do repositório ABAP põe nele para declará-lo API. Ele tem duas partes:
- o contrato, que diz o que não pode mais mudar no objeto e para que tipo de uso ele serve;
- a visibilidade, que diz quais versões de linguagem podem usá-lo: ABAP for Cloud Development, ABAP for Key Users ou as duas.
Sem contrato, um objeto da SAP não pode ser usado por código ABAP Cloud nem por código de Key User. É o contrato que faz de uma tabela, CDS, classe ou função uma "API liberada".
Os cinco contratos
| Contrato | Nome no ADT | O que garante | Para quem serve |
|---|---|---|---|
| C0 | Extend | Pontos de extensão estáveis: o objeto pode ser ampliado e a ampliação sobrevive ao upgrade | Quem acrescenta campos, amplia CDS, estruturas, behavior definitions e service definitions |
| C1 | Use System-Internally | Interface estável para uso dentro do mesmo sistema | Código ABAP Cloud e código de Key User |
| C2 | Use as Remote API | O mesmo do C1 e, além disso, nenhum campo pode ser alongado, para não quebrar quem consome de fora | Integrações por OData, SOAP e eventos |
| C3 | Manage Configuration Content | Persistência estável para conteúdo de configuração, editável por ferramentas próprias | Tabelas e views de configuração |
| C4 | Use in ABAP-Managed Database Procedures | Interface estável para uso em AMDP, sem nenhuma mudança permitida | Classes, interfaces e BAdIs usadas por AMDP |
O C4 é o mais novo: aparece na documentação do ABAP 7.58 (S/4HANA 2023) e não na 7.57. Num S/4HANA 2023 (SP00) medido, só quatro objetos da SAP tinham C4. O C1 é, de longe, o mais comum: é ele que decide o que o código ABAP Cloud e o código de Key User podem usar.
Visibilidade: ABAP Cloud, Key User ou os dois
Só o C0 e o C1 têm visibilidade. No C1, as duas opções são:
| Visibilidade | Quem pode usar |
|---|---|
| Use in Cloud Development | Objetos em ABAP for Cloud Development, criados no ADT |
| Use in Key User Apps | Objetos em ABAP for Key Users, criados pelos apps Fiori de extensibilidade (Custom Logic, Custom CDS Views e outros) |
As duas são independentes, e a diferença não é detalhe. Num S/4HANA 2023 (SP00) medido, os objetos da SAP liberados em C1 se dividiam assim:
| Visibilidade do C1 | Objetos |
|---|---|
| Cloud e Key User | 9.507 |
| Só Cloud | 5.101 |
| Só Key User | 10.002 |
Há mais objetos liberados só para Key User do que só para ABAP Cloud. Só entre as CDS, eram 3.429 só para Key User contra 1.031 só para Cloud. Uma CDS como I_BudgetEntryDocumentType pode ser lida por uma Custom CDS View, mas uma classe ABAP Cloud que tenta lê-la recebe "The use of CDS Entity ... is not permitted". Já os módulos de função liberados são sempre só para ABAP Cloud: a documentação diz que função não pode ser liberada para Key User.
A visibilidade é presa à versão de linguagem, não a um componente de software. Um objeto liberado para Cloud Development pode ser usado por qualquer código ABAP Cloud do sistema.
O que muda depois da liberação
Liberar é prometer estabilidade. As regras da SAP para o C1 dizem o que não pode mais mudar:
- CDS: não se tira campo, parâmetro nem associação a alvo liberado, e só se acrescentam campos que não são chave. Não se muda a caixa dos nomes nem o tratamento de mandante, e
SELECT *implícito é proibido; - classes e interfaces: a classe precisa ser final ou abstrata, com instanciação privada. Não se apaga método, não se muda de estático para instância nem se reduz a visibilidade. Parâmetro opcional novo é permitido, mas ele não pode virar obrigatório;
- módulos de função: os parâmetros não mudam, opcionais podem entrar e exceções novas não;
- dicionário: não se remove campo de estrutura ou tabela, e não se encurta domínio. Tipo de tabela não muda em nada;
- qualquer objeto C1: não pode ser apagado depois de liberado. O caminho é marcá-lo como obsoleto, com um sucessor.
O C2 acrescenta a proibição de alongar campos, e o C4 não permite mudança nenhuma.
Quem impede uma mudança incompatível
Aqui está o ponto que mais se confunde. Para os objetos da SAP, o cumprimento do contrato é verificado por checks especiais do ATC, dentro do processo de desenvolvimento da própria SAP, antes de cada entrega.
Para os objetos que a empresa libera, a proteção também é do ATC, e não da ativação. Os checks são dois:
- API_COMPATIBILITY (API Release: Compatibility of Released APIs), que compara o objeto com uma foto da API (snapshot) tirada antes, no app Manage API Snapshots, que existe também no S/4HANA on-premise. Sem a foto, ele não aponta nada;
- API_CONSISTENCY (API Release: Consistency of Released APIs), que confere as regras do contrato.
Num S/4HANA 2023 sem essa foto configurada, a ativação aceitou, num objeto Z liberado em C1:
- tirar um campo de uma CDS;
- apagar o único método público de uma classe;
- liberar uma classe
CREATE PUBLIC, contra a regra da instanciação privada; - tirar a visibilidade Key User de uma CDS já liberada.
Nenhuma dessas mudanças deu erro. Ou seja: o C1 num objeto Z é uma promessa de quem libera, e o sistema só a cobra se o ATC de compatibilidade estiver em uso. Quem libera objetos Z para outros times precisa de três coisas: um processo de aprovação, que a própria SAP recomenda, esses checks na variante do ATC e uma foto da API tirada a cada versão liberada.
Os estados de liberação e o sucessor
| Estado | O que significa |
|---|---|
| Released | Liberado: pode ser usado |
| Deprecated | Obsoleto: ainda funciona, mas deve ser trocado pelo sucessor indicado. Quem usa recebe aviso de sintaxe |
| Not to Be Released | Decisão registrada de não liberar. Pode trazer o sucessor a usar no lugar |
| Not to Be Released, Stable | Não liberado, mas mantido estável porque algo depende dele |
| Decommissioned | Desativado. Só na nuvem (Public Cloud e SAP BTP), só em C2 e depois de pelo menos 12 meses como obsoleto |
O sucessor é a parte mais útil para quem adequa código clássico. Ele aparece na própria mensagem de sintaxe: ler a tabela T001 em código ABAP Cloud dá "The use of Table T001 is not permitted. Use CDS Entity I_COMPANYCODE instead.". Um objeto pode ter mais de um sucessor: a MARA tem cinco (I_Product, I_ProductQM, I_ProductSales, I_ProductStorage_2 e I_ProductProcurement), e a escolha depende dos campos que o programa usa.
Onde consultar o estado de um objeto
- No ADT: a aba API State, nas propriedades do objeto, mostra contrato, estado, visibilidade e sucessor. Uma árvore de repositório com o filtro
api:lista os objetos por contrato (por exemploapi:USE_IN_KEY_USER_APPS). - No sistema: o programa
ABAP_DOCU_RELEASED_APISlista os objetos com contrato. A tabelaARS_W_API_STATEguarda uma linha por objeto e por contrato, com as colunasUSE_IN_SAP_CLOUD_PLATFORMeUSE_IN_KEY_USER_APPSpara a visibilidade. - No GitHub da SAP: o Cloudification Repository (
SAP/abap-atc-cr-cv-s4hc) tem um arquivo por release com os objetos liberados, os não liberados e os sucessores. O arquivo não traz contrato nem visibilidade e só lista o que é visível para ABAP Cloud. Uma CDS liberada só para Key User não aparece nele: para Key User, a fonte é o próprio sistema.
Liberar um objeto próprio
A empresa pode liberar os próprios objetos em C0 (só para Cloud Development) e em C1, com qualquer das visibilidades. A liberação é feita no ADT, pela aba API State ou pelo menu Change API State, e segue o objeto na request de transporte como um objeto próprio (R3TR APIS). O comentário escrito no assistente de liberação fica só no sistema de origem e não é transportado.
O uso mais comum é o wrapper: um objeto em ABAP padrão que usa algo não liberado e se expõe em C1 para o código ABAP Cloud de outro componente. A liberação permite o uso, mas não muda as ocorrências do próprio objeto no Clean Core. Os detalhes estão em Componentes de software no ABAP Cloud: quem pode chamar quem e em Wrapper no Clean Core: o débito se concentra, não some. A visibilidade para Key User, e o que ela abre, está em ABAP for Key Users: o que são os objetos de Key User e onde eles entram no Clean Core.
Fontes
- SAP Help, ABAP Keyword Documentation 7.58: ABAP Language Versions, Release Contracts and Released APIs, os glossários dos contratos C0 a C4 e as C1 Contract Rules for API Providers (CDS, objetos ABAP e dicionário). A versão 7.57 da mesma página, para a comparação do C4.
- SAP Help, ABAP Development Tools User Guide: Released APIs, Releasing Development Objects, as páginas de cada contrato, Deprecation e Checking the Compatibility of Released APIs.
- SAP Help, SAP BTP ABAP Environment: Software Component Dependencies e API Release Framework.
- SAP, Cloudification Repository (GitHub SAP/abap-atc-cr-cv-s4hc).
- Consultas à tabela
ARS_W_API_STATEe testes de liberação num SAP S/4HANA 2023 (SAP_BASIS 758).