Autore Topic: comportamento strano in un record  (Letto 3188 volte)

g.paolo

  • Visitatore
comportamento strano in un record
« il: 03 Aprile 2008, 20:34:13 »
Sto proprio dando i numeri!!!
Voglio memorizzare i dati di quattro variabili in un record, ma due di esse non vengono salvate.
Immaginate di avere il RESULT sul record nel quale scrivere e di procedere all'assegnazione dei dati.
Ebbene, quelli di stringa vengono memorizzati, mentre quelli integer NO.
Se metto un brekpoint ed esamino i valori prima dell'assegnazione, i valori sono corretti nelle variabili.
Quando cerco di assegnarle ai campi del record, quelli integer rimangono NULL, anche se le variabili sono INTEGER.
NOn riesco proprio a capire la cosa. Sto usando un DB Sqlite3 ed ho l'impressione che la colpa sia proprio di questo. Che ne dite?

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: comportamento strano in un record
« Risposta #1 il: 03 Aprile 2008, 21:19:56 »
prova a ricontrollare bene il codice .. a volte ci si sfascia la testa per delle piccolezze! oppure postalo ..dopotutto 4 occhi sono meglio di 2  ...6 sono meglio di 4...8 sono meglio di 6 ecc ecc

ciao ciao :-P

g.paolo

  • Visitatore
Re: comportamento strano in un record
« Risposta #2 il: 04 Aprile 2008, 08:14:50 »
Ecco il codice!
I campi "tipo ed indirizzo" sono stringhe, mentre "id_ind e id_area" sono integer

Codice: [Seleziona]
PUBLIC SUB btn_salva_Click()                                'SALVA I DATI MODIFICATI ED ESCE
  DIM ind_area AS Integer
  DIM Res_trova_area AS Result
  DIM Res_crea_indirizzi AS Result
  DIM Res_edit_indirizzi AS Result
  INC Application.Busy
  WITH connessione
      IF Tb_indirizzo.Text <> "" AND Tb_indirizzo.Text <> NULL AND avvio.edit_new = TRUE THEN
        avvio.edit_new = FALSE
      .Begin
            Res_crea_indirizzi = .Create("indirizzi")
            Res_crea_indirizzi.Update                                 'registra il nuovo record vuoto
      .Commit
           
      .Begin
            Res_trova_area = .Find("aree", "area=&1", cbx_area.Text)
            Res_tot_aree.MoveTo(res_trova_area!id_area - 1)               'muove sul record area corrispondente
            ind_area = Res_tot_aree!id_area                                 'preleva l'ID area
           
            Res_edit_indirizzi = .Edit("indirizzi", "id=&1", Tb_id.Text)
            Res_edit_indirizzi!tipo = cbx_Tipo.Text
            Res_edit_indirizzi!indirizzo = Tb_indirizzo.Text 'fin qui funziona perfettamente
            Res_edit_indirizzi!id_ind = Val(Tb_id.Text) ' Res_edit_indirizzi!id_ind rimane NULL
            Res_edit_indirizzi!id_area = ind_area       ' Res_edit_indirizzi!id_area rimane NULL
            Res_edit_indirizzi.Update                                  
      .Commit
      ELSE
            funzioni.mess_no_modif           'messaggio di modifica non eseguita
      ENDIF
    END WITH
  DEC Application.Busy                                  
  chiude_maschera                                                     'chiude definitivamente la connessione
CATCH
  errore
END


Si noti che tutto questo accade solo con i nuovi records, mentre l'editazione degli esistenti avviene perfettamente.

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: comportamento strano in un record
« Risposta #3 il: 04 Aprile 2008, 08:46:36 »
l' unica cosa che posso dirti ..a nche se non ne sono pienamente sicuro visto che è un bel po che non uso gambas sui datatbase è  che mi fa strano che prima aggiungi il record poi fai un .commit e poi ci scrivi dentro

io ho sempre creato il record e poi ci ho scritto dentro direttamente  e alla fine ho poi hatto un .update e un .commit

Codice: [Seleziona]
PUBLIC SUB btn_salva_Click()                                'SALVA I DATI MODIFICATI ED ESCE
  DIM ind_area AS Integer
  DIM Res_trova_area AS Result
  DIM Res_crea_indirizzi AS Result
  DIM Res_edit_indirizzi AS Result
  INC Application.Busy
  WITH connessione
      IF Tb_indirizzo.Text <> "" AND Tb_indirizzo.Text <> NULL AND avvio.edit_new = TRUE THEN
        avvio.edit_new = FALSE
          .Begin
            Res_crea_indirizzi = .Create("indirizzi")
         
           
         
           
            Res_tot_aree.MoveTo(res_trova_area!id_area - 1)               'muove sul record area corrispondente
            ind_area = Res_tot_aree!id_area                                    'preleva l'ID area
           


            Res_crea_indirizzi!tipo = cbx_Tipo.Text
            Res_crea_indirizzi!indirizzo = Tb_indirizzo.Text             'fin qui funziona perfettamente
            Res_crea_indirizzi!id_ind = Val(Tb_id.Text)                 ' Res_edit_indirizzi!id_ind rimane NULL
            Res_crea_indirizzi!id_area = ind_area                       ' Res_edit_indirizzi!id_area rimane NULL
              Res_crea_indirizzi.Update                                 'registra il nuovo record vuoto
          .Commit
      ELSE
            funzioni.mess_no_modif()                     'messaggio di modifica non eseguita
      ENDIF
    END WITH
  DEC Application.Busy                                  
  chiude_maschera()                                                     'chiude definitivamente la connessione
CATCH
  errore
END



questa è solo un idea sicuramente il tuo proble è un ' altro

hai provato a vedere con i breakpoint il valore di val(TB_id.Text)  ?

g.paolo

  • Visitatore
Re: comportamento strano in un record
« Risposta #4 il: 04 Aprile 2008, 09:04:27 »
Certo che ci ho provato, ed i valori numerici che devo scrivere sono sempre disponibili!
Ma subito dopo l'istruzione di assegnamento, se vado a vede il contenuto dei campi numerici modificati, mi ritrovo sempre NULL.
Il motivo per cui faccio COMMIT dopo l'aggiunta di un nuovo record, è solo per essere sicuro che sia disponibile e scritto su disco dal buffer; probabilmente non serve, ma mi sembra più sicuro.

g.paolo

  • Visitatore
Re: comportamento strano in un record
« Risposta #5 il: 04 Aprile 2008, 09:57:03 »
Ho fatto un'altra scoperta interessante! Quando aggiungo un nuovo record ed i dati stringa vengono scritti correttamente, il record aggiunto si salva ed è visibile nella lista tramite un'altra applicazione anche se i due campi numerici non indispensabili rimangono vuoti.
Quando vado ad aprirlo con gambas, il comando record.count non lo conta affatto, per lui è inesistente!
Quindi, qualsiasi record io aggiunga non è mai disponibile, se non aggiungendolo con altre applicazioni che trattano i files Sqlite3.
Se apro ad esempio Kexi ed edito il record appena aggiunto inserendo i dati numerici mancanti, e poi chiudo e riapro con Gambas, allora il record è presente e modificabile.
La cosa strana è che i campi numerici che non vengono scritti da gambas, non sono dichiarati necessari e quindi i conti non tornano.
Mi è venuto il dubbio che sia un baco di gambas, magari risolto in seguito, visto che uso la versione 2.2 prevista per i repository di Ubuntu 7.10.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: comportamento strano in un record
« Risposta #6 il: 04 Aprile 2008, 11:53:34 »
Per i database io di solito uso comandi sql e non le funzioni intrinseche di gambas ma, ad ogni modo, è anche probabile che, come nel tuo caso, esistano dei bugs in gambas, specialmente se usi versioni precedenti.

Ho dato un'occhiata ora sulla documentazione on-line e, in effetti, non c'è alcun metodo che possa essere utile a fare il refresh dei dati.

La cosa anomala, in effetti, è il ritorno di Count, nonostante l'aggiunta di record; per quanto riguarda l'inserimento di campi numerici, prova a inserirli senza convertirli con Val().

Da analisi che avevo fatto a suo tempo, ho scoperto che sqlite non gestisce i tipi che prevede come sono in realtà, ma tratta tutto come stringhe, tanto è vero che se provi a scrivere caratteri alfabetici all'interno di un campo definito come INTEGER, questi vengono accettati tranquillamente.

Questo comporta che i controlli devono essere necessariamente eseguiti tutti a livello di programma, validando opportunamente i dati inseriti nelle form prima di scriverli nel database.

Di tutto ciò avevo già scritto un'analisi in un'altra discussione, che potete leggervi per farvi un'idea.

Resta comunque dubbia la presenza di bugs all'interno della libreria gambas.

g.paolo

  • Visitatore
Re: comportamento strano in un record
« Risposta #7 il: 04 Aprile 2008, 12:03:49 »
Ti ringrazio per le info, comunque ho provato anche come dici senza l'usi di VAL ed il problema rimane.
Ora sto provando ad installare la versione 2.5 da sorgenti, speriamo bene!
Se non risolvo ancora penso che dovrò passare a postgresql o mysql perchè ho proprio il dubbio che sia un problema di gambas nella gestione di sqlite3

g.paolo

  • Visitatore
Re: comportamento strano in un record
« Risposta #8 il: 04 Aprile 2008, 12:13:33 »
Ho installato la 2.5 di gambas, ma ora quando provo a lanciarlo mi dice:

Codice: [Seleziona]
han@han-desktop:~$ gambas2
ERROR: #27: Cannot load component 'gb.desktop': cannot find library file


Come faccio dunque a risolvere questo altro problema?
Si tenga presente però che al comando make, ho ricevuto alla fine il seguente messaggio:

Codice: [Seleziona]
THESE COMPONENTS ARE DISABLED:

- gb.corba
- gb.db.firebird
- gb.desktop
- gb.gtk.svg
- gb.pcre
- gb.pdf
- gb.qt.kde
- gb.qte
- gb.sdl
- gb.sdl.sound
- gb.xml

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: comportamento strano in un record
« Risposta #9 il: 04 Aprile 2008, 12:21:39 »
Perdonami, ma la 2.5 è una versione in sviluppo... non penso di convenga utilizzarla, specialmente se hai problemi...

Ti consiglio di installare la versione stabile, che mi pare sia la 2.4.1, altrimenti sommiamo problemi su problemi e non ne usciamo vivi... :-)

A parte questo, dall'elenco delle dipendenza mancate, hai parecchie librerie da installare sul tuo sistema, per poter installare gambas in modo completo.
Ti consiglio di leggerti i README o INSTALL che sono forniti con i pacchetti sorgente di gambas, dove sono descritte tutte le librerie esterne necessarie.

NOTA: dopo aver fatto "configure/make/make install", dai il comando "ldconfig" che di aggiorna il repository dei puntamenti alle librerie di sistema.

NOTA2:
- gb.corba  (non ti serve)
- gb.db.firebird  (non ti serve, a meno che tu non voglia usare il suo motore db)
- gb.desktop (necessario!)
- gb.gtk.svg (facoltativo)
- gb.pcre (necessario ad altre librerie)
- gb.pdf (facoltativo, in pgDesigner lo uso per esempio)
- gb.qt.kde (facoltativo)
- gb.qte (non ti serve)
- gb.sdl (facoltativo, grafica, suono, ecc.)
- gb.sdl.sound (idem come sopra)
- gb.xml (facoltativo, come gb.pdf)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: comportamento strano in un record
« Risposta #10 il: 04 Aprile 2008, 12:36:47 »
Perdonami, ma mi sono accorto solo ora dell'uscita della nuova 2.5

g.paolo

  • Visitatore
Re: comportamento strano in un record
« Risposta #11 il: 04 Aprile 2008, 13:35:18 »
Sul sito http://gambas.sourceforge.net/ si dice che l'ultima versione stabile è la 2.5.0, ed è per questo che ho installato quella. Altre info che mi avrebbero aiutato a sceglierne una diversa non ne avevo, dunque è andata così!
Ora per quanto concerne i moduli libreria che non sono stati caricati in automatico, non so proprio come fare, visto che tutte le dipendenze necessarie le ho soddisfatte ancor prima dell'installazione.
Allora qui c'è qualcosa che non funziona proprio: o le dipendenze necessarie non erano complete, o c'è qualcosa nell'installazione che non provvede a risolvere il problema.
Sta di fatto che il mio primo tentativo in assoluto di installare qualcosa da sorgenti è andato storto, e questo mi fa proprio pensare che non sia il caso di farlo ancora.
Ora mi rimane il problema di togliere tutta questa robaccia dal PC, quindi andrò a cercarmi un file di unistall (se esiste) e rimetterò la vecchia 2.2 supportata dai repository e lascerò perdere per ora il problema che ho con sqlite3, aspettando il tempo migliore in cui i repository saranno aggiornati alla nuova versione.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: comportamento strano in un record
« Risposta #12 il: 04 Aprile 2008, 14:14:54 »
Codice: [Seleziona]
make uninstall


per disinstallare gambas


per quanto riguarda le dipendenze, se hai compilato i sorgenti, le nota ma non le può risolvere.
In questo caso devi usare il sistema di aggiornamento del tuo Linux per cercarle ed installarle nel sistema.

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: comportamento strano in un record
« Risposta #13 il: 04 Aprile 2008, 14:29:34 »
Posso dirti che io uso SQLite3 ed ha una cache in cui registra le transazioni prima di eseguirle del tutto.
Quindi, finché non fai un Commit le transazioni non vengono scritte nel DB.

A questo si somma un problema derivante dai filesystem di tipo journaling che il 99% di noi usa per Linux: le modifiche ad un file non vengono effettivamente scritte al momento dell'esecuzione dell'operazione di scrittura/modifica/cancellazione ma solo ogni tot. Quindi ci sta che la tua situazione sia questa: modifichi un dato e dal programma lo vedi modificato ma se lanci un altro applicativo che accede al file, questo legge il file che il filesystem non ha ancora aggiornato.

Ecco quindi che può essere che qualche operazione resti "sospesa" e non venga eseguita (per via della cache del DB o di quella del filesystem) finché non chiudi materialmente la connessione con Connection.Close().

Un buon "modus operandi" è proprio quello di NON lasciare mai aperta la connessione, anche per evitare perdite di dati in casi "nefasti" (leggi "blackout" o figlio che stacca la spina...). Quindi, se il tuo programma apre la connessione all'avvio e la chiude solo quando viene terminato, modificalo in modo che la apra e la chiuda quando occorre operare sul DB.
Visita il mio sito personale: http://www.leonardomiliani.com

g.paolo

  • Visitatore
Re: comportamento strano in un record
« Risposta #14 il: 04 Aprile 2008, 14:46:38 »
@md9327
Le dipendenze o come cavolo sio chiamano quelle che mi ha dato nella lista finale, le ho cercate con synaptic ma non esistono affatto nei repository, quindi non c'è soluzione a meno di non sapere quali repo attivare.

@leo72
Buona questa! E meno male che mi era stato consigliato di togliere anche il COMMIT dopo l'aggiunta del record vuoto. Speravo proprio che bastasse un COMMIT per svuotare il buffer, ma a detta tua non è affatto così. Bene, proverò dunque a chiudere e riaprire la connessione all'interno della stessa sub che usavo per aggiungere il record vuoto e poi modificarlo.