PDA

Visualizza la versione completa : [delphi]: query intervallo date


elevation
25-07-2002, 22:05
ciao a tutti,
sapete per caso qual è la sintassi corretta per selezionare tutti i record che hanno il campo "Data" compreso in un certo intervallo. Per intenderci: ho due Edit (data1 e data2) nei quali scrivo le due date; cliccando su un tasto la query deve eseguire la selezione dei record che hanno la data compresa fra data1 e data2.
Purtroppo la query viene eseguita ma non mostra alcun record...

Ecco il codice:


procedure TForm1.Button1Click(Sender: TObject);
var
num_and: integer;
begin
with ADOQuery1 do begin

with SQL do begin
Clear;
Add('SELECT *');
Add('FROM tabella1');
Add('where');
num_and:=0;
if checkbox1.Checked then
begin
if num_and > 1 then
begin
SQL.Add ('AND ');

end;
SQL.Add('data>='+edit1.text);
num_and:=num_and+1;

end;

if checkbox2.Checked then
begin
num_and:=num_and+1;
if num_and>1 then
begin
SQL.Add ('AND ');

end;
SQL.Add('data<='+edit2.text);


end;
end;
Open;
num_and:=0;
end;

ciao!

bDaniele
25-07-2002, 22:23
esiste un apposito cast per le date ma adesso non lo ricordo
vedi nell'help dell'sql

alka
25-07-2002, 23:58
Prova a delimitare le date con il simbolo #, oppure sostituisce il valore esplicito con un valore parametrico (ad esempio, :datainizio). Successivamente, puoi utilizzare il metodo ParamByName per inizializzare il valore del parametro.

Ciao! :ciauz:

elevation
26-07-2002, 10:50
ciao Alka,

- Prova a delimitare le date con il simbolo #

come mi hai detto funziona solo se inserisco negli edit la data in formato americano. Come posso convertirla??

ciao

alka
26-07-2002, 10:55
Si tratta di un problema ricorrente. Stai usando un database Access, vero?
Ad ogni modo, credo che l'unica soluzione sia utilizzare le funzioni Delphi per la manipolazione delle stringhe in modo da invertire da codice mese e giorno prima di passarlo alla query.
La soluzione alternativa è l'uso di parametri nella query: utilizzando StrToDateTime converti la data inserita nel controllo Edit e la passi come valore TDateTime al parametro.
Se vuoi gestire in modo più controllato l'input, utilizza un controllo MaskEdit.

Ciao! :ciauz:

elevation
26-07-2002, 11:00
ok, come faccio allora a scambiare mese e giorno nella stringa digitata nell'edit???

ciao!

alka
26-07-2002, 11:12
Eccoti un esempio pratico. Potresti costruire una funzione simile a questa:


function DateUS2UK(const DateStr: string): string;
var
g, m, y: string;
begin
g := Copy(DateStr, 4, 2);
m := Copy(DateStr, 1, 2);
y := Copy(DateStr, 7, 4);
Result := g + '/' + m + '/' + y;
end;


Passando a questa funzione una stringa del tipo 31/12/2002, essa restituisce 12/31/2002 invertendo semplicemente mese e giorno. Potrai utilizzare questo valore all'interno della query parametrica per esprimere le date nel formato richiesto.

Ciao! :ciauz:

elevation
26-07-2002, 11:16
adesso funziona!!

ciao

elevation
27-07-2002, 12:09
ciao Alka,

sto provando a sostituire gli edit con i datetimepicKer sostituendo nella query al posto di data1.text e data2.text datatimepicker1.date e datetimepicker2.date rispettivamente. Mi da il seguente errore:

Nessun valore predefinito per il parametro datetimepicker.date

come si utilizza questo componente?? Poi mi indica sempre la data del primo inserimento.

ciao

alka
27-07-2002, 15:19
Tanta fatica per elaborare una data inserita in formato testo all'interno di un controllo Edit per passare poi ad un controllo DateTimePicker? :dhò:

Il DateTimePicker dispone di proprietà di tipo TDateTime, quindi non puoi passarle direttamente nello statement SQL, ma devi convertirle usando la funzione DateTimeToStr...poi però incapperai nello stesso problema iniziale che avevamo precedentemente risolto: l'inversione del giorno col mese.

Ciao! :ciauz:

Loading