Newsgroup: it.comp.lang.delphi
Titolo: [D6 - ADO] Query Parametriche

In un datamodule ho un oggetto ADOQuery - per accedere ad un database Access
2002 - la cui stringa SQL riceve quattro parametri.
Associato ad un pulsante ho una procedura che valorizza i parametri sulla
base dei valori di alcuni controlli e apre la query, elabora un report e la
chiude.
Qualcosa tipo:
...
  // Valorizzazione parametri
 if chkRpt1DateFrom.Checked then
   dmArch.qryRptStartStop.Parameters.ParamByName('par_dt_inizio').Value :=
cboRpt1DateFrom.AsDate
 else
    dmArch.qryRptStartStop.Parameters.ParamByName('par_dt_inizio').Value :=
'01/01/1990';
  // di seguito, con la stessa modalità, vengono valorizzati pure gli altri
parametri
  // apertura della query
  dmArch.qryRptStartStop.Active := True;
  try
    // se la query non restituisce record solleva un 'eccezione
    if dmArch.qryRptStartStop.Eof then
        raise Exception.Create('Nessun dato trovato');
    // Vengono effettuate alcune elaborazioni
  finally
    // al termine chiude la query
    dmArch.qryRptStartStop.Active := False;
  end;
L'anomalia riscontrate è che, anche a parità di parametri, appena ripremo il
pulsante la query mi ritorna sempre EOF, come se fosse vuota.
Questo finchè non chiudo la connessione chiudendo l'applicazione. Riavviando
l'applicazione naturalmente continua a restituire i dati correttamente solo
la prima esecuzione della query.
Ho provato, in testa alla mia routine a chiudere e riaprire la ADOConnection
ed effettivamente tutto funziona: la mia query ogni volta torna i dati
correttamente selezionati. Ma ovviamente non posso nel bel mezzo
dell'applicazione chiudere la connessione al Database.
Ho installato il Jet 4.0 con Sp7 e MDAC 2.6 sp2.
Gianluca.


Sembra strano e provare a chiudere ed aprire il dataset
tAdoQuery1.Active := False ;
tAdoQuery1.Active := True ;
Ciao
P:S: Non è molto elegante ma non mi viene in mente altro.
--------------------------------
Inviato via 
http://usenet.libero.it

 > dmArch.qryRptStartStop.Active := False;
Dove, mi scuso per l'omissione:
- dmArch è un datamodule
- qryRptStartStop è la mia ADOQuery incriminata.
Ogni volta che la routine viene chiamata, nell'ordine vengono eseguiti:
1 - valorizzazione parametri;
2 - apertura query;
3 - elaborazione dati;
4 - chiusura query.
Il problema si verifica in tutte le chiamate successive alla prima, dove
l'apertura della query mi restituisce un recordset vuoto.
Per il momento ho risolto spostando l'oggetto su un modulo (un report) che
creo nella routine. Sembra che creandolo run-time e distruggendolo dopo
l'utilizzo ad ogni chiamata di routine funzioni tutto bene.
Mi resta comunque il dubbio relativamente alla chiusura e riapertura di una
TADOQuery statica.
Ciao.
Gianluca.

>     if dmArch.qryRptStartStop.Eof then
Puoi provare a testare la contemporaneità di Eof e Bof:
    if dmArch.qryRptStartStop.Bof and dmArch.qryRptStartStop.Eof then
Può darsi infatti che dopo l'apertura il cursore, posizionandosi sull'unico
record trovato, segnali Eof perchè in effetti è arrivato in fondo.
Meglio sarebbe che tu effettuassi un test per IsNull sul campo chiave:
    if dmArch.qryRptStartStop.FieldByName('<CAMPO CHIAVE>').IsNull then
        raise Exception.Create('Nessun dato trovato');
In questo modo saresti effettivamente sicuro che nel record corrente non c'è
nulla.
Saluti
        Marco Bortolani
 
infoN...@marcobortolani.it

   // apertura della query
   dmArch.qryRptStartStop.Open
...//metti il resto
e alla fine non mettere   dmArch.qryRptStartStop.Active := False;
Io faccio sempre così e non ho problemi, fammi sapere che così mi faccio
esperienza in più.Ciao.
---------------------------------------------------------------------------
Messaggio inviato attraverso 
http://www.trucchiperpc.it
 - sezione newsgroup

Nel libro di Teixeira e Pacheco su D4 gli autori dicono di non usare
tQuery.Open ;
tQuery.Close ;
unicamente per problemi di velocità di esecuzione e consigliano invece :
tQuery.Active := True ;
tQuery.Active := False ;
Io me lo immagino cosi'.
Procedure Open ( DataSet : tDataset ) ;
Begin
  DataSet.Active := True ;
End ;
Ciao

--------------------------------
Inviato via 
http://usenet.libero.it

 Ciao
Forse perchè era delphi 4, non saprei.  Per la questione della velocità di
esecuzione non ci sono problemi perchè non si nota nessun rallentamento.



Dall'Help in linea:
property Active: Boolean;
Description
Use Active to determine or set whether a dataset is populated with
data. When Active is False, the dataset is closed; the dataset cannot
read or write data and data-aware controls can not use it to fetch
data or post edits. When Active is True, the dataset can be populated
with data. It can read data from a database or other source (such as a
provider). Depending on the CanModify property, active datasets can
post changes.
Setting Active to True
Generates a BeforeOpen event.
 Sets the dataset state to dsBrowse.
 Establishes a way to fetch data (typically by opening a cursor).
 Generates an AfterOpen event.
If an error occurs while opening the dataset, dataset state is set to
dsInactive, and any cursor is closed.
Setting Active to False:
1 Triggers a BeforeClose event.
2 Sets the State property to dsInactive.
3 Closes the cursor.
4 Triggers an AfterClose event.
An application must set Active to False before changing other
properties that affect the status of a database or the controls that
display data in an application.
Note: Calling the Open method sets Active to True; calling the Close
method sets Active to False.
Infatti la chiamata al metodo Open o Close non fa altro che porre le
proprietà Active a True/False. Non è altro che un modo diverso di fare
la stessa cosa.
Il concetto di "disattivazione" di una query non credo esista. Una
query può essere aperta (attiva) o chiusa (non attiva). Al massimo
disconnessa. ;-)
Cmq, come ho scritto ho risolto spostando la query incriminata
direttamente nel report che la utilizza. Essendo questo creato a
run-time, anche quest'ultima viene creata e distrutta ogni volta che
creo e distruggo il report che la contiene. In questo modo tutto
funziona.
Ciao.
Gianluca.