Newsgroup: it.comp.lang.visual-basic
Titolo: grosso casino con le date

In una tabella ho un campo data con formato xx/xx/xx xx.xx.xx
Facendo una query del tipo
select * from tabella where data > datainizio and data < datafine
dove datainizio e datafine sono due variabili di tipo date formato xx/xx/xx
Non badate alla sintassi, mi scocciava riportarla corretta.
non mi vengono riportati risultati anche se ce ne sono...eccome!
Allora provo a cambiare il campo della tabella in formato xx/xx/xx pensando
che il problema deriva da un formato di dati non esattamente combaciante.
però il problema persiste.
dopo ore ed ore di prove (sono molto tenace in questi casi) scopro una cosa
che mi rende molto perplesso...
se nella variabile di ricerca datainizio (ad esempio) carico una data tipo
30/12/00 salta fuori l'errore
siete pronti.....
DIVISIONE PER ZERO!!!!!!
Sono allibito.
Qualcuno ha un'idea di cosa sta succedendo?
--
------------------------------------------------------------
Davide Russo....
        ....a very internet person
-----------------------------------------------------------

 Qualcuno ha un'idea di cosa sta succedendo?
non saprei, ma potresti provare a semplificare la query prima con una data sola
poi potresti vedere se l'errore si ripropone anche se confronti le due date
alfabeticamente cioč:
anno (in cifre, 4) & mese (in cifre, 2) & giorno (in cifre, 2).
che l'errore provenga da una conversione automatica?
ciao Valerio

 non mi vengono riportati risultati anche se ce ne sono...eccome!
[cut]
prova a utilizzare la clausola SQL BETWEEN, e a formattare le date
secondo il formato americano (MM/DD/YYYY)
Ciao
Faber

già fatto, stesso risultato anzi, addirittura in questo caso qualsiasi
limite io ponga >lui mi fa vedere tutti i record della tabella (praticamente
l'inverso)
Ho trovato qualcosa, forse
Il linguaggio SQL (Structured Query Language) è uno standard ANSI
riconosciuto da Visual Basic. Le date vengono salvate in tabelle e database
utilizzando il formato Inglese/Stati Uniti, ovvero mese/giorno/anno,
adottato anche per il modulo di gestione di database Microsoft Jet. Quando
l'applicazione esegue query basate su date, è necessario considerare tale
limitazione. Se infatti viene utilizzato un formato della data diverso da
Inglese/Stati Uniti, le query che utilizzano tali campi possono infatti
restituire record inesatti o non restituire alcun record.
Tale limitazione si applica anche alla proprietà Filter, ai metodi
FindFirst, FindNext, FindPrevious e FindLast dell'oggetto Recordset e alla
proposizione WHERE di un'istruzione SQL.
Utilizzo delle funzioni DateSerial e DateValue
Anziché inserire valori letterali di data e ora nel codice, per gestire la
limitazione impostata dallo standard SQL e generare la data desiderata, è
preferibile utilizzare le funzioni DateValue o DateSerial. La funzione
DateValue utilizza l'impostazione del formato Short Date del sistema per
interpretare la stringa specificata. La funzione DateSerial utilizza un
gruppo di argomenti che è possibile eseguire indipendentemente dalle
impostazioni internazionali. Se si utilizzano valori letterali di data e ora
nella query SQL o con la proprietà Filter, è indispensabile utilizzare il
formato di data/ora Inglese/Stati Uniti.
Chi me lo spiega in maniera semplice e rapida?
come devo fare allora?
Davide

 secondo il formato americano (MM/DD/YYYY)
Ho provato ma niente da fare...
Ora perň č giunto il momento di scendere nei dettagli
Il Db č Access 2000 la tabella ha un campo data in formato data generica,
forse devo cambiare il formato del campo?

Ho risolto cosi'
Però è un marone e quando i record diventano molti il programma rallenta di
peso!
Ho creato nella tabella dove voglio fare la selezione un campo di nome "sel"
dataMovimenti.RecordSource = "SELECT * FROM MOVIMENTI"
dataMovimenti.Refresh
dataMovimenti.Recordset.MoveFirst
Do Until dataMovimenti.Recordset.EOF
If (dataMovimenti.Recordset("DATA") < DataFine And
dataMovimenti.Recordset("DATA") > DataInizio) Or
DateValue(dataMovimenti.Recordset("DATA")) = DateValue(DataInizio) Or
DateValue(dataMovimenti.Recordset("DATA")) = DateValue(DataFine) Then
dataMovimenti.Recordset.Edit
dataMovimenti.Recordset("SEL") = "S"
dataMovimenti.Recordset.Update
Else
dataMovimenti.Recordset.Edit
dataMovimenti.Recordset("SEL") = "N"
dataMovimenti.Recordset.Update
End If
dataMovimenti.Recordset.MoveNext
Loop
If chkOrdina = 1 Then
dataMovimenti.RecordSource = "SELECT NOME, COGNOME, CODICE AS CODIMOV, DATA,
TEMPO, ERRORE FROM MOVIMENTI WHERE SEL='S'"
DataMovimenti.Refresh
DBGrid1.Refresh
CHE SCHIFO
se qualcuno ha un'idea migliore me lo faccia sapere che modifico subito il
prog.

hai provato a mettere nella query,  # all'inizio e alla fine delle date?
".. where CampoDataInizio>  #" & DataInizio & "#  and CampoDataFine<  #" &
DataFine & "#"


Davide

dovredde servire a specificare che il tipo è un tipo data
come nelle stringe gli apici specificano il tipo char

ma tu richiami la query da codice?
hai provato a registrare la query ed eseguirla?

 Qualcuno ha un'idea di cosa sta succedendo?
I campi di tipo date sono composti da una parte intera (la data) e una parte
decimale (l'ora).
Se a te l'ora non interessa, puo` essere comodo evitare addirittura di
includerla nel database, usando un campo di tipo long e formattandolo come
se fosse una data.
Ad ogni modo, se hai un dampo di tipo date e vuoi risolvere il tuo problema,
puoi provare con questo tipo di sintassi.
select * from <table> where clng(<date_field>) between clng(<start_date>)
and clng(<end_date>)
Bye.

 hai provato a registrare la query ed eseguirla?
si, richiamo la query da codice.
cosa intendi per "registrare"?
Davide


Purtroppo io dell'ora ne ho bisogno però sto cercando di ovviare il probl
impostando la tabella diversamente, ho aggiunto un campo ora dove registro
solo l'ora e un campo data dove registro solo la data.
Però se inserissi la data come se fosse testo, poi come farei se dovessi
cercare i campi che hanno una data inferiore o superiore ad una, insomma, se
volessi porre dei limiti di ricerca?
Ti ringrazio tantissimo, per oggi il tempo a mia disposizione è scaduto però
appena posso provo la sintassi che mi hai genitlmente suggerito

richiami la query da codice nel senso che fai qualcosa tipo :
set rst=db.openrecordset(strSql)
o fai
docmd.OpenQuery (NomeQuery)?
cioč la query l'hai costruita col generatore e l'hai salvata tra le
query o no?
se non č cosě puoi provare a crearla col generatore salvarla ed aprirla
direttamente dalle query per vedere che risultati ti da, se funziona
correttamente
ciao Valerio

 query o no?
No, uso un sistema molto piů blando
prendendo ad esempio il mio controllo data
data1.recordset="SELECT * FROM TABELLA WHERE PROVA='" & prova & "' ORDER BY
PROVA"
data1.recordset.refresh
Davide

ahhh mai pensavo che usassi access e basta
quello che ti volevo dire prima era che per provare la query potresti
utilizzare access stesso
col generatore di query
la puoi ricreare  o incollare l'sql
 poi la esegui. se non trova i parametri te li chiede, glieli dai nei vari
formati e vedi che succede.
ciao Valerio

 Bye.
Usando questo sistema ho risolto!!!
Grazie mille...
Non puoi immaginare da che casino di m***a mi hai tolto...
Davide

Sapete, anche se sono l'ultimo sfigato che cerca di imparare come si
programma in vb, dopo aver risolto un problema del genere (che per il 99% di
voi sarà sembrata una boiata) mi sento il signore di visual basic!!!!
ERA 1 GIORNO CHE CI RIMUGINAVO SOPRA!!!
ho pure litigato con la morosa perchè ero skazzato!
:-(
cercherò di rimediare con un bel regalo di natale....
Grazie ancora!

 volessi porre dei limiti di ricerca?
inserendo la data nel formato <aaaammgg>
beppe
-----------------------------------------------------------
Visita il sito del WWF AltoFerrarese
http://www.comune.cento.fe.it/wwfaf
-----------------------------------------------------------

 inserendo la data nel formato <aaaammgg>
MIIIIIIIII!!
Non ci avevo prooooooooprio penzaaaaatoo!!!!
THX!
Non si finisce mai di imparare!
Davide