PDA

Visualizza la versione completa : delphi - IBquery


123delphi321
14-02-2004, 14:38
vorrei cercare di posizionarmi sul primo record che soddisfa una condizione. (tramite sql)

pertanto ho la seguente tabella:

codice

0003
0001
0002
0004

ho una form, e su di essa l'oggetto IBquery a cui ho associato il seguente codice:

SELECT * from TABELLA_NOMI where codice>="0002" ORDER BY codice;

come risultato ho 3 record, e sono posizionato sul record con codice 0002

...(esiste una clausula x averne come risultato solo il primo?)

fin qui ok?!

adesso ho inserito un textbox sulla form dove vorrei inserire una valore da ricercare....

e in futuro sul suo evento Onchenge vorrei eseguire nuovamente IBquery.open in modo da posizionarmi sempre sul primo record che soddisfa la mia condizione,

quindi ho provato a scrivere questo codice nella proprieta sql della IBquery:

SELECT * from TABELLA_NOMI where codice>=form1.edit1.text ORDER BY codice;

a questo punto, eseguendo il run...ottengo un errore sql 104.

non so cosa sia.....

ho erratamente pensato che dipendesse da una dichiarazione di variabile ed ho anke provato cosi:

in Unit1

var
cercare : string;


poi sull'evento beforeopen di IBquery:

cercare := form1.edit1.text;

e cambiando infine:

SELECT * from TABELLA_NOMI where codice>=cercare ORDER BY codice;


chiaramente stesso errore: sql 104.


aiutooo

alka
14-02-2004, 15:08
Originariamente inviato da 123delphi321

quindi ho provato a scrivere questo codice nella proprieta sql della IBquery:

SELECT * from TABELLA_NOMI where codice>=form1.edit1.text ORDER BY codice;

a questo punto, eseguendo il run...ottengo un errore sql 104.

Errore grave: la propriet SQL della IBQuery una stringa, ed in particolare una stringa che contiene uno statement SQL valido da poter essere eseguito sul database server.

Non puoi inserire un riferimento diretto, sottoforma di stringa, ad un qualsivoglia componente o controllo o altro elemento di Delphi, poich tale elemento viene inviato al server che non assolutamente in grado di capire a cosa fa riferimento il contenuto dello statement SQL.

Al massimo, puoi creare delle query parametriche inserendo nello statement i nomi di parametri preceduti da ":" che verranno poi dotati dei rispettivi valori prima di mandare in esecuzione la query presso il database server.

Riprendendo il tuo esempio:


IBQuery.SQL.Text := 'SELECT * FROM TabellaNomi WHERE Codice = :ParCodice';
IBQuery.ParamByName('ParCodice').AsString := Edit1.Text;
IBQuery.Open;
if not IBQuery.IsEmpty then
begin
...
end;
IBQuery.Close;

In questo modo, definisci uno statement SQL per prelevare dal DB la riga avente il codice uguale a quello specificato dal parametro ParCodice, del quale definisci il valore nella riga immediatamente successiva, prima di aprire (eseguire) la query con il metodo Open ottenendo cos i risultati che rispecchiano il criterio di ricerca specificato; se vi sono risultati, IsEmpty restituisce False quindi possibile leggere i dati del primo record o eseguire un ciclo while not IBQuery.Eof do spostandosi di record in record con il metodo IBQuery.Next fino alla fine della tabella dati; infine, la tabella viene chiusa con il metodo Close.

Solo una nota: trovo che abbia poco senso la condizione Codice >= Valore, specialmente se il codice di tipo alfanumerico (testuale).

123delphi321
15-02-2004, 19:03
riesco a fare la query e ad avere un risultatio.

sulla form1 ho un Tedit(Edit1) nel quale inserisco una stringa da cercare nella mia tabella.

il risultato della query lo visualizzo in un DBgrid di cui setto la proprieta visible a true o a false a secondo se la query non e' empty.

genero la query sull'evento click del button1, ho scritto il seguente codice:

procedure TForm1.Button1Click(Sender: TObject);
begin
IBQuery1.SQL.Text := 'SELECT * FROM Tabella_nomi where nome = :ParCodice ORDER BY nome';
IBQuery1.ParamByName('ParCodice').AsString := Edit1.Text;
IBQuery1.Open;
if not IBQuery1.IsEmpty then
dbgrid1.Visible:=true
else
dbgrid1.Visible:=false;

end;

questo funziona.

adesso volevo modificare la select al fine di avere come risultato tutti i valori che "contengono" cio che viene inserito in Edit1, quindi:

supponendo che si voglia ricercare tutti i record che hanno nel nome la parola "anton"

IBQuery1.SQL.Text := 'SELECT codice,nome,tel FROM Tabella_nomi where nome LIKE %anton% ORDER BY nome';

quindi inserendo una variabile...:

IBQuery1.SQL.Text := 'SELECT codice,nome,tel FROM Tabella_nomi where nome LIKE %:ParCodice% ORDER BY nome';

questa maniera e' errata... :dh:


domanda 2:
e' possibile eseguire una query che non sia case sensitive, cioe dia risultato tutti i record sia se maiuscolo che in minuscolo:
in pratica cercando "anton" vengano restituiti i record ANTON e anton?


domanda 3:
si puo fare una query che cerchi il valore desiderato in due campi diversi?
es.:

select * from tabella_nome where nome+indirizzo LIKE 'anton';

in pratica ottenere come risultato i record che abbiano la parola "anton" o nel campo nome o nel campo indirizzo o in entrambi.

domanda 4:
quando faccio una queri vorrei visualizzare il numero di records trovati. quindi assegnare tale valore ad una label opportunamente messa sulla form.
quindi faccio la query

select * from tabella

label.caption = ???????????


grazie

Loading