Programmazione > Programmazione in generale

[Risolto] SQlite - Trattamento/Indirizzamento errato campi di tabella

(1/2) > >>

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

[#] Pagina successiva

Vai alla versione completa