Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: Picavbg - 22 Febbraio 2010, 00:01:21

Titolo: Tabella di DB.SQLite3 vuota
Inserito da: Picavbg - 22 Febbraio 2010, 00:01:21
Mi succede un fatto assai strano. Nel mio programma ho inserito la seguente istruzione di inserimento dati in una tabella, definita con "Primary key", composta da due colonne contigue, la prima e la seconda di ciascuna riga:
Codice: [Seleziona]
DB_Connection.EXEC("INSERT INTO Movimgg VALUES(" & Val(Colonna1_Key1) & ", '" & Colonna2_Key2 & "', '" & Colonna3 & "', '" & Colonna4 & "', '" & Colonna5 & "', '" & Colonna6 & "', '" & Colonna7 & "', '" & Colonna8 "')")
 DB_Connection.Commit
Ebbene il programma sembra eseguire l'istruzione EXEC senza dare errori e va avanti come se tutto fosse andato bene, ma in effetti non ha inserito il record. Detta istruzione è copiata da un'altra simile che svolge il lavoro di inserimento dati in una tabella diversa, in un altro passo del programma. Lì il lavoro viene svolto veramente e bene, tanto che stavo cominciando a fare amicizia con SQLite3. È da ieri che sbatto il muso su codesta istruzione e non riesco a venirne fuori. Oggi ho fatto un'altro tentativo: ho scritto un programmino semplicissimio che cerca la tabella "movimgg" se la trova la cancella e la ricrea, inserendovi dopo un solo record.
Risultato: nessun problema la tabella è validimante valorizzata col record inserito con la stessa istruzione scritta sopra.
Ritornando al problema, la connessione è aperta bene; ho guardato in debug la finestra DB_Connection ed ho visto che il DB è puntato come dovuto.
Debbo anche dire alcune istruzioni prima interrogo un'altra tabella del DB, da cui prelevo un codice che devo trascrivere nella tabella "Movimgg" per realizzare il collegamento fra le due tabelle; quella lettura si svolge con successo. Ma allora che succede?
Spero che mi possiate accendere la lampadina.
Ciao a tutti.
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: leo72 - 22 Febbraio 2010, 11:07:26
Potresti postare tutta la porzione di codice interessata? Vale a dire anche quella dove, come dici, interroghi il DB per prelevare il dato che poi inserisci successivamente con l'istruzione che ha messo?
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: fsurfing - 22 Febbraio 2010, 12:24:49
hai provato a vedere come si comporta usando il metodo hres=db_connection.edit(nometavola)

hres!nomecampo1=valore1
hres!nomecamnpon=valoren

db.connection.commit

ti ricordo che usando INSERT into devi dare un valore a tutte le colonne della tabella a meno che non specifichi prima i campi in cui vuoi inserire i valori
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: Picavbg - 22 Febbraio 2010, 12:38:18
Potresti postare tutta la porzione di codice interessata? Vale a dire anche quella dove, come dici, interroghi il DB per prelevare il dato che poi inserisci successivamente con l'istruzione che ha messo?
Sarebbe meglio, secondo me, allegare tutto il programma, comprensivo delle tabelle per una eventuale prova, ma non so come fare per allegare anche le tabelle. Intanto riporto qui sotto tutta la Sub dove si verifica l'inconveniente, preceduta dalle dichiarazioni poste in testa alla classe di appartenenza:
Citazione
Codice: [Seleziona]
' Gambas class file

PRIVATE DB_Connection AS NEW Connection 
PRIVATE DBname AS String                               'Nome del Database'
PRIVATE DB_path AS String                               'Percorso di ricerca del Database ContabFam.db
PRIVATE sql AS String                                        'serve per eseguire i comandi sul DB
PRIVATE RecTab AS Result

PUBLIC SUB MovDigOk_Click()
DIM b_nupro AS Byte
DIM f_ImpMov AS Float


DIM i_Som AS Integer
DIM i_CoVoContab AS Integer
DIM i_data AS Integer
DIM i_ImpMov AS Integer
DIM i_orario AS Integer
DIM i_RgGriMov AS Integer

DIM $_Benef AS String
DIM $_Como AS String
DIM $_Data AS String
DIM $_Descr AS String
DIM $_GG AS String
DIM $_MM AS String
DIM $_AA AS String
DIM $_orario AS String
DIM $_ora AS String
DIM $_minuti AS String
DIM $_secondi AS String
DIM $_Moneta AS String

  IF $_DescrUlt <> "" THEN
      $_TabNewDescr.Add($_DescrUlt)     'trascrive le nuove descrizioni, inserite nella giornata corrente, in attesa di ricorreggerle in caso di ripresa ddel movimento caricato nella griglia dei movimenti della giornata
      $_DescrUlt = ""         'Serve a consolidare l'aggiunta della nuova descrizione nella DescrMovDig.List
  ENDIF
  IF ImpMovDig.Text = "" THEN
     ImpMovDig.SetFocus
  ELSE
    IF DescrMovDig.Text = "" THEN
        DescrMovDig.SetFocus
    ELSE 
      IF SegnoEU.Text = "" THEN
          SegnoEU.SetFocus
        ELSE
          i_RgGriMov = 0
          DO UNTIL GriMovv[i_RgGriMov, 1].text = ""   'cerca la prima riga libera (con campo descrizione vuoto"
            INC i_RgGriMov
            IF i_RgGriMov > GriMovv.Rows.count THEN
                BREAK
            ENDIF
          LOOP
 
          SELECT CASE SegnoEU.Text
                  CASE "E", "U"     'il movimento in trattamento è un movimento di Entrata/Uscita ordinaria
                    GriMovv[i_RgGriMov, 1].text = VoContMoDig.Text
                    GriMovv[i_RgGriMov, 5].text = BenefMovG.Text
                  CASE ELSE         'il movimento in trattamento è un movimento di tipo "Prestito momentaneo"
                    GriMovv[i_RgGriMov, 1].text = CreDebMovG.text
          END SELECT
          GriMovv[i_RgGriMov, 2].text = DescrMovDig.Text
          $_Como = ModuliVari.LevEditing(ImpMovDig.Text)
          i_Posiz = InStr($_Como, ",")
          IF i_Posiz <> 0 THEN
            $_Como = Left($_Como, i_Posiz - 1) & "." & Right($_Como, 2)
          ENDIF
          f_ImpMov = CFloat($_Como)
          SELECT CASE SegnoEU.Text
                  CASE "E", "D"
                    GriMovv[i_RgGriMov, 3].text = ImpMovDig.Text
                    i_TotEntrate += i_ImpMov
                  CASE ELSE 
                    GriMovv[i_RgGriMov, 4].text = ImpMovDig.Text
                    i_TotUscite += i_ImpMov
          END SELECT
L'istruzione seguente è quella di lettura che restituisce bene il Codice-Voce da inserire nella tabella "movimgg", ancora vuota
Codice: [Seleziona]
          '---------------------------- rilevo il codice di Voce contabile dalla Tabella piancont ---------------------------------------
          i_Posiz = RInStr(VoContMoDig.Text, " » ") - 3            'ricerca l'ultima ricorrenza di " » " VoContMoDig.Text ne segnala la posizione del primo crt della sottostringa
          $_VoceConto = Right(VoContMoDig.Text, i_Posiz)
          DB_Connection.Begin
          RecTab = DB_Connection.EXEC("SELECT * FROM piancont WHERE NomeVoce  LIKE '%" & $_VoceConto & "%'")
          i_CoVoContab = RecTab!NumVoce                                 'Codice della Voce contabile nel piano dei conti
         
 :)
Codice: [Seleziona]
          i_data = Val(ModuliVari.$_DataCont)
'--------
'--------------------------------------- routinetta di conversione dell'orario corrente in hhmmss (2 crt per ciascun sottocampo
          $_ora = Hour(Now)
          IF Len($_ora) = 1 THEN $_ora = "0" & $_ora
          $_minuti = Minute(Now)
          IF Len($_minuti) = 1 THEN $_minuti = "0" & $_minuti
          $_secondi = Second(Now)
          IF Len($_secondi) = 1 THEN $_secondi = "0" & $_secondi
          $_Data = $_AA & $_MM & $_GG
          $_orario = $_ora & $_minuti & $_secondi
          i_orario = Val($_orario)                           '    ----> orario(hhmmss) IN formato numerico
          b_nupro = CByte(GriMovv[i_RgGriMov, 0].text)       'Numero progressivo del movimento nella giornata
          SELECT CASE SegnoEU.Text
                  CASE "U", "A"
                    f_ImpMov = f_ImpMov * (-1)    'trasforma in negativo l'importo se il movimento è di Uscita, di inedbitamento o diminuzione di credito
          END SELECT
          i_Totel = BenefMovG.Count
          FOR i_Som = 0 TO i_Totel - 1
            IF BenefMovG.List[i_Som] = BenefMovG.Text THEN
                $_Benef = Str(i_Som + 1)                  'Numero progressivo del record corrispondente della Tabella "Componenti Familiari"
                BREAK
            ENDIF
          NEXT
'---------------------------------------------------------------------------------------------------------------------------------------
'--------
'--------------------------------------------------------------------- istruzioni aggiunte in prova, ma poi tolte perchè la open viene ignorata ------------------------------     
          'DB_Connection.CLOSE               'chiude il DB
          'WITH DB_Connection
          '  .Name = DBname
          '  .Open    'Riapro il DB
          'END WITH
'--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------     
          $_Descr = DescrMovDig.Text
          $_Moneta = ModuliVari.$_TipoValuta
Ecco l'istruzione incriminata con la sua commit, dopo la quale, accedendo alla tabella scopro che non è stato inserito il record comandato:
Codice: [Seleziona]
          DB_Connection.EXEC("INSERT INTO movimgg VALUES(" & i_data & ", '" & i_orario & "', '" & b_nupro & "', '" & i_CoVoContab & "', '" & $_Descr & "', '" & $_Moneta & "', '" & f_ImpMov & "', '" & $_Benef & "')")
          DB_Connection.Commit   
:-[
Codice: [Seleziona]
      
          ME.ResetAreaDigMov()        'routine che svuota il contenute di tutte le caselle del Form
      ENDIF
    ENDIF
  ENDIF
END

Dovrei ancora rifinire qualche dettaglio,ma aspetto prima di concludere positivimanete la prova.
Se ritieni non sufficiente il gruppo di istruzioni riportate qui sopra, dimmi pure cosa posso fornire oltre.
Ciao. :)
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: Picavbg - 22 Febbraio 2010, 12:46:56
hai provato a vedere come si comporta usando il metodo hres=db_connection.edit(nometavola)

hres!nomecampo1=valore1
hres!nomecamnpon=valoren

db.connection.commit

ti ricordo che usando INSERT into devi dare un valore a tutte le colonne della tabella a meno che non specifichi prima i campi in cui vuoi inserire i valori
Si, cito tutte le colonne; le devo infatti valorizzare tutte coio dati preparati durante l'inserimento del movimento di pertinenza. Per maggiore chiarezza allego il programmino che ho realizzato per provare esclusivamente l'inserimento di un solo record sempre nella stessa tabella e ti posso assicurare che svolge il suo lavoro egregiamente.
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: leo72 - 22 Febbraio 2010, 15:26:03
Ho notato che spesso le funzioni di gestione dei DB di Gambas sono un pò capricciose.
Hai provat a riaprire la connessione proprio prima di eseguire l'istruzione incriminata?
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: Picavbg - 22 Febbraio 2010, 15:43:10
Ho notato che spesso le funzioni di gestione dei DB di Gambas sono un pò capricciose.
Hai provat a riaprire la connessione proprio prima di eseguire l'istruzione incriminata?
Non so se hai notato le istruzioni, riportate come commento,  subito prima dell'istruzione INSERT
Codice: [Seleziona]
'--------------------------------------------------------------------- istruzioni aggiunte in prova, ma poi tolte perchè la open viene ignorata ------------------------------     
          'DB_Connection.CLOSE               'chiude il DB
          'WITH DB_Connection
          '  .Name = DBname
          '  .Open    'Riapro il DB
          'END WITH
'--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------   
 
È una prova che ho eseguito, ma ho dovuto abbandonarle subito perchè il programma si comporta come se non eseguisse la open del DB; infatti produce il seguente errore:
Codice: [Seleziona]
Query failed: the database file is locked
:o
Ciao.

Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: fsurfing - 22 Febbraio 2010, 23:14:58
a far le cose benfatte dovresti postare tutto il programma e il db,, nel programmino che hai postato prima ho notato che  cancelli la tabella moving, poi la ricrei e poi ci scrivi dei record il tutto con un unico commit...
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: leo72 - 22 Febbraio 2010, 23:37:21
Riguardando il tuo codice ed alcuni miei programmi vedo che io opero in maniera differente.
Non mi affido alle query SQL lanciate con Connection.EXEC ma preferisco usare i metodi di Gambas e poi, anche a costo di sembrare ripetitivo, inserisco una ben precisa sequenza di istruzioni.

Io riscriverei il pezzo incriminato così:

Codice: [Seleziona]
DIM Connessione as NEW Connection
DIM Risultato as Result

'-- apre il DB
WITH Connessione
    .Name = NOME_DB
    .Type = "sqlite3"
    .Open
END WITH
Connessione.Begin
Risultato = Connessione.Create("mivimgg")
Risultato[CAMPO1]=DATO1
Risultato[CAMPO2]=DATO2
......
Risultato[CAMPOn]=DATOn
Risultato.Update
Connessione.Commit
Connessione.CLOSE
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: fsurfing - 23 Febbraio 2010, 00:12:46
io lo scritto 6 post addietro 8) ma come al solito nessuno mi ascolta! ;D
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: Picavbg - 23 Febbraio 2010, 00:55:59
@fsurfing:
Prima di tutto, grazie per la tua sempre pronta disponibilità. Ho preparato gli allegati che mi hai chiesto, però ho sempre difficoltà con la connessione Internet.
Per un'eventuale prova, tieni presente:
1) il DB risiede in /ContabFam/ContabFam_DB
2) Per arrivare alla prova di inserimento record nella Tabella "Movimgg", dopo l'avvio tramite l'IDE, occorre:
     a) FMain(CoFam_Ini) »» Menù: Movimenti/Inserimento;
     b) Form1(Movimenti giornalieri) »» pulsante OK
     c) Form2(Inserimento Movimenti del: »» digitare o scegliere una voce nella ComboBox "Descrizione"
                                                                        Importo non essenziale; specificare però il Segno con "e/u"
                                                                        scegliere una voce nella ComboBox "Voce di Entrata o di Uscita"
                                                                        cliccare sul pulsante OK
Se tutto va bene il movimento digitato compare mella prima triga della gridview e vengono svuotate tutte le caselle di digitazione movimenti; viene pure registrato il movimento nella Tabella "movimgg" del DB.
Io spero che si manifesti regolarmente l'errore alla "INSERT INTO movimgg ". :D  ... così mi puoi aiutare a capire dove e come intervenire!

@Leo:
Purtroppo ho dovuto abbandonare istruzioni del tipo
Connessione.Begin
Risultato = Connessione.Create("mivimgg")
Risultato[CAMPO1]=DATO1
Risultato[CAMPO2]=DATO2
......
Risultato[CAMPOn]=DATOn
Risultato.Update

a causa dell'inserimento anomalo-automatico di una colonna ID imprevista ed indesiderata. Ho invece provato e collaudato il fedele rispetto della struttura tabellare, preparata durante il disegno del DB, delle istruzioni di tipo SQL.EXEC. Preferisco perciò proseguire sulla scelta fatta.
Ciao a tutti.
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: leo72 - 23 Febbraio 2010, 07:27:49
Sì, ma se con SQL.EXEC non risolvi mentre con i metodi di Gambas sì, allora lasci perdere l'apparizione della colonna ID ma almeno risolvi il problema ("1a regola del programmatore pragmatico  ;)")
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: Picavbg - 23 Febbraio 2010, 09:13:50
@Leo:
Supponiamo che la tua idea pratica, ma non rispondente ai miei disegni, sia da applicare, perchè l'unica presumibile funzionante, vorrei invitarti a ragionare sul comportamento strano del programma anche a livello delle seguenti istruzioni:
DB_Connection.Begin       
TRY RecTab = DB_Connection.EXEC("SELECT * FROM piancont WHERE NomeVoce  LIKE '%" & $_VoceConto & "%'")    ««   funziona benissimo
Codice: [Seleziona]
DB_Connection.CLOSE   ««  funziona benissimo
 WITH
     DB_Connection
           .Type = "sqlite3"
           .Host = FMain.DB_path
           .Login = ""
           .Password = ""
           .Name = FMain.DBname
           .Open    'Riapro il DB                ««  Non funziona ....................  pur essendo un'istruzione SQL
 END WITH

Io non riesco a spiegarmelo, perchè in altre parti del  programma utilizzo sequenze di quel tipo, cioè con Close ed Open in successione e funzionano sempre a meraviglia. Quindi se c'è un'anomalia in quel punto, la spiegazione è: commetto io un errore in quel passo di programma, oppure qualche meccanismo di Gambas non funziona.
Ti ho espresso il mio pensiero da modestissimo programmatore, inesperto di tecnicismi costruttivi di linguaggi di programmazione; spero solo che debba io aggiustare qualcosa; solo che, se è così, non ho capito ancora cosa.
Ciao
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: leo72 - 23 Febbraio 2010, 09:55:00
L'errore dovrebbe essere qui:
Codice: [Seleziona]
.Host = FMain.DB_path

SQLite è un DB locale, non puoi impostargli la proprietà Host: quella è riservata a DB che girano su server quali MySQL o PostGre.
Per indicare il nome del file che contiene il DB devi usare la proprietà Name. Quindi.
Codice: [Seleziona]
.Name = FMain.DB_path

In pratica, quindi, non ti apre il DB perché non lo trova.
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: fsurfing - 23 Febbraio 2010, 13:03:05
io ti posso consigliare una cosa, visto che il programma e già piuttosto vasto ti consigli di  non utilizzare la connessione come variabile globale ma inizializzarla in ogni funzione, questo principalmente per due motivi

1) se in qualche parte del codice in una funzione ti sei dimenticato di chiudere il db questo viene chiuso automaticamente alla chiusura della funzione

2)puoi aprire più connessioni quasi contemporane (a patto che siano tutte di lettura) per  realizzare delle funzioni di ricerca nel db tramite un modulo esterno mentre stai leggendo i valori di un altra tabella

tutti i tuoi problemi derivano dal fatto che usi PRIVATE DB_Connection AS NEW Connection  come variabile globale e da qualche parte del programma non hai correttamente chiuso il db o non effettuato correttamente il commit,oppure la connessione è gia avviata da un altra funzione del programma
Segui il mio consigli e avvia l' inizializzazione della connessione localmente alla funzione o non ne esci + fuori
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: fsurfing - 23 Febbraio 2010, 13:05:19
Citazione
Inserisci citazione
L'errore dovrebbe essere qui:
Codice:

.Host = FMain.DB_path


SQLite è un DB locale, non puoi impostargli la proprietà Host: quella è riservata a DB che girano su server quali MySQL o PostGre.
Per indicare il nome del file che contiene il DB devi usare la proprietà Name. Quindi.
Codice:

.Name = FMain.DB_path


In pratica, quindi, non ti apre il DB perché non lo trova.

veramente sqlite 3 accetta come host il percorso dove si trova il db e come name il nome oppure volendo si può definire solamente il nome comprensivo del percorso,
in entrambi i casi il db funziona correttamente
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: Picavbg - 23 Febbraio 2010, 14:37:59
non utilizzare la connessione come variabile globale ma inizializzarla in ogni funzione.
1) se in qualche parte del codice in una funzione ti sei dimenticato di chiudere il db questo viene chiuso automaticamente alla chiusura della funzione
Quindi tui dici di dichiarala all'interno di ciascuna SUB così:
Codice: [Seleziona]
DIM DB_Connection AS NEW Connection 
in modo tale ogni uscita da una sub qualsiasi, a chiudere il DB, eventualmente dimenticato aperto, ci pensa automaticamente Gambas.
Spero di avere capito e procedo così. Vi farò sapere.
Ciao :)
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: fsurfing - 23 Febbraio 2010, 20:37:34
si esatto la dichiari all' interno della sub  :)
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: Picavbg - 24 Febbraio 2010, 00:16:06
È successo quello che immaginavo, cioè non è cambiato niente, o quasi: Infatti l'errore che mi dava e che mi da non fa pensare ad un close non eseguita, bensì ad una open mancante. Il messaggio di ERRORE è cambiato ed è cambiato pure il punto dove si manfesta:
Citazione
Unable to commit transaction: The database file is locked
Ecco il codice della Form2.class modificato
Codice: [Seleziona]
PUBLIC SUB MovDigOk_Click()
DIM DB_Connection AS NEW Connection   'inizializza la nuova connessione

DIM b_nupro AS Byte
DIM f_ImpMov AS Float


DIM i_Som AS Integer
DIM i_CoVoContab AS Integer
DIM i_data AS Integer
DIM i_ImpMov AS Integer
DIM i_orario AS Integer
DIM i_RgGriMov AS Integer

DIM $_Benef AS String
DIM $_Como AS String
DIM $_Data AS String
DIM $_Descr AS String
DIM $_GG AS String
DIM $_MM AS String
DIM $_AA AS String
DIM $_orario AS String
DIM $_ora AS String
DIM $_minuti AS String
DIM $_secondi AS String
DIM $_Moneta AS String
  WITH
      DB_Connection
      .Type = "sqlite3"
      .Host = FMain.DB_path
      .Name = FMain.DBname
      .OPEN    'Apro il DB
  END WITH
  IF $_DescrUlt <> "" THEN
      $_TabNewDescr.Add($_DescrUlt)     
      $_DescrUlt = ""         
  ENDIF
  IF ImpMovDig.Text = "" THEN
     ImpMovDig.SetFocus
  ELSE
    IF DescrMovDig.Text = "" THEN
        DescrMovDig.SetFocus
    ELSE 
      IF SegnoEU.Text = "" THEN
          SegnoEU.SetFocus
        ELSE
          i_RgGriMov = 0
          DO UNTIL GriMovv[i_RgGriMov, 1].text = "" 
            INC i_RgGriMov
            IF i_RgGriMov > GriMovv.Rows.count THEN
                BREAK
            ENDIF
          LOOP
          SELECT CASE SegnoEU.Text
                  CASE "E", "U"   
                    GriMovv[i_RgGriMov, 1].text = VoContMoDig.Text
                    GriMovv[i_RgGriMov, 5].text = BenefMovG.Text
                  CASE ELSE         
                    GriMovv[i_RgGriMov, 1].text = CreDebMovG.text
          END SELECT
          GriMovv[i_RgGriMov, 2].text = DescrMovDig.Text
          '$_StriMia = Modulivari.LevEditing($_StriMia)
          $_Como = ModuliVari.LevEditing(ImpMovDig.Text)
          i_Posiz = InStr($_Como, ",")
          IF i_Posiz <> 0 THEN
            $_Como = Left($_Como, i_Posiz - 1) & "." & Right($_Como, 2)
          ENDIF
          f_ImpMov = CFloat($_Como)
          SELECT CASE SegnoEU.Text
                  CASE "E", "D"
                    GriMovv[i_RgGriMov, 3].text = ImpMovDig.Text
                    i_TotEntrate += i_ImpMov
                  CASE ELSE 
                    GriMovv[i_RgGriMov, 4].text = ImpMovDig.Text
                    i_TotUscite += i_ImpMov
          END SELECT
          '---------------------------- rilevo il codice di Voce contabile dalla Tabella piancont ---------------------------------------
          i_Posiz = RInStr(VoContMoDig.Text, " » ") + 3           
          i_LuFix = Len(VoContMoDig.Text) - i_Posiz           
          PRINT "«" & VoContMoDig.Text & "»"
          PRINT Len(VoContMoDig.Text)
          PRINT "«" & Left(VoContMoDig.Text, 17) & "»"
          PRINT "«" & Right(VoContMoDig.Text, i_LuFix) & "»"
          $_VoceConto = Right(VoContMoDig.Text, i_LuFix)
          DB_Connection.Begin
          TRY RecTab = DB_Connection.EXEC("SELECT * FROM piancont WHERE NomeVoce  LIKE '%" & $_VoceConto & "%'")
          IF ERROR THEN
              Message.ERROR("Attenzione! ->  " & ERROR.Text & Chr(10) & Chr(10) & "durante la lettura della Tabella ContabFam.db!piancont'" & Chr(10) & Chr(10) & " il programma verrà chiuso")       
              FMain.Close
          ENDIF
          i_CoVoContab = RecTab!NumVoce                               
          i_data = Val(ModuliVari.$_DataCont)
'--------
'--------------------------------------- routinetta di conversione dell'orario corrente in hhmmss (2 crt per ciascun sottocampo
          $_ora = Hour(Now)
          IF Len($_ora) = 1 THEN $_ora = "0" & $_ora
          $_minuti = Minute(Now)
          IF Len($_minuti) = 1 THEN $_minuti = "0" & $_minuti
          $_secondi = Second(Now)
          IF Len($_secondi) = 1 THEN $_secondi = "0" & $_secondi
          $_Data = $_AA & $_MM & $_GG
          $_orario = $_ora & $_minuti & $_secondi
          i_orario = Val($_orario)                       
          b_nupro = CByte(GriMovv[i_RgGriMov, 0].text)       
          SELECT CASE SegnoEU.Text
                  CASE "U", "A"
                    f_ImpMov = f_ImpMov * (-1)   
          i_Totel = BenefMovG.Count
          FOR i_Som = 0 TO i_Totel - 1
            IF BenefMovG.List[i_Som] = BenefMovG.Text THEN
                $_Benef = Str(i_Som + 1)                 
                BREAK
            ENDIF
          NEXT
'---------------------------------------------------------------------------------------------------------------------------------------
'--------
          $_Descr = DescrMovDig.Text
          $_Moneta = ModuliVari.$_TipoValuta
          TRY DB_Connection.EXEC("INSERT INTO movimgg VALUES(" & i_data & ", '" & i_orario & "', '" & b_nupro & "', '" & i_CoVoContab & "', '" & $_Descr & "', '" & $_Moneta & "', '" & f_ImpMov & "', '" & $_Benef & "')")         '»»  Istruzione superata come se fosse stata eseguita bene
        IF ERROR THEN
            Message.ERROR("Attenzione! ->  " & ERROR.Text & Chr(10) & Chr(10) & "durante l'inserimento record nella Tabella ContabFam.db!movimgg'" & Chr(10) & Chr(10) & " il programma verrà chiuso")       
            FMain.Close
        ELSE
          DB_Connection.Commit            '»»  Istruzione dove si manifesta l'errore
        ENDIF
          ME.ResetAreaDigMov()
      ENDIF
    ENDIF
  ENDIF
END

Come puoi vedere non esiste alcuna close, eppure, sempre più stranamente , la "INSERT INTO movimgg" non produce errore, ma lo produce la "Commit", come se fra la "Insert" e la "Commit" ci fosse una "CLOSE"
Io non so più che cosa fare ..... :'(
Mi resta da provare una cosa sola: svuotatre tutta la Form2.class delle istruzioni presenti; poi rimetterle piano piano tutte, partendo da valori precostituiti e dalle sole "INSERT INTO" e "COMMIT". Se questa non dovesse funzionare, posso solo prendere l'aliscafo per Marettimo e buttare tutto il prgramma in alto mare! ... Sig! sig!
Ciao a tutti.
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: fsurfing - 24 Febbraio 2010, 08:22:54
togli il connection.begin, lascia solo l' open , fai la tua lettura, quando hai finito di leggere tutti i dati prova a dare un close e poi prima di inserire la tabella dai un open, cerca di racchiudere operazioni di diverso genere su un db tra un open e un close, se modifichi la struttura o i dati devi dare anche un commit e in alcuni casi anche ub update del result
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: Picavbg - 24 Febbraio 2010, 10:26:11
togli il connection.begin, lascia solo l' open , fai la tua lettura, quando hai finito di leggere tutti i dati prova a dare un close e poi prima di inserire la tabella dai un open, cerca di racchiudere operazioni di diverso genere su un db tra un open e un close, se modifichi la struttura o i dati devi dare anche un commit e in alcuni casi anche ub update del result
Ho fatto tutto come mi hai detto ed è tornato l' errore sull'istruzione "INSERT INTO":
Citazione
Query failed: the database file is locked
Ho  allora posto prima di quell'istruzione un'istruzione di test sulla tabella:
Codice: [Seleziona]
 IF NOT DB_Connection.Tables.Exist("movimgg") THEN      ' Verifica l'esistenza della Tabella "PIanCont"
              Message.ERROR("Attenzione! ->  ERRORE" & Chr(10) & Chr(10) & " '" & ERROR.Text & "'" & Chr(10) & Chr(10) & "La Tabella ContabFam.db!movimgg' è inesistente")       
          ENDIF
Ebbene il risultato non è cambiato; il programma esegue il test senza dare errore e poi da errore sempre alla stessa istruzione:
Codice: [Seleziona]
DB_Connection.EXEC("INSERT INTO movimgg VALUES(" & i_data & ", '" & i_orario & "', '" & b_nupro & "', '" & i_CoVoContab & "', '" & $_Descr & "', '" & $_Moneta & "', '" & f_ImpMov & "', '" & $_Benef & "')")
Sicuramente il problema à lì dentro, ma come superare l'ostacolo?
Come avrai visto in qualche post precedente e nel sorgente che ti ho fatto pervenire, le colonne riportate nell'INSERT sono tutte quelle della tabella.
Secondo te quell'istruzione è scritta bene? Io non so più cosa fare....... :'( :'( :'(
Ciao.


Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: leo72 - 24 Febbraio 2010, 11:56:19
Vediamo se l'ho beccato!

Allora... tu inserisci i dati creando una concatenazione di stringhe con il comando &... però penso che ti dia l'errore perché vuoi concatenare ad una stringa un intero, ad esempio i_data, o un byte, ad esempio b_nupro.
Prova a convertirli prima tutti in stringa.
Cioè:
Codice: [Seleziona]
..... VALUES(" & trim(str(i_data)) & ", '" & trim(str(i_orario)) & "', '" & trim(str(b_nupro)) & "......
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: fsurfing - 24 Febbraio 2010, 12:19:17
io in casi dubbi faccio così:

Citazione

sql="INSERT INTO movimgg VALUES(" & i_data & ", '" & i_orario & "', '" & b_nupro & "', '" & i_CoVoContab & "', '" & $_Descr & "', '" & $_Moneta & "', '" & f_ImpMov & "', '" & $_Benef & "')"

file.save(user.home & "/pippo.txt",sql)
DB_Connection.EXEC(sql)

in questo modo salvo la query in file di testo poi apro il db con sqlitebrowser e provo la query contenuta nel file pippo.txt nel db ottenedo così indicazione di eventuali errori.
se la query funziona il problema è nel codice, posta il programma modificato  con le connection "locali" così riesco a controllarlo meglio
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: Picavbg - 24 Febbraio 2010, 12:56:00
@Leo:
In un programmino che ho allegato in uno dei miei post iniziali (n.4), ho eseguito quella riga di comando, impostata sempre alla stessa maniera, ed ha funzionato meravgliosamente, per cui ho rinunciato a dare spiegazioni sull'anomalia. Ho provato stamani anche a lasciare nella SUB in questione solamente le istruzioni necessarie per inserire il record nella tabella e non ha funzionato nemmeno.   Boooh!!!  :-X

@fsurfing:
Ho fatto anche la prova fresca fresca che mi hai suggerito, ma non è cambiato niente. Rieccoti allegato il programma con le ultime modifiche.
 :-[ :-[
Sono veramente desolato per tutta questa lunga discussione. Vi chiedo scusissime.
Ciao a tutti
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: Ceskho - 24 Febbraio 2010, 15:16:06
Scusate ma a me l'errore restituito mi fa pensare ad un file protetto che non viene sbloccato...non è che hai creato il tuo database con dati di login ed orta non li inizializzi mai?
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: fsurfing - 24 Febbraio 2010, 17:38:37
OK ora con qualche modifica funziona :)

appena avviato comunque il programma mi dava stakoverflow, ho risolto togliendo tutti i me. presenti nel form2 del resto se tu hai una funzione nel form2 non è il caso che indichi ad esempio il button1 con me.button1, basta button1.
il ME si utilizza soprattutto in relazione alla chiamata di oggetti appartenenti a un gruppo o array di oggetti
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: Picavbg - 24 Febbraio 2010, 23:56:44
OK ora con qualche modifica funziona :)
appena avviato comunque il programma mi dava stakoverflow, ho risolto togliendo tutti i me. presenti nel form2 del resto se tu hai una funzione nel form2 non è il caso che indichi ad esempio il button1 con me.button1, basta button1.
il ME si utilizza soprattutto in relazione alla chiamata di oggetti appartenenti a un gruppo o array di oggetti
Ho visto solo a tarda sera la tua risposta, perchè ho potuto solo ora riappropriarmi della connessione Internet.
Ti ringrazio enormemente per i chiarimenti. Da quello che mi hai detto sembra che tutte le chiamate fatte con ME. abbiano provocato  lo stakoverflow.A me non lo dava perciò non lo avevo segnalato. Tornando al programma, ho visto le correzioni apportate e l'ho eseguito così come me lo hai restituito. Ho trovato il file pippo.txt con la stringa che poi sarebbe dovuta finire anche, come riga, nella tabella movimgg e, purtroppo devo dirti che la tabella rimane vuota. Se tu dici che il programma da te funziona, devo crederci, ma nel mio pc, sotto Gambas 2.19, continua a non funzionare.

Vorrei capire poi una cosa. Il programma non da più errore se viene mantenuto il comando
DB_Connection.Begin    e viene soppresso il comando    DB_Connection.Commit.
Per quello che avevo capito, senza il commit l'INSERT non viene convalidato, però la presenza del commit fa rinascere l'errore.

Tutto ciò mi sembra il cane che vuole mordere la coda. Per riuscirci la bestiola avrebbe bisogno di una coda e di un collo un pò più lunghi. :)

Ciao.
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: Picavbg - 25 Febbraio 2010, 10:49:01
@fsurfing:
Stamattina ho provato a spostare l'INSERT INTO in una nuova classe, ma il risultato, purtroppo non cambia. Ecco l'esito delle prove (ho riportato solo le istruzioni essenziali):
Codice: [Seleziona]
DB_Connection.Type = "sqlite3" 
DB_Connection.Host = FMain.DB_path
DB_Connection.Name = FMain.DBname
DB_Connection.Open   
DB_Connection.Begin
DB_Connection.EXEC(sql)
DB_Connection.CLOSE
Cioè, ripetendo le istruzioni preparate da te (con Begin e senza Commit), il programma procede senza dare errori, ma non registra il record nella tabella.
Codice: [Seleziona]
DB_Connection.Type = "sqlite3" 
DB_Connection.Host = FMain.DB_path
DB_Connection.Name = FMain.DBname
DB_Connection.Open   
DB_Connection.Begin
DB_Connection.EXEC(sql)
DB_Connection.Commit
DB_Connection.CLOSE
Inserendo la Commit provoca Errore di DB chiuso alla Commit.
Codice: [Seleziona]
DB_Connection.Type = "sqlite3" 
DB_Connection.Host = FMain.DB_path
DB_Connection.Name = FMain.DBname
DB_Connection.Open   
DB_Connection.EXEC(sql)
DB_Connection.Commit
DB_Connection.CLOSE
Togliendo la Begin e lasciando la Commit, l'Errore  di DB chiuso lo da già alla .EXEC(sql).

E veramente diventato un percorso senza via d'uscita. Ora provo a trasformare la classe in modulo, anche se con molto scetticismo. Dopo di che, resta solo la possibilità di chiamare un'altro programma o forse una funzione shell. Intanto sono già trascorsi 6 giorni dalla prima manifestazione di errore ed il mio programma è ancora fermo, mentre dovrei essere alle fasi di prova del Form5.class. Però non mi sto lamentando con nessuno di Voi che state cercando di darmi veramente una grossa mano, ma delle stranezze che riscontro. :(
Ciao.
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: fsurfing - 25 Febbraio 2010, 11:32:58
la cosa strana è che l' errore dice che il db e loked ovvero la connessione è aperta correttamente ma il db non può essere scritto perchè l' accesso in scrittura è negato , questo succede solitamente se un altra applicazione o processo stanno eseguendo operazioni di scrittura nel db o se non si anno i permessi per scrivere
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: fsurfing - 25 Febbraio 2010, 12:01:50
secondo me il problema deriva tutto dalla creazione delle tabelle iniziali che non hanno un indice autoincrementante, altrimenti non si spiegano questi problemi,perchè non utilizzi un indice autoincrementante su un campo id lasciando quest' ultimo come unico indice?
tanto poi l' ordinamento nella visualizzazione lo puoi fare tramite query

Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: Picavbg - 25 Febbraio 2010, 15:18:29
Tutte le tabelle del DB sono strutturate alla stessa maniera. Fino ad ora ho lavorato da programma solo con due tabelle; la prima non mi ha assolutamente dato problemi (piancont). Su quest'ultima ho eseguito funzioni di cancellazione tabella, creazione con successivo inserimento record già presenti ed uno nuovo e non ho incontrato per niente ostacoli. La "movimgg" è la seconda tabella che stavo tentando di popolare da programma. È completamente vuota. Potrei tentare a scrivere manualmente un record, per vedere se così posso poi accedervi in scrittura da programma. L'ID a me non serve, ma con SQLite ne ho vissute tante di sventure che non mi meraviglio più di niente. Sarà leggero come una piuma, ma mi sembra che funziona a schema obbligato.
Ti farò sapere.
Ciao.
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: fsurfing - 25 Febbraio 2010, 18:33:40
tra le due tabelle differenze ce ne sono ad esempio quella che da problemi ha due primary key mentre piancont solo uno,
io sqlite l' ho usato veramente moltissimo , nell' ultimo programam (gesthotel ) il munero di operazioni svolte sul db è veramente notevole,problemi riscontrati: 0
il tipo di query che usi per creare il db è leggermente diversa da quella che uso io, io uso cmq il campo id anche se  non mi  serve, in un unico progetto ho usato db senza id e ti assicuroi che era una rottura.

ho notato (almeno credo) che  in alcune tabelle effettui delle operazioni senza controllare se il db è vuoto o pieno o cmq lo controlli con

result.count<>0

questa istruzione può generare errore se non ci sono record nel db, ti conviene utilizzare:

if result.availabe=true then.


la tabella incriminata io sono riuscito a popolarla tramite il programma con un record, alla memorizzazione del secondo record va in errore , io attribuisco questo problema
alla modalità di creazione della tavola.

ho notato inoltre che se inserisci una spesa e il tipo di movimento ma non metti nessun valore come descrizione , premendo ok il programma entra in un loop infinito

nel programma nelle funzioni di creazione tavole mancano alcuni parametri per avviare la connessione
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: Picavbg - 25 Febbraio 2010, 22:54:00
Dalla tua esperienza devo assumere il consiglio di utilizzare il campo id autoincrementale. E la primary key che avevo definito, allora non mi serve più?

Io, al contrario di te, ho usato pochissimo i DB; infatti togliendo qualche cosa fatta con VB, ma mai fino in fondo, e lo studio che sto portando avanti con Gambas, ho solo nozioni teoriche.

Sicuramente ho ancora bisogno di diversi consigli e, prima di ricominciare ad analizzare tutta la struttura del DB ed il trattamento dei dati tabellari, ti esponmgo il mio pensiero sull'argomento, così da raccogliere i tuoi preziosi consigli:  penso che inserendo una colonna id, dovendo poi leggere le tabelle col metodo "order by" possa abbandonare la definizione di una chiave primaria. Certamente, almeno per la scrittura, non avrò più bisogno di utilizzare istruzioni SQL.

Quella del loop a causa della descrizione assente non l'avevo ancora provata. Grazie per la segnalazione. Si vede che ho dimenticato ad inserire l'istruzione di controllo alla fine dell'inserimento di tutti i dati pertinenti al movimento in digitazione. Provvedrò senz'altro alla correzione. Grazie anche per il consiglio sul metodo più consono per verificare la presenza di dati in una tabella.

Ora quello che mi mi preoccupa è il controvalore della tua consulenza ......  ;D ;D

Ciao.

Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: fsurfing - 25 Febbraio 2010, 22:57:43
Citazione
Ora quello che mi mi preoccupa è il controvalore della tua consulenza ......  Ghigno Ghigno
figurati non sono mica ceskho io! :P
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: Picavbg - 25 Febbraio 2010, 23:04:36
@Leo:
Non ci volevo credere e non volevo intraprendere la strada del'Id inutile, a tutti i costi. Invece devo arrendermi di fronte alla tracotanza di SQLite: o così o niente DB!
Perciò, deposta l'ascia di guerra, farò come avevi scritto tu qualche post fa; aggiungerò la colonna id autoincrementale, anche se non me ne facco un ... bel niente. :D
Ciao.
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: fsurfing - 25 Febbraio 2010, 23:11:31
ho provato a cambiare il codice di creazione del db e farlo come uso di solito, sembra funzionare correttamente,

forse potresti anche usare il db senza id ma non devi definire un campo come integer primary key ma solo definire degli indici, dico forse perchè non l' ho mai usato in tal modo :)
Titolo: Re: Tabella di DB.SQLite3 vuota
Inserito da: Ceskho - 26 Febbraio 2010, 00:34:26
Citazione
Ora quello che mi mi preoccupa è il controvalore della tua consulenza ......  Ghigno Ghigno
figurati non sono mica ceskho io! :P

8)