Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326

    [delphi] assegnare ad una variabile il numero di record di una query

    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

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    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.

    codice:
    ...
    MyLabel.Caption := IntToStr(IBQuery.RecordCount);
    ...
    Vedo che non fai molto uso della Guida in linea però...
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    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

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    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?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    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!

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    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:
    codice:
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    adesso, scrivero' gli opportuni controlli x la lunghezza dei campi da ricercare.

    codice:
    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:

    codice:
    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?


  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    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:
    codice:
    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...
    codice:
    IBQuery1.SQL.Text := 'select * from tabella';
    IBQuery1.Open;
    label2.Caption := 'Trovati: '+IntToStr(IBQuery1.RecordCount);
    avete qualche ulteriore suggerimento?
    non so piu' cosa provare.....


    grazie

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Non hai seguito il mio suggerimento!!

    Nel messaggio di risposta ti ho scritto di usare la seguente forma di statement SQL:
    codice:
    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
    codice:
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.