agentleFS
replybrreplybr/plugadvpl/skills/advpl-fundamentals/SKILL.md

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.

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
  1. Very specific:

    Use o lookup modulos_erp (carregado em /plugadvpl:init) para a lista completa.

    line 77

≈ “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.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

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:

PrefixoTipoExemplo
cCharacter (string)cCodCli, cNomeFor
nNumericnValor, nQtd
dDatedEmissao, dHoje
lLogical (bool)lOk, lExiste
aArrayaDados, aHeader
oObjectoModel, oView
bCode blockbValid, bWhile
xVariant / qualquerxValor, xParam
uUndefined / unknownuRet

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.00

Prefixo 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óduloCódigoPrefixos de função/rotinaTabelas típicas
ComprasCOMMATA1, MATA12, A097, A120SC1, SC2, SC7, SC8
EstoqueESTMATA0, MATA2, MATA3SB1, SB2, SD1, SD2, SD3
FaturamentoFATMATA41, MATA46, MA410SC5, SC6, SC9, SF2, SD2
FinanceiroFINFINA, FA0, FA1SE1, SE2, SE5
ContábilCTBCTBA, CTB0CT1, CT2, CT5, CT7
FiscalFISMATA9, MTA710, SPEDSF3, SF6, CDA, CDF
RHGPEGPEA, RHSRA, RCB, RCC
ManufaturaPCPMATA6, MATA65SH6, 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 (use ParamBox/Pergunte parametrizados em vez de leitura direta).
  • nUsado (variável interna do framework).
  • Várias funções com prefixo __ ou Fwk/FW internas.

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 Local no meio do código (depois de If/While) → lint BP-002 (crítico).
  • Usar Private/Public quando Local resolveria → lint BP-002b.
  • User Function sem prefixo cliente → risco de colisão entre fornecedores.
  • Usar MV_PAR01 direto sem ParamBox → fragil, perde controle.
  • Shadowing de variável reservada (cFilAnt, cEmpAnt, __cInternet) → lint BP-008 (crítico).

Referência rápida

ConceitoRegra
Prefixo variável1 letra minúscula + PascalCase
Atribuição:=
Comparação==
BlocoBegin Sequence/Recover/End Sequence
Declaração de variáveisLocal/Static/Private/Public no topo
Include padrão#include "TOTVS.CH" (NUNCA Protheus.ch)
User FunctionPrefixo de cliente (2–3 letras)
Função restritaConsulte /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.

Download now (ZIP)

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
What did you use it for? e.g. Reviewing pull requests in a Rails app

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.