r2cxsap-c4cabslauthorityreferencebusiness-rules

A Referência Definitiva de ABSL -- 6 Tipos de Template Gerados em Uma Sessão

JedIN Team2026-04-079 min de leitura

ABSL Authority

ABSL: A Linguagem Que Consultores SAP Não Podem Evitar

ABSL -- Add-On Business Script Language -- é a linguagem de script proprietária que o SAP C4C usa para lógica de negócios personalizada. Toda implementação SAP C4C de complexidade significativa requer scripts ABSL. Regras de validação que garantem qualidade de dados. Lógica de cálculo que computa campos derivados. Regras de atribuição de território que roteiam registros para a equipe de vendas correta. Lógica de deduplicação que previne registros redundantes. Workflows de aprovação que controlam processos de negócio críticos.

O problema com ABSL não é complexidade -- a linguagem em si é direta, assemelhando-se a um Java simplificado com APIs específicas do SAP. O problema é acessibilidade. A documentação ABSL está espalhada por portais SAP Help, wikis da comunidade e bases de conhecimento de consultores. A sintaxe para acessar campos de entidade, chamar APIs do sistema e tratar condições de erro varia por tipo de entidade e pelo contexto do evento no qual o script é executado. Um consultor que escreveu ABSL para Opportunities não pode necessariamente escrever ABSL para ServiceRequests sem pesquisar as diferenças de API específicas da entidade.

O R2-CX resolve isso gerando scripts ABSL completos e prontos para produção através da ferramenta c4c_generate_absl. Nesta sessão, seis scripts foram gerados cobrindo todos os seis tipos de template, cada um em aproximadamente 2 milissegundos.

Os Seis Tipos de Template

Tipo 1: Validation -- Opportunity

ToolEntityTemplate TypeStatus
c4c_generate_abslOpportunityvalidationOK

Scripts de validação aplicam regras de qualidade de dados no ponto de entrada. Eles executam quando um registro é criado ou modificado e levantam erros que impedem o salvamento se os dados não atenderem aos critérios definidos.

O script de validação de Opportunity gerado demonstra o padrão standard:

import ABSL;
import AP.CRM.Global;

var opp = this;

// Validate that expected revenue is positive when status is In Process
if (opp.LifeCycleStatusCode == "2" && opp.ExpectedRevenueAmount.GetApplicableCurrencyAmount() <= 0) {
    raise OpportunityExpectedRevenueValidation.Create("E", "Expected revenue must be greater than zero for opportunities in process.");
}

// Validate that close date is not in the past for open opportunities
if (opp.LifeCycleStatusCode == "2" && opp.ExpectedClosingDate < Context.GetCurrentLocalDate()) {
    raise OpportunityCloseDateValidation.Create("W", "Expected close date is in the past. Please update.");
}

// Validate that an owner is assigned
if (opp.OwnerPartyID.IsInitial()) {
    raise OpportunityOwnerValidation.Create("E", "An owner must be assigned before saving.");
}

O script valida três condições: receita esperada positiva para oportunidades ativas, data de fechamento futura e atribuição obrigatória de responsável. Cada validação levanta uma mensagem tipada com severidade "E" (error, bloqueia salvamento) ou "W" (warning, permite salvamento).

Tipo 2: Validation -- ServiceRequest

ToolEntityTemplate TypeStatus
c4c_generate_abslServiceRequestvalidationOK

A validação de ServiceRequest segue o mesmo padrão estrutural mas com campos específicos da entidade e regras de negócio:

import ABSL;
import AP.CRM.Global;

var sr = this;

// Validate that a customer is assigned
if (sr.BuyerPartyID.IsInitial()) {
    raise ServiceRequestCustomerValidation.Create("E", "A customer must be assigned to the service request.");
}

// Validate that category is set before escalation
if (sr.EscalationStatusCode == "2" && sr.ServiceIssueCategoryID.IsInitial()) {
    raise ServiceRequestCategoryValidation.Create("E", "Service category must be set before escalation.");
}

// Validate SLA compliance window
if (sr.RequestedFulfillmentPeriodStartDate > sr.RequestedFulfillmentPeriodEndDate) {
    raise ServiceRequestSLAValidation.Create("E", "Fulfillment start date cannot be after end date.");
}

As diferenças específicas de entidade são significativas. ServiceRequests usam BuyerPartyID enquanto Opportunities usam OwnerPartyID. Códigos de status de escalonamento diferem de códigos de status de ciclo de vida. Validação de período SLA aplica-se a serviço mas não a vendas. Essas diferenças são tratadas automaticamente pelo gerador de templates.

Tipo 3: Calculation

ToolEntityTemplate TypeStatus
c4c_generate_abslOpportunitycalculationOK

Scripts de cálculo computam valores de campos derivados com base em outros campos no registro ou registros relacionados. Eles executam em eventos de salvamento e preenchem campos que os usuários não devem inserir manualmente.

import ABSL;
import AP.CRM.Global;

var opp = this;

// Calculate weighted revenue based on probability
var probability = opp.WinningChanceProbabilityPercent;
var revenue = opp.ExpectedRevenueAmount.GetApplicableCurrencyAmount();

if (probability > 0 && revenue > 0) {
    var weightedRevenue = revenue * (probability / 100);
    opp.SetExtensionField("WeightedRevenue", weightedRevenue);
}

// Calculate days in current phase
var phaseStartDate = opp.LifeCycleStatusSetDateTime;
var today = Context.GetCurrentLocalDate();
var daysInPhase = today.SubtractDate(phaseStartDate);
opp.SetExtensionField("DaysInCurrentPhase", daysInPhase);

Scripts de cálculo evitam o erro comum do consultor de expor campos computados para entrada manual. Ao computar valores em ABSL, os dados são sempre consistentes e não podem ser sobrescritos por usuários que possam inserir valores incorretos.

Tipo 4: Territory Assignment

ToolEntityTemplate TypeStatus
c4c_generate_abslAccountterritoryOK

Scripts de atribuição de território roteiam registros para o território de vendas apropriado com base em critérios geográficos, de indústria ou de atributos da conta. Esses scripts estão entre os mais operacionalmente críticos porque atribuição incorreta de território faz com que registros fiquem invisíveis para a equipe de vendas errada.

import ABSL;
import AP.CRM.Global;

var account = this;

// Territory assignment based on country and industry
var country = account.CountryCode;
var industry = account.IndustryCode;

// Brazil - segmented by industry
if (country == "BR") {
    if (industry == "TECH" || industry == "IT") {
        account.SalesTerritoryID = "BR-TECH";
    } else if (industry == "MFG" || industry == "IND") {
        account.SalesTerritoryID = "BR-INDUSTRIAL";
    } else {
        account.SalesTerritoryID = "BR-GENERAL";
    }
}

// Default assignment for unmatched records
if (account.SalesTerritoryID.IsInitial()) {
    account.SalesTerritoryID = "UNASSIGNED";
    raise TerritoryAssignmentWarning.Create("W", "Account could not be auto-assigned. Manual territory selection required.");
}

O script de território demonstra um padrão que consultores frequentemente implementam incorretamente: o caso de fallback. Sem tratamento explícito de registros não correspondidos, contas que não se encaixam em nenhuma regra de território ficam invisíveis -- atribuídas a nenhum território e, portanto, visíveis para nenhuma equipe de vendas. O script gerado sempre inclui uma atribuição padrão explícita com uma mensagem de aviso.

Tipo 5: Deduplication

ToolEntityTemplate TypeStatus
c4c_generate_abslAccountdeduplicationOK

Scripts de deduplicação identificam e sinalizam registros potencialmente duplicados durante a criação. Eles consultam registros existentes com base em critérios de correspondência e bloqueiam a criação ou sinalizam o novo registro para revisão.

import ABSL;
import AP.CRM.Global;

var account = this;
var duplicateFound = false;

// Check for exact name match
var existingByName = Account.QueryByElements;
existingByName.AddSelectionParam("AccountName", "I", "EQ", account.AccountName);
var resultByName = existingByName.Execute();

if (resultByName.Count() > 0) {
    duplicateFound = true;
    raise AccountDuplicateCheck.Create("W", "Potential duplicate: An account with the same name already exists.");
}

// Check for matching tax ID
if (!account.TaxID.IsInitial()) {
    var existingByTax = Account.QueryByElements;
    existingByTax.AddSelectionParam("TaxID", "I", "EQ", account.TaxID);
    var resultByTax = existingByTax.Execute();

    if (resultByTax.Count() > 0) {
        duplicateFound = true;
        raise AccountDuplicateTaxID.Create("E", "Duplicate detected: An account with this Tax ID already exists. Creation blocked.");
    }
}

O script de deduplicação distingue entre correspondências suaves (mesmo nome, apenas aviso) e correspondências fortes (mesmo Tax ID, bloqueia criação). Essa abordagem graduada previne falsos positivos de bloquear criação legítima de registros enquanto ainda captura duplicatas definitivas.

Tipo 6: Approval Workflow

ToolEntityTemplate TypeStatus
c4c_generate_abslOpportunityapprovalOK

Scripts de aprovação implementam portões de processo de negócio que exigem autorização gerencial antes que um registro possa avançar para o próximo estágio do ciclo de vida.

import ABSL;
import AP.CRM.Global;

var opp = this;

// Approval required for opportunities above threshold
var revenue = opp.ExpectedRevenueAmount.GetApplicableCurrencyAmount();
var approvalThreshold = 100000;

if (revenue >= approvalThreshold && opp.LifeCycleStatusCode == "3") {
    // Status 3 = Won - requires approval for high-value deals
    if (opp.ApprovalStatusCode != "3") {
        // Approval status 3 = Approved
        raise OpportunityApprovalRequired.Create("E", "Opportunities above " + approvalThreshold.ToString() + " require manager approval before marking as Won.");
        opp.ApprovalStatusCode = "1"; // Set to Pending Approval
    }
}

O script de aprovação aplica uma regra de negócio que oportunidades de alto valor não podem ser marcadas como Won sem aprovação gerencial. O limiar é definido como uma variável para fácil ajuste, e o script tanto bloqueia a mudança de status quanto define o status de aprovação para Pending.

Características de Desempenho

MetricValue
Total tool calls6
Failed tool calls0
Pass rate100%
Average generation time~2 ms per script
Template types covered6 of 6
Entities covered3 (Opportunity, ServiceRequest, Account)

O tempo de geração de aproximadamente 2 milissegundos por script reflete o fato de que c4c_generate_absl usa templates pré-validados com injeção de parâmetros específicos da entidade em vez de gerar código do zero a cada invocação. Os templates codificam padrões que foram validados em múltiplas implementações SAP C4C.

Da Referência à Produção

Cada script gerado é pronto para produção em estrutura, mas requer customização para requisitos de negócio específicos. Os valores de limiar, códigos de território, critérios de correspondência e regras de validação são exemplos representativos que demonstram os padrões ABSL corretos. Um consultor ajustaria esses valores para corresponder aos requisitos específicos do cliente enquanto mantém os padrões estruturais -- tratamento de erros, casos de fallback, verificações de código de status -- que os templates garantem.

Esta é a proposta de valor da referência ABSL: não eliminar o trabalho do consultor, mas eliminar a pesquisa e o boilerplate que consomem a maioria do tempo de desenvolvimento ABSL. Um consultor que gasta 30 minutos pesquisando sintaxe ABSL para validação de ServiceRequest e 10 minutos escrevendo a lógica de negócio real está gastando 75% do seu tempo em trabalho que o R2-CX completa em 2 milissegundos.

Todos os seis scripts foram gerados em uma única sessão R2-CX, contra o mesmo tenant SAP C4C, com zero falhas. O log da sessão contém os parâmetros de entrada completos e scripts de saída para cada invocação, fornecendo uma referência totalmente reproduzível para qualquer projeto de desenvolvimento ABSL.

Related Articles

Fale conosco pelo WhatsApp