Newsgroup: it.comp.lang.visual-basic
Titolo: Problema ACCESS 97 e VB 5

Dopo un cordiale saluto a tutti i partecipanti a questo fantastico NG
espongo il mio problema.
Premetto che sono del tutto nuovo alla programmazione e che non ho mai messo
le mani a VB 5, mi piace tanto, però ho bisgno di un grosso aiuto.
Possego in  DB.mdb creato con MS ACCESS 97 chiamato Azienda.mdb  contenente
i dati di una ditta che contiene a sua volta una tabella chiamata Personale.
Ho creato un piccolo programma con VB 5 per aprie e leggere i dati contenuti
in questo DB e in particolare quelli della tabella Persoanle.
Per fare ciò ho inserito in un Form un controllo DATA e quattro TEXTBOX
Con la TEXTBOX 1 inserisco il cognome da ricercare mentre con le TEXTBOX 2,
3 e 4 visualizzo i risultati COGNOME, NOME e TELEFONO.
Le TEXTBOX 2, 3 e 4 fanno riferimento ai Records COGNOME, NOME e TELEFONO
della tabella Personale tramite il controllo DATA1 il quale fa riferimento
al DB Azienda.mdb.
Il controllo DATA ha le seguenti proprietà:
BOFAction = 0 - Move First; Connect = ACCESS; DatabaseName =
C:\Documenti\Azienda.mdb; DefaultCursorType = -defaultCursor; DefaultType =
2 - UseJet; OEFAction = 0 - Move Last; Exclusive = True; options = 0;
ReadOnly = True; RecordSetType = 1 - Dynaset; RecordSource = Personale.
Nell'oggetto TextBox1 ho inserito la seguente procedura:
Private Sub Text1_Change()
Dim CognomeDaRicercare As String
CognomeDaRicercare = Text1.Text
Data1.RecordSource = "Select * from Personale where Cognome = '" &
CognomeDaRicercare & " ' "
Data1.Refresh
Con questa procedura quando lancio il programma digito il nome da ricercare
nella TEXTBOX1 il controllo DATA scorre i cognomi nella tabella Personale
del DB Azienda fino a trovare quello che è stato digitato nella TEXTBOX1
scorrendo tutti quelli che sono composti dalla stringa fin li digitata.
Il problema e che se voglio cecare un congnome che contiene un apostrofo
(es. D'ALESSANDRO) il programma mi segnala l'errore di RUN - TIME '3075'
errore di sintassi nella stringa nell'espressione della query 'Cognome="".
Ho risolto il problema inserando la seguente procedura FUNCTION recuperata
nel sito Visual Basic Tips & Tricks di Gianluca Cannalire & Marco Cecchini
che ringrazio tanto:
Function StringaPerQuery(stringa As String) As String
Dim lun_str As Integer
Dim k0 As Long
Dim k1 As Integer
Dim car As String
Dim strbuff As String
k0 = InStr(stringa, Chr$(39))
If k0 > 0 Then
strbuff = Mid$(stringa, 1, k0 - 1)
lun_str = Len(stringa)
For k1 = k0 To lun_str
car = Mid$(stringa, k1, 1)
If car = Chr$(39) Then car = Chr$(39) & Chr$(39)
strbuff = strbuff & car
Next k1
End If
StringaPerQuery = strbuff
End Function
Da richiamare come segue:
Dim CognomeDaRicercare as String
CognomeDaRicercare = StringaPerQuery (Text1.Text) 'chiama la funzione...
Data1.RecordSource = "Select * from Personale where Cognome = '" &
CognomeDaRicercare & " ' "
Data1.Refresh
Adesso posso cercare i congnomi contenenti un apostrofo i li trovo tutti ma
il nuovo problema è che quando digito in TEXTBOX1 un cognome senza apostrofo
sento sempre l'HD che gira alla ricerca dei dati ma sulle TEXTBOX2, 3 e 4
non apparre nulla di quanto richiesto.
Ringrazio chiunque sarà in grado di aiutarmi perché questo problema mi ha
bloccato tutto il mio propgetto aziandale e non so più dove cercare la
soluzione.

il nuovo problema è quando digito un cognome senza apostrofo
La funzione StringaPerQuery (Text1.Text) restituisce una stringa nulla se
non è presente un carattere apostrofo all'interno della stringa. Infatti se
K0 = 0 restituisce strbuff che è una stringa vuota. La soluzione può quindi
essere:
a) dopo le dichiarazioni e prima dell'istruzione if scrivi strbuff = stringa
private function StringaPerQuery(stringa as string) as string
    strbuf = stringa
    if ......
    end if
    StringaPerQuery = strbuff
end function
b) suddividi il blocco if -  EndIf  con if - else - EndIf
    if K=> 0 then
        ' inserisco gli apici aggiuntivi
    else
        strbuff = stringa
    end if
.....
c) usi una querydef parametrizzata, e nel qual caso non hai mai un problema
di apostrofo.
    dim Qd as querydefs
    set qd = db.querydefs("RicercaPerNome")
    qd.Parameters("Nome")= text1.text
    set rs = qd.openrecordset()
N.B. Poichè la querydef è gia registrata all'interno del database. non
costringi il modulo Jet al controllo della sintassi dell'istruzione SQL, ne
deriva che è più veloce
Ciao Bruno


WOW! A me una pinta che nel leggere tutto m'e' venuta una sete!!!!
A parte il msg un po' "allungato", la soluzione puo' essere piu' semplice:
Data1.RecordSource = "Select * from Personale where Cognome = """ &
CognomeDaRicercare & """"
Nota: alle virgolette singole sostituisci 2 virgolette doppie (che
significano una virgoletta doppia nella stringa). In questo modo la
presenaza di cognomi con virgoletta semplice non e' un problema (al limite
lo e' la virgoletta doppia, ma devo ancora trovare un cognome che le
contiene :-)
--
Roal Zanazzi
z...@iol.it

Siete semplicemente fantastici. Sě FANTASTICI.
Non avrei sicuramente mai trovato l asoluzione senza l'apporto (tič un
appostrofo!!!) di tutti voi.
Un particolare ringraziamnto a Roal Zanazzi e a Bruno La Torre.

Io ho risolto questo problema usando "LIKE" al posto di "=" e inviando le
stringhe da ricercare a una SUB che sostituisce il carattere " ' "  con " ?
"...