Receitas¶
Status: parcial — receitas ancoradas apenas em fatos citados.
[n · F]remete à fontenda lista de fontes; a letra marca a procedência: F fato em fonte oficial TOTVS/TDN · S fonte secundária (blog, fórum) · unverified sem fonte que sustente.
Escopo desta seção¶
Receitas curtas, cada uma montada só com afirmações verificadas. Onde a pesquisa não trouxe base, a receita entra como lacuna declarada em vez de "exemplo plausível".
1. Ler uma tabela do Protheus sem perder a workarea¶
Base: [54] (padrão documentado pela TOTVS), [28] (regras de filial e expurgo).
- O padrão é: salvar a área, selecionar o alias, posicionar por
xFilial() + chave, iterar comDbSkipe restaurar a área.[54 · F] - Salve com
GetArea()e restaure comRestArea();[31] filtre a filial peloxFilialda própria tabela e useD_E_L_E_T_ = ' '.[28 · F]
Os três erros que essa receita evita
Workarea não restaurada; _FILIAL comparado entre tabelas; e D_E_L_E_T_ <> '*'
no lugar de D_E_L_E_T_ = ' '.[28][31]
2. Gravar em uma tabela com lock correto¶
Base: [29][31][54].
RecLock(<alias>, .T.)cria registro em branco com lock exclusivo;(.F.)trava o registro posicionado para update.[29 · F]- Libere sempre com
MsUnLock()— esquecer deixa o registro travado para os processos padrão.[31 · F] - No
INSERT, o registro nasce com valores vazios por tipo (caractere com espaços, numérico 0, data vazia, booleano.F.) e só é definitivo ao soltar o lock.[29 · F]
3. Ponto de entrada MVC que valida antes de gravar¶
Base: [20][54][56].
- O PE do MVC é único por model e leva o ID do Model como nome — que não pode ser igual ao nome do fonte.[20 · F]
- Comece por
Local aParam := PARAMIXB; os três primeiros elementos do vetor são sempre o objeto do formulário/modelo, o ID do local de execução e o ID do formulário.[20 · F] - Para decidir o que fazer, compare o ID recebido contra os IDs de momento (
MODELPRE,MODELPOS,MODELCOMMITTTS,BUTTONBAR, …).[56 · F] - Exemplo de referência com
aClone(PARAMIXB),DbSeekpor filial + chave,RecLock/MsUnlockeReturn .T..[54 · F]
4. Expor um endpoint REST em TLPP¶
Base: [16][44].
- Inclua
tlpp-core.thetlpp-rest.th(nativos notlpp.rpo) e declare a annotation acima da função:endpointé obrigatório,descriptioné opcional.[16, 44 · F] - Use
@Get,@Post,@Put,@Deleteou@Patch.[16 · F] - Responda com
oRest:setResponse(); para erro,setStatusCode()esetFault().[16, 17 · F]
Path params com mesmo caminho base
O nome da variável é o da primeira rota registrada; nomes divergentes nas seguintes são ignorados silenciosamente.[17]
5. Consumir uma API externa com Bearer¶
Base: [27][58].
FWRest():new(cUrlBase), headers em array, e o token no cabeçalhoAuthorizationcomBearer+ access token.[27 · F]- Obtenha o token por POST no endpoint de token com
grant_type=password; o access token expira em 1 hora e o refresh em 24 horas — trate a renovação.[27 · F]
6. JSON inline em TLPP¶
Base: [14].
- Requer 17.3.0.7 ou superior.[14 · F]
local varJson := {"teste": {"var1":"oioi"}} as json, com acesso por índice:varJson['teste']['var1'].[14 · F]
7. Garantir CP-1252 antes de compilar¶
Base: [24][50].
- Os compiladores aceitam apenas CP-1252; com erro de codificação o arquivo não é salvo.[24 · F]
- Vale para
.prw,.prg,.prx,.tlpp,.ch,.aph.[50 · F] - Ferramenta do repositório: skill
utf8-to-cp1252-conversion(script em lote, sem dependências).
Lacunas declaradas¶
Lacuna: exportação para
.xlsxcomFwMsExcelXlsx— sem fonte coletada nesta passada. A skillfwmsexcelxlsx-generatorcobre o tema internamente.Lacuna: Protheus + appserver em Docker para teste local — só há blog de terceiro[36].
Lacuna: consulta ao dicionário via SQL e mapa de campos — a API
execute-sqlaparece na referência interna da skilldata-dictionary-lookup, sem fonte TOTVS coletada.
Fontes¶
[14] · [16] · [17] · [20] · [24] · [27] · [28] · [29] · [31] · [36] · [44] · [50] · [54] · [56] · [58] — ver lista completa.