Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Fells

[Resolvido] Verificação de data

Recommended Posts

Fala galera, boa sexta-feira pra todos...

 

Seguinte, estava observando os nossos amados usuários interagindo com o sistema. E sempre tem um que quer nos testar né!? kkkk...

 

No meu caso tenho um sisteminha ASP que busca dados no BD SQL Server.

Um dos campos de busca é o de data, onde o usuário digita a data inicial e final e o sistema tras os dados entre as datas escolhida pelo usuário.

 

Queria fazer um esqueminha pra pegar essa data que o usuário digita, e verificar se ele não digitou algo errado como por exemplo 35/15/2011... enfim.

Pensei em algo como pegar a data e dividir ela em dia, mês e ano e comparar. Sei lá! Estou aberto a sugestões.

 

Alguem tem ideia do que posso fazer para verificar se a data digitada pelo usuário é uma data válida? Dentro dos padrões!

 

Segue um resumo do código:

 

filtro_Data 	      = Request.Form("filtro_Data")
filtro_DataFin	      = Request.Form("filtro_DataFin")

sql = "SELECT ContEng_AtaVisita.Numero, ContEng_AtaVisita.Cliente, ContEng_AtaVisita.Distribuicao, ContEng_AtaVisita.Emitente, ContEng_AtaVisita.Data, ContEng_AtaVisita.Assunto FROM ContEng_AtaVisita"

If filtro_DataFin <> "" And filtro_Data <> "" Then
sql = sql & " AND (Data Between '"&filtro_Data&"' AND '"&filtro_DataFin&"')"
End If

Compartilhar este post


Link para o post
Compartilhar em outros sites

Usa javascript pra isso. Faz uma funçãozinha e coloca no onsubmit do form, tem várias prontas. Mas se você quer fazer em asp, pode fazer mais ou menos assim:

 

Separa a data em um vetor

data = Split(campo_data,"/")
dia = data(0)
mes = data(1)
ano = data(2)

If (dia < 1 AND dia > 31) OR (mes < 1 AND mes > 12) OR (ano > Year(Now)) Then
'volta, exibe uma mensagem erro, ou o que você quiser ..
End If

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Felipe, beleza?

Cara eu to buscando qualquer colução na verdade, que me resolva isso. Não sou totalmente iniciante em ASP mas ainda to pegando algumas coisas. Na verdade várias. kkkk...

 

você acha melhor fazer algo em javascript então?

 

Pq ainda tem mais algumas coisas por trás. Pq vou precisar separar o dia, o mes e o ano de uma unica variavel que é a Filtro_Data.

Ai fazer a comparação tendo em mente que tem dias com 28, 30 e 31 dias... o ano também pode ser menor que o ano que estamos mais maior não! Enfim.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, é que em javascript essa verificação pode ser feita enquanto o usuário digita o formulário, já em ASP apenas quando o formulário for enviado. Como você é iniciante, tenta fazer em ASP, é bem simples, olha:

 

campo_data = Request.Form("data") '10/05/2011
data = Split(campo_data,"/") 'Aqui é formado um vetor de três posições separado pelo /
dia = data(0)
mes = data(1)
ano = data(2)
If (dia < 1 AND dia > 31) OR (mes < 1 AND mes > 12) OR (Cint(ano) > Cint(Year(Now)) ) Then  'Usa o cint ali no final pra converter os dois valores pra inteiro
'volta, exibe uma mensagem erro, ou o que você quiser ..
End If

Compartilhar este post


Link para o post
Compartilhar em outros sites

olh aeste artigo para fazer uma comprovação de datas. A função recebe um dia, um mês e um ano e comprovam que estes sejam numéricos e que a data criada entre todos é correta e possível no calendário.

 

A função recebe os dados de dia, mês e ano como string, tal como poderíamos chegar através de um formulário ou como parâmetro em uma URL. Não obstante, visto que ASP é uma linguagem pouco "typed", mesmo passando valores numéricos à função continuará dando resultados corretos.

 

Como resultado a função devolverá um valor verdadeiro ou falso, dependendo se a data é correta ou incorreta.

 

O código da função é o seguinte:

 

'valido uma data
'espero receber tres strings com o dia, o mes e o ano

function validarData(dia,mes,ano)

 'elimino possiveis espacos aos lados dos numeros que recebo por parametro

 dia = trim(dia)
 mes = trim(mes)
 ano = trim(ano)

 'comprovo nº de caracteres que recebo em cada parametro sao os permitidos
 'O ano pode ter ate 4 caracteres

 if len(dia)=0 or len(dia)>2 or len(mes)=0 or len(mes)>2 or len(ano)=0 or len(ano)>4 then
   validarData = false
   exit function
 end if

 'compovo que os caracteres dos parametros sao numeros

 if (not isNumeric(dia)) or (not isNumeric(mes)) or (not isNumeric(ano)) then
   validarData = false
   exit function
 end if

 'O mes nao pode ser maior que 12 nem menor que 1

 mes = cint(mes)
 if mes > 12 or mes < 1 then
   validarData = false
   exit function
 end if
 dia = cint(dia)

 'O dia nao pode ser menor que 1

 if dia < 1 then
   validarData = false
   exit function
 end if

 'O dia, dependendo do mes que seja, pode ter uns ou outros valores

 if mes=1 or mes=3 or mes=5 or mes=7 or mes=8 or mes=10 or mes=12 then

   'nesses meses pode ter 31 dias

   if dia > 31 then
     validarData = false
     exit function
   end if
 elseif mes=2 then

   'en fevereiro temos que ver se sera ano bissexto
   'consigo o numero de ano de 4 cifras.
   'se nos derem um valor de 2 cifras < 31 se refere a 2000 mais esse valor

   if ano < 31 then
     ano = ano + 2000

   'se nos derem um valor de 2 cifras > 31 se refere a 1900 mais esse valor

   elseif ano < 100 then
     ano = ano + 1900
   end if

   'calculo se o ano eh bissexto
   'se for divisivel por quatro e (nao divisivel por 100 ou divisivel por 400)

   if ((ano mod 4)=0) and ((ano mod 100)<>0 or (ano mod 400)=0) then

     'eh bissexto

     if dia > 29 then
       validarData = false
       exit function
     end if
   else

     'NAO eh bissexto

     if dia > 28 then
       validarData = false
       exit function
     end if
   end if
 else

   'em todos os demais meses chegam a ter 30 dias

   if dia > 30 then
     validarData = false
     exit function
   end if
 end if

 'se estou aqui eh porque todas as comprovacoes foram positivas

 validarData = true
end function

 

O código da função está comentado para que possa ser entendido mais facilmente. Basicamente, o que faz é realizar uma série de comprovações, uma atrás da outra. Se alguma das comprovações faz com que a data seja incorreta, devolve-se o valor false e sai da função. Se chega-se ao final da função e nenhuma das comprobações falhou, se devolve true, pois a data é correta.

 

Na hora de calcular se um dia é válido, temos que saber os dias que tem um mês. Temos que prestar especial atenção ao mês de fevereiro, para saber se é bissexto. Para saber se um ano é bissexto existe a seguinte regra:

 

São bissextos todos os anos divisíveis por 4, excluindo os que sejam divisíveis por 100, mas não excluindo os que sejam divisíveis por 400.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mew... To tentando fazer conforme vcs estão dizendo mas não estou conseguindo...

É provavel que eu esteja confuso! kkkkk...

 

Vou postar meu código como esta funcionando... O problema só aconece se o usuário digitar uma data muito louca e/ou errada tipo 62/30/2011... kkkkk...

 

<%
' ____________________________________________________________________________________
' _____________________________________ Filtro _______________________________________
'_____________________________________________________________________________________

filtro_Cliente        = Request.Form("filtro_Cliente")
filtro_Distribuicao   = Request.Form("filtro_Distribuicao")
filtro_Emitente       = Request.Form("filtro_Emitente")
filtro_Data 	      = Request.Form("filtro_Data")
filtro_DataFin	      = Request.Form("filtro_DataFin")
filtro_Assunto 	      = Request.Form("filtro_Assunto")
%>

      <table width="100%" align="center">
         <tr>
           <td width="13%" align="center"><font size = 2 color = "#666666">Cliente</td>
           <td width="20%" align="center"><font size = 2 color = "#666666">Distribuicao</td>
           <td width="16%" align="center"><font size = 2 color = "#666666">Emitente</td>
           <td width="16%" align="center"><font size = 2 color = "#666666">Data</td>
           <td width="16%" align="center"><font size = 2 color = "#666666">Data Final</td>
           <td width="20%" align="center"></td>
         </tr>
         <tr>
           <td align="center">
             <input maxlength=50 class="texto" style="text-align: center" type="text" value="<%=Cliente%>" name="filtro_Cliente">
           </td>
           <td align="center">
             <input maxlength=60 class="texto" style="text-align: center" type="text" value="<%=Distribuicao%>" name="filtro_Distribuicao">
           </td>
           <td align="center">
             <input maxlength=50 class="texto" style="text-align: center" type="text" value="<%=Emitente%>" name="filtro_Emitente">
           </td>
           <td align="center">
             <input maxlength=10 class="texto" style="text-align: center" type="text" value="<%=Data%>" name="filtro_Data">
           </td>
           <td align="center">
             <input maxlength=10 class="texto" style="text-align: center" type="text" value="<%=Data%>" name="filtro_DataFin">
           </td>
         </tr>
       </table>


<%
sql = "SELECT ContEng_AtaVisita.Numero, ContEng_AtaVisita.Cliente, ContEng_AtaVisita.Distribuicao, ContEng_AtaVisita.Emitente, ContEng_AtaVisita.Data, ContEng_AtaVisita.Assunto FROM ContEng_AtaVisita"
sql = sql & " WHERE (Numero LIKE N'%" & filtro_Numero & "%')"

'_________________________________________________________________________________________________________________________________________
'Filtros que verificam se e onde o usuário inseriu o(s) dado(s) que quis para filtrar a tabela.
'Faz a verificação através do IF e retorna os dados encontrados na tabela pelo filtro que o usuário escolheu.
'_________________________________________________________________________________________________________________________________________

'If filtro_Numero <> "" Then
'  sql = sql & " AND (Numero LIKE N'%" & filtro_Numero & "%')"
'End If

If filtro_Cliente <> "" Then
 sql = sql & " AND (Cliente LIKE N'%" & filtro_Cliente & "%')"
End If

If filtro_Distribuicao <> "" Then
 sql = sql & " AND (Distribuicao LIKE N'%" & filtro_Distribuicao & "%')"
End If

If filtro_Emitente <> "" Then
 sql = sql & " AND (Emitente LIKE N'%" & filtro_Emitente & "%')"
End If

If filtro_Data <> "" AND filtro_DataFin = "" Then
sql = sql & " AND (Data = '"&filtro_Data&"')"
End If

If filtro_DataFin <> "" And filtro_Data <> "" Then
sql = sql & " AND (Data Between '"&filtro_Data&"' AND '"&filtro_DataFin&"')"
End If

If filtro_Assunto <> "" Then
 sql = sql & " AND (Assunto LIKE N'%" & filtro_Assunto & "%')" 
End If

'_________________________________________________________________________________________________________________________________________
'Ordena tudo em ordem crescente pelo Numero, que é a Chave Primaria da tabela, ou seja, um número unico que não se repete.
'_________________________________________________________________________________________________________________________________________

sql = sql & " ORDER BY Numero"

Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open sql, Session("Gestao_conn"), 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

qual sua dúvida ???

 

ele gera algum numero de erro ? se sim, poste o numero

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom o erro que dá é esse:

 

Microsoft OLE DB Provider for SQL Server error '80040e07'

 

The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

 

/Engenharia/AtaVisita.asp, line 178

 

Linha 178 = rs.Open sql, Session("Gestao_conn"), 3 (mais claro que não deve ser aqui o problema)

 

 

Esse programa busca e mostra todos os dados do BD SQL Server, nome do Cliente, Emitente, Data do documento, Assunto etc.

Inseri esses "filtros" para facilitar as buscas para o usuário e entre esses filtros há o filtro_Data e o filtro_DataFin.

Se o usuário colocar uma data apenas no filtro_Data e clicar em buscar, o sistema retorna apenas os dados que contenha aquela data especifica. Agora se o usuario inserir uma data no filtro_Data e outra no filtro_DataFin, o sistema busca e trás os dados entre a as duas data informadas.

 

Isso funciona se o usuário digitar uma data(s) coerente. Porem se ele digitar uma data inválida como 35/02/2011 acusa esse erro acima.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando se lida com colunas CHAR / VARCHAR, e não validar entrada do usuário, você pode ter esse erro, Este erro geralmente acontece quando você tenta inserir uma data no Access com 'delimitadores;tentativa de inserir uma data no SQL Server com # delimitadores;tentativa de inserir uma data no Access ou SQL Server sem delimitadores, ou,tentativa de inserir uma data malformado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

[RESOLVIDO] Verificação de data

 

Ae galera, só pra dar um retorno...

 

o Anderson tinha razão... mais valew pelas postagens de todos... me deram varias ideias...

Mass... fiz um IsDate(Data) = 0 e resolveu meus problemas...

 

IsDate (parametro) = 0 'se data for Falso se não "existir"

 

ou

 

IsDate (parametro) = 1 caso a data for Verdadeira.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.