Ciao!
Ho scritto queste righe di codice in una funzione, con questa idea:
Scrivo il titolo di un libro nella textbox2, quando clicco aggiungi, controllo che il titolo del libro non sia già presente nel database, se è già presente faccio comparire una messagebox, se non è già presente lo aggiungo al database.
ho fatto questa cosa perchè la funzione cerca, se per esempio cerco la lettera a, mostra tutti i titoli che contengono la lettera a, e quindi per controllare se un titolo esiste giò ho fatto così:
sql = "SELECT * FROM biblio WHERE titolo LIKE '%" & Aggiungi.TextBox2.Text & "%'"
hres = $hconn.Exec(sql)
FOR EACH hres
IF hres!titolo = Aggiungi.TextBox2.Text THEN
Message.Info("Libro già presente nel database", "Ok")
BREAK
ENDIF
NEXT
IF NOT hres.Available THEN
$hconn.Begin
hres = $hconn.Create("biblio")
hres!titolo = Aggiungi.TextBox2.Text
hres!autore = Aggiungi.TextBox3.Text
hres!annolettura = Aggiungi.TextBox4.Text
hres!commento = Aggiungi.TextArea1.Text
hres.Update
$hConn.Commit
$hConn.Close
Aggiungi.TextBox2.text = ""
Aggiungi.TextBox3.text = ""
Aggiungi.TextBox4.text = ""
Aggiungi.TextArea1.Text = ""
Message.Info("Libro aggiunto al database", "Ok")
ENDIF
ENDIF
END
Solo che secondo me c'è qualcosa di sbagliato,perchè anche se per esempio cerco "a" che non combacia con nessun titolo, hres contiene informazioni, quindi non dovrebbero venire eseguite tutte le righe di codice sotto IF NOT hres.Available THEN invece lo fa!
Non va bene che non capisca cosa ho fatto :rolleyes:
Qualcuno mi spiega cosa fa il mio codice per piacere?
Grazie!!
p.s. il doppio endif alla fine è perchè c'è un'altro if prima della parte di codice che ho postato :)
Il primo consiglio è innanzitutto di abituarti ad aggiungere il ; alla fine della query SQL.
...WHERE titolo LIKE '%" & Aggiungi.TextBox2.Text & "%'"
Il carattere speciale % comunica al database di cercare qualsiasi substringa.
Se ne inserisci uno prima, ed uno dopo, la stringa di ricerca... vuol dire che fai cercare al tuo motore tutti i titoli che abbiano almeno un stringa di ricerca in mezzo. Ossia con la sintassi che hai utilizzato tu, stai chiedendo a Database di cercare qualsiasi titolo che abbia almeno una lettera "a" (all'inizio, in mezzo, o alla fine).
Se invece vuoi cercare le iniziali del film devi togliere il primo "%".
...WHERE titolo LIKE '" & Aggiungi.TextBox2.Text & "%'"
In questo modo il database restituisce tutti i titoli che iniziano per "a" (oppure che inizino per "a....").
Ti posso consigliare una soluzione se vuoi sia le iniziali sia ovunque?!
sql = "SELECT * FROM biblio WHERE titolo LIKE '"
IF Len(Aggiungi.TextBox2.Text) <=2 THEN
sql &= Aggiungi.TextBox2.Text & "%';" 'questa condizione viene aggiunta alla sql di prima se la lunghezza della ricerca è minore o uguale di 2 (ossia: 0, 1 oppure 2 caratteri)
ELSE
sql &= "%" & Aggiungi.TextBox2.Text & "%';" 'questa condizione viene aggiunta alla sql di prima se la lunghezza della ricerca è oltre 3 caratteri
ENDIF
In questo modo... con fino a due caratteri ti cerca l'iniziale... oltre anche in mezzo. ;)
Semplicemente che per verificare se il titolo combacia non serve che fai un ulteriore ciclo 'For Each'...
Quando nella Query metti il WHERE... automaticamente il DB ti restituisce un Result solo dove la clausola WHERE è soddisfatta. Quindi se tu metti un titolo che non esiste... il risultato è NOT AVAILABLE...
Se invece il libro c'è già... il risultato è AVAILABLE...
In sostanza:
sql = "SELECT * FROM biblio WHERE titolo LIKE '%" & Aggiungi.TextBox2.Text & "%'"
hres = $hconn.Exec(sql)
IF NOT hres.Available THEN
$hconn.Begin
hres = $hconn.Create("biblio")
hres!titolo = Aggiungi.TextBox2.Text
hres!autore = Aggiungi.TextBox3.Text
hres!annolettura = Aggiungi.TextBox4.Text
hres!commento = Aggiungi.TextArea1.Text
hres.Update
$hConn.Commit
$hConn.Close
Aggiungi.TextBox2.text = ""
Aggiungi.TextBox3.text = ""
Aggiungi.TextBox4.text = ""
Aggiungi.TextArea1.Text = ""
Message.Info("Libro aggiunto al database", "Ok")
ELSE
Message.Info("Libro già presente nel database", "Ok")
ENDIF
END
PS. Attenzione però, perché usando il LIKE... potresti scartare dei libri con titoli simili per stringa di ricerca.
Così com'è scritta se volessi inserire "mare calmo" quando nel DB già c'è "I segreti della pesca quando con in mare calmo..." ti dice che già c'è ("Libro già presente nel database").
Alla fine ho risolto così:
sql = "SELECT * FROM biblio WHERE titolo COLLATE NOCASE = '" & Aggiungi.TextBox2.Text & "';"
in pratica usando COLLATE NOCASE, confronto il valore della textbox con tutti i valori titolo del database, senza considerare maiuscole e minuscole :)