ProcName
Retorna o nome da funcao N niveis acima na pilha de chamada. Pratico pra log de stack trace, auditoria, identificar contexto.
Assinatura: ProcName([nLevel]) -> cNome
Retorna: Character
ProcName permite ler a pilha de chamadas. Sem parametro retorna a funcao atual (similar a FunName). Com nivel N, retorna a funcao N posicoes acima na pilha.
Sintaxe
ProcName(nLevel) --> cNomeDaFuncao
// nLevel 0 = funcao atual (default)
// nLevel 1 = quem chamou a atual
// nLevel 2 = quem chamou quem chamou
// ...
Exemplo: stack trace
User Function A()
U_B()
Return
Static Function B()
U_C()
Return
Static Function C()
ConOut("Atual: " + ProcName(0)) // "C"
ConOut("Pai: " + ProcName(1)) // "B"
ConOut("Avo: " + ProcName(2)) // "A"
Return
Casos praticos
1. Log com stack trace
Static Function LogErro(cMsg)
ConOut("[ERRO] " + cMsg)
ConOut(" Em: " + ProcName(1)) // quem chamou LogErro
ConOut(" De: " + ProcName(2)) // pai dele
Return
// Uso
User Function MinhaFuncao()
If !ValidaAlgo()
LogErro("Validacao falhou")
// [ERRO] Validacao falhou
// Em: MinhaFuncao
// De: ...
EndIf
Return
2. Auditoria de quem alterou registro
Static Function GravaAuditoria(cTabela, cAcao)
RecLock("ZAUD", .T.)
ZAUD->ZAUD_FILIAL := xFilial("ZAUD")
ZAUD->ZAUD_DATA := dDataBase
ZAUD->ZAUD_HORA := Time()
ZAUD->ZAUD_USER := RetCodUsr()
ZAUD->ZAUD_TABELA := cTabela
ZAUD->ZAUD_ACAO := cAcao
ZAUD->ZAUD_ORIGEM := ProcName(1) // quem disparou
ZAUD->(MsUnlock())
Return
3. Validar contexto de execucao
User Function MtVldCli()
Local cCaller := ProcName(1)
// So permitir alteracao se chamado por MATA030
If !"MATA030" $ cCaller
Help(" ", 1, "INVALIDO", , "Use a tela padrao pra alterar", 1, 0)
Return .F.
EndIf
Return .T.
ProcName vs FunName
| Funcao | Retorno |
|---|---|
FunName() | Funcao "raiz" — geralmente a rotina TOTVS que esta no menu (MATA030, MATA460...) |
ProcName(0) | Funcao atual em execucao |
ProcName(N) | N niveis acima na pilha |
Pegadinhas
- nLevel maior que profundidade da pilha retorna vazio.
- User Functions tem prefixo U_ internamente — pode aparecer com ou sem dependendo de release.
- Em JOB sem PE, ProcName(0) retorna nome do JOB. Levels acima ficam vazios.
- Performance — ProcName tem custo de stack walk. Evite em loops apertados.
Parâmetros
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
nLevel | Numeric | não | Nivel da pilha (0 = atual, default). |