Newsgroup: it.comp.lang.visual-basic
Titolo: Convalidare una Data

come faccio a sapere se una Data
č scritta in maniera corretta in una textBox ??
Perchč quando la scrivo nel DB
ed č sbagliata, mi restituisce un errore
quindi prima di scriverla nel DB
mi piacerebbe poter controllare
che la data sia esatta, non solo come
formattazione (gg/mm/aaaa) ma che i numeri
contenuti siano corretti, cioč
non devo accettare una data del tipo "45/45/2005"
Grazie a tutti.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 non devo accettare una data del tipo "45/45/2005"
Io generalmente prevengo a monte, usando un DTPicker anzichè una 
textbox.
Ciao
Alberto
-- 
Si è visto di meglio,
ma si è scopato di peggio,
qualche volta a pago
e non erano neanche sempre donne
[Paolo]

insomma.....
sarà più sicuro
ma nella textbox scrivi 711 e invio
e lui te lo trasforma in 07/11/2005
nel DTpicker devi scrivere 7 left 11 left e invio
per chi usa questo programma sarebbe
un freno notevole.
Attendo soluzioni di codice,
altrimenti, se disperato,
seguirò il tuo consiglio.


 seguirò il tuo consiglio.
C'è la funzione IsDate, che però dà True anche per le stringhe contenenti orari.
IsDate("7/11/2005") -> True
IsDate("47/11/2005") -> False
IsDate("7/11/2005 10.30") -> True
IsDate("10.30") -> True
Probabilmente dovrai comunque scrivere ulteriore codice per testare che
effettivamente la stringa inserita sia composta unicamente da una data (oppure
per tralasciare la parte orario in fase di scrittura nel DB, se non ti
interessa).
Bye
Raf

 Attendo soluzioni di codice,
No, non attendere, è un discorso già visto.
Ricordo che era stato postato del codice ben fatto, cerca su google.


Io creerei una funzione apposita (IsValidDate) a cui passerei la stringa 
della textbox.
Private Function IsValidDate(ByRef lptStr As String) As Boolean
Dim strGiorno As String, strMese As String, strAnno As String
Dim Slash1 As Long, Slash2 As Long
Dim strMiaData As String, strDataOttenuta As String
     'Cerco il primo slash
     Slash1 = InStr(1, lptStr, "/")
     If Slash1 > 0 Then
         'se c'è cerco il secondo
         Slash2 = InStr(Slash1 + 1, "/")
         If Slash2 > 0 Then
             'recupero anno, mese e giorno
             strGiorno = Left$(lptStr, Slash1 - 1)
             strMese = Mid$(lptStr, Slash1 + 1, Slash2 - Slash1 + 1)
             strAnno = Mid$(lptStr, Slash2 + 1)
             'se sono tre numeri validi
             If IsNumber(strGiorno) And isnuber(strMese) And 
IsNumber(strAnno) Then
                 'ottengo la mia data nel formato gg/mm/aaaa
                 strMiaData = CStr(Format$(Val(strGiorno), "00")) & "/" 
& CStr(Format$(Val(strMese), "00")) & "/" & CStr(Format$(Val(strAnno), 
"0000"))
                 'e controllo che corrisponda con la relativa data
                 'ottenuta dai singoli valori gg, mm, aaaa
                 strDataOttenuta = CStr(Format$(DateSerial(Val(strAnno), 
Val(strMese), Val(strGiorno)), "dd/MM/yyyy"))
                 IsValidDate = strDataOttenuta = strMiaData
             End If
         End If
     End If
End Function
N.B.: IsNumber() è una funzione creata da me che restituisce VERO 
soltanto se la stringa passata è composta SOLTANTO da cifre.
-- 
Quando noi ignoranti eravamo di più, tutto era più bello...
(A. Celentano)
Per rispondermi in privato, prima togli "l'immondizia dalla testa" :)

Ho sbagliato alcune cose... ecco la versione definitiva:
Public Function IsNumber(ByRef S As String) As Boolean
Dim I As Integer, Flag As Boolean
     If S <> "" Then
         Flag = True
         I = 1
         Do While I <= Len(S) And Flag
             If Mid$(S, I, 1) Like "#" Then
                 I = I + 1
             Else
                 Flag = False
             End If
         Loop
         IsNumber = Flag
     End If
End Function
Public Function IsValidDate(ByRef lptStr As String) As Boolean
Dim strGiorno As String, strMese As String, strAnno As String
Dim Slash1 As Long, Slash2 As Long
Dim strMiaData As String, strDataOttenuta As String
     'Cerco il primo slash
     Slash1 = InStr(1, lptStr, "/")
     If Slash1 > 0 Then
         'se c'è cerco il secondo
         Slash2 = InStr(Slash1 + 1, lptStr, "/")
         If Slash2 > 0 Then
             'recupero anno, mese e giorno
             strGiorno = Left$(lptStr, Slash1 - 1)
             strMese = Mid$(lptStr, Slash1 + 1, Slash2 - Slash1 - 1)
             strAnno = Mid$(lptStr, Slash2 + 1)
             'se sono tre numeri validi
             If IsNumber(strGiorno) And IsNumber(strMese) And 
IsNumber(strAnno) Then
                 'ottengo la mia data nel formato gg/mm/aaaa
                 strMiaData = CStr(Format$(Val(strGiorno), "00")) & "/" 
& CStr(Format$(Val(strMese), "00")) & "/" & CStr(Format$(Val(strAnno), 
"0000"))
                 'e controllo che corrisponda con la relativa data
                 'ottenuta dai singoli valori gg, mm, aaaa
                 strDataOttenuta = CStr(Format$(DateSerial(Val(strAnno), 
Val(strMese), Val(strGiorno)), "dd/MM/yyyy"))
                 IsValidDate = strDataOttenuta = strMiaData
             End If
         End If
     End If
End Function
-- 


 seguirò il tuo consiglio.
L'unica è analizzare il DateTime format di sistema e controllare se a 
lettera uguale corrisponde un numero valido.
Altri sistemi "embedded" come l'IsDate() non funzionano.
Es: Debug.Print IsDate("13/21/2005")
Ciao 

 Es: Debug.Print IsDate("13/21/2005")
Restituisce False, cos'altro avrebbe dovuto dare?
Se per convertire da stringa a data si usa la funzione CDate, per i test meglio
usare IsDate in quanto perfettamente "sincrona" con essa: ritorna true per ogni
stringa che può essere convertita in data con successo mediante CDate.
L'unica pecca è che IsDate/CDate non seguono strettamente il formato della data
di sistema, tranne nel caso in cui ci sia ambiguità.
Ad esempio "12-31,05" viene considerata perfettamente valida come data, sebbene
nel mio sistema il formato sia gg/MM/aaaa.
Mentre "03/04/05" viene giustamente convertita in 3 aprile 2005.
Bye
Raf

 Restituisce False, cos'altro avrebbe dovuto dare?
Uff, ma sě, dai intendevo Debug.Print IsDate("10/13/2005")
Ciao 

 Ciao
Ciao

 textbox.
Scusa, ma esattamente quale voce dei Componenti devo spuntare per vedermelo
apparire nella finestra degli strumenti? Mon l'ho mai usato, ma giusto per
dargli un'occhiata, ho letto che si trova nel file mscomct2.ocx e quello sta
al suo posto... ma nella lista dei componenti non vedo nulla che assomigli a
Microsft DateTimePicker.
In ogni caso, quando io ho bisogno di queste funzionalità, ricorro ad un ocx
scritto da Balena quando è uscito il VB5 per dimostrare come si fa un ocx,
che io poi mi sono adattato e moficato per i miei gusti e abitudini. Se
qualcuno ne avesse bisogno, cerco il progetto e glielo mando.
Il controllo si chiama BetterTextBox.
Fa tante cose carine, la maggior parte tramite una finestra di propietà:
- accettare solo numeri
- solo testo
- solo data
- solo certe lettere e non altre
- diventare sfondo blu e testo bianco quando prende il focus
- e altro non ricordo....
--
Greg

 Microsft DateTimePicker.
Boh, che dirti...
Dopo avere messo la spunta sul mscomct2.ocx, a me nella barra strumenti 
appare, assieme ad altri 4-5 oggettini, un coso che si chiama 
'DTPicker'.


 chiama 'DTPicker'.
Trovato, provato e ricordato!
--
Greg