advpl-fundamentals
Skill1 starsChanged 6 months agoMITView on GitHub
Fundamentos ADVPL/TLPP — notação húngara (c/n/d/l/a/o/b/x), naming convention, prefixos de módulo, User Function precisa prefixo de cliente, 195 funções restritas pela TOTVS.
In this repository29 other files it gives its agents.
- advpl-advancedSkill
- advpl-code-reviewSkill
- advpl-dicionario-sxSkill
- advpl-embedded-sqlSkill
- advpl-encodingSkill
- advpl-jobs-rpcSkill
- advpl-matxfisSkill
- advpl-mvc-avancadoSkill
- advpl-mvcSkill
- advpl-pontos-entradaSkill
- advpl-tlppSkill
- advpl-webserviceSkill
- advpl-webSkill
- archSkill
- calleesSkill
- callersSkill
- doctorSkill
- findSkill
- grepSkill
- helpSkill
- ingestSkill
- initSkill
- lintSkill
- paramSkill
- plugadvpl-index-usageSkill
- reindexSkill
- setupSkill
- statusSkill
- tablesSkill
The file
We split this skill into the rules it gives an agent
1 rule. About 0 are common, 0 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 77
Use o lookup modulos_erp (carregado em /plugadvpl:init) para a lista completa.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
advpl-fundamentals — Convenções básicas ADVPL/TLPP
ADVPL (Advanced Protheus Language) e seu sucessor TLPP são linguagens proprietárias da TOTVS, derivadas do Clipper/xBase. Têm convenções fortes que não são opcionais em código de qualidade Protheus.
Quando usar
- Antes de gerar qualquer função/variável ADVPL.
- Quando o usuário pede para criar
User Function,Static Function,Main Function. - Ao revisar nomes de variáveis ou funções existentes.
- Ao decidir se um símbolo é do customer, do TOTVS padrão, ou de uma biblioteca terceira.
- Antes de chamar qualquer função "esquisita" (consulte
funcoes_restritas).
Notação húngara — obrigatória
Toda variável ADVPL começa com um prefixo de tipo (1 letra minúscula) seguido de PascalCase:
| Prefixo | Tipo | Exemplo |
c | Character (string) | cCodCli, cNomeFor |
n | Numeric | nValor, nQtd |
d | Date | dEmissao, dHoje |
l | Logical (bool) | lOk, lExiste |
a | Array | aDados, aHeader |
o | Object | oModel, oView |
b | Code block | bValid, bWhile |
x | Variant / qualquer | xValor, xParam |
u | Undefined / unknown | uRet |
Violação dispara BP-006 no lint (severidade info).
// CORRETO
Local cCodCli := "000001"
Local nValor := 1500.00
Local lOk := .T.
// ERRADO — sem prefixo, parecido com C
Local codigo := "000001"
Local valor := 1500.00Prefixo de cliente em User Function
User Function é o ponto de entrada de customização. Por convenção institucional, o nome deve começar com um prefixo de 2–3 letras do cliente para evitar colisão com customizações de outros parceiros instaladas no mesmo RPO.
// Cliente "XYZ"
User Function XYZValCli(cCod) // OK
Return .T.
// Sem prefixo — risco de sobrescrever User Function homônima de outro fornecedor
User Function ValCli(cCod) // EVITAR
Return .T.Combine com o pattern de PE: User Function MT100LOK() (PE oficial, sem prefixo cliente — exceção justificada).
Prefixos de módulo (rotinas TOTVS padrão)
Funções/rotinas oficiais TOTVS seguem padrões de prefixo por módulo. Conhecer ajuda a localizar rapidamente:
| Módulo | Código | Prefixos de função/rotina | Tabelas típicas |
| Compras | COM | MATA1, MATA12, A097, A120 | SC1, SC2, SC7, SC8 |
| Estoque | EST | MATA0, MATA2, MATA3 | SB1, SB2, SD1, SD2, SD3 |
| Faturamento | FAT | MATA41, MATA46, MA410 | SC5, SC6, SC9, SF2, SD2 |
| Financeiro | FIN | FINA, FA0, FA1 | SE1, SE2, SE5 |
| Contábil | CTB | CTBA, CTB0 | CT1, CT2, CT5, CT7 |
| Fiscal | FIS | MATA9, MTA710, SPED | SF3, SF6, CDA, CDF |
| RH | GPE | GPEA, RH | SRA, RCB, RCC |
| Manufatura | PCP | MATA6, MATA65 | SH6, SH7, SHB |
Use o lookup modulos_erp (carregado em /plugadvpl:init) para a lista completa.
Naming — funções
User Function→ customização do cliente, prefixo cliente.Static Function→ privada ao fonte, sem prefixo cliente obrigatório.Main Function→ entrypoint de JOB, scheduler, MainAdvpl.Class ... Method→ OOP (preferido em TLPP).
Toda função (incluindo Static) deveria ter cabeçalho Protheus.doc (regra BP-007, severidade info):
/*/{Protheus.doc} XYZValCli
Valida codigo do cliente conforme regra fiscal do cliente XYZ.
@type function
@author Equipe ABC
@since 2024-01-15
@param cCod, character, codigo do cliente
@return logical, .T. se valido
/*/
User Function XYZValCli(cCod)
Return AllTrim(cCod) != ""Funções restritas pela TOTVS — 195 catalogadas
TOTVS mantém uma lista de funções, classes e variáveis internas que não devem ser usadas em customização:
- Não documentadas, não suportadas.
- Podem ser removidas/alteradas sem aviso.
- Algumas têm compilação bloqueada desde release 12.1.33.
Exemplos comuns que aparecem em código legado:
MV_PAR01..MV_PARxx(useParamBox/Pergunteparametrizados em vez de leitura direta).nUsado(variável interna do framework).- Várias funções com prefixo
__ouFwk/FWinternas.
Antes de usar qualquer função "que parece nativa", consulte:
/plugadvpl:find function <nome>Se aparecer em funcoes_restritas, não use. Dispara SEC-005 (crítico) no lint.
Tipos primitivos e operadores
- Atribuição:
:=(não=). - Igualdade:
==(estrito) ou=(igualdade ADVPL, depende do contexto). - Diferente:
!=ou<>. .T./.F.— true / false.- Conversão:
cValToChar,Val,StoD(string-to-date),DtoC,DtoS.
Anti-padrões
- Nomes sem prefixo húngaro → lint
BP-006. - Declarar
Localno meio do código (depois deIf/While) → lintBP-002(crítico). - Usar
Private/PublicquandoLocalresolveria → lintBP-002b. User Functionsem prefixo cliente → risco de colisão entre fornecedores.- Usar
MV_PAR01direto semParamBox→ fragil, perde controle. - Shadowing de variável reservada (
cFilAnt,cEmpAnt,__cInternet) → lintBP-008(crítico).
Referência rápida
| Conceito | Regra |
| Prefixo variável | 1 letra minúscula + PascalCase |
| Atribuição | := |
| Comparação | == |
| Bloco | Begin Sequence/Recover/End Sequence |
| Declaração de variáveis | Local/Static/Private/Public no topo |
| Include padrão | #include "TOTVS.CH" (NUNCA Protheus.ch) |
| User Function | Prefixo de cliente (2–3 letras) |
| Função restrita | Consulte /plugadvpl:find function <nome> |
Comandos plugadvpl relacionados
/plugadvpl:find function <nome>— descobre se função é nativa, restrita ou customer./plugadvpl:lint <arq>— valida convenções (BP-001..008)./plugadvpl:callers <fn>— vê quem chama uma função antes de renomear.
Referência profunda
Para detalhes completos (~2.9k linhas), consulte reference.md ao lado deste arquivo:
- Histórico ADVPL/Clipper e arquitetura do RPO/APO compilado.
- Diretivas de pré-processamento (
#include,#define,#command,#xcommand,#translate) com exemplos. - Catálogo expandido de funções de string, data, array, conversão (Substr, At, Asc, Time, MonthName, AScan, ASort, AEval).
- Estruturas de controle avançadas (
Begin Sequence/Break/Recover,For Each, code blocks). - Tabela completa de prefixos de módulo (50+ módulos com tabelas/rotinas típicas) e regras de naming.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

