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:
| Campo | Conteudo |
|---|---|
| X5_FILIAL | Filial (ou vazio = todas) |
| X5_TABELA | "21" |
| X5_CHAVE | Data formato MMDD (ex: "0501" pra dia do trabalho) |
| X5_DESCRI | Descricao do feriado |
Pegadinhas
- Feriados moveis (Carnaval, Pascoa) precisam ser cadastrados a cada ano — nao auto-calcula.
- Multi-filial — feriados por filial sao filtrados; sem filial = nacional.
- Datas vazias retornam vazia.
- Em base sem cadastro SX5 21, considera apenas sabado/domingo.
- Performance em loop grande — cache resultado se for ajustar varias datas com mesma referencia.
Parâmetros
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
dData | Date | sim | Data a validar. |
lForward | Logical | não | .T. (default) avanca; .F. retrocede. |