Migrar AdvPL legacy para TLPP
Guia de migracao de codigo AdvPL antigo para TLPP moderno. namespace, class, async, JsonObject. O que mudar e o que manter.
TLPP (TOTVS Language Plus Plus) e a evolucao do AdvPL — mais TypeScript que Clipper. Estrutura: namespace, class, async/await, JsonObject/JsonArray, lambda. Migrar nao e tudo-ou-nada — TLPP roda lado a lado com AdvPL no mesmo RPO.
Por onde comecar
| Tipo de codigo legado | Migrar? | Por que |
|---|---|---|
| User Function isolada (utilitario) | Sim | Ganha tipagem e classes |
| Ponto de Entrada | Nao por enquanto | Framework MVC ainda espera AdvPL |
| Web Service WSDL legado | SIM | REST decorators muito melhor |
| Rotina batch / JOB | Avaliar | Async ajuda em IO; nao em SQL puro |
| MVC customizado completo | Aguardar | Suporte parcial; legado ainda padrao |
Mapping pratico — AdvPL -> TLPP
// ANTES (AdvPL)
User Function GetData(cId)
Local aRet := {}
Local cQry := "SELECT * FROM SA1 WHERE A1_COD = '" + cId + "'"
TCQuery cQry New Alias "QRY"
While !QRY->(Eof())
aAdd(aRet, {QRY->A1_COD, QRY->A1_NOME})
QRY->(DBSkip())
EndDo
QRY->(DBCloseArea())
Return aRet
// DEPOIS (TLPP)
#include "tlpp-core.th"
namespace custom.api.clientes
function GetData(cId)
Local oResultado := JsonArray():New()
Local cQry := "SELECT * FROM " + RetSqlName("SA1") + ;
" WHERE A1_COD = '" + cId + "' AND D_E_L_E_T_ = ' '"
Local oQry := tcGenQry(NIL, NIL, cQry)
Local oAlias := tcSetField(oQry, "QRY")
While !QRY->(Eof())
Local oItem := JsonObject():New()
oItem["cod"] := AllTrim(QRY->A1_COD)
oItem["nome"] := AllTrim(QRY->A1_NOME)
oResultado:Add(oItem)
QRY->(DBSkip())
EndDo
QRY->(DBCloseArea())
Return oResultado:ToJson()
Ganho principal — REST nativo
@Get("/api/v1/clientes/:id")
function getCliente(:id)
Local oRet := custom.api.clientes.GetData(:id)
oResponse:setContentType("application/json")
Return oRet
Pegadinhas da migracao
- RPO compatibility — fonte TLPP gera codigo binario que requer AppServer 12.1.220x+.
- namespace obrigatorio em TLPP — sem ele, fonte nao compila.
- Includes diferentes —
tlpp-core.the o cabecalho principal. - Suporte parcial a OO em frameworks antigos — checar versao LIB antes.
- SX3/SX2 inalterado — TLPP usa o mesmo dicionario que AdvPL.