Autore Topic: Non so perchè queste istruzioni funzionano  (Letto 1001 volte)

Offline gustav_ygman

  • Gamberetto
  • *
  • Post: 36
    • Mostra profilo
Non so perchè queste istruzioni funzionano
« il: 26 Dicembre 2010, 12:28:01 »
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ì:

Codice: gambas [Seleziona]
    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  :)
« Ultima modifica: 26 Dicembre 2010, 12:29:51 da gustav_ygman »

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Non so perchè queste istruzioni funzionano
« Risposta #1 il: 26 Dicembre 2010, 12:58:24 »
Il primo consiglio è innanzitutto di abituarti ad aggiungere il ; alla fine della query SQL.

Codice: gambas [Seleziona]
...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 "%".
Codice: gambas [Seleziona]
...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?!
Codice: gambas [Seleziona]
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.  ;)
« Ultima modifica: 26 Dicembre 2010, 13:02:28 da perseo »

Offline gustav_ygman

  • Gamberetto
  • *
  • Post: 36
    • Mostra profilo
Re: Non so perchè queste istruzioni funzionano
« Risposta #2 il: 26 Dicembre 2010, 13:36:24 »
Grazie  :2birre:

Non conosco troppo bene sqlite (si era capito eh  :-[)

Comunque, che cerchi ovunque nel titolo mi va benissimo, nel codice che ho postato però volevo far si che prima di aggiungere un libro, il programma controllasse se era già presente nel database, e in tal caso mostrasse una message box.
Se invece il libro non è presente, lo aggiunge.

Solo che secondo me nel mio codice c'è qualcosa che non va (anche se funziona), ma non capisco cosa.

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Non so perchè queste istruzioni funzionano
« Risposta #3 il: 26 Dicembre 2010, 18:35:17 »
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:
Codice: gambas [Seleziona]
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").
« Ultima modifica: 26 Dicembre 2010, 18:39:12 da perseo »

Offline gustav_ygman

  • Gamberetto
  • *
  • Post: 36
    • Mostra profilo
Re: Non so perchè queste istruzioni funzionano
« Risposta #4 il: 27 Dicembre 2010, 12:55:41 »
Alla fine ho risolto così:

Codice: gambas [Seleziona]
   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  :)