Programmazione > Programmazione in generale
[Risolto] SQlite - Trattamento/Indirizzamento errato campi di tabella
Picavbg:
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:
--- Citazione ---RecRiepMovg!IdRiepMovg= '6159'
RecRiepMovg!DtCoMovg= '20130102'
RecRiepMovg!StaDtMovg='C'
RecRiepMovg!TotEntrg= '3110' RecRiepMovg!TotUscg= '3110'
RecRiepMovg!RipFing= '360,52'
--- Termina citazione ---
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 é:
--- Codice: gambas --- 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
--- Termina codice ---
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:
--- Codice: gambas ---
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
--- Termina codice ---
:rolleyes:
Gianluigi:
--- Citazione da: Picavbg - 10 Marzo 2015, 17:48:52 ---
--- Codice: gambas ---
...
sql = sql & "('IdRiepMovg' INTEGER PRIMARY KEY AUTOINCREMENT," 'codice id obbligato dalla struttura di SQLite3, ma inutile per questo DB
...
--- Termina codice ---
--- Termina citazione ---
Probabilmente sto dicendo una scemenza ma sembra mancare lo spazio davanti e dietro la parentesi tonda...forse.
:ciao:
Picavbg:
--- Citazione da: Gianluigi - 10 Marzo 2015, 22:49:06 ---
--- Citazione da: Picavbg - 10 Marzo 2015, 17:48:52 ---
--- Codice: gambas ---
...
sql = sql & "('IdRiepMovg' INTEGER PRIMARY KEY AUTOINCREMENT," 'codice id obbligato dalla struttura di SQLite3, ma inutile per questo DB
...
--- Termina codice ---
--- Termina citazione ---
Probabilmente sto dicendo una scemenza ma sembra mancare lo spazio davanti e dietro la parentesi tonda...forse.
:ciao:
--- Termina citazione ---
No, purtroppo non è quello il problema, perché tutte le tabelle del DB sono create con la stessa tecnica di scrittura e nelle altre l'anomalia non si verifica.
Probabilmente dovrei sottoporre il problema direttamente a SQlite!, oppure ... non lo so.
L'anomalia si protrae senza che me ne sia mai accorto da troppo tempo; infatti sono diversi i record di detta tabella che nel tempo hanno determinato, forse per aggiornamenti successivi a passaggi del contenuto delle celle incriminate in campi di memoria che poi sono stati presi dal programma per riscrivere i record coi contenuti dei campi di memoria, alterati proprio in fase di lettura.
Picavbg:
Stamattina ho provato a leggere la tabella e estrane il contenuto con la seguente istruzione di print:
--- Codice: ---
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]; "'"
--- Termina codice ---
Ed ecco il risultato:
--- Citazione ---RecRiepMovg!IdRiepMovg= '6159' RecRiepMovg!DtCoMovg= '20130102' RecRiepMovg!StaDtMovg='C' RecRiepMovg!TotEntrg= '3110' RecRiepMovg!TotUscg= '3110' RecRiepMovg!RipFing= '360,52'
--- Termina citazione ---
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?
???
Picavbg:
Ulteriore prova:
--- Citazione ---
--- Codice: gambas ---RecRiepMovg = ApriDB.DB_Connection.Exec("SELECT TotUscg, IdRiepMovg FROM riepmovg WHERE IdRiepMovg = '" & 6159 & "'")
Print "RecRiepMovg!TotUscg= '"; RecRiepMovg!TotUscg; "'"
Print "RecRiepMovg!IdRiepMovg= '"; RecRiepMovg!IdRiepMovg; "'"
--- Termina codice ---
Risultato:
--- Citazione ---RecRiepMovg!TotUscg= '0'
RecRiepMovg!IdRiepMovg= '6159'
--- Termina citazione ---
--- Termina citazione ---
--------------------------------------------------------------------------
--- Citazione ---
--- Codice: gambas ---RecRiepMovg = ApriDB.DB_Connection.Exec("SELECT IdRiepMovg, TotUscg FROM riepmovg WHERE IdRiepMovg = '" & 6159 & "'")
Print "RecRiepMovg!TotUscg= '"; RecRiepMovg!TotUscg; "'"
Print "RecRiepMovg!IdRiepMovg= '"; RecRiepMovg!IdRiepMovg; "'"
--- Termina codice ---
Risultato:
--- Citazione ---RecRiepMovg!TotUscg= '6159'
RecRiepMovg!IdRiepMovg= '6159'
--- Termina citazione ---
--- Termina citazione ---
In pratica se il nome-colonna TotUscg è scritto per primo nella riga SQL SELECT il valore che viene estratto é 0 (zero), altrimenti assume il valore della colonna precedente.
Ma che senso ha?
:o
Navigazione
[0] Indice dei post
Vai alla versione completa