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 legadoMigrar?Por que
User Function isolada (utilitario)SimGanha tipagem e classes
Ponto de EntradaNao por enquantoFramework MVC ainda espera AdvPL
Web Service WSDL legadoSIMREST decorators muito melhor
Rotina batch / JOBAvaliarAsync ajuda em IO; nao em SQL puro
MVC customizado completoAguardarSuporte 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

Veja também