Gambas-it

Gambas3 => Programmazione => Topic aperto da: fernando - 03 Giugno 2012, 19:38:42

Titolo: aprire un database sqlite
Inserito da: fernando - 03 Giugno 2012, 19:38:42

Salve
Ho il solito problema, che mi porto da tanto tempo, non riesco ad importare un file (datatabase) sqlite già esistente nel mio progetto. Non sono riuscito ad adattare la funzione (utility) che  gentilmente mi è stata suggerita da golia : 'importa file csv'. Qualcuno potrebbe aiutarmi ?
Saluti
Titolo: Re: aprire un database sqlite
Inserito da: md9327 - 04 Giugno 2012, 00:20:19
Ho notato che avevi segnalato un problema simile in altra discussione.

Dovresti spiegare meglio cosa devi effettivamente ottenere...

Da quello che avevo capito, era che dovevi importare dati da un file csv in un db sqlite:

1) il db sqlite è già stato creato?
2) la tabella per l'import è già stata creata?
3) il formato del file è un vero csv?
4) devi importare il file una-tantum, o devi creare una procedura ad-hoc?

Soluzioni da analizzare:

a) nei download dovrebbe esserci una mia classe per il trattamento dei file csv
b) sicuramente nel forum, ma anche negli esempi gambas, c'è qualche esempio per connettersi ad un db sqlite
c) una volta risolto il problema di caricare un file csv in memoria, e risolto il problema di collegamento al db, costruire una procedura di caricamento credo sia semplice...

Se, dopo aver dato un'occhiata a quanto ti ho suggerito, hai ancora problemi, fammelo sapere...
Titolo: Re: aprire un database sqlite
Inserito da: fernando - 04 Giugno 2012, 15:36:51

 Salve
Innanzitutto grazie per aver (ri)preso in considerazione il mio quesito. Tempo fa ho avuto un problema simile , ma riguardava  l'import di file csv, risolto alla grande , con la 'classe' messa nell'area download e anche con l'aiuto di persone di questo forum. Ma la stessa 'classe' purtroppo, non riesco ad adattarla al mio problema attuale che riguarda l'import di un database sqlite, che presentai anche tempo fa su questo forum, mi spiego:

Ho creato un database sqlite  chiamato 'GestCC', una tabella chiamata 'movimenti' con i seguenti campi : data - operazione - dare - avere - saldo, dove inserisco regolarmente i dati , creo query sql per la ricerca e visualizzazione dati senza difficoltà, fin qui ci siamo.
 Nello stesso progetto
voglio creare un 'nuovo' database sqlite ad es. per l'anno 2013 che chiamerò 'GestCC2013' con la stessa tabella (movimenti) e quindi, rispettando sempre le caratteristiche del database  principale (GestCC : data - operazione - dare - avere - saldo), dove andrò a inserire regolarmente i dati, questo riesco a farlo mettendo in una textbox il nome del database.
Quello che non riesco a realizzare  è
l'import del database 'Sqlite nello stesso progetto, ad esempio mi trovo in 'GestCC' e voglio aprire il database GestCC2013 con relativa visualizzazione tabella di dati, ricerche etc. come faccio ?
Spero di avere un aiuto, prendendo come esempio anche il vostro progetto 'bibliosqlite'
Spero anche di essermi spiegato bene. Grazie
Cordiali Saluti
Titolo: Re: aprire un database sqlite
Inserito da: md9327 - 04 Giugno 2012, 20:43:21
Quindi usi più database, divisi per anno... è una scelta, come anche usare lo stesso db, eseguendo query mirate per anno sulla data, come ad esempio:
Codice: [Seleziona]
SELECT * FROM <tabella> WHERE YEAR(<campo data>) = <anno>

Quello che non mi è però chiaro è il perchè hai problemi con la visualizzazione. Credo che per prima cosa tu debba selezionare il db tramite una selezione (es. una combobox), e poi gestirlo come al solito tramite le tue form...

Partendo da questo, il mio dubbio è che tu ti trovi con:

1) il problema di switchare tra un db e l'altro, perchè magari le form puntano al nome del db principale
2) il problema che forse non hai conoscenza delle possibilità della sintassi SQL, in particolare con SQLite
3) altro non saprei, perchè dal tuo msg non riesco a capire altro...
Titolo: Re: aprire un database sqlite
Inserito da: milio - 04 Giugno 2012, 22:21:41
4) forse non riesci a creare una copia del db originale, ma vuoto?
Titolo: Re: aprire un database sqlite
Inserito da: fernando - 05 Giugno 2012, 07:57:40

Riesco benissimo a creare una copia vuota dell'originale, quello che non riesco a fare, è importare (aprire) ad es. questo database vuoto.
Titolo: Re: aprire un database sqlite
Inserito da: milio - 05 Giugno 2012, 12:11:07
Bene... capisco...

Allora prova l'esempio (modificato) della rubrica che ti aveva postato Golia tempo fa...


Titolo: Re: aprire un database sqlite
Inserito da: fernando - 06 Giugno 2012, 12:01:44

Salve
Intanto grazie, per l'esempio proposto, sto facendo delle prove per capire il codice che c'è sotto il comando button 'Cambio db', ma credo che finalmente
ci siamo. Sto facendo anche delle prove per creare nuovi db con codice, nella stessa cartella del progetto.
Grazie
Cordiali saluti.
Titolo: Re: aprire un database sqlite
Inserito da: fernando - 10 Giugno 2012, 13:24:15

Salve
Ho 'studiato' l'esempio in allegato, e credo di avere (quasi) risolto il problema... l'unica cosa che non riesco a capire come mai  chiudendo il progetto (programma), nel riaprirlo non mi da l'ultimo database caricato , ma  sempre il primo (prova), mi spiego:
se ad es. chiudo il programma con 'prova2012', nel riaprirlo mi da per sempre 'prova'.
Ultima cosa , con il codice riportato sotto creo un nuovo db , inserendo il nome in una textbox, e lo va a creare nella 'home', ma per averlo nella cartella del progetto, come l'esempio nell'esempio che  ho scaricato, cosa devo cambiare ?

Public Sub Button5_Click()
 Dim sName As String  ' sName è una variabile che indica il nome che diamo al nostro database
Dim sPercorso As String ' indica il percoso in cui andremo a creare il db
Dim $hConn As New Connection
Dim sql As String
Dim htable As Result
   sName = TextBox1.text
   sPercorso = User.Home  'definiamo come percorso la nostra home
 With $hConn
    .Type = "sqlite3"  ' indicazione del tipo di tatabase da utilizzare
    .Host = sPercorso
End With
$hConn.Open
If textbox1.text = "" Then
  Message.Info("inserire il nome per il nuovo database ")
  textbox1.setfocus
  Else
  If Not $hConn.Databases.Exist(Sname) Then 
        $hConn.Databases.Add(sName)             
        $hConn.Close         
        $hConn.Name = sName
        $hConn.Open()       
         sql = "CREATE TABLE 'rubrica' ( 'id' INTEGER PRIMARY KEY, 'nome' VARCHAR(255) DEFAULT NULL, 'cognome' VARCHAR(255) DEFAULT NULL, 'indirizzo' VARCHAR(255) DEFAULT NULL);"
        hTable = $hConn.EXEC(sql)
           $hConn.Commit
        Label9.Text = "Database creato"
    Else
        Message.Error("database già esistente", "OK")
         Endif
    $hConn.Close
End If
End
Cordiali saluti e Buona Domenica a tutto il forum.
Titolo: Re: aprire un database sqlite
Inserito da: Golia - 10 Giugno 2012, 14:03:31
Ciao
questa è la riga interessata per selezionare la cartella che ospita il database
Citazione
  sPercorso = User.Home  'definiamo come percorso la nostra home
come vedi è impostata nella home e quindi va a creare il db nella home, devi cambiare il percorso, se per esempio lo vuoi nella caretella del progetto il codice è questo
Citazione
sPercorso = Application.Path

Invece quando apri il programma, andrà sempre ad aprire il database "prova", perchè è scritto nel codice che apra quel database, devi sostituire il nome del database con quello che vuoi che apra, se vuoi che il programma si ricordi l'ultimo database che hai usato devi dare il nome al db con una variabile: la procedura è questa

1: quando chiudi il programma devi andare a scrivere in un file di testo o in un setting il nome database
2: quando apri il programma devi andare a leggere in un file di testo o in un setting il nome database
3: imposta la variabile nomedatabase con il nome che hai letto dal file o setting
Ciao
Titolo: Re: [Risolto]:aprire un database sqlite
Inserito da: fernando - 11 Giugno 2012, 09:25:21
Salve
Non saprei proprio come far scrivere il nome del database su un file di testo, per poi lo stesso file farlo leggere.
La spiegazione è stata come al solito chiara, ma non avendolo mai fatto, lascio questo argomento per non essere troppo 'invadente' e ripetivo con i miei quesiti.
So che chi si 'arrende' è perduto.... :-) , e questo non va bene, cmq ho risolto uno dei due quesiti.... grazie a questo forum ho imparato tante cose riguardo la programmazione in gambas. Metto 'risolto' o quasi, così chiudo questo post.
Alla prossima.... Cordiali Saluti.
Titolo: Re: aprire un database sqlite
Inserito da: md9327 - 11 Giugno 2012, 10:14:35
DIM t AS String = File.Load("filename") 'carica il contenuto del file "filename" nella variabile

File.Save("filename", t) 'salva il contenuto della variabile "t" nel file "filename". Se non esiste lo crea

Questi sono i due metodi più semplice per leggere e scrivere testo su file.
E' ovvio che l'analisi del contenuto deve essere fatta da te con codice apposito.
Per espandere le potenzialità di un file, facendolo diventare un vero file di configurazione, puoi usare la classe Setting, di cui è stato discusso molto nel forum...
Titolo: Re: aprire un database sqlite
Inserito da: fernando - 11 Giugno 2012, 20:01:19

Buonasera
Non riesco a creare il codice pe leggere e scrivere testo su file, -nel mio caso far ricordare al programma, l'ultimo database caricato, ho provato in tutti i modi,guardando esempi, e seguendo le discussioni sul forum. Pazienza...  infine volevo sapere come chiudere la discussione, mettendo [Risolto] anche se in realtà non lo è.
Cordiali saluti, con na buona serata a questo formidabile forum.
Titolo: Re: aprire un database sqlite
Inserito da: Golia - 11 Giugno 2012, 20:55:15
Ciao fernando
Il sistema di MD è facile e semplice dovresti provare a scrivere e leggere dei file senza pensare al database in modo da capire bene la procedura, poi la applichi.
Un'altro sistema per scrivere e leggere in un file le procedure sono queste
Codice: gambas [Seleziona]

Public Sub Button2_Click()
  Dim riga1, riga2, riga3 As String
  Dim filelettura As String
  Dim hfile As File  
  filelettura = User.Home & "/gino.txt"
    
  If filelettura Then
    hFile = Open filelettura For Input
    While Not Eof(hFile)
    Line Input #hFile, riga1 ' vado a leggere e poi dare il valore della prima riga su riga1
    Line Input #hFile, riga2 ' vado a leggere e poi dare il valore della seconda riga su riga2
    Line Input #hFile, riga3  '..........
    Wend
    Close #hfile
  Message("il valore della riga1 è : " & riga1)
  Endif
End

Public Sub Button3_Click()
  Dim filescrittura As String
  Dim hfile As File  
  
  filescrittura = User.Home & "/gino.txt"
  If filescrittura Then
  hfile = Open filescrittura For Create
                Print #hfile, "Milano" ' scrivo Milano nella prima riga
                Print #hfile, "Roma" '....
                Print #hfile, "Palermo"
  Close #hfile
  Endif

End


per quello che devi fare tu mi pare più comodo usare setting:
Per prima cosa devi abilitare il componente "Settings"
e poi è facile..
Codice: gambas [Seleziona]
Public Sub Button4_Click()

  settings["nomechvuoi"] = "pippobaudo"
  settings.Save

End



Public Sub Button5_Click()
Dim risu As String
risu = settings["nomechvuoi"]
  Message(risu)

End


Per mettere risolto in questo post basta che vai al primo e modifichi il titolo, gli metti [RISOLTO] davanti alla scritta "aprire un database sqlite"
Certo non sarebbe male una volta che hai fatto il codice per cambiare il database lo scrivessi quà, in modo da essere d'aiuto ad altri utenti
Ciao
Titolo: Re: aprire un database sqlite
Inserito da: fernando - 12 Giugno 2012, 14:10:21

Salve
Ho creato un file 'gino.txt' posizionandolo nella 'home' , poi ho creato dei button2-3-4-5 con il codice allegato, funziona.... Nel 'file scrittura' (button3) va a scrivere tre righe(milano,roma,palermo),fin qui ci sono, poi nel 'file lettura' richiama sempre la prima (milano),non so il perchè..., ma scusa nel mio caso deve scrivere solo una riga , cioè ricordare l'ultimo database che ho usato es. 'prova2012', o sbaglio ?
Nel tuo codice il nome del mio dataabse del database dove va collocato ? Bisogna mettere il nome del primo database (vuoto) creato ?

settings["nomechvuoi"] = "pippobaudo" 
 settings.Save
.....
'nomechevuoi' ho messo un nome a caso, =pippobaudo devo mettere il nome del database ?
Cordiali saluti
fernando
Titolo: Re: aprire un database sqlite
Inserito da: Golia - 12 Giugno 2012, 17:23:32
Citazione
Ho creato un file 'gino.txt' posizionandolo nella 'home' , poi ho creato dei button2-3-4-5 con il codice allegato, funziona.... Nel 'file scrittura' (button3) va a scrivere tre righe(milano,roma,palermo),fin qui ci sono, poi nel 'file lettura' richiama sempre la prima (milano),non so il perchè..., ma scusa nel mio caso deve scrivere solo una riga
ti ho fatto un'esempio di scrittura di 3 righe, tu puoi scriverne quante ne vuoi..1 o 100000
la sub che va a leggere, legge le tre righe e ti manda il messaggio di lettura della prima riga  --- Message("il valore della riga1 è : " & riga1) 
Sono esempi per capire come funziona , sta a te gestirli come meglio ti pare.

Per il resto, ti ho già detto, prova e se non riesci scrivi quà il codice che hai scritto e che non funziona che vediamo dove non va, ok?
Titolo: Re: aprire un database sqlite
Inserito da: fernando - 13 Giugno 2012, 18:38:31

Ciao
questo è il codice :
ma non scrive il nome dell'ultimo database aperto, scrive sempre 'prova'

Dim $hConn As New Connection
Dim filescrittura As String 
 Dim hfile As File   
   filescrittura = Application.Path & "/gino.txt" 
 If filescrittura Then 
 hfile = Open filescrittura For Create 
               Print #hfile, "prova"
              $hConn.Type = "sqlite3"
   $hConn.Host = Application.Path
   $hconn.Name = & sqlname
   $hconn.Open
 Close #hfile   
 Endif   
saluti
Titolo: Re: aprire un database sqlite
Inserito da: fsurfing - 13 Giugno 2012, 19:10:21
scusa se non ho letto tutta la discussione e quindi il mio intervento potrebbe cadere a sproposito...

ma perchè cerchi di aprire un file sqlite in quel modo con OPEN ??

se è un file sqlite trattalo come tale e utilizza la connessione a un database.

hai letto la guida per sqlite?
http://www.gambas-it.org/wp/?wpfb_dl=123 (http://www.gambas-it.org/wp/?wpfb_dl=123)
Titolo: Re: aprire un database sqlite
Inserito da: fernando - 14 Giugno 2012, 08:40:00

Salve
Grazie per aver preso in considerazione il mio quesito (codice), ma il problema non è, aprire o meno con 'open' il database, perchè può essere anche un mio errore momentaneo di scrittura in quest post, ma è, far scrivere il nome dell'ultimo database aperto,per farlo ricordare alla riapertura del programma. Non so se hai seguito questa 'discussione' nel corso dei giorni, mi è stato anche allegato un esempio per il 'cambio db', cioè passare da un database all' altro nello stesso programma, un esempio allegato da milio,(modificato) della rubrica che aveva postato Golia tempo fa.
Cordiali saluti
Titolo: Re: aprire un database sqlite
Inserito da: fsurfing - 14 Giugno 2012, 20:27:13
per quello puoi usare settings


come sai , la connessione la stabilisci cosi:


Codice: [Seleziona]
   $hConn.Type = "sqlite3"
   $hConn.Host =percorsodb
   '$hconn.Name = & sqlname 'il name non serve se è già inserito nell' host
   $hconn.Open

quindi poni di avere tutti i db salvati nella carte lla database della tua home, quindi:


Codice: [Seleziona]
   $hConn.Type = "sqlite3"
   $hConn.Host =user.home & "/database/db1"
 
   $hconn.Open

così il programma aprirà sempre il db1.

se tu il nome del db lo memorizzi in una variabile , ad esempio nomedb, per ottenere quello che vuoi dovrai salvare il nome del db qunado chiudi il programma  con:

Codice: [Seleziona]
settings["db/nome"]=nomedb
settings.save

all' avvio del programma il metodo di connessione sarà:

Codice: [Seleziona]
  nomedb=settings["db/nome"]
   $hConn.Type = "sqlite3"
   $hConn.Host =user.home & "/database/" & nomedb
 
   $hconn.Open


naturalmente il problema si pone al priomo avvio in assoluto del programma, in quanto nel file settings non è acora memorizzato alcun nome , percui dovrai inserire un controllo per verificare che un nome esista , altrimenti viene creato un db iniziale
Titolo: Re: aprire un database sqlite
Inserito da: fernando - 15 Giugno 2012, 20:23:52
Salve
Ho aggiunto al progetto il codice che hai suggerito, ma non ottengo quello che chiedo, allego tutto il progetto,
facendo notare che il codice da me inserito si trova nel button 'salva settaggio', e l'altro che dovrebbe 'ricordare'l'ultimo db aperto in  'Public Sub Form_Open()',
puoi gentilmente correggere queste poche righe di codice ? cosa ho sbagliato o mi msfugge ?
Tengo a precisare che  questo progetto che ho  allegato, mi è stato gentilmente suggerito, da questo forum.
Grazie anticipatamente
Cordiali saluti
Titolo: Re: aprire un database sqlite
Inserito da: fsurfing - 15 Giugno 2012, 20:50:25
forse dovresti soffermarti più sulle basi , poi iniziare a passare a cose più complesse, dal tuo codice ,mi sembra che non hai chiaro in mente differenze tra variabili globali e locali, cmq
ti allego un programma semplice che non utilizza moduli o altro , spero che sia semplice e ti permetta di capire come funziona il tutto, il programma permette di creare nuovi db, passare da un db all' altro , modificare i valori immessi cliccando sulla casella della griglia corrispondente , eliminare record cliccando sul numero id del record (sempre nella tabella),
naturalmente salva l' ultimo db in uso che al riavvio vene utilizzato
Titolo: Re: [RISOLTO]aprire un database sqlite
Inserito da: fernando - 19 Giugno 2012, 18:13:43

Salve
Scusate se in ritardo, ma finalmente posso scrivere 'risolto', grazie all'esempio di fsurfing.Il codice spero di poterlo inserire al più presto, così altre persone del forum potranno risolvere come ho risolto io. Una buona serata a tutto il forum.
Grazie...alla prossima.