Max/Min
Dupla classica pra escolher maior/menor entre dois valores. Tambem funciona com datas, strings. Util pra clamp de valor em range.
Assinatura: Max(a, b) -> nMaior // Min(a, b) -> nMenor
Retorna: Numeric/Date/Character
Dupla minimalista mas onipresente em codigo. Max retorna o maior, Min retorna o menor. Funciona com numericos, datas e strings (comparacao lexicografica).
Sintaxe
Max(a, b) --> valor maior
Min(a, b) --> valor menor
Exemplos
// Numericos
Max(10, 20) // 20
Min(10, 20) // 10
Max(-5, 3) // 3
Min(-5, 3) // -5
// Datas
Max(CtoD("13/05/2026"), CtoD("01/06/2026")) // 01/06/2026
// Strings (lexicografica)
Max("abc", "xyz") // "xyz"
Min("abc", "xyz") // "abc"
Casos praticos
1. Limitar valor a um teto (clamp superior)
// Desconto maximo de 10%
nDescTotal := nValor * 0.20 // 20% calculado
nDescAplic := Min(nDescTotal, nValor * 0.10) // mas limita a 10%
2. Limitar valor a um piso (clamp inferior)
// Quantidade minima 1
nQtd := Max(nQtdSolicitada, 1)
3. Range clamp (entre piso e teto)
// Idade entre 18 e 65
nIdade := Min(Max(nIdadeBruta, 18), 65)
// Equivalente a "clamp(nIdadeBruta, 18, 65)"
4. Data limite — entre hoje e data fim
// Vencimento nao pode passar de 31/12 nem ser anterior a hoje
dVencto := Max(Min(dVenctoSolic, CtoD("31/12/2026")), dDataBase)
5. Encontrar maior valor em array
Static Function MaiorValor(aArr)
Local nRet := aArr[1]
Local i
For i := 2 To Len(aArr)
nRet := Max(nRet, aArr[i])
Next
Return nRet
Pegadinhas
- Apenas 2 argumentos — pra mais valores, encadeie:
Max(a, Max(b, c))ou loop sobre array. - NIL — comportamento indefinido. Sempre garanta valores nao-nulos.
- Strings com case diferente — "Z" < "a" lexicograficamente (case-sensitive). Normalize com Upper se quer comparacao insensitive.
- Mistura de tipos (Numeric vs Date) — comportamento indefinido, pode dar erro.