Autore Topic: modifica dati in tabella  (Letto 1590 volte)

g.paolo

  • Visitatore
modifica dati in tabella
« il: 01 Marzo 2008, 12:14:11 »
Ho ancora da capire come si possa modificare dati in una table. Come vedete all'attivazione del form carico nelle textbox i dati del record da modificare, e questo funziona perfettamente.

PUBLIC SUB Form_Activate() ' riporta i dati del record nei campi della maschera
  ME.Text = "MASCHERA DI MODIFICA AGENTI"
  Connessione.Name = Avvio.s_cartellaDB & Avvio.s_nomeDB
  Connessione.Type = "sqlite3"
  Connessione.OPEN
  criterio = "id_age=&1"
  parametro = avvio.posizione
  Connessione.Begin
  Risultato = Connessione.Edit("agenti", criterio, parametro) '
  Tb_idage.Text = risultato!id_age    'sola lettura!
  tb_nick.text = risultato!nick
  Tb_nominativo.Text = risultato!nominativo
  Tb_cellulare.Text = risultato!cell
  Tb_passw.Text = risultato!passw
  Connessione.close
CATCH
  errore
END                  

Quando provo a scrivere con la seguente routine, i dati modificati nelle textbox tornano esattamente eguali a quelli iniziali. Questo è il dilemma!

PUBLIC SUB btn_salva_Click() ' salva nel record i dati modificati ed esce
  INC Application.Busy
  Connessione.Begin
  Risultato!nick = tb_nick.Text                          
  Risultato!nominativo = tb_nominativo.Text
  Risultato!cell = tb_cellulare.Text
  Risultato!passw = tb_passw.Text
  Risultato.Update
  Connessione.Commit
FINALLY
  DEC Application.Busy                   'decrementa il busy flag
  Connessione.Close
  Fagenti.Load
  Fagenti.Show
  ME.Close
CATCH
  errore
END                                     'btn_salva_Click - fine routine
 

Grazie per la Vs pazienza!

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: modifica dati in tabella
« Risposta #1 il: 02 Marzo 2008, 02:22:45 »
Forse non ho ben compreso il codice, o perlomeno mi manca qualcosa...

Intanto dovresti capire se effettivamente la funzione "btn_salva_Click()" ha scritto correttamente ed effettivamente i dati in archivio.
inoltre c'è di mezzo una cache e un buffer, che viene usata per trasferire i dati dal database al client. Non ho fatto ancora prove con database e Gambas2, ma è probabile che tu debba fare un refresh del buffer in questione o ricaricarti il record, oppure hai qualcos'altro che ripristina i dati iniziali.

... altro non posso dirti, non conosco il resto del codice ...

g.paolo

  • Visitatore
Re: modifica dati in tabella
« Risposta #2 il: 02 Marzo 2008, 09:04:19 »
Alla fine ho risolto in questo modo:

' Gambas class file
PUBLIC Connessione AS NEW Connection
PUBLIC Risultato AS Result
PUBLIC criterio AS String
PUBLIC parametro AS Integer

PUBLIC SUB Form_Open() ' riporta i dati del record nei campi della maschera
  ME.Text = "MASCHERA DI MODIFICA AGENTI"
  Connessione.Name = Avvio.s_cartellaDB & Avvio.s_nomeDB
  Connessione.Type = "sqlite3"
  Connessione.Open
  Connessione.Begin      inizio transazione
  criterio = "id_age=&1"
  parametro = avvio.posizione   'variabile nel modulo avvio
  Risultato = Connessione.Edit("agenti", criterio, parametro) '
  Tb_idage.Text = risultato!id_age    'sola lettura!
  tb_nick.text = risultato!nick
  Tb_nominativo.Text = risultato!nominativo
  Tb_cellulare.Text = risultato!cell
  Tb_passw.Text = risultato!passw
  'la connessione rimane aperta........pronta per le modifiche
CATCH
  errore      'routine di gestione errori
END                  

PUBLIC SUB btn_salva_Click() '     salva nel record i dati modificati ed esce
  INC Application.Busy
  risultato!nick = tb_nick.Text                          
  risultato!nominativo = tb_nominativo.Text
  risultato!cell = tb_cellulare.Text
  risultato!passw = tb_passw.Text
  risultato.Update
  Connessione.Commit      'fine transazione
FINALLY
  DEC Application.Busy                'decrementa il busy flag
  Connessione.Close
  Fagenti.Load
  Fagenti.Show
  ME.Close
CATCH
  errore      'routine di gestione errori
END                  'btn_salva_Click - fine routine

A quanto pare non devo chiudere la connessione nel form_open, quindi ho tolto il commit e lasciata aperta e la cosa ha funzionato. Non avevo ancora capito il funzionamento di begin....commit e spulciando un po in giro le info in lingua inglese (che non conosco) finalmente ho compreso. Grazie!

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: modifica dati in tabella
« Risposta #3 il: 02 Marzo 2008, 10:39:26 »
Scusami se intervengo, ma è normale che il primo esempio non funzionasse: tu in fase di avvio dell'applicazione aprivi il database, leggevi i dati e poi chiudevi la connessione. All'interno del codice relativo all'evento btnSalva_click a questo punto Gambas trovava la connessione chiusa e per forza di cose non poteva aggiornare i valori nel DB.

Il mio consiglio (IMHO) è sempre quello di aprire la connessione dove effettivamente serve e di chiuderla subito dopo aver eseguito le operazioni che servono: questo per evitare di lasciare dati non trascritti nella cache che, in caso di crash dell'applicazione stessa o di un ipotetico blackout o chiusura del sistema, non vengano poi trascritti sul disco.

Quindi, all'avvio dell'applicazione, carica i dati e poi richiudi la connessione. Dal pulsante Salva riapri la connessione, cerchi i dati da modificare, li cambi, aggiorni e poi richiudi la connessione. In questo modo hai una gestione più semplice: se ad esempio il tuo utente annulla il salvataggio, ti devi ricordare di chiudere la connessione e quindi devi scrivere una porzione di codice per controllare se questa è attiva o no. Con il metodo del "apri quando serve", semplicemente esci dalla procedura o funzione.  :-)
Visita il mio sito personale: http://www.leonardomiliani.com

g.paolo

  • Visitatore
Re: modifica dati in tabella
« Risposta #4 il: 02 Marzo 2008, 19:44:06 »
In effetti il mio errore era di "chiudere" troppo. Cliccando sulla griglia aprivo la maschera per l'edit del record chiamato. ma invece di lasciare aperta la connessione dopo la chiusura della griglia in modo da avere il record pronto per la modifica nella maschera, chiudevo la connessione e quindi mi sorgeva l'errore.
Non penso che lasciare aperta la connessione tra i due form possa creare problemi, visto che uno (la griglia) richiama l'altro (la maschera) per l'edit.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: modifica dati in tabella
« Risposta #5 il: 02 Marzo 2008, 23:30:32 »
Sicuramente no, ma come ha consigliato leo, il fatto di includere in un'unica soluzione (unica funzione) l'intero processo di aggiornamento, ti semplifica la vita.
Purtroppo, ed è un errore comune nei linguaggi del tipo basic, quello di creare variabili in punti generici del programma (diversamente da quanto si faceva in C, per esempio), e questo può portare a dimenticanze, o a grossi problemi, se non si tracciano correttamente i punti di apertura e chiusura.
Personalmente questo tipo di approccio mi piace poco, perchè se anche da un lato permette al programmatore di preoccuparsi poco dell'aspetto formale del codice, dall'altro può portare a perdere il controllo del flusso logico.
Altra cosa, in un programma, è cercare di semplificare il più possibile, in modo da evitare di incasinare il tutto. Questo è ovviamente un mio personale parere.
Come ultima cosa, per confermare quanto scritto da leo, se accade qualche cosa di anomalo (e succede spesso!), non avresti modo di ricuperare, a meno di non incasinare ulteriormente il codice.

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: modifica dati in tabella
« Risposta #6 il: 03 Marzo 2008, 10:09:40 »
Ora Gambas è molto stabile. Ma le vecchie versioni 1.9.5x crashavano con una certa frequenza. E la perdita di dati era inevitabile, a meno di non prendere le opportune precauzioni che bisognerebbe prendere  :-P
Visita il mio sito personale: http://www.leonardomiliani.com

g.paolo

  • Visitatore
Re: modifica dati in tabella
« Risposta #7 il: 03 Marzo 2008, 18:43:47 »
Le vostre spiegazioni sono esaurienti ed efficaci. Devo ringraziarvi di nuovo perchè se sono alle prese con gambas lo devo esclusivamente a voi.
Più volte ci avevo provato, ma solo ora posso toccare con mano risultati tangibili, e questo lo devo esclusivamente a questo forum e alla vostra cortese diponibilità.
Buon lavoro!