Oggi, durante l'esecuzione di un programma di test sul DB costruito dal mo programma "ContabFam" ho incontrato un'anomalia che definirei inverosimile, e cioè:
vado a leggere il contenuto di certi dati riepilogativi presenti in campi di colonne contigue della tabella di DB riepmovg
Ebbene pur avendoli richiamati correttamente, l'output fornito dalla query sql è uguale per tutti e due i campi, proprio come se contenessero entrambi lo stesso valore.
Riporto la print eseguita durante il debug del programma, per tutte le colonne di una riga della tabella incriminata:
RecRiepMovg!IdRiepMovg= '6159'
RecRiepMovg!DtCoMovg= '20130102'
RecRiepMovg!StaDtMovg='C'
RecRiepMovg!TotEntrg= '3110' RecRiepMovg!TotUscg= '3110'
RecRiepMovg!RipFing= '360,52'
Come risulta chiaramente la 4^ riga di print richiama le colonne TotEntrg e TotUscg: RecRiepMovg!TotEntrg= '3110' RecRiepMovg!TotUscg= '3110'
L'istruzione di query che precede la suddetta print é:
RecRiepMovg = ApriDB.DB_Connection.Exec("SELECT * FROM riepmovg WHERE DtCoMovg = '" & iGiornata & "'")
If Not RecRiepMovg.Available
EdtData = New EditData(iGiornata)
Message.Error("<CENTER> ATTENZIONE !!!<BR><b> Il RECORD RIEPILOGATIVO della giornata contabile '" & EdtData.$DataEdt & "' inesistente in DB.ContabFam.riepmovg <BR><BR>IL PROGRAMMA VERRÀ CHIUSO </b></CENTER>")
Quit
Endif
Print "RecRiepMovg!IdRiepMovg= '"; RecRiepMovg!IdRiepMovg; "'", "RecRiepMovg!DtCoMovg= '"; RecRiepMovg!DtCoMovg; "'", "RecRiepMovg!StaDtMovg='"; RecRiepMovg!StaDtMovg; "'", "RecRiepMovg!TotEntrg= '"; RecRiepMovg!TotEntrg; "'", "RecRiepMovg!TotUscg= '"; RecRiepMovg!TotUscg; "'", "RecRiepMovg!RipFing= '"; RecRiepMovg!RipFing; "'"
If RecRiepMovg!TotEntrg = fTotEntr And RecRiepMovg!TotUscg = fTotUsc And RecRiepMovg!StaDtMovg = "C" Then
iEsito = 0
Else
iEsito = 1
Endif
La vista della tabella fornita da Sqlite ed allegata qui mostra chiaramente che i nomi delle colonne sono riportati correttamente e che il contenuto delle celle nella riga di cui ho detto sopra è diverso:
3110 per TotEntrg
3012.9 per TotUscg
Inoltre la tabella presenta altre celle delle stesse colonne con valori uguali, diversamente dalla realtà. Mi viene difficile da crederlo, ma sembra che ci possa essere qualche cattivo comportamento di software che legge e/o registra i dati in codesta tabella. Ma perché solo in essa?
Ho guardato le istruzioni di creazione della tabella ed a me sembrano corrette:
Public Sub CreaRiepMovg($_NomeTab As String) 'Routine di crea'PRIVATE DB_path AS String 'Percorso di ricerca del Database ContabFam.db
'----------------------------------------------------------- CREAZIONE DELLA "Tabella di RIEPILOGO DEI MOVIMENTI GIORNALIERI" -------
ApriDB = New OpenDB
sql = "CREATE TABLE '" & $_NomeTab & "'" '*** Contiene i Conti e sottoconti di dettaglio utilizzabili nella procedura ***"
sql = sql & "('IdRiepMovg' INTEGER PRIMARY KEY AUTOINCREMENT," 'codice id obbligato dalla struttura di SQLite3, ma inutile per questo DB
sql = sql & " 'DtCoMovg' INTEGER," '----»» costituisce la chiave primaria d'ordinamento effettiva e rappresenta la Data contabile della giornata di riferimento
sql = sql & " 'StaDtMovg' CHAR(1) DEFAULT NULL," ' "A" = Giornata aperta, "C" = Giornata chiusa
sql = sql & " 'TotEntrg' INTEGER," 'Totale Entrate di giornata
sql = sql & " 'TotUscg' INTEGER," 'Totale Uscite di giornata
sql = sql & " 'RipFing' FLOAT" 'Saldo di fine giornata, a riportare
sql = sql & " );"
Try ApriDB.DBConnection.Exec(sql)
If ApriDB.DBConnection.Error Then
Message.ERROR("Attenzione! -> Creazione Tabella 'ContabFamdb.RiepMovg' --> FALLITA" & Chr(10) & Chr(10) & "Cod.Erro= " & Error.Code & "»»" & ERROR.Text & Chr(10) & Chr(10) & "Il programma verrà chiuso")
Quit
Else
ApriDB.DBConnection.Close 'chiude il DB
Endif
End
:rolleyes:
Stamattina ho provato a leggere la tabella e estrane il contenuto con la seguente istruzione di print:
Print "RecRiepMovg!IdRiepMovg= '"; RecRiepMovg[0]; "'", "RecRiepMovg!DtCoMovg= '"; RecRiepMovg[1]; "'", "RecRiepMovg!StaDtMovg='"; RecRiepMovg[2]; "'", "RecRiepMovg!TotEntrg= '"; RecRiepMovg[3]; "'", "RecRiepMovg!TotUscg= '"; RecRiepMovg[4]; "'", "RecRiepMovg!RipFing= '"; RecRiepMovg[5]; "'"
Ed ecco il risultato:
RecRiepMovg!IdRiepMovg= '6159' RecRiepMovg!DtCoMovg= '20130102' RecRiepMovg!StaDtMovg='C' RecRiepMovg!TotEntrg= '3110' RecRiepMovg!TotUscg= '3110' RecRiepMovg!RipFing= '360,52'
Come si può notare ho trattato la variabile Result "RecRiepMovg" come se fosse un array, ma il risultato non è cambiato: in RecRiepMovg[4] ho trovato lo stesso valore di RecRiepMovg[3].
Ora, dato che,utilizzando Sqliteman (in fedora) le colonne mostrate dal software riportano i valori corretti, debbo supporre che sia proprio Gambas a leggere il valore della cella precedente a quella corretta.
Visto però che ciò succede solamente per una tabella e solo per le due colonne incriminate, devo pensare ad una cattiva indicizzazione dei campi interni alla tabella, ma causata da che cosa?
???
Stamattina mi sono accorto di un errore presente nel comando SQL di creazione della tabella; l'errore consiste nell'avere definito le due colonne TotEntrg e TotUscg con Type INTEGER, mentre il loro contenuto pò essere facilmente formato da valori numerici decimali. Ho allora riprovato a riorganizzare la tabella ridefinendone i type delle colonne che la compongono:
sql = "CREATE TABLE '" & $NomeTab & "'"
sql = sql & "('IdRiepMovg' INTEGER PRIMARY KEY AUTOINCREMENT,"
sql = sql & " 'DtCoMovg' INTEGER,"
sql = sql & " 'StaDtMovg' CHAR(1) DEFAULT NULL,"
sql = sql & " 'TotEntrg' FLOAT,"
sql = sql & " 'TotUscg' FLOAT,"
sql = sql & " 'RipFing' FLOAT"
sql = sql & " );"
Try ApriDB.DBConnection.Exec(sql)
Pensavo di avere finalmente capito la causa dell'anomalia riscontrata, invece, quando ho riprovato ad estrarre il suo contenuto, l'anomalia è ricomparsa in tutta la sua prepotente pienezzza.
Non so veramente più cosa tentare per risolvere questo assurdo Bug.
:o ??? :rolleyes:
Volendo tagliare la testa al toro, ho dato corso ad una prova, ultima delle scarse risorse della mia fantasia: ho creato la tabella incriminata definendo tutte le sue colonne, ad eccezione della primary key, col type VARCHAR ed ho ripercorso la strada degli esperimenti pratici di questi giorni.
sql = "CREATE TABLE '" & $NomeTab & "'"
sql = sql & "('IdRiepMovg' INTEGER PRIMARY KEY AUTOINCREMENT,"
sql = sql & " 'DtCoMovg' VARCHAR(8) DEFAULT NULL,"
sql = sql & " 'StaDtMovg' CHAR(1) DEFAULT NULL,"
sql = sql & " 'TotEntrg' VARCHAR(10) DEFAULT NULL,"
sql = sql & " 'TotUscg' VARCHAR(10) DEFAULT NULL,"
sql = sql & " 'RipFing' VARCHAR(10) DEFAULT NULL"
sql = sql & " );"
Ebbene, la prova si è conclusa bene e, finalmente, l'estrazione dei valori dalla tabella ha fornito i contenuti corretti:
RecRiepMovg = ApriDB.DB_Connection.Exec("SELECT * FROM riepmovg WHERE IdRiepMovg = '" & 6253 & "'")
If Not RecRiepMovg.Available
EdtData = New EditData(iGiornata)
Message.Error("<CENTER> ATTENZIONE !!!<BR><b> Il RECORD RIEPILOGATIVO della giornata contabile '" & EdtData.$DataEdt & "' inesistente in DB.ContabFam.riepmovg <BR><BR>IL PROGRAMMA VERRÀ CHIUSO </b></CENTER>")
Quit
Endif
Print "RecRiepMovg!IdRiepMovg= '"; RecRiepMovg!IdRiepMovg; "'"
Print "RecRiepMovg!TotEntrg= '"; RecRiepMovg!TotEntrg; "'"
Print "RecRiepMovg!TotUscg= '"; RecRiepMovg!TotUscg; "'"
RecRiepMovg!IdRiepMovg= '6253'
RecRiepMovg!TotEntrg= '3110'
RecRiepMovg!TotUscg= '3012,90'
Secondo me, però, il BUG c'è sempre ed andrebbe affrontato ed eliminato.
Ritengo pertanto di non potere considerare risolta la presente discussione che, a parte la cortese partecipazione di Gianluigi, si é dimostrata un vero e proprio monologo.
Spero che la mia esperienza possa servire a chi dovrebbe affidare i propri dati alla struttura SQLite. Non potendone fare a meno, conviene definire le colonne delle varie tabelle occorrenti, sempre come stringhe di caratteri.
Io non ho ancora finito, infatti, proprio per l'anomalia che si è manifestata a mia completa inconsapevolezza, dovrò andare a ricalcolare tutti i valori delle celle di tabella che si sono alterati nel tempo e dovrò anche riconsiderare tutti i passi di programma dove vengono estratti e trattati i valori delle colonne oggetto della presente indagine.
:ciao: :ciao: