Newsgroup: it.comp.appl.access
Titolo: Problema illogico con orario in query su tabella creata a codice.

Salve a tutti,
ho una semplice tabella : nome, data, ora, idcliente. I campi sono definiti
come testo,data/ora e numerico
La tabella viene creata e riempita via codice con dati omogenei tranne che
per il campo idcliente che viene lasciato vuoto.
Ammettiamo che il range di [ora] sia 7.00-20.00.
Il problema sta in questo : se faccio una Select con una precisa data ed un
preciso orario antecedente le 8.00.00 il tutto funziona egregiamente
restituendo un solo record. Se lo stesso viene fatto per un oraio tra le
8.00.01 e le 20.00.00 non viene restituito nessun record.
Sostituendo l'orario preciso con un Between orario - 00.00.01 and orario +
00.00.01 funziona tutto egregiamente.
Ora, ammettendo tutto cio' che volete, quale differenza passa tra un orario
prima delle 8 e un orario dopo le 8 ?
Ultima nota : se la tabelle viene creata a mano funzionano tutti gli orari.
Appiccico il codice che crea la tabella ( scritto mediocremente ma
l'estetica non e' il mio forte )
Set tdfNuovo = dbs.CreateTableDef(nometab)
    With tdfNuovo
        .Fields.Append .CreateField("Agente", dbText)
        .Fields.Append .CreateField("Giorno", dbdate)
        .Fields.Append .CreateField("Ora", dbdate)
        .Fields.Append .CreateField("IDcliente", dbLong)
        .Fields.Append .CreateField("Note", dbmemo)
                    Set idxNuovo = .CreateIndex("IndiceIDCLIENTE")
                    idxNuovo.Fields.Append idxNuovo.CreateField("IDCLIENTE")
                    idxNuovo.Unique = False
            .Indexes.Append idxNuovo
         dbs.TableDefs.Append tdfNuovo
         Set relNuovo = dbs.CreateRelation(nometab & "Rel", _
            "clienti", nometab, _
            dbRelationUpdateCascade)
         relNuovo.Fields.Append relNuovo.CreateField("IDCLIENTE")
        relNuovo.Fields!IDcliente.ForeignName = "IDCLIENTE"
        dbs.Relations.Append relNuovo
Set rs = dbs.OpenRecordset(nometab, dbOpenDynaset)
rs.AddNew
rs.Update
rs.MoveFirst
rs.Edit
X = DateValue(datain)
Y = TimeValue(orain)
Do Until X = DateValue(dataout + 1)
Do Until TimeValue(Y) = TimeValue(oraout + TimeValue("0.30.00"))
rs!giorno = X
rs!Ora = Y
rs!Agente = nometab
Y = Y + "0.30"
rs.Update
rs.AddNew
Loop
X = X + 1
Y = TimeValue(orain)
Loop
    End With
    rs.Close
    dbs.Close
    Set dbs = Nothing
    Set rs = Nothing
Grazie a chiunque abbia qualche consiglio ( accetto anche insulti)
Giuliano 2XL

 Grazie a chiunque abbia qualche consiglio ( accetto anche insulti)
A parte il ciclo organizzato in maniera molto strana
addnew
update
movefirst
edit
?!?!?!!??!!?
e un addnew prima del loop, cosě se poi devi uscire hai fatto un addnew a
vuoto...
mah...
Comunque dovresti provare a fornire i valori scritti nella tabella...
Antonio

 Antonio
Grazie Antonio, sia per la risposta che per i consigli.
Effettivamente ora come ora non mi ricordo il perche' di questi strani
rigiri...... magari frutto di qualche ora di sonno negata :)
I valori sono presto detti : datain=01/06/2003   dataout=05/06/2003
orain=08.00.00     oraout=20.00.00
Risultato:
Agente   Giorno        Ora         IDcliente Note
Giuliano 01/06/2003 8.00.00
Giuliano 01/06/2003 8.30.00
Giuliano 01/06/2003 9.00.00
Giuliano 01/06/2003 9.30.00
Giuliano 01/06/2003 10.00.00
Giuliano 01/06/2003 10.30.00
Giuliano 01/06/2003 11.00.00
Giuliano 01/06/2003 11.30.00
Giuliano 01/06/2003 12.00.00
Giuliano 01/06/2003 12.30.00
ecc.
E giuro che :
  SELECT Giuliano.Agente, Giuliano.Giorno, Giuliano.Ora, Giuliano.IDcliente,
Giuliano.Note
  FROM Giuliano
  WHERE (((Giuliano.Ora)=#8:30:0#));
non funziona ( appena riprovato) mentre :
  SELECT Giuliano.Agente, Giuliano.Giorno, Giuliano.Ora, Giuliano.IDcliente,
Giuliano.Note
  FROM Giuliano
  WHERE (((Giuliano.Ora)=#8:0:0#));
funziona perfettamente.
Hai qualche idea ?
Io non so cosa pensare e al momento ho risolto con il between ma non sono
certo soddisfatto.
Grazie ancora.
Giuliano 2XL




Che formato è ora in tabella?
Queste cose con le ore delle volte succedono perchè in realtà lui non
memoprizza proprio precisamente l'ora, ma ci mette degli "spiccioli" di
frazioni di tempo che fanno sì che poi l'operatore uguaglianza non funzioni.
Ed ecco perchè il between funziona.
Certo, magari non dovrebbe andare neanche con le 8.00, però questa potrebbe
essere la spiegazione...
Antonio

 essere la spiegazione...
Ma il problema sta nel fatto che con valori fino alle 8.00 va ( quindi anche
7.00 e 7.30 ) e poi non piu'.
So di essere pedante in questa richiesta ma, secondo te, cosa c'e' nel mio
codice che non funziona?
Ti chiedo questo perche una tabella fatta a mano e con i dati copiati e
incollati da quella fatta via codice fa funzionare il tutto.
AIUTO !!!
Giuliano 2XL

 incollati da quella fatta via codice fa funzionare il tutto.
Quello che posso fare è debuggarti un po' il codice.
Set rs = dbs.OpenRecordset(nometab, dbOpenDynaset)
rs.AddNew
rs.Update VIA
rs.MoveFirst VIA
rs.Edit VIA
X = DateValue(datain)
Y = TimeValue(orain)
Do Until X = DateValue(dataout + 1)
Do Until TimeValue(Y) = TimeValue(oraout + TimeValue("0.30.00"))
rs!giorno = X
rs!Ora = Y
rs!Agente = nometab
Y = Y + "0.30"
rs.Update
rs.AddNew
Loop
X = X + 1
Y = TimeValue(orain)
Loop
I CICLI SONO SBAGLIATI. NON FAI CONTROLLI SULLE DATE. SE PER ESEMPIO E' LA
STESSA DATA OK, FINISCI QUANDO SFORI L' ORAOUT, MA SE SONO DATE DIVERSE, CON
L'ORA DEVI FINIRE QUANDO ARRIVI A MEZZANOTTE E RICOMINCIARE CON LE 00.30
DELLA DATA SUCCESSIVA.
SECONDO ME DOVRESTI RISCRIVERE LA FUNZIONE.
Antonio

 Antonio
dott. Scooter
otorino
via dei Baccanti, 10
Chiasso
cab 80059
abi 00100
c/c 123456
Importo 1.000.000.000 euro
Questi sono i riferimeti per l'otorino a cui son dovuto ricorrere.
Ovviamente ti giro il bonifico da pagare.
MAssimiliano


Meco...
Ciao.
--
Sergio MAZZA


Grazie per i suggerimenti.
Non faccio controllo sulla data perche', per come funziona la cosa, non e'
necessaria.
Che ci sia da riscrivere la cosa e assolutamente probabile.
Resta il fatto che essendo un ciclo i record prima delle 8.00 dovrebbero
essere scritti come quelli dopo.
Comunque come al solito in questi casi, vince chi si arrangia per cui mi
sono arrangiato col between.
Grazie comunque.
Giuliano 2XL