Newsgroup: it.comp.lang.delphi
Titolo: query SQL

Ho un bene da noleggiare che ha un prezzo base; il suo prezzo
può essere diverso in alcuni periodi.
Ho una tabella BENI contenente le informazioni del bene:
ID	prezzobase
1	150,00
2	134,00
...
e una tabella PREZZI contenente i prezzi che cambiano nel
periodo specificato:
IDbene	data_da		data_a		prezzo
1	10/01/2004  	30/01/2004	180,00
1	21/03/2004  	25/03/2004	160,00
...
Per sapere il prezzo totale, tramite un ciclo for i:= 1 to
num_giorni_noleggio interrogo il database controllando
se il prezzo per quel giorno dell'anno ricade in un particolare
periodo, se esiste, leggo il prezzo, altrimenti per quel
giorno il prezzo è uguale al prezzo base e lo sommo al totale.
Non trovo però la soluzione particolarmente efficiente,
all'aumentare nel numero dei giorni di noleggio aumentano
il numero di interrogazioni al database. Sapete consigliarmi
una query per interrogare il database una volta sola e
farmi ritornare il prezzo totale speficandogli l'id del bene?
Oppure mi conviene strutturare le tabelle diversamente?
Il risultato finale dovrebbe essere, specificando una data inizio
e una data fine, una stampa degli ID e del prezzo totale ordinati
per prezzo in ordine crescente.
Grazie
Antonio


La butto là, io proverei a fare una query con un range su cui cercare
SELECT .. FROM...  WHERE DATA IN ("giornonoleggio1", "giornonoleggio2",
ecc..)
Così con una sola interrogazione sai se il periodo di noleggio cade in un
periodo a prezzo particoloare
Potresti anche studiarti la BETWEEN che forse può anche esserti più utile
Io IN e BETWEEN le ho usate praticamente mai, ma forse la strada è questa.
Ciao

Antonio
	Ciao
	MassimoB
 

 Antonio
ci provo...
var
  Data: TDateTime;
begin
  //HO APERTO LA QUERY PREZZI con il seguente SQL "SELECT * FROM PREZZI
WHERE   IDBene='+BeniID.AsString+' ORDER BY Data_Da';
  PREZZI.First;
  Data := DataInizioNoleggio;
  while not(Data>=DataFineNoleggio) do
  begin
     while not(PREZZIData_Da.ADateTime<=Data) or not(PREZZI.EOF) do
     begin
        PREZZI.Next;
     end;
     if (PREZZIData_Da.ADateTime<=Data) then
     begin
        if (DataFineNoleggio<=PREZZIData_A.ADateTime) then
        begin
           ///HO TROVATO UN PERIODO AD UNICA TARIFFA FINO ALLA FINE
           TB_STAMPA.Insert;
           TB_STAMPAID.Value := BENIID.Value;
           TB_STAMPAData_Da.Value := Data;
           TB_STAMPAData_A.Value := DataFineNoleggio;
           TB_STAMPAGiorni.Value :=
TB_STAMPAData_A.Value-TB_STAMPAData_Da.Value+1;
           TB_STAMPAImporto.Value :=  TB_STAMPAGiorni.Value*
PREZZIPrezzo.Value;
           TB_STAMPA.Post;
           Data := DataFineNoleggio;
        end
        else
        begin
           ///HO TROVATO UN PERIODO AD UNICA TARIFFA FINO AD UNA CERTA DATA
           TB_STAMPA.Insert;
           TB_STAMPAID.Value := BENIID.Value;
           TB_STAMPAData_Da.Value := Data;
           TB_STAMPAData_A.Value := TB_STAMPAData_A.Value;
           TB_STAMPAGiorni.Value :=
TB_STAMPAData_A.Value-TB_STAMPAData_Da.Value+1;
           TB_STAMPAImporto.Value :=  TB_STAMPAGiorni.Value*
PREZZIPrezzo.Value;
           TB_STAMPA.Post;
           Data := TB_STAMPAData_A.Value+1;
        end;
     end
     else
     begin
        //la tabella prezzi non č inserita bene.
     end;
  end;
end;
l'ho fatta al volo... non so se funziona.
Ciao.
Mirko, Sole & C.