Newsgroup: it.comp.lang.delphi
Titolo: Problemi con query con D5

Salve a tutti...
Vengo subito ad esporre il mio problema...
L'ambiente di lavoro e' delphi5
Il db e' firebird
la connessione e' via ado
Ho un datamodule con un elenco di query
Nella filter d ognuna d esse ho inserito quello che dovr� esser contenuto 
nella where... in modo che ciclando il dm stesso apro tutte le query gia' 
con i parametri impostati
Faccio un esempio
Query Clienti --> Select * From Clienti
nella filter ho messo Saldo;0
quando far� il ciclo costruir� nuovamente la query e poi aprendola con --> 
Select * From Clienti Where Saldo = 0
e in questo caso funziona perfettamente....
Il problema si presenta se metto nella filter un campo variabile....
Query Azienda --> Select * From Azienda
nella filter ho messo ID;MainForm.hhID
prima d arrivare al ciclo delle aperture delle query... diciamo che 
MainForm.hhID e' 0000001
Quando arriva ad aprire la query Azienda mi scrive esattamente... Select * 
From Azienda Where ID = MainForm.hhID .... mentre... dovrebbe secondo me ( e 
qua sono bloccato )
 
                                      Select * From Azienda Where ID = 
0000001
Come faccio ad utilizzare il contenuto della variabile MainForm.hhID ed 
impostarlo nella query sopra?
Spero di esser stato chiaro... Grazie a tutti 

 Spero di esser stato chiaro... Grazie a tutti
Io sposterei la logica dal filter ai parametri.. mi spiego
1) modifico la query di apertura Select * From Azienda where ID=:nID
2) prima di aprire la query setto il parametro: 
TADOQUERY.Parameters.ParamByName('nID').Value := MainForm.hhID;
^_Goblin_^
-- 
Ibis et redibis non morieris in bello
http://goblinland.myminicity.com/

> quando far� il ciclo costruir� nuovamente la query e poi aprendola 


:-(
Non funziona....
ho scritto cos�
ma quando apre la query il recordcount e' 0  :-(
If (Temp AS TADOQuery).Parameters.Count > 0 Then
Begin
       SetLength(aFilter , 5);
       sTemp            := '';
       aFilter[0]       := '';
       aFilter[1]       := '';
       aFilter[2]       := '';
       aFilter[3]       := '';
       aFilter[4]       := '';
       KK               := 0;
       sFilter          := (Temp AS TADOQuery).Filter;
       For J := 1 To Length(sFilter) Do
       Begin
          If sFilter[J] = ';' Then
          Begin
             aFilter[KK]        := sTemp;
             Inc(KK);
             sTemp              := '';
          End
          Else
             sTemp              := sTemp + sFilter[J];
       End;
       aFilter[KK]              := sTemp;
       For J := 0 To 4 Do
       If aFilter[J] <> '' Then
           (Temp AS TADOQuery).Parameters.ParamByName('sParametro' + 
IntToStr(J+1)).Value := aFilter[J];
End;
 

 
Non so bene come si comporta la filter con ADO, ma credo che si porta a 
casa tutta la tabella FB e poi ti mostra il dataset filtrato, se questo 
è il comportamento ti conviene cambiare la logica e spostare tutte le 
aperture nei parametri. Se hai pochi record non ti accorgi, ma pensa con 
qualche decina di migliaia di record ... magari con qualche memo i tempi 
di caricamento diventano impensabili, oltre che inutile portarsi nella 
query record che al momento non usi.
 > Select Impianto where (anno = :anno) And (Id = :id) e nella filter metto
 > MainForm.hhanno;MainForm.hhID
 > e poi li lavoro mettendoli in arrary?
Non capisco .... cosa ti serve mettere le tue variabili nel filter??
se imposti la query con 2 parametri allora sai che li devi assegnare,
TADOQUERY.Parameters.ParamByName('anno').Value := MainForm.hhanno e
TADOQUERY.Parameters.ParamByName('id').Value := MainForm.hhID.
Se, invece, non conosci i parametri della query puoi sempre "ravanarli", 
la proprietà Parameters è una Collection(lista) la puoi scorrere ed 
interrogare, qualcosa del tipo "if 
Assigned(TADOQUERY.Parameters.FindParam('anno')) then" ... beccato il 
parametro "anno" adesso lo devo assegnare alla variabile 
MainForm.hhanno, puoi scorrere la lista dei parametri ed assegnarli ...


 la propriet� Parameters � una Collection(lista) la puoi scorrere ed 


 
Forse stiamo parlando 2 lingue diverse :), tu confondi il parametro con 
la variabile, se non assegni nessun valore al parametro "mainForm.hhid" 
mi sembra giusto che il dataset risultante è vuoto.
la tua query "select * From azienda where id = :nid" contiene il 
parametro "nid" a questo parametro devi assegnare il valore della 
variabile "mainForm.hhid" l'istruzione di assegnazione è: 
"TADOQUERY.Parameters.ParamByName('nid').Value := MainForm.hhID"


 "mainForm.hhid" l'istruzione di assegnazione �: 


 
Non mi ricordo se c'e' qualcosa che ti prende il nome della variabile e 
la converte nel suo valore.
Se devo seguire la tua logica farei qualcosa del tipo:
procedure SettaQry(oQry: TAdoQuery; Params: variant);
Var i: Integer;
     vType: Integer;
begin
// Loop su tutti i valori passati
   for i := VarArrayLowBound(Params,1) to VarArrayHighBound(Params,1) do
   begin
     // in base al tipo assegno il valore
     vType := VarType(Params[i]);
     if (vType = varEmpty) or (vType = varNull) then
       oQry.Parameters[i].Value := EmptyParam
     else if (vType = varDate) then
       oQry.Parameters[i].Value := FormatDateTime('dd/mm/aaa',Params[i])
     else
      oQry.Parameters[i].Value:= Trim(Params[i]);
   end;
end;
Tenuto conto che:
Query con 1 solo parametro
ADOQuery1.Sql.Text :='Select * From Azienda Where ID_Impianto_Corrente = 
:sParametro1'
SettaQry(ADOQuery1, VarArrayOf([MainForm.hhID]));
....
Query con 2 parametri
ADOQuery2.Sql.Text :='Select * From Azienda where Where 
ID_Impianto_Corrente = :sParametro1 and  Anno=:sParametro2 '
SettaQry(ADOQuery1, VarArrayOf([MainForm.hhID, MainForm.hhAnno]));
......
Io uso D2007.
Di piu' nin zo :)


> la query io l'ho scritta cos�...


 quando farà il ciclo costruirà nuovamente la query e poi aprendola con -->


> quando far� il ciclo costruir� nuovamente la query e poi aprendola 


se hai il "nome" e non il "valore", è sbagliata l'assegnazione che
fai: non ci sono alternative. Se scrivi:
Sql.Add(' SELECT * FROM BABLABA ');
Sql.Add(' where ');
Sql.Add(' campo=variabile');
stai facendo una cazzata. Se scrivi:
Sql.Add(' SELECT * FROM BABLABA ');
Sql.Add(' where ');
Sql.Add(' campo=' + #apice + variabile + #apice);
ottieni quello che vuoi.
#apice va OVVIAMENTE SOSTITUITO con ansiquoted oppure con il codice
asci dell'apice.
A.

 se hai il "nome" e non il "valore", � sbagliata l'assegnazione che
