DataValida

Verifica se data e dia util e, se nao for, retorna proximo dia util. Considera feriados cadastrados na SX5 tabela 21. Indispensavel pra calculo de vencimento real.

Assinatura: DataValida(dData, [lForward]) -> dDataUtil

Retorna: Date

DataValida e a funcao oficial pra "ajustar data pra dia util". Se a data cai em fim de semana ou feriado, retorna proximo dia util (ou anterior, se lForward=.F.). Usa a tabela de feriados cadastrada em SX5 tabela 21.

Sintaxe

DataValida(dData, lForward) --> dDataUtil
//   lForward = .T. (default) avanca pro proximo dia util
//   lForward = .F. retrocede pro anterior

Exemplos

// 13/05/2026 = quarta-feira (dia util normal)
DataValida(CtoD("13/05/2026"))      // 13/05/2026 (nao muda)

// Sabado vira segunda
DataValida(CtoD("16/05/2026"))      // 18/05/2026

// Domingo vira segunda
DataValida(CtoD("17/05/2026"))      // 18/05/2026

// Feriado nacional (01/05/2026 = sexta = feriado trabalho)
DataValida(CtoD("01/05/2026"))      // 04/05/2026 (segunda)

// Retroceder (vencimento ANTES da data)
DataValida(CtoD("16/05/2026"), .F.) // 15/05/2026 (sexta)

Casos praticos

1. Vencimento de titulo ajustado pra dia util

// Cliente paga em 30 dias, mas vencimento real e dia util
dVencto := dFatur + 30
dVenctoReal := DataValida(dVencto)   // ajusta se cair fim de semana

// SE1
RecLock("SE1", .T.)
SE1->E1_EMISSAO  := dFatur
SE1->E1_VENCTO   := dVencto
SE1->E1_VENCREAL := dVenctoReal     // campo "vencimento real"
SE1->(MsUnlock())

2. Data de entrega prometida

// Prazo de 5 dias uteis a partir de hoje
Static Function CalcEntrega(dInicio, nDiasUteis)
    Local dRet := dInicio
    Local n := 0

    While n < nDiasUteis
        dRet++
        If DataValida(dRet) == dRet  // mesma data = e dia util
            n++
        EndIf
    EndDo
Return dRet

CalcEntrega(dDataBase, 5)    // 5 dias uteis a partir de hoje

3. Forcar fechamento mensal em dia util

// Ultimo dia util do mes
dFechamento := DataValida(LastDate(dDataBase), .F.)
// Se LastDate cair sabado/domingo, retrocede pra sexta

Cadastro de feriados (SX5 tabela 21)

Configuracao em Configurador > Base Dados > Dicionario > Tabelas > SX5, tabela "21". Cada registro um feriado:

CampoConteudo
X5_FILIALFilial (ou vazio = todas)
X5_TABELA"21"
X5_CHAVEData formato MMDD (ex: "0501" pra dia do trabalho)
X5_DESCRIDescricao do feriado

Pegadinhas

Parâmetros

NomeTipoObrigatórioDescrição
dDataDatesimData a validar.
lForwardLogicalnão.T. (default) avanca; .F. retrocede.

Veja também