Newsgroup: it.comp.lang.delphi
Titolo: record di tabella

Ho un comando select in una tabella firebird. Come faccio a sapere quanti 
record restituisce senza ricorrere a cicli first, next?
Giorgio 

 Giorgio 
Se usi i ClientDataSet(o simili) controlla la proprietà RecordCount.
Oppure devi fare una seconda query con il un select count(ID) from tabella
Saluti Goblin


Uso gli IBX che non hanno il RecordCount. Usando un select il Count(ID) come 
faccio a memorizzarlo in una variabile per leggerlo poi e select eseguito?
Giorgio 

^_Goblin_^ ha scritto:

Se hai molti record (dove molti è un numero X che non ricordo) il
RecordCount non funziona, dovresti fare un .Last e poi record count, ma
credo che la via preferibile sia fare
SELECT COUNT(*)
FROM TABELLA
ExecQuery; 
numRec := Fields[0].AsInteger;
Saluti

 
La select Count ... ti restituisce una sola colonna e un solo record il 
cui valore è il numero dei record presenti in tabella.
dunque con select count(ID) from tabella
nVariabile := Tabella.fields[0].AsInteger;
Oppure puoi dare un nome alla colonna count con Select Count (ID)NRECORD 
from tabella e poi leggere il valore con un:
nVariabile := Tabella.fieldByName('NRECORD').AsInteger;
Saluti Goblin

la recordcount fa un fetchall.
Immagina cosa succede se la select restituisce 20.000.000 di record..
la select count(*) from tabella è una select a tutti gli effetti.
Quindi, scrivi oggetto.fieldbyname...
Se vuoi semplificarti la vita, puoi scrivere:
SELECT COUNT(*) CONTEGGIO FROM TABELLA
E poi
x := query.fieldbyname('conteggio').AsInteger;
A.

 RecordCount non funziona, dovresti fare un .Last e poi record count
Mi pare fosse un problema del jet engine ADO di qualche versione fa, che 
io ricordi i CDS non hanno mai avuto problemi con il recordcount ....
Cmq se qualcuno è + informato ....
Saluti
Goblin

 record restituisce senza ricorrere a cicli first, next?
Devi eseguire una select count.  Tieni presente che dbExpress, ad esempio,
mette a disposizione cursori unidirezionali, quindi a meno di non
possedere un dataset contenitore (vedi il CDS), non è possibile scorrerli
per sapere quanti sono e poi procedere all'elaborazione.  Non investigare
la proprietà RecordCount del CDS perché non è affidabile (i.e. restituisce
solo il numero di record parzialmente fetchati e non quelli effettivamente
presenti in tabella).
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Se usi i ClientDataSet(o simili) controlla la proprietą RecordCount.
Non č affidabile la RecordCount.  Questa proprietą restituisce solo il
numero di record presente nel subset "fetchato".


 la recordcount fa un fetchall.
Assolutamente no.


 io ricordi i CDS non hanno mai avuto problemi con il recordcount ....
Ti stai sbagliando.  La regola di inaffidabilità della RecordCount
prescinde dai componenti specifici usati per accedere ai dati.  L'unica
maniera affidabile per sapere quanti record ci sono in una tabella è
lasciarselo dire dal DB, interrogandolo con una select count, operazione
precisa e mirata allo scopo.


 Assolutamente no.
Quindi, se le volessi affidabile dovrei dare prima un last?
A.

 
La proprietą del CDS "PacketRecords" settata a -1 come da Help (F1) mi dice:
"When a client dataset is instantiated, PacketRecords is automatically 
set to -1, meaning that a single packet should contain all records in 
the dataset."
Dunque il recordcount non dovrebbe sbarellare ....
Cosa mi perdo ????
Saluti Goblin

 Quindi, se le volessi affidabile dovrei dare prima un last?
Se volessi il count affidabile di quanti record sono presenti in una
tabella, devi fare una select count.


 Dunque il recordcount non dovrebbe sbarellare ....
Non c'entra il PacketRecords.  Il fetching dei record dal database è
comunque progressivo.


 Cmq se qualcuno è + informato ..
Ritengo che usare il cds per determinare il recordcount sia un errore
concettuale: il numero di record prelevato da una query viene determinato
dal database, pertanto e' meglio affidarsi al medesimo e sparargli una sql
preventiva senza perarltro cambiare la condizione where che hai gia'...
basta sostituire COUNT(*) all'elenco di colonne che vuoi prelevare con la
query ed il giochillo è fatto.
ciao
-- 
Morde. 
(email fittizia, non sono contattabile)
ICLDweb: 
http://www2.samatel.com/icld/

 comunque progressivo.
Alla fine ho risolto con un select count(*) from table where ecc. e 
raccogliendo il valore del ds.fields[0].asInteger;
Ringrazio tutti per i suggerimenti.
Giorgio