Newsgroup: it.comp.lang.delphi
Titolo: RecordCount & TSQLQuery

Ciao a tutti,
ma come è possibile che effettuo una query SQL
la quale mi restituisce un certo numero di record
(inferiore al totale dei record presenti nella tabella) 
ma il recordcount assume sempre il totale del totale dei record 
nella tabella...
myQuery.SQL.Clear;
myQuery.SQL.Add('SELECT * FROM TAB1 WHERE DESC LIKE ''A%''');
myQuery.Active := True;
Se faccio myQuery.RecordCount  questo mi ritorna il valore 6
poichè i record nella tabella sono 6, 
ma se poi ciclo sulla tabella per riempire una Lista,
questa mi visualizza solo 2 record (che giustamente
sono gli unici 2 record con descrizione A...)
Qualcuno me lo spiega?
Rino
p.s. uso D2005.
 


Te lo spiega l'help [e' quello di D4, ma non credo sia poi cosi' 
diverso
da quello di D2005]:
"This function returns -1 in all cases. Ordinarily an application will 
not access RecordCount
at the TDataSet level. Instead a redeclared and implemented 
RecordCount property in a descendant
object such as TTable is accessed. RecordCount provides a fallback 
property for derived dataset
objects that do not reimplement it."
e poi
"Note: Use RecordCount with care, because record counting can be a 
costly operation,
especially for SQL queries that return large result sets. Generally, 
an application should only
use RecordCount with Paradox and dBASE tables."
In definitiva, RecordCount oltre a fare un fetchall oneroso in termini 
prestazionali, e' fortemente
influenzato dall'implementazione interna delle classi che utilizzi per 
interfacciarti
al DB utilizzato (che ovviamente non hai specificato).
Per sapere invece quanti record una istruzione SQl ha recuperato, 
utilizza la
procedura COUNT sempre di SQL.
Ciao
-- 
ACSH
[D4]
Chi fa da se', fatica il doppio 

Incredibile!!!!
Ho trovato forse dov'è il problema.....
Se scrivo la query in un sola linea :
  myQuery.SQL.Add('SELECT * FROM MYTAB WHERE DESC LIKE ''A%''');
il risultato è giusto : " 1 record "
Se invece scrivo : 
  myQuery.SQL.Add('SELECT * FROM MYTAB');
  myQuery.SQL.Add('WHERE DESC LIKE ''A%''');
mi da come recordcount : " 6 record "......
Qualcuno sà dirmi cosa può essere?
Vi ricordo che uso Delphi 2005!
Ciao
Rino
 

 ha scritto nel messaggio 
news:200506281...@mynewsgate.net...


 Giorgio
Ma quando uso l'ADD non ho bisogno di spazi fra una riga ed un'altra.
Io in Delphi 6 ho usato molto la DBEXpress ma non ho mai avuto
di questi problemi.
Considera che addirittura ho provato a fare 
  myQuery.SQL.Add('SELECT * FROM MYTAB WHERE DESC LIKE ''A%''');
  myQuery.SQL.Add('ORDER BY CODICE'); 
e va in errore!!!!
Non quando apro la query (myQuery.Open) ma quando faccio :
  myQuery.RecordCount.
Secondo me c'è qualche bug nella DBEXPRESS del 2005, ma se fosse
così... come risolvo il problema?
 


Continui a ricordarci che usi D2005 ma questo e' forse la cosa meno
importante: se utilizzi componenti *generici* per l'accesso ad un db
(che abbiamo scoperto essere DB2) e' possibile che vi siano
incongrenze ed incompabilita' tra versioni ed implementazioni degli
stessi componenti, del DB che usi e dei driver che si frappongono
ad essi  . In alcuni casi, e' addirittura possibile che un DB non
supporti la funzionalita' "generica" implementata invece
in un componente.
Questa e' la teoria generale della quale sono a conoscenza.
Un'altra norma di "buona programmazione" della quale sono a conoscenza
e' che in un ambiente in multiutenza conoscere il numero dei
record restituiti da un determinato comando SQL non ha molto
senso (il primo esempio che mi viene in mente e' che e' possibile
ci sia una transizione in corso che puo' modificare questo valore,
oppure che esista una sorta di "cache" che falsi il risultato);
nel caso si desideri davvero conoscere tale valore il modo
migliore, piu' veloce e sicuramente corretto per ottenerlo e'
con una SELECT COUNT(*) WHERE ... (regola pratica: tutti i DB
implementano lo standard SQL come codificato da chi di dovere
mentre non sono sicuro che le DBEXPRESS abbiano driver
aggiornati a tutte le versioni dei vari motori database).
Alcuni esempi di quello che dico:
http://bdn.borland.com/article/0,1410,28160,00.html
<inzio cit.>
Unless the result set is small, never use the Filter property or 
OnFilter
event, or call RecordCount with a TQuery, this forces the entire 
record
set to be fetched.
If you really need the record count, use another query to get it
so the server will do the counting and send back the count itself
instead of all the records.
<fine cit>
Oppure
http://delphi.newswhat.com/geoxml/forumhistorythread?groupname=borland.public.delphi.database.dbexpress&messageid=3f0e1f1c$1...@newsgroups.borland.com
Ultimo tips: prova a fare un LAST sulla query e poi leggere il RecNo.
(NON ho D2005 ne aluna versione delle DBExpress, quindi non
posso fare prove di quello che ti sto consigliando).
Ciao.



Continui a ricordarci che usi D2005 ma questo e' forse la cosa meno
importante: se utilizzi componenti *generici* per l'accesso ad un db 
(che
abbiamo scoperto essere DB2) e' possibile che vi siano incongrenze
ed incompabilita' tra versioni ed implementazioni degli
stessi componenti, del DB che usi e dei driver che si frappongono
ad essi. In alcuni casi, e' addirittura possibile che un DB non 
supporti
la funzionalita' "generica" implementata invece in un componente.
Questa e' la teoria generale della quale sono a conoscenza.
Un'altra norma di "buona programmazione" della quale sono a conoscenza
e' che in un ambiente in multiutenza conoscere il numero dei
record restituiti da un determinato comando SQL non ha molto senso
e nel caso si desideri davvero conoscere tale valore il modo
migliore, piu' veloce e sicuramente corretto per ottenerlo e'
con una SELECT COUNT(*) WHERE ... (regola pratica: tutti i DB
implementano lo standard SQL come codificato da chi di dovere
mentre non sono sicuro che le DBEXPRESS abbiano driver
aggiornati a tutte le versioni dei vari motori database).
Ciao.


 
Ciao e grazie mille.
Rino