PDA

Visualizza la versione completa : [delphi] assegnare ad una variabile il numero di record di una query


123delphi321
20-02-2004, 18:37
Ciao,

perfavore, se eseguo una select mi viene restituito un certo numeri di records che soddisfano la mia richesta.

come si fa x assegnare ad una variabile quel numero?

es:

select * from tabella where nome = 'antonio'

come risultato ho 30 records.

vorrei che una mia variabile abbia quel valore... miavariabile= nrecord (30)

grazie

alka
20-02-2004, 19:22
Il componente IBQuery, tanto per citarne uno, è dotato di una proprietà RecordCount che restituisce esattamente l'informazione che ti interessa.

Trattandosi di un valore intero (essendo un conteggio), va convertito in stringa per poter essere visualizzato come Caption.



...
MyLabel.Caption := IntToStr(IBQuery.RecordCount);
...


Vedo che non fai molto uso della Guida in linea però... ;)

123delphi321
20-02-2004, 21:43
sto usando la funzione che mi hai indicato IBQuery.RecordCount

io visualizzo i record ottenuti dalla query in un dbgrid:

[#CODE]
IBQuery1.Open;
label2.Caption := 'Trovati: ' +IntToStr(IBQuery1.RecordCount);
[#/CODE]

come risultato ottengo una label: 'Trovati : 8'.
8 e' il numero di records che possono essere visualizzati nella dbgrid.
in realtà, la query restituisce piu di 100 records.

sto cercando di guardare nell'help....e da come capisco avrebbe dovuto funzionare gia in questa maniera...

grazie

alka
21-02-2004, 11:45
Originariamente inviato da 123delphi321
8 e' il numero di records che possono essere visualizzati nella dbgrid.
in realtà, la query restituisce piu di 100 records.

8 è il numero di record che vengono visualizzati in una sola schermata della DBGrid, oppure è il numero massimo di record che vedi nella griglia?

123delphi321
21-02-2004, 12:11
8 e' il numero di righe che, per motivi di spazio, vengono visualizzati nel video....poi con l'opportuna 'scrollbar' vedo anke gli altri records....


ti volevo chiedere anke un'altra cosa:

se faccio una select cosi dalla finestra di IBconsole va tutto ok:

select * from tabella where codice like '00000000000'

mi viene restituito una query con 0 elementi.

ma se faccio la stessa query da dentro il mio programma delphi...viene generato un errore: "Trying to store a string of lenght 14 in a field that can only contain 8"

il campo 'codice' della mia tabella e' di lunghezza 8.
c'e' un metodo adatto x risolvere anke questo problema?

grazie .....x tutto l'aiuto che mi stai dando! :ciauz:

alka
21-02-2004, 12:24
Originariamente inviato da 123delphi321
8 e' il numero di righe che, per motivi di spazio, vengono visualizzati nel video....poi con l'opportuna 'scrollbar' vedo anke gli altri records....
Capisco...molto probabilmente, per ottimizzare le risorse, la griglia richiede al componente IBQuery le righe da visualizzare "un poco alla volta", generando quel problema.

Il metodo più sicuro che conosco per ottenere il conteggio dei record è quello di eseguire una query:


SELECT COUNT(*) AS Conteggio FROM Tabella;

Chiaramente, lo statement va completato con le clausole WHERE appropriate che ti permettono di filtrare i dati da contare.
La query restituisce il campo Conteggio con il numero di record individuati.



Originariamente inviato da 123delphi321
il campo 'codice' della mia tabella e' di lunghezza 8.
c'e' un metodo adatto x risolvere anke questo problema?
Sì, se il campo ha 8 caratteri al massimo, non eseguire query in cui il contenuto del campo viene confrontato con valori di dimensione superiore agli 8 caratteri.

IB Console è un'applicazione e pertanto è possibile che esegua delle operazioni di controllo prima di lanciare la query, cosa che non viene fatta dal tuo programma se non inserendo codice appropriato che evidentemente è presente in IB Console.

Ciao! :ciauz:

123delphi321
21-02-2004, 12:32
adesso, scrivero' gli opportuni controlli x la lunghezza dei campi da ricercare.



SELECT COUNT(*) AS Conteggio FROM Tabella;


facendo questa query ottengo il numero dei record....

io volevo 'esplodere' il risultato della query nella dbgrid, e scrivere sopra i record risultanti.

quindi utilizzando questo tipo di conteggio dovrei eseguire 2 query:



SELECT COUNT(*) AS Conteggio FROM Tabella;
SELECT * FROM Tabella;


con conseguente appesantimento di transazioni......

pensi sia una transazione pesante...o si puo tranquillamente fare cosi?

:ciauz:

alka
21-02-2004, 12:45
Devi necessariamente usare due query separate: la prima per reperire i dati, la seconda per calcolare il numero di record.

Esegui effettivamente due interrogazioni sul server SQL, ma tieni presente che la seconda ha un peso molto ridotto poichè il conteggio è una elaborazione tutto sommato semplice e restituisce alla fine una tabella con un solo campo e un unico record contenente il risultato.

Ciao! :ciauz:

123delphi321
21-02-2004, 17:45
il conteggio del risultato funziona nella maniera precedentemente descritta, ma non mi faccio capace di dover eseguire 2 volte la stessa query!

ho fatto vari tentativi, nel senso di inserire l'assegnazione:


label2.Caption := 'Trovati: '+IntToStr(IBQuery1.RecordCount);

in vari eventi come ad esempio AfterOpen, il risultato ottenuto, pero, e' sempre lo stesso.... eppure continuo a non capire:

questo e' quanto scritto...


IBQuery1.SQL.Text := 'select * from tabella';
IBQuery1.Open;
label2.Caption := 'Trovati: '+IntToStr(IBQuery1.RecordCount);


avete qualche ulteriore suggerimento?
non so piu' cosa provare..... :dhò:


grazie

alka
21-02-2004, 21:00
Non hai seguito il mio suggerimento!!

Nel messaggio di risposta ti ho scritto di usare la seguente forma di statement SQL:


SELECT COUNT(*) AS CONTEGGIO FROM Tabella;

Poi, ti ho detto che nel campo Conteggio, che noti all'interno dello statement, ti ritrovi con il conteggio dei campi.

Quindi, dopo aver eseguito la query sopra, puoi leggere il numero di record da


IBQuery.FieldByName('CONTEGGIO').AsInteger
.

La necessità di eseguire due query sta nel fatto che una ti serve per reperire i dati, la seconda invece per reperire il solo conteggio.

La proprietà RecordCount lasciala perdere, poichè non ha un comportamento affidabile per quello che vuoi fare tu.

Ciao! :ciauz:

Loading