VERIFICAR DATA

FBUR 18/10/2010 11:32:50
#355358
Bom dia!

Sabemos que o VB aceita datas no formato DD/MM/YYYY ou MM/DD/YYYY

A questão é que eu não quero no formato MM/DD/YYYY, apenas no DD/MM/YYYY. Como eu faço para verificar isso??

A maneira que faço é sempre converter para DD/MM/YYY. Mas eu gostaria de saber se dá para checar em qual formato está.

[]'s
PDUARTE9 18/10/2010 12:58:06
#355360
Como assim?
Explique melhor!
MARCELO.TREZE 18/10/2010 13:09:38
#355362
veja este código

Option Explicit

Private Const LOCALE_SSHORTDATE = &H1F
Private Declare Function GetSystemDefaultLCID Lib [Ô]kernel32[Ô] () As Long
Private Declare Function SetLocaleInfo Lib [Ô]kernel32[Ô] Alias [Ô]SetLocaleInfoA[Ô] (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String) As Boolean

Private Sub Command1_Click()
Dim lngLocale As Long
lngLocale = GetSystemDefaultLCID()
If SetLocaleInfo(lngLocale, LOCALE_SSHORTDATE, Combo1.Text) = False Then
Label2.Caption = [Ô]Houve um erro ao definir o formato de data ![Ô]
Else
Label2.Caption = [Ô]Formato de data atualizado para [Ô] & Combo1.Text & [Ô] com sucesso ![Ô]
End If
End Sub

Private Sub Form_Load()
With Combo1
.AddItem [Ô][Selecione um formato][Ô]
.AddItem [Ô]MM/dd/yyyy[Ô]
.AddItem [Ô]dd/MM/yyyy[Ô]
.AddItem [Ô]MM-dd-yyyy[Ô]
.AddItem [Ô]dd-MM-yyyy[Ô]
.ListIndex = 0
End With
Label2.Caption = [Ô][Ô]
End Sub
FBUR 18/10/2010 13:47:18
#355367
cruzis... eu achava que era mais simples...

Mas era isso mesmo que eu queria saber Marcelo-Treze. Eu pensava que tinha uma forma mais simples de se fazer.

Hj eu faço assim: Supondo que o camarada digitou na txt1 06/20/2010. No meu programa essa data é inválida, pois não está no formato DD / MM / YYY (dia / mês / ano)

Então faço uma conversão automática:

txt1.text = format(txt1.text, [Ô]dd/mm/yyyy[Ô])


No entanto, o meu objetivo é de avisar o usuário. Então fiz assim:


Dim x As String
Dim y As String

x = txt1.Text
y = Format(txt1.Text, [Ô]dd/mm/yyyy[Ô])


If x <> y Then
MsgBox [Ô]data inválida[Ô], vbCritical
ElseIf Not IsDate(x) Then [ô]pois o camarada pode digitar 99/99/9999
MsgBox [Ô]data inválida[Ô], vbCritical

End If



Ou seja, se o camarada digitar 06/20/2010, essa data é guardada na variável x e é comparada com a mesma data na variável y, só que com o formato modificado para DD / MM / YYYY

Resumindo:
- se o camarada digita 06/20/2010, na variável y ela fica 20/06/2010 ---> Digo para exibir uma mensagem de erro dizendo que a data digitada é inválida (Na verdade é inválida apenas neste formato, mas essa é a intenção. :)
- se o camadata diguta 20/06/2010, no novo formato fica a mesma coisa. Ou seja, o camarada digitou uma data válida (repito, quando digo [Ô]data válida[Ô] estou me referindo ao formato DD / MM / YYYY)
- se for assim: 11/06/2010 ou 06/11/2010, sem problemas. Ambas estão no formado DD / MM / YYYY e são datas válidas.

é isso.

[ ]'s
MARCELO.TREZE 18/10/2010 14:16:46
#355371
colega o simples fato de se fazer isto

teste = Format([Ô]09/20/2010[Ô], [Ô]dd/mm/yyyy[Ô])

MsgBox teste


ou seja se vc digitar 09/20/2010 ele automaticamente converte para 20/09/2010

vc não precisa fazer verificação nenhuma

SACOFRITO 19/10/2010 08:32:41
#355445
da pra vc travar oq digitado
tipo

Private Sub Objeto_lostfocus()

if not isdate(objeto) then
msgbox [Ô]data invalida[Ô]
end if
end sub
FBUR 19/10/2010 13:30:02
#355469
Então Marcelo-Treze, o que vc disse é uma verdade. No entanto, no meu caso, preferi exibir uma mensagem para o usuário. Já tive experiências amargas com usuários falando que [Ô]... não foi eu.... o sistema que fez sozinho....[Ô]. Às vezes algumas coisas feitas de forma automática servem como muleta para tentar justificar erros completamente diferentes. Então preferi mostrar o erro e não deixar o VB corrigir automaticamente.

Vamos supor que o camarada queira digitar 06/12/2010, mas por erro de digitação sai como 06/22/2010.
Se eu deixasse o VB corrigir sozinho, ao invés de ser 06/22/2010, ficaria 22 de junho de 2010, bem diferente de 06 de dezembro de 2010, que era a intenção do usuário caso ele não errasse a digitação.

Aí vem o usuário reclamando que o sistema fez sozinho... que não tem nada a ver com o que ele digitou, bla bla bla... Dentro de uma certa lógica, o danado do usuário acaba ficando com a razão.

Então, ao invés de corrigir automaticamente, prefiro mostrar o erro e que o usuário mesmo corrija. Todo mundo fica feliz. ]

Caro Sacofrito, desta forma o sistema aceita formatos DD / MM / YYYY (ex: 20/06/2010) e também formatos MM / DD / YYYY (ex: 06/20/2010). E minha intenção é somente DD / MM / YYYY.

[]'s
MARCELO.TREZE 19/10/2010 13:56:28
#355472
FBUR sua lógica está correta, então pensando nisto, veja a função que desenvolvi pra vc

ela coloca as barras automáticamente, e verifica se o dia ou o mes é valido conforme a digitação, teste veja se ajuda.


Function CampoDATA(obj As Object, Keyasc As Integer)
If Not ((Keyasc >= Asc([Ô]0[Ô]) And Keyasc <= Asc([Ô]9[Ô])) Or Keyasc = 8) Then
Keyasc = 0
Exit Function
End If
If Keyasc <> 8 Then

If Len(obj.Text) = 2 Then
If Mid(obj.Text, 1, 2) > 31 Then
MsgBox [Ô]digite um dia válido[Ô]
obj.Text = [Ô][Ô]
Keyasc = 0
Else
obj.Text = obj.Text + [Ô]/[Ô]
obj.SelStart = Len(obj.Text)
End If
End If

If Len(obj.Text) = 5 Then
If Mid(obj.Text, 4, 2) > 12 Then
MsgBox [Ô]Digite um mês válido[Ô]
obj.Text = Mid(obj.Text, 1, 3)
obj.SelStart = Len(obj.Text)
Keyasc = 0
Else
obj.Text = obj.Text + [Ô]/[Ô]
obj.SelStart = Len(obj.Text)
End If
End If

End If
End Function


Private Sub Text1_KeyPress(KeyAscii As Integer)
CampoDATA Text1, KeyAscii
End Sub


acho que vai gostar, teste coloque um dia maior que 31 ou um mes maior que 12 para ver.
FBUR 19/10/2010 14:10:50
#355474
Também é uma ótima alternativa Marcelo!

Obrigado.

[]'s
Tópico encerrado , respostas não são mais permitidas