Newsgroup: it.comp.lang.delphi
Titolo: ancora date..

salve,
ho una stringa SQL uguale a questa
SELECT * FROM Table WHERE Data =  #28/04/2005#
utilizzando access 2003 e delphi 7 (BDE), mi viene Lanciata la seguente 
eccezione
Process XXXX.Exe raised exception class EDBEngineError with message 'Invalid 
Use of Keyword.
Token : #28/04/2005#
dov'è l'errore?:'( 

> SELECT * FROM Table WHERE Data =  #28/04/2005#
ma che significa #28/04/2005# ????
prova con 
SELECT * FROM Table WHERE Data = '28/04/2005'
i valori passati ai campi data vanno messi tra apici.
Non l'ho testata prova cosi o con i doppi apici.
Diego
--- posted by geoForum on 
http://www.delphiedintorni.it

 SELECT * FROM Table WHERE Data =  #28/04/2005#
L'errore è l'uso (non standard) dei cancelletti attorno alla data.
E' una convenzione Access.  Usa gli apici singoli.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ha scritto nel messaggio 
news:d4t80t$96d$1...@news.newsland.it...


>ho provato sia con Apici singoli che doppi, stavolta l'errore è dato da 
ODBC 
prova ad invertire il giorno e il mese tipo :
'04/28/2005'
forse vuole il formato di data americano.
prova, nel frattempo faccio un test e ti faccio sapere.


 >ho provato sia con Apici singoli che doppi, stavolta l'errore č dato da


 stavolta l'errore č dato da ODBC
Le date in SQL danno sempre rogne: prova a usare il formato con giorno e
mese invertito, oppure quello piů standard: YYYY/MM/DD


 SELECT * FROM Table WHERE Data = 28/04/2005
Attento: in alcuni database le date sono memorizzate internamente come 
numero decimale -> quello che stai facendo tu è comparare una data con 
28 diviso 4 diviso 2005 = 0,00349... quindi un numero decimale che può 
essere comparato con una data ma che NON rappresenta il 28 aprile del 
2005. Il programma non ti dà errore, ma nemmeno ti filtra i dati come 
vuoi tu.
La soluzione migliore IMHO è usare un dataset parametrico (es. una 
TADOQuery, TIBQuery, TQuery, ecc.) e passare la data come parametro:
   Query1.SQL.Text := 'Select * from ORDINI where data > :data;
   Query1.ParamByName('data').AsDateTime := now;
   Query1.Open;
Si occuperà Delphi e dopo di lui il meccanismo di accesso ai dati 
utilizzato (es. ADO) di tradurre il parametro in un formato allineato al 
db (sennò i driver cosa li fanno a fare?).
Tutto questo rigorosamente IHMO.
Saluti
	Marco Bortolani
	info @ 
marcobortolani.it

Prova con "cDate"
Lo uso da una vita e non mi ha mai dato problemi.
Pochi lo conosco, ma funziona una favola.
Eccoti anche un esempio.
procedure TForm1.Periodo;
begin
  DataModule1.Fatture.Close;
  DataModule1.Fatture.SQL.Clear;
  DataModule1.Fatture.SQL.Add('Select * from Fatture');
  DataModule1.Fatture.SQL.Add('where Data >= cDate(''' + 01/01/2005 + 
''')');
  DataModule1.Fatture.SQL.Add('and Data <= cDate(''' + 31/01/2005 + ''')');
  DataModule1.Fatture.Open;
  if DataModule1.Fatture.IsEmpty then
  begin
    with Application do
    begin
      MessageBox('Non ci sono Fatture in questo periodo.', 'Attenzione', 
MB_OK+MB_ICONHAND+MB_DEFBUTTON1+MB_APPLMODAL);
    end;
    DataModule1.Fatture.Close;
    DataModule1.Fatture.SQL.Clear;
    DataModule1.Fatture.SQL.Add('Select * from Fatture Order by Num, Anno');
    DataModule1.Fatture.Open;
  end;
end;
Ciao
Vincenzo Di Falco