Newsgroup: it.comp.lang.delphi
Titolo: problemi AdoQuery e parametri

  ciao non riesco far funzionare questa query
  ADOQDettInterv.Active := FALSE;
  ADOQDettInterv.Parameters.Clear;
  ADOQDettInterv.SQL.Clear;
 
ADOQDettInterv.Parameters.AddParameter.Name
 := 'NrAFtt';
  ADOQDettInterv.Parameters.ParamByName('NrAFtt').DataType := ftstring;
  ADOQDettInterv.Parameters.ParamByName('NrAFtt').Direction := pdInput;
  ADOQDettInterv.Parameters.ParamByName('NrAFtt').Value := '10/2006';
  ADOQDettInterv.SQL.Add('SELECT DettagliInterventi.IDInterventoRiga,');
  ADOQDettInterv.SQL.Add(' DettagliInterventi.IDIntervento,
DettagliInterventi.IDContratto,');
  ADOQDettInterv.SQL.Add(' DettagliInterventi.IDProdotto,
DettagliInterventi.InGaranzia,');
  ADOQDettInterv.SQL.Add(' DettagliInterventi.Descrizione,');
  ADOQDettInterv.SQL.Add(' DettagliInterventi.Importo,  Iva.PerIva,
Prodotti.DescrizioneProdotto ');
  ADOQDettInterv.SQL.Add('FROM (DettagliInterventi LEFT JOIN Iva ON
DettagliInterventi.IDIva = Iva.IDiva) ');
  ADOQDettInterv.SQL.Add('LEFT JOIN Prodotti ON
DettagliInterventi.IDProdotto = Prodotti.IDCotrPodotto ');
  ADOQDettInterv.SQL.Add('where  DettagliInterventi.IDIntervento in');
// in questo modo non restituisce record
  ADOQDettInterv.SQL.Add('(SELECT IDIntervento from interventi where
Interventi.NRFat =:NrAFtt)');
  ADOQDettInterv.Active := True;
in questo modo funziona
 ADOQDettInterv.SQL.Add('(SELECT IDIntervento from interventi where
Interventi.NRFat =''10/2006'')');
delphi 7, db access
ciao e grazie

Io proverei a passare il parametro dopo aver compilato il testo della query,
un po' come di fa quando si prepara il tutto a design time:
  ADOQDettInterv.Active := FALSE;
  ADOQDettInterv.Parameters.Clear;
  ADOQDettInterv.SQL.Clear;
  ADOQDettInterv.SQL.Add('SELECT DI.IDInterventoRiga,');
  ADOQDettInterv.SQL.Add(' DI.IDIntervento, DI.IDContratto,');
  ADOQDettInterv.SQL.Add(' DI.IDProdotto, DI.InGaranzia,');
  ADOQDettInterv.SQL.Add(' DI.Descrizione,');
  ADOQDettInterv.SQL.Add(' DI.Importo, I.PerIva, P.DescrizioneProdotto ');
  ADOQDettInterv.SQL.Add('FROM (DettagliInterventi DI LEFT JOIN Iva I ON
DI.IDIva = I.IDiva) ');
  ADOQDettInterv.SQL.Add('LEFT JOIN Prodotti P ON DI.IDProdotto =
P.IDCotrPodotto ');
  ADOQDettInterv.SQL.Add('where  DI.IDIntervento in');
  ADOQDettInterv.SQL.Add('(SELECT I2.IDIntervento from interventi I2 where
I2.NRFat =:NrAFtt)');
  ADOQDettInterv.Parameters.ParamByName('NrAFtt').Value := '10/2006';
  ADOQDettInterv.Active := True;
Ho usato questa strategia un sacco di volte e sempre con successo: vedi tu.
Se poi continua a non funzionare, prova ad aggiornare l'MDAC o a compilare
il testo della query senza il parametro:
  ADOQDettInterv.Active := FALSE;
  ADOQDettInterv.Parameters.Clear;
  ADOQDettInterv.SQL.Clear;
  ADOQDettInterv.SQL.Add('SELECT DI.IDInterventoRiga,');
  ADOQDettInterv.SQL.Add(' DI.IDIntervento, DI.IDContratto,');
  ADOQDettInterv.SQL.Add(' DI.IDProdotto, DI.InGaranzia,');
  ADOQDettInterv.SQL.Add(' DI.Descrizione,');
  ADOQDettInterv.SQL.Add(' DI.Importo, I.PerIva, P.DescrizioneProdotto ');
  ADOQDettInterv.SQL.Add('FROM (DettagliInterventi DI LEFT JOIN Iva I ON
DI.IDIva = I.IDiva) ');
  ADOQDettInterv.SQL.Add('LEFT JOIN Prodotti P ON DI.IDProdotto =
P.IDCotrPodotto ');
  ADOQDettInterv.SQL.Add('where  DI.IDIntervento in');
  ADOQDettInterv.SQL.Add('(SELECT I2.IDIntervento from interventi I2 where
I2.NRFat =''' + parametro + ''')');
  ADOQDettInterv.Active := True;
Saluti
        Marco Bortolani
        info @ 
marcobortolani.it
 (togli gli spazi)
P.S.
Nel testo della mia query utilizzo gli alias locali alle tabelle al posto
del nome intero:
    select DI.IDInterventoRiga
    from DettagliInterventi DI..
Questa dichiarazione mi consente di fare riferimento alla tabella
DettagliInterventi nel testo della query attraverso l'alias locale DI invece
che utilizzando il nome intero: non cambia nulla in termini di prestazioni
ma snellisce un po' il codice.

 ma snellisce un po' il codice.
proverò
ciao e grazie


*PRIMA* inserisci la query e *DOPO* il parametro.
In questo modo ADO riuscirà a fare il corretto parsing della query
stessa.
Prima del Parameters.ParamByName ti consiglio di fare anche
ADODettInterv.Parameters.Refresh.
Inoltre DataType e Direction non dovrebbe essere necessario indicarle.
-- 
"La velocità luce non è sufficiente Comandante Nunziatella, 
dobbiamo passare alla velocità smodata!"

cut
grazie