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

Parâmetros

NomeTipoObrigatórioDescrição
dDataDatesimData inicial.
nMesesNumericsimMeses a somar (negativo subtrai).

Veja também