PDA

Visualizza la versione completa : [delphi] da IBQuery a IBDataset


123delphi321
05-05-2004, 00:08
Ciao a tutti,

eseguo una IBQuery premendo un pulsante e ne visualizzo il suo risultato in una DBGrid.

IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.add('SELECT *');
IBQuery1.SQL.add(' from Movimenti');

if DBEdit1.Text <> '' then
begin
IBQuery1.SQL.add(' where');
IBQuery1.SQL.add(' fornitore like :PARAM1 ');
IBQuery1.ParamByName('Param1').AsString:= DBEdit1.Text ;
end;

IBQuery1.SQL.Add(' ORDER BY data');

IBQuery1.Open ;

questo codice funziona bene, se DBEdit1.Text e' = '' vengono visualizzati tutti i record della tabella Movimenti, se invece DBEdit1.Text e' = '13' vengono visualizzati solo i record del fornitore '13'......qui e' tutto ok!

...e' nata l'esigenza di poter modificare i valori di questa query, quindi ho sostituito l'oggetto IBQuery con un Oggetto IBdataset.

IBDataset1.Close;
IBDataset1.SelectSQL.Clear;
IBDataset1.SelectSQL.add('SELECT *');
IBDataset1.SelectSQL.add(' from Movimenti');

if DBEdit1.Text <> '' then
begin
IBDataset1.SelectSQL.add(' where');
IBDataset1.SelectSQL.add(' fornitore like :PARAM1 ');
IBDataset1.ParamByName('Param1').AsString:= DBEdit1.Text ;
end;

IBDataset1.SelectSQL.Add(' ORDER BY data');

// mia:= IBdataset1.selectsql.text;

IBDataset1.Open ;

con questo codice se DBEdit1.Text e' = '' vengono visualizzati tutti i record della tabella Movimenti, se invece DBEdit1.Text e' = '13' non viene ottenuto alcun risultato! IBdataset e' vuoto!

come se avesse problema con il parametro che gli passo.
ho controllato con il debugger il valore IBdataset1.selectsql.text e questo era = 'select * from fornitori where fornitore like :PARAM1 ORDER BY data'

a voi e' capitato mai?

grazie

alka
05-05-2004, 09:33
I Params usati da IBDataSet non sono i parametri standard che si trovano in tutti gli altri componenti, ma sono tipi specifici pensati per InterBase.

Ho lavorato pochissimo con IBDataSet, quindi non vorrei dire un'eresia, ma trattandosi di un'implementazione particolare spero che il reperimento del parametro attraverso il nome non distingua tra maiuscole e minuscole ('Param1' <> 'PARAM1').

Inoltre, il componente che utilizzo abbastanza spesso (SimpleDataSet) per rappresentare un DataSet esegue una "pulizia" dei valori dei parametri (probabilmente perchŔ li ricrea) quando lo statement SQL cambia.
Nel tuo codice, vedo che prima definisci un parametro, poi li assegni un valore e successivamente modifichi di nuovo lo statement SQL aggiungendo la clausola ORDER BY: sei sicuro che in quel momento, il parametro ha ancora il valore precedentemente assegnato?

Per entrambi i casi, puoi verificare in fretta usando la finestra di Evaluate di Delphi inserendo una chiamata alla funzione ParamByName e, in caso positivo, cercando di ispezionarne il valore per vedere se Ŕ stato mantenuto.

Purtroppo non mi viene in mente altro.

Ciao! :ciauz:

123delphi321
05-05-2004, 10:01
Per entrambi i casi, puoi verificare in fretta usando la finestra di Evaluate di Delphi inserendo una chiamata alla funzione ParamByName e, in caso positivo, cercando di ispezionarne il valore per vedere se Ŕ stato mantenuto

scuasami, da dove devo aprire questa finestra Evaluate?...non e' la finestra whach list?

ho gia provato a cambiare in minuscolo...ma non cambia nulla.

alka
05-05-2004, 10:06
Facendo clic con il tasto destro sul codice (a runtime), puoi richiamare la finestra di Evaluate attraverso la voce di menu [Debug|Evaluate/Modify].

Nella finestra viene copiata l'espressione "puntata" nel codice, ma pu˛ essere modificata a piacimento per conoscere il valore di una determinata espressione (chiamata a funzione, valore di una proprietÓ, riferimento ad un oggetto, ecc.).
Nel caso di variabili e campi, i valori possono anche essere modificati.

L'uso degli strumenti di debugging Ŕ essenziale per poter verificare a fondo il funzionamento di un programma ed individuare le cause di eventuali problemi.

123delphi321
05-05-2004, 13:10
bene,...ho imparato quest'altra cosa! un altro prezioso suggerimento! grazie.


sono riuscito a risalire al problema. la causa era (come avevi diagnosticato) l'aggiunta della successiva riga

IBDataset1.SelectSQL.Add(' ORDER BY data');


eliminando questa riga funziona bene.

quindi ho risolto assegnando il valore ai vari parametri subito dopo la composizione della query.

grazie :ciauz:

Loading