Italian community of Lazarus and Free Pascal

Programmazione => Databases => Topic aperto da: JonnyB - Novembre 29, 2019, 06:22:56 pm

Titolo: Ancora su 'Operation cannot be performed on an inactive dataset'.
Inserito da: JonnyB - Novembre 29, 2019, 06:22:56 pm
Un saluto a tutti,
sono un programmatore delphi che sta valutando il passaggio a Lazarus 2.0.6.
Nel simulare l'utilizzo dei vari componenti, soprattutto legati ai database,
ho incontrato una prima difficoltà riguardante i campi di fklookup, che
permettono, data una tabella, di reperire dei valori da una tabella di servizio collegando i relativi campi con un campo chiave.
Esempio
TabellaPrincipale->id_localita --> TabellaDiServizio->id_Localita->Descrizione_localita

Provate ad aprire il progetto nella cartella degli esempi di Lazarus al
seguente percorso C:\lazarus\examples\database\dblookup.
A design time sembra tutto a posto: la compilazione e la generazione dell'eseguibile vengono completati correttamente. Quando però viene eseguito il programma si verifica il seguente errore: 'Operation cannot be performed on an active dataset'.
Stranamente il problema si risolve disattivando a design time i due dataset e ricreando l'eseguibile!

Ho simulato una situazione simile utilizzando i componenti di Zeos Access versione 7.2.4 lavorando su tabelle di un Db Firebird 2.5.
A design time la creazione del campo fklookup non presenta problemi,
tutto sembra funzionare correttamente, nella dbgrid il campo  di fklookup viene correttamente visualizzato col dato recuperato dalla tabella di servizio.
Quando eseguo il programma però si verifica il seguente errore:
'Operation cannot be performed on an inactive dataset'.
(nel primo caso 'active dataset' nel secondo 'inactive dataset').

Se qualcuno di voi ha avuto un problema simile, como lo ha risolto ?
Vi ringrazio in anticipo.
Titolo: Re:Ancora su 'Operation cannot be performed on an inactive dataset'.
Inserito da: xinyiman - Dicembre 01, 2019, 12:33:27 pm
Ciao, io di solito gestisco tutto tramite codice alla creazione della form.
Apro il connettore, apro la transaction e apro la query.
Poi chiudo tutto nella distruzione della form
Titolo: Re:Ancora su 'Operation cannot be performed on an inactive dataset'.
Inserito da: JonnyB - Dicembre 03, 2019, 09:41:43 pm
Sono d'accordo con te, rimane il fatto che creando un campo di tipo fklookup in una TZTable, a designtime, tutto sembra funzionare correttamente, mentre a runtime avviene l'errore in argomento.
Si aggira l'errore aprendo la TZTable a runtime.
In una precedente installazione di Lazarus, se non ricordo male, lo stesso errore lo ottenevo anche con i componenti ibx4lazarus.
Se qualcuno potesse approfondire quanto sopra, si renderebbe più performante la piattaforma.
Comunque grazie.
Titolo: Re:Ancora su 'Operation cannot be performed on an inactive dataset'.
Inserito da: nomorelogic - Dicembre 05, 2019, 12:02:25 pm
nell'evento OnCalc

credo basti mettere l'istruzione
Codice: [Seleziona]
if not Table1.Active then
   exit;

Edit:
come prima istruzione
Titolo: Re:Ancora su 'Operation cannot be performed on an inactive dataset'.
Inserito da: JonnyB - Dicembre 09, 2019, 09:09:42 pm
Ho provato il tuo suggerimento ma non funziona.
Rimane un mistero!
Titolo: Re:Ancora su 'Operation cannot be performed on an inactive dataset'.
Inserito da: Stilgar - Dicembre 10, 2019, 05:12:58 pm
Sono d'accordo con te, rimane il fatto che creando un campo di tipo fklookup in una TZTable, a designtime, tutto sembra funzionare correttamente, mentre a runtime avviene l'errore in argomento.
Si aggira l'errore aprendo la TZTable a runtime.
In una precedente installazione di Lazarus, se non ricordo male, lo stesso errore lo ottenevo anche con i componenti ibx4lazarus.
Se qualcuno potesse approfondire quanto sopra, si renderebbe più performante la piattaforma.
Comunque grazie.

Ciao
Ho sempre preferito aprire le TZTable a manella, nell'ordine che mi serviva.
Così avevo il controllo e non delegavo alla libreria l'apertura. Se apri prima le tabelle che usi per il lookup, non ci sono problemi, di solito.
(Poi chiusura a manella della destroy nell'ordine inverso)

Stilgar


Titolo: Re:Ancora su 'Operation cannot be performed on an inactive dataset'.
Inserito da: antoniog - Maggio 30, 2020, 12:14:19 am
ho avuto lo stesso problema e sono curioso di sapere se l'errore è dovuto a BUGS sugli aggiornamenti. Prova a retrocedere lazarus alla 1.6.2 e zeos alla 7.1.2 e ricompilare il progetto . Io ho risolto così!
Titolo: Re:Ancora su 'Operation cannot be performed on an inactive dataset'.
Inserito da: JonnyB - Dicembre 08, 2020, 10:50:55 am
Ciao a tutti,
ho risolto il problema di ‘operation cannot be performed on an inactive dataset’, che si presenta in fase di esecuzione di un programma, che fa uso di tabelle contenenti campi di lookup o campi calcolati sulla base di altre tabelle.
La soluzione è la seguente:
Ho creato due datamodule: DM1 e DM2 impostando il medesimo ordine di creazione automatica in ‘opzioni progetto’ facendo seguire la form principale e a seguire le altre.
In DM1 metto tutte le tabelle che devono essere create per prima, in sostanza quelle di lookup da cui vengono prelevati i dati.
In DM2 metto le tabelle che contengono i campi di lookup o campi calcolati.
La soluzione sembra banale anche se in rete non ho trovato un’alternativa.
In questo modo riduco anche il codice per gestire la fase di apertura di ogni singola tabella.
Spero di essere stato d’aiuto, ne approfitto per augurarvi Buone Feste.
Titolo: Re:Ancora su 'Operation cannot be performed on an inactive dataset'.
Inserito da: Stilgar - Dicembre 08, 2020, 11:30:21 am
Grazie, anche a te e ai tuoi cari.