Newsgroup: it.comp.appl.access
Titolo: Apice, SQL e arrabbiature

Ho una maschera con una casella combinata nella quale sono elencati i
nominativi dei pazienti dalla quale selezionandone uno e confermando con
Invio si apre una seconda maschera con le informazioni riguardanti quel
paziente.
Per fare ciò ho impostato l'evento KeyPress della casella combinata e
quindi...
If KeyAsci = 13 then DoCmd.OpenForm "anagrafica", , , "[nominativo]=" &
Me.CasellaCombinata2
Tutto va bene finché non si sceglie un cognome tipo D'AVOLA o D'ASTA e
simili, l'istruzione SQL si inca....a e mi dà errore.  Qualcuno sicuramente
mi risponderà che al posto di [nominativo] dovrei usare l'ID del record e
ha ragione!!
Ma a scopo didattico, come si potrebbe risolvere il problema?
--
Cordiali saluti
Nunzio Santini

 wrote in message
8etj2b$pvk$1...@serv1.albacom.net...

Questa funzione dovrebbe fare al caso tuo:
Function ParseInvalid(ByVal strParseString As String) As String
   ' -------------------------------------------------------------
   ' Parses single and double quotes from strings into their
   ' associated chr()'s to prevent parsing problems with criteria
   ' strings. Returns a string that includes delimiters
   ' if delimiters are needed.
   ' -------------------------------------------------------------
   Dim SwapPoint, SwapChars, i, SwapAscii, ParseLen
   ' -------------------------------------------------------------
   ' Set SwapChars to characters you want replaced.
   ' -------------------------------------------------------------
   SwapChars = Chr(34) & Chr(39)
   ' -------------------------------------------------------------
   ' Search for first special character.
   ' -------------------------------------------------------------
   For i = 1 To Len(SwapChars)
   SwapPoint = InStr(strParseString, Mid(SwapChars, i, 1))
      If (SwapPoint) Then
         SwapAscii = Asc(Mid(strParseString, SwapPoint, 1))
         ParseLen = Len(strParseString)
         Exit For
      End If
   Next
   Select Case SwapPoint
      Case 0
         ' -------------------------------------------------------------
         ' No special characters found, return string with surrounding
quotes.
         ' -------------------------------------------------------------
         ParseInvalid = Chr(39) & strParseString & Chr(39)
      Case 1
         ' -------------------------------------------------------------
         ' First character is a special character
         ' -------------------------------------------------------------
         If (ParseLen = 1) Then
            ParseInvalid = "Chr(" & SwapAscii & ")"
         Else
            ParseInvalid = "Chr(" & SwapAscii & ") & " &
ParseInvalid(Right(strParseString, ParseLen - 1))
         End If
      Case ParseLen
         ' -------------------------------------------------------------
         ' Last character is a special character...
         ' -------------------------------------------------------------
         ParseInvalid = ParseInvalid(Left(strParseString, ParseLen - 1)) & "
& Chr(" & SwapAscii & ")"
      Case Else
         ' -------------------------------------------------------------
         ' Middle character is a special character.
         ' -------------------------------------------------------------
         ParseInvalid = ParseInvalid(Left(strParseString, SwapPoint - 1)) &
" & Chr(" & SwapAscii & ") & " & ParseInvalid(Right(strParseString,
ParseLen - SwapPoint))
   End Select
End Function

simili, l'istruzione SQL si inca....a e mi dà errore.  Qualcuno sicuramente
si', perche' in sql l'apice e' il delimitatore di una stringa.  quindi
nel caso di D'AVOLA avrai una stringa sql tipo:
...where Cognome = 'D'AVOLA...
che per sql sarebbe come:
...where Cognome = 'D'
seguita da monnezza.
il modo per far capire ad sql che tu vuoi proprio un carattere apice
come parte di un filtro e' quello di scriverlo raddoppiato, ad es.
D''AVOLA (mi raccomando: D-apice-apice-AVOLA e non
D-virgolette-AVOLA).
questo detto, puoi scrivere una funzione a cui datao in pasto un
cognome ne esca una stringa con l'eventuale apice raddoppiato, ad es.:
fChkApice(s as string) as string
dim i as integer
dim appo as string
dim ss as string
for i=1 to len(s)
	ss=mid(s,i,1)
	if ss="'" then
		ss="''"
	end if
	appo=appo & s
next i
fchkApice=appo
end function
dentro una stringa di sql la usi ad es. cosi':
dim ssql as string
ssql = "SELECT * FROM TABELLA " & _
          "WHERE Cognome = '" & fChkApice(me.controllo) & "'"
--
il sito comune di it.comp.appl.access:
http://members.xoom.it/it_db_access/

Function ParseInvalid(ByVal strParseString As String) As String
Mecojoni!
Io faccio semplicemente chr(34) & qualsiasistringa & chr(34)
Forse mi dovrei vergognare...
--
Lorenzo Coronati
--
<<Nessuno sa che questa affermazione e' vera>>
(John D. Barrow)
--

 ha scritto nel messaggio
news:3912f1e9...@news.libero.it...

Ci vergognamo in due!
Ciao.