Newsgroup: it.comp.lang.visual-basic
Titolo: Il solito problema con le date...

Salve newsgoup...
facendo i test di inserimento in mshflexgrid avevo il problema che i campi
"data" (dd/mm/yyyy) venivano salvati in modo esatto sul db access ma
venivano visualizzati nello standard americano
Il problema viene aggirato con la formattazione della colonna della griglia
col comando
Format(data, "dd/mm/yyyy")
e funziona!
Pero' il problema nasce quando ci sono date come : 02/03/2002 (2 marzo 2002)
ecc.
ovvero quando il num del giorno o il num del mese sono ambigui al comando
format
infatti dopo la formattazione la data viene visualizzata come 03/02/2002
(standard americano)
SE invece la data è 13/02/2002 , non ci sono problemi.
In pratica il comando Format non capisce il vero senso della data.
Avete soluzioni?
Grazie
-Davide-

 In pratica il comando Format non capisce il vero senso della data.
O forse è chi scrive che ha una pessima calligrafia e Format$ non riesce a
leggere?
Ciao
--
using System.Gtk.Forms = "
http://www.neodatatype.net/windowsforms/sgf.aspx
"
mathParser = "
http://www.neodatatype.net
"
sitoComune = "
http://www.it-lang-vb.net
"

 leggere?
??? Questa non l'ho capita...
-Mad-

 per metterli in ordine cronologico lo posiziona perfettamente!!!
Puoi postare due righe di codice?
Che tipo di var. usi, che codice usi per scrivere nel DB, che query usi per
verificare, che DB usi...
Ciao


Allora, la query la faccio fare ad Access 2002... ma funziona anche se
gliela faccio fare a VB6
Il campo su Access2002 č configurato come 'Data/ora' , con formato 'Data in
cifre'
Per salvare associo al tasto SALVA questo codice:
--------------------------------------------------------------------
Private Sub Save_Click()
If rs.RecordCount > 0 Then
rs.MoveLast
End If
rs.AddNew
On Error GoTo attenzione
rs("nascita") = Format(nascita.Text, "dd/mm/yyyy")
rs("cognome") = cognome.Text
rs("nome") = nome.Text
MsgBox ("Ho salvato la data di nascita!!")
Exit Sub
attenzione:
MsgBox ("Sbagliato!! La data devi scriverla cosě gg/mm/aaaa")
End Sub
---------------------------------------------------------------------
Per leggere, mettere in Griglia (uso una mshflexgrid), e formattare uso
questo:
----------------------------------------------------------------------
Private Function mostra()
Dim x As Integer
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseServer
rs.Open "SELECT nome as Nome,cognome as Cognome,
                nascita as Data FROM archivio
                order by nascita", cn, adOpenKeyset, adLockOptimistic,
adCmdText
If rs.RecordCount > 0 Then
griglia.Visible = True
griglia.ColWidth(0) = 1500
griglia.ColWidth(1) = 1500
griglia.ColWidth(2) = 1500
Set griglia.DataSource = rs
'la data viene visualizzata in americano, quindi la converto
griglia.Col = 2
For x = 1 To griglia.Rows - 1
griglia.Row = x
griglia.Text = Format$(griglia.Text, "dd/mm/yyyy")
Next x
End If
End Function
--------------------------------------------------------------------------
Ho anche provato ad usare il Format al posto del Format$ con nessun
risultato....
Fammi sapere....
Ciao...
-Dave-

 MsgBox ("Ho salvato la data di nascita!!")
Sì, ma l'hai salvata male! :)
Stai facendo implicitamente (VB lo fa per te)
' non puoi formattare una stringa come una data se prima non
' viene convertita in data
stringa = Format(CDate(nascita.Text), "dd/mm/yyyy")
' non puoi salvare una stringa in una data!
Data = CDate(stringa)
Considera che la CDate() è soggetta alle impostazioni internazionali, io non
mi azzardo a dire cosa o come stai salvando :)
Soluzione? E' un casino :)
Io ti consiglio di usare il DateTimePicker per inserire le date, la sua
proprietà Value è di tipo Date quindi non ti puoi sbagliare.



Convengo.
L'unica č scriversi una funzioncella alla quale si passano anno, mese e
giorno e la data viene impostata in maniera univoca nella forma "dd mmm
yyyy"
ave et vale

 yyyy"
DateSerial()?
Non ho ben capito il formato indicato.


Ciao
idem
function CiccioData as date(giorno as integer,mese as integer, anno as
integer) as date
    cicciodata=giorno & " " & monthname(mese) & " " & anno
end function
(:-) Quant'è buono il VB!!!!! (-:)
La data viene forzata all'impostazione di data lunga italiana e VB non
dovrebbe avere dubbi qualunque siano le impostazioni internazionali di W.
ave et vale

 dovrebbe avere dubbi qualunque siano le impostazioni internazionali di W.
E tu ti fidi di una roba del genere?
Che inoltre non risolve l'uso errato dei vari tipi di dato.
Tanto più che una funzione simile esiste già e funziona sul serio:
MyData = DateSerial(Anno, Mese, Giorno)
Ed è univocamente interpretata :)


Ecco la mia soluzione! Funzionante al 10000% :)))
Lo so, fa molto ridere e l'algoritmo ha un costo un po' elevato vista la
ricerca diretta... ma il fine giustifica i mezzi!!
Vi ringrazio cmq. per i consigli.
In pratica trasformo la data in stringa.
Ci sono 3 casi: la lungh. puo' essere 8,9 o 10
8 --- es. 1/2/2002
9 --- es. 10/2/2002
9 --- es. 1/12/2002
10 --- es. 26/11/2002
-------------------------INIZIO CODICE----------------------
griglia1.Col = 1
For x = 1 To griglia1.Rows - 1
griglia1.Row = x
tot = CStr(griglia1.Text)
If Len(tot) = 8 Then
gio = Left$(tot, 1)
mes = Mid$(tot, 3, 1)
an = Right$(tot, 4)
griglia1.Text = "0" & mes & "/0" & gio & "/" & an
End If
If Len(tot) = 9 Then
    If Mid$(tot, 2, 1) = "/" Then
       gio = Left$(tot, 1)
       mes = Mid$(tot, 3, 2)
       an = Right$(tot, 4)
       griglia1.Text = mes & "/0" & gio & "/" & an
    End If
    If Mid$(tot, 3, 1) = "/" Then
       gio = Left$(tot, 2)
       mes = Mid$(tot, 4, 1)
       an = Right$(tot, 4)
       griglia1.Text = "0" & mes & "/" & gio & "/" & an
    End If
End If
If Len(tot) = 10 Then
   If CInt(Mid$(tot, 4, 2)) <= 12 Then
       gio = Left$(tot, 2)
       mes = Mid$(tot, 4, 2)
       an = Right$(tot, 4)
       griglia1.Text = mes & "/" & gio & "/" & an
   Else
   griglia1.Text = Format(griglia1.Text, "dd/mm/yyyy")
   End If
End If
Next x
End If
-----------------FINE CODICE---------------------------
-Davide-

 Vi ringrazio cmq. per i consigli.
Boh, il mio consiglio l'avevo dato, bastava una (1!) riga di codice a costo
pressochč zero (mi chiedo perchč continuo a darne):
griglia1.Text = Format$(DateTimePicker1.Value, "dd/mm/yyyy")
Tu continui  voler fare casting imprevedibili su dati di tipi
incompatibili...
"griglia1.Text = Format(griglia1.Text, "dd/mm/yyyy")"
Secondo me non funziona, č un uso scorretto, pesante, dispendioso,
complicato... contento tu.


Tanto più che una funzione simile esiste già e funziona sul serio:
Hai ragione.
Funziona. Se lo vuoi formalmente corretto:
    cicciodata=cdate(str(giorno) & " " & monthname(mese) & " " &str( anno))
che poi sarebbe la stessa cosa che fa per altre vie la funzione
SerialDate(year, month, day). Il problema di Mad e' il recupero di anno,
mese e giorno corretti, da risolvere secondo me con l'uso delle funzioni
Instr, Mid e Val (vedi correttezza formale)
(:-) Quant'è buono il VB!!!!! (-:)
ironico


 Instr, Mid e Val (vedi correttezza formale)
Il problema di Mad è trovare il DataTimePicker da appiccicare al form.



Eppure ce l'avevo qua un minuto fa :))))
ciao
-Mad-

 griglia1.Text = Format$(DateTimePicker1.Value, "dd/mm/yyyy")
Io continuo a sostenere che la soluzione migliore e' salvare le date nel
formato yyyymmdd.
Lokar
--
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
UGIdotNET - 
http://www.ugidotnet.org

 formato yyyymmdd.
Come "purista" non concordo, ma perlomeno non da adito a errori di
interpretazione.
