Io e ditabase andiamo d'amore e d'accordo..
Comunque, dopo aver finito il mio programma, e in attesa che il mio amcio torni a casa per farmi spiegare una cosa(magari, però...vabbé), ho deciso di fare un'altra versione del mio programma, per un pubblico un po' diverso..
Comunque, prendo i pezzi di codice dal vecchio programma (almeno quelli per i database), ma continua, in una maniera a dir poco indecente, a darmi il solito errore, ovvero quello del titolo..
vi mostro un pezzo di codice, un po' confusionario, forse..
nomedb = "registro_del_prof_" & user.Name
path = user.Home
WITH $hConn
.type = "sqlite3"
.host = path
END WITH
$hConn.name = nomedb
classesel = lstclassi.Text
lstmat.Clear()
$hConn.Open()
sql = "SELECT * FROM mat WHERE classi2 LIKE classesel"
hres = $hConn.exec(sql)
FOR EACH hres
lstmat.Add(hres!mat)
NEXT
$hConn.Close()
e mi da errore sul..
però...
$hConn.Close()
lstclassi.Clear()
$hConn.Open()
sql = "SELECT * FROM classe"
hres = $hConn.exec(sql)
FOR EACH hres
lstclassi.Add(hres!classi)
NEXT
$hConn.Close()
qui non mi da alcun problema, nulla di nulla..Non riesco a capirlo..E aprendo il database con sqlitebrowser, nessun problema, nulla di nulla..E' tutto in ordine..
thanks..
RiCi12 ha scritto:
.......................
nomedb = "registro_del_prof_" & user.Name
path = user.Home
WITH $hConn
.type = "sqlite3"
.host = path
END WITH
$hConn.name = nomedb
classesel = lstclassi.Text
lstmat.Clear()
$hConn.Open()
sql = "SELECT * FROM mat WHERE classi2 LIKE classesel"
hres = $hConn.exec(sql)
FOR EACH hres
lstmat.Add(hres!mat)
NEXT
$hConn.Close()
Uso da poco Sqlite3 e quindi lo conosco altrettanto poco, però secondo me il problema é dentro l'istruzione 'sql=' dove leggo l'uso della funzione LIKE, la quale permette la ricerca di tutti quegli elementi di tabella "classi2" il cui contenuto comprenmda almeno un crt della variabile "classesel". Ecco, mi pare che LIKE desideri che la stringa da ricercare sia compresa fra due "*". Poiché "classesel" contiene un valore proveniente da "lstclassi.Text", può darsi che manchino proprio gli "*" di delimitazione voluti dalla funzione LIKE. Potresti perciò modificare l'istruzione "sql=" nella seguente:
sql = "SELECT * FROM mat WHERE classi2 LIKE" & "*" & "classesel" & "*"
e riprovare.
Magari, quello che ho notato non c'entra niente, ma provare non fa mai male. :-) :ciao:
Ceskho ha scritto:
hres è dichiarato?
si si...
picavbg ha scritto:
RiCi12 ha scritto:
.......................
nomedb = "registro_del_prof_" & user.Name
path = user.Home
WITH $hConn
.type = "sqlite3"
.host = path
END WITH
$hConn.name = nomedb
classesel = lstclassi.Text
lstmat.Clear()
$hConn.Open()
sql = "SELECT * FROM mat WHERE classi2 LIKE classesel"
hres = $hConn.exec(sql)
FOR EACH hres
lstmat.Add(hres!mat)
NEXT
$hConn.Close()
Uso da poco Sqlite3 e quindi lo conosco altrettanto poco, però secondo me il problema é dentro l'istruzione 'sql=' dove leggo l'uso della funzione LIKE, la quale permette la ricerca di tutti quegli elementi di tabella "classi2" il cui contenuto comprenmda almeno un crt della variabile "classesel". Ecco, mi pare che LIKE desideri che la stringa da ricercare sia compresa fra due "*". Poiché "classesel" contiene un valore proveniente da "lstclassi.Text", può darsi che manchino proprio gli "*" di delimitazione voluti dalla funzione LIKE. Potresti perciò modificare l'istruzione "sql=" nella seguente:
sql = "SELECT * FROM mat WHERE classi2 LIKE" & "*" & "classesel" & "*"
e riprovare.
Magari, quello che ho notato non c'entra niente, ma provare non fa mai male. :-) :ciao:
giusta osservazione, ma quello li non è un problema. Mi son visto costretto, nel programma precedente, a fare in modo che cercasse solo la parola esatta, e avevo risolto così...
sql = "SELECT * FROM voti WHERE materia2 LIKE '" & materiasel & "'"
Risolvendo perfettamente..
Il problema, però non si va a risolvere: com'è possibile che in parte vada e in parte no? Lo stesso pezzo di codice, oltretutto. Non ha minimamente senso..
Comunque, vi posto il pezzo di codice incriminato: praticamente, all'avvio(form_open), gli faccio controllare se esiste tale database, altrimenti lo crea. Se già esiste, mi va a leggere i valori in esso contenuto, e mi prende le varie classi e me le mette in una listbox.. E basta..E già qui non va, dandomi l'errore sull'hres = bla bla bla..Se cancello il database, e uso dei valori che inserisco at the moment( senza usvire dal programma), il pezzo riportato sopra va', tranquillamente(quello segnalato come funzionante)
Comunque..
PUBLIC SUB Form_Open()
nomedb = "registro_del_prof_" & user.Name
path = user.Home
WITH $hConn
.type = "sqlite3"
.host = path
END WITH
$hConn.Open()
IF NOT $hConn.Databases.Exist(nomedb) THEN
$hConn.databases.Add(nomedb)
$hConn.name = nomedb
$hConn.Close()
$hConn.Open()
sql = "CREATE TABLE 'classe' ('id' INTEGER PRIMARY KEY, 'classi' VARCHAR(255) DEFAULT NULL);"
htable = $hConn.exec(sql)
sql = "CREATE TABLE 'mat' ('id' INTEGER PRIMARY KEY, 'classi2' VARCHAR(255) DEFAULT NULL, 'materia' VARCHAR(255) DEFAULT NULL);"
htable = $hConn.exec(sql)
sql = "CREATE TABLE 'stud' ('id' INTEGER PRIMARY KEY, 'classi3' VARCHAR(255) DEFAULT NULL, 'stud' VARCHAR(255) DEFAULT NULL);"
htable = $hConn.exec(sql)
sql = "CREATE TABLE 'voti' ('id' INTEGER PRIMARY KEY, 'materia2' VARCHAR(255) DEFAULT NULL, 'voto' VARCHAR(255) DEFAULT NULL, 'stud2' VARCHAR(255) DEFAULT NULL);"
htable = $hConn.exec(sql)
$hConn.Close()
ELSE
lstclassi.Clear()
$hConn.Close()
$hConn.Open()
sql = "SELECT * FROM classe"
hres = $hConn.exec(sql)
FOR EACH hres
lstclassi.Add(hres!classi)
NEXT
$hConn.Close()
ENDIF
END
l'errore lo riporta li, solo li...
@ RiCi12:
Domanda stupida: Sei sicuro chhe la tabella "mat" del DB non sia vuota?
mi viene in mente una prova. Visto che
sql = "SELECT * FROM mat WHERE classi2 LIKE classesel"
é diversa da
sql = "SELECT * FROM mat"
perché non estrai la funzione "Where dalla riga sql e la trasferisci nella riga for each", cioé:
sql = "SELECT * FROM mat"
hres = $hConn.exec(sql)
FOR EACH hres
WHERE hres!classi2 LIKE classesel
lstmat.Add(hres!mat)
NEXT
$hConn.Close()
era un banale errore
nel caso il db non esista devi indicarne il nome prima di aprirlo
PUBLIC SUB Form_Open()
nomedb = "registro_del_prof_" & user.Name
path = user.Home
WITH $hConn
.type = "sqlite3"
.host = path
END WITH
$hConn.Open()
IF NOT $hConn.Databases.Exist(nomedb) THEN
$hConn.databases.Add(nomedb)
$hConn.name = nomedb
$hConn.Close()
$hConn.Open()
sql = "CREATE TABLE 'classe' ('id' INTEGER PRIMARY KEY, 'classi' VARCHAR(255) DEFAULT NULL);"
htable = $hConn.exec(sql)
$hConn.Commit
sql = "CREATE TABLE 'mat' ('id' INTEGER PRIMARY KEY, 'classi2' VARCHAR(255) DEFAULT NULL, 'materia' VARCHAR(255) DEFAULT NULL);"
htable = $hConn.exec(sql)
$hConn.Commit
sql = "CREATE TABLE 'stud' ('id' INTEGER PRIMARY KEY, 'classi3' VARCHAR(255) DEFAULT NULL, 'stud' VARCHAR(255) DEFAULT NULL);"
htable = $hConn.exec(sql)
$hConn.Commit
sql = "CREATE TABLE 'voti' ('id' INTEGER PRIMARY KEY, 'materia2' VARCHAR(255) DEFAULT NULL, 'voto' VARCHAR(255) DEFAULT NULL, 'stud2' VARCHAR(255) DEFAULT NULL);"
htable = $hConn.exec(sql)
$hConn.Commit
$hConn.Close()
ELSE
lstclassi.Clear()
$hConn.Close()
$hConn.name = nomedb'''''''codice mancante
$hConn.Open()
sql = "SELECT * FROM classe"
hres = $hConn.exec(sql)
FOR EACH hres
lstclassi.Add(hres!classi)
NEXT
$hConn.Close()
ENDIF
END
Tu dici, dunque, che il problema è se qualcuno mi scrive, come classe(che verrà salvato nella colonna/riga "classi"), un valore soltanto numerico?
esatto
se crei una classe chiamandola solamente 3 ti darà errore la query di ricerca
se la chiami 3A andrà tutto bene