Autore Topic: [RISOLTO + SOLUZIONE] sqlite & foreign key  (Letto 665 volte)

Offline jockerfox

  • Gambero
  • **
  • Post: 77
    • Mostra profilo
[RISOLTO + SOLUZIONE] sqlite & foreign key
« il: 03 Gennaio 2012, 22:42:06 »
Salve a tutti e benvenuto a Gambas 3 FINALE  :2birre:,
Ci sarebbe un problemino con sqlite.. ve lo espongo.



Ho creato un DB (sqlite3) con due tabelle: Conti e MovimentiConti.

La tabella Conti è così composta:
Codice: sql [Seleziona]
CREATE TABLE Conti
(
id INTEGER PRIMARY KEY,
tipologia TEXT,
nome TEXT
)


La tabella MovimentiConti è così composta (in realtà è più popolata, ma la ho stilizzata giusto per una miglior comprensione del problema):
Codice: sql [Seleziona]
CREATE TABLE MovimentiConti
(
id INTEGER PRIMARY KEY,
conti_id INTEGER REFERENCES Conti (id),
clifor TEXT,
[...altri campi eliminati perché non necessari alla comprensione del problema...]
)


Evidenzio il fatto che la tabella MovimentiConti praticamente ha un foreign key alla tabella Conti.


In Gambas tutto funziona a meraviglia, cioè le tabelle vengono create, i dati vengono aggiunti, ecc..., eccetto quando si inserire il valore di "conti_id" !
Ecco il codice Gambas:

Codice: gambas [Seleziona]
  ...
  AproDataBase() 'Apre la connessione al DataBase
  ConnessioneDB.Begin

  hres = ConnessioneDB.Create("MovimentiConti")  'Collega il Result hres alla tavola MovimentiConti in modalità CREA record
  hres!conti_id = conti_id
  hres!clifor = clifor
  ...

  hres.Update
  ConnessioneDB.Commit
  ConnessioneDB.Close
  END


Per completezza:
Codice: gambas [Seleziona]
AproDataBase()
  With ConnessioneDB
    .Type = "sqlite3"  ' indicazione del tipo di database da utilizzare
    .Host = FMain.PathFile
    .Name = "DBDati"
    .Open
  End With


Bene, quando passo conti_id mi ritrovo nel database il valore NULL  ???
Premetto che ho provato a passarlo sia come intero, che come stringa. Ma in entrambi i tentativi mi ritrovo con il solito valore NULL nel database. In teoria dovrebbe essere passato per intero visto e considerato che la foreign è un intero.

I casi sono due:
1) ho Gambas non riesce a gestire i foreign in sqlite3
2) non ho ben capito come funzia il foreign

In caso della seconda, ecco il mio ragionamento:
- La tabella conti:
id : è automatico, per cui freghiamocene :D
tipologia: esempio un conto bancario
nome: il nome che diamo al conto

- La tabella MovimentiConti:
id : è automatico, per cui freghiamocene :D
conti_id: inserisco (appunto con hres!conti_id = conti_id) a quale conto si riferisce questo movimento
clifor: testo di vario genere.. freghiamocene :D




Grazie per la eventuale risposta.
« Ultima modifica: 04 Gennaio 2012, 17:02:17 da jockerfox »
:-)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: sqlite & foreign key
« Risposta #1 il: 04 Gennaio 2012, 12:33:14 »
Se ho compreso bene la faccenda, credo tu debba prima popolare la tabella Conti con il nuovo id, indi per cui inserisci i dati nei movimenti.
Dato che la Conti non la chiave, non può restituirti nulla (per cui il NULL).
Per come hai giuestamente costruito, la tabella Conti è un'anagrafica, per cui padre dei Movimenti, la cui tabella è quindi figlia di Conti, quindi dipendente da essa.
La cosa che potresti fare, a alivello di codice, è di inserire prima il conto, poi il movimento.
Se avessi un'altro database (es. PostgreSQL o MySQL), potresti creare un'apposito trigger di autopopolamento di Conti.

Offline jockerfox

  • Gambero
  • **
  • Post: 77
    • Mostra profilo
Re: sqlite & foreign key
« Risposta #2 il: 04 Gennaio 2012, 17:01:38 »
Ciao e grazie per la risposta.
Premetto che sono riuscito a trovare il problema spulciando in altri codici di QUESTO forum :ok:, comunque ringrazio md9327 per il tentativo. Ti faccio notare che la tua osservazione è giusta! Solo che io naturalmente avevo già popolato la tabella CONTI, per cui il problema non era quello da te presupposto.

SOLUZIONE:
per il beneficio di tutti, in caso qualcuno si dovesse trovare con questi problemi da risolvere :D

La tabella MovimentiConti va eliminata la parolina "INTEGER", cioè da:
conti_id INTEGER REFERENCES Conti (id)
bisogna scrivere
conti_id REFERENCES Conti (id)

e tutto funzia a meraviglia ;D

Naturalmente mi rimane il dubbio del perché, però in questo modo funziona tutto regolarmente.

Spero di essere stato utile a qualcuno... Ciao.
:-)