Evolução do AdvPL para o Protheus

TOTVS Language
Plus Plus

A linguagem moderna do ecossistema TOTVS. Orientação a objetos completa, tipagem forte, namespaces e integração REST nativa — tudo que o AdvPL precisava para o desenvolvimento contemporâneo.

255 caracteres para nomes
OOP orientação a objetos completa
100% compatível com AdvPL
Role para explorar

A próxima geração do
desenvolvimento TOTVS

TLPP (TOTVS Language Plus Plus) é uma evolução da linguagem AdvPL, criada para trazer paradigmas modernos de programação ao ecossistema TOTVS. Mantendo total compatibilidade retroativa, a linguagem introduz tipagem forte, orientação a objetos completa e recursos que aumentam significativamente a produtividade e qualidade do código.

Utilizada principalmente no Protheus, o ERP da TOTVS, o TLPP usa a extensão .tlpp e se integra ao módulo tlppCore para desenvolvimento de APIs REST, testes automatizados e expressões regulares. AdvPL e TLPP coexistem no mesmo projeto, permitindo migração gradual sem ruptura.

🔄
Retrocompatível AdvPL e TLPP convivem no mesmo projeto sem conflitos
Curva de aprendizado curta Sintaxe familiar para quem já conhece AdvPL
🏢
Focada no ERP Projetada para customizações robustas no Protheus
saudacao.tlpp
// TLPP — sintaxe moderna e expressiva
Namespace MeuProjeto

Class Saudacao
  Private cNomeDestinatario as Character

  Method New(cNome as Character) Constructor
  Method Saudar() as Character
EndClass

Method New(cNome as Character) Class Saudacao
  ::cNomeDestinatario := cNome
Return Self

Method Saudar() Class Saudacao
  Local cMensagem as Character
  cMensagem := "Olá, " + ::cNomeDestinatario + "!"
Return cMensagem

O que o TLPP oferece

Recursos modernos que elevam a qualidade e produtividade no desenvolvimento para o Protheus

Nomes Longos

Identifique funções, variáveis e classes com até 255 caracteres, eliminando a limitação histórica de 10 do AdvPL para código autodocumentado.

Produtividade

Tipagem Forte

Declaração explícita de tipos com verificação em compilação. Erros de type mismatch geram exceções, impedindo que problemas cheguem à produção.

Segurança

Orientação a Objetos

OOP completa: encapsulamento com private/protected/public, métodos estáticos, interfaces e sobrecarga de operadores.

Arquitetura

Namespaces

Organize bibliotecas e evite colisões de nomes com namespaces hierárquicos. Importe com using namespace ou prefixe diretamente.

Organização

Try / Catch

Tratamento de exceções nativo e intuitivo. Capture e trate erros de forma elegante sem comprometer o fluxo da aplicação com blocos Begin Try...Catch.

Robustez

JSON Nativo

Crie e manipule estruturas JSON diretamente com a classe JsonObject. Sem parsers externos ou conversões manuais para integrar com APIs.

Integração

Parâmetros Nomeados

Chame funções especificando parâmetros por nome, tornando o código mais legível e eliminando erros de posicionamento em funções com muitos argumentos.

Legibilidade

Annotations & Reflection

Metaprogramação com annotations em classes e funções para mapeamento automático de rotas REST, e reflection para inspeção dinâmica de tipos em runtime.

Avançado

AdvPL vs TLPP

Veja o que evoluiu na nova geração da linguagem TOTVS

Recurso AdvPL TLPP
Tamanho máximo de nomes 10 caracteres 255 caracteres
Tipagem Fraca (apenas avisos) Forte (exceções)
Namespaces Não suportado Suportado
Encapsulamento OOP Apenas public Private / Protected / Public
Interfaces Não suportado Suportado
Métodos estáticos Não suportado Suportado
Try / Catch nativo Não Sim
JSON nativo Manual / Externo Nativo (JsonObject)
Parâmetros nomeados Não suportado Suportado
Annotations & Reflection Não suportado Suportado
REST nativo (tlppCore) Não Sim
Extensão de arquivo .prw / .prg .tlpp
Arquivos de cabeçalho .ch .th

TLPP em ação

Explore exemplos práticos que demonstram o poder da linguagem

Nomes descritivos + Tipagem forte No AdvPL, nomes eram limitados a 10 caracteres e a tipagem não gerava erros em compilação. O TLPP resolve ambos.
calculo_financeiro.tlpp
// AdvPL — nomes limitados a 10 chars, sem declaração de tipos
// Function CalcJrs(nPrc, nTx, nPrd)  <-- ilegível!

// TLPP — nomes descritivos até 255 chars + tipagem forte
Function CalcularJurosCompostos( nPrincipal   as Numeric, ;
                                   nTaxaMensal  as Numeric, ;
                                   nTotalMeses  as Numeric ) as Numeric

  Local nMontanteFinal as Numeric

  nMontanteFinal := nPrincipal * ( (1 + nTaxaMensal / 100) ** nTotalMeses )

Return nMontanteFinal

// Chamada com parâmetros nomeados — muito mais legível!
Local nResultado as Numeric
nResultado := CalcularJurosCompostos( nPrincipal  := 10000, ;
                                         nTaxaMensal := 1.5,   ;
                                         nTotalMeses := 12    )
Orientação a Objetos completa Classes com encapsulamento real (private/protected/public), construtores tipados e namespaces hierárquicos.
conta_bancaria.tlpp
Namespace Financeiro.Conta

Class ContaBancaria

  Private nSaldo   as Numeric
  Private cTitular as Character

  Method New(cNome as Character, nSaldoInicial as Numeric) Constructor
  Method Depositar(nValor as Numeric) as Logical
  Method Sacar(nValor as Numeric)     as Logical
  Method GetSaldo()                    as Numeric

EndClass

Method New(cNome, nSaldoInicial) Class ContaBancaria
  ::cTitular := cNome
  ::nSaldo   := nSaldoInicial
Return Self

Method Sacar(nValor) Class ContaBancaria
  If nValor > ::nSaldo
    Return .F.  // Saldo insuficiente
  EndIf
  ::nSaldo -= nValor
Return .T.
Tratamento de erros + JSON nativo Exceções estruturadas com Begin Try...Catch e manipulação de JSON diretamente pela classe JsonObject.
integracao_json.tlpp
Function BuscarDadosDoCliente(nCodigoCliente as Numeric) as Character

  Local oRespostaJson  as Object
  Local cJsonResultado as Character := ""

  Begin Try

    // JSON nativo — sem bibliotecas externas
    oRespostaJson := JsonObject():New()
    oRespostaJson["codigo"]     := nCodigoCliente
    oRespostaJson["sistema"]    := "Protheus"
    oRespostaJson["data"]       := DToS(Date())
    oRespostaJson["processado"] := .T.

    cJsonResultado := oRespostaJson:ToJson()

  Catch oErro as Object

    // Tratamento estruturado de exceções
    ConOut("Erro: " + oErro:Description)
    cJsonResultado := '{"erro": true}'

  End Try

Return cJsonResultado
REST APIs com tlppCore Annotations como @Get e @Post mapeiam rotas HTTP diretamente no Protheus, sem configuração adicional.
api_clientes.tlpp
#include "tlpp-rest.th"

Namespace MeuSistema.API

// Annotation mapeia automaticamente a rota HTTP GET
@Get("/api/clientes/{nCodigo}")
Function EndpointBuscarCliente(nCodigo as Numeric) as Character

  Local oResposta as Object
  oResposta := JsonObject():New()

  Begin Try

    oResposta["codigo"]  := nCodigo
    oResposta["nome"]    := BuscarNomeCliente(nCodigo)
    oResposta["ativo"]   := .T.
    oResposta["sistema"] := "Protheus"

    oRest:SetStatus(200)

  Catch oErro as Object

    oResposta["erro"]     := .T.
    oResposta["mensagem"] := oErro:Description
    oRest:SetStatus(500)

  End Try

Return oResposta:ToJson()

tlppCore — O framework do TLPP

Módulo integrado que expande as capacidades do TLPP para aplicações modernas no Protheus

REST APIs

Desenvolva endpoints REST completos diretamente no Protheus com suporte a annotations (@Get, @Post, @Put, @Delete), controle de threads e middleware de autenticação.

  • Annotations para mapeamento de rotas
  • Controle de threads de requisição
  • Serialização JSON automática

PROBAT

Framework de testes automatizados integrado ao TLPP. Escreva testes unitários e de integração para garantir a qualidade das customizações do Protheus de forma profissional e rastreável.

  • Testes unitários e de integração
  • Assertions expressivas
  • Relatórios de cobertura de testes

Expressões Regulares

Suporte nativo a regex para validação e manipulação avançada de strings. Valide CPF, CNPJ, e-mails e formatos de dados sem dependências externas.

  • Validação de formatos e padrões
  • Busca e substituição avançada
  • Parsing de strings complexas
Comece hoje

Pronto para migrar para o TLPP?

A transição é gradual e sem ruptura. AdvPL e TLPP convivem no mesmo projeto — comece migrando um arquivo por vez e aproveite os novos recursos progressivamente.