MonthAdd
Soma (ou subtrai) meses a uma data. Lida com fim-de-mes inteligentemente: 31/01 + 1 mes = 28/02 (nao 31/02). Pratico em fechamentos e vencimentos.
Assinatura: MonthAdd(dData, nMeses) -> dNova
Retorna: Date
MonthAdd soma N meses a uma data. Diferente de AddMonth em algumas releases, e o nome canonico. A funcao trata fim-de-mes corretamente — janeiro 31 + 1 mes nao gera fevereiro 31 (que nao existe).
Sintaxe
MonthAdd(dData, nMeses) --> dNova
// nMeses positivo = soma; negativo = subtrai
Exemplos
d := CtoD("15/05/2026")
MonthAdd(d, 1) // 15/06/2026
MonthAdd(d, 3) // 15/08/2026
MonthAdd(d, 12) // 15/05/2027
MonthAdd(d, -2) // 15/03/2026
MonthAdd(d, -12) // 15/05/2025
// Fim-de-mes
d := CtoD("31/01/2026")
MonthAdd(d, 1) // 28/02/2026 (Fev nao tem 31)
// Bissexto
MonthAdd(CtoD("29/02/2024"), 12) // 28/02/2025
MonthAdd(CtoD("29/02/2024"), 48) // 29/02/2028 (volta a ser bissexto)
Casos praticos
1. Vencimento de cobranca (30 dias do faturamento)
// Titulo com prazo 30 dias mes-comercial
dVencto := MonthAdd(dFatur, 1)
// Cliente VIP com 60 dias
If SA1->A1_GRPVEN == "VIP"
dVencto := MonthAdd(dFatur, 2)
EndIf
2. Periodo de relatorio — mes anterior
// Relatorio do mes anterior completo
dInicio := FirstDate(MonthAdd(dDataBase, -1)) // 01 do mes anterior
dFim := LastDate(MonthAdd(dDataBase, -1)) // ultimo dia do mes anterior
cQry := "SELECT * FROM " + RetSqlName("SE1") + ;
" WHERE E1_EMISSAO BETWEEN '" + DToS(dInicio) + ;
"' AND '" + DToS(dFim) + "'"
3. Aniversario com tratamento bissexto
Static Function ProxAniv(dNasc)
Local dHoje := dDataBase
Local nAnos := Year(dHoje) - Year(dNasc)
Local dAniv := MonthAdd(dNasc, nAnos * 12)
If dAniv < dHoje
dAniv := MonthAdd(dAniv, 12)
EndIf
Return dAniv
Pegadinhas
- Dia ajustado pra fim do mes — 31/01 + 1 vira 28/02 (ou 29/02 em bissexto), nao 31/02. Comportamento "correto" mas pode surpreender em logica que espera "mesmo dia".
- nMeses zero retorna mesma data (sem erro).
- Data vazia retorna data vazia.
- Diferenca para AddMonth — em algumas releases sao identicas.
AddMonthe o nome mais usado em codigo legado;MonthAdde o moderno. Funcionalmente equivalentes.
Parâmetros
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
dData | Date | sim | Data inicial. |
nMeses | Numeric | sim | Meses a somar (negativo subtrai). |