Newsgroup: it.comp.appl.access
Titolo: Stringhe, apici ect. chi mi fa un po' di luce? (Bis)

Ho postato venerdì qualcosa del genere (aggiungo qualche correzione perché
il Week End porta consiglio)
se possibile vorrei qualche chiarimento
La pratica è una cosa, la teoria, si sa, un'altra.
Confesso di avere le idee piuttosto confuse sull'uso delle virgolette (o
doppi apici) e dell'apice semplice.
Per intenderci (") e (').
A volte vedo anche tre apici: quando e perché?
E questi tre apici sono i doppi seguiti dal singolo o il contrario, prima il
singolo e poi i doppi?
Aggiungo che se il codice non viene visualizzato in Curier ma con un
carattere TT non è facile distinguere tra i due caratteri.
Inoltre la leggibilità del codice è dura, tant'è che io uso spesso chr(34)
per le virgolette e chr(39) per l'apice.
Poi ci sono alcune cose che non capisco. Per esempio la funzione
arrotondaeuro come gira nel NG:
Function ArrotondaEuro2(varNr As Double, Optional varPl = 2) As Double
'varNr: numero da arrotondare
'varPI: numero di decimali (due predefinito)
varNr = Nz(varNr, 0)
ArrotondaEuro2 = Fix("" & varNr * (10 ^ varPl) + Sgn(varNr) * 0.5) / (10 ^
varPl)
End Function
Perché c'è Fix seguito dall concatenazione stringavuota & numero? A che
serve la stringa vuota prima?
Un altro esempio che illustra la mia confusione:
Sul sito comune c'è una funzione di NicoS in cui tra l'altro si sostituisce
nella stringa di esempio [Sylvia's theme] l'apice (') con il doppio apice
(").
Prima domanda: ma se io cambio la stringa che non è altro che il parametro
di ricerca poi come fa la query a trovare i record?
La query è così intelligente da capire che i record contenenti la stringa
[Sylvia's theme]
corrispondono al criterio di selezione [Sylvia"s theme] (con i doppi apici
al posto del singolo)?
Oppure i due diversi caratteri Ascii 34 e Ascii 39 sono intercambiabili in
SQL? E' mai possibile?
Altra domanda:
Il codice della funzione di NicoS è (l'ho prelevato dal sito, con taglia e
incolla):
Public Function ComponiStringaPerSQL (ByVal stringa As String) As String
   Dim n As Long, posiz As Long
   Dim h As String
   On Local Error Resume Next
   If IsNull(stringa) Then
      h = ""
      GoTo Fine
   End If
   h = stringa: posiz = 1
   n = InStr(posiz, h, "'")
/* apice singolo tra virgolette /*
   While n > 0
      h = Left$(h, n) & "'" & Right$(h, Len(h) - n)
/* stesso apice singolo tra virgolette /*
      posiz = n + 2
      n = InStr(posiz, h, "'")
/* sempre lo stesso apice singolo tra virgolette /*
   Wend
Fine:
   ComponiStringaPerSQL = h
End Function
Ma questo codice a me sembra che sostituisca all'apice "'" lo stesso apice
"'". Sbaglio?
L'istruzione non dovrebbe essere piuttosto (uso chr(34) per essere sicuro di
non fare confusione)
   While n > 0
      h = Left$(h, n) & chr(34) & Right$(h, Len(h) - n)
      posiz = n + 2
      n = InStr(posiz, h, "'")
   Wend
in modo da sostituire ['] con ["]?
Come vedete ho le idee confuse
Mi piacerebbe che qualcuno me le chiarisse
Grazie  a tutti
Filippo

 serve la stringa vuota prima?
Vedi l'help su Fix
Antonio

 CUT
Grazie per la risposta, comincio a vederci meglio ;).
C'è una cosa che ancora non mi è chiara, e mi riferisco all'ultima parte del
mio post, che è questa:
Sul sito comune c'è una funzione di NicoS in cui tra l'altro si sostituisce
nella stringa di esempio [Sylvia's theme] l'apice (') con il doppio apice
(").
In sostanza se compongo via codice una stringa per una query tipo
stringa = "SELECT * FROM Tabella WHERE Cognome ='" & Parametro & "';"
Se Parametro è per esempio "Rossi" va tutto Ok ma se è "D'Onofrio"
quell'apice, giustamente, crea problemi.
NicoS dice di cambiare D'Onofrio in D"Onofrio, così non si creano più guai
ma come fa poi la query a trovare il record che, ovviamente, contiene
D'Onofrio e non D"Onofrio?
Ripeto quindi la domanda?
La query è così intelligente da capire che i record contenenti la stringa
[Sylvia's theme]
corrispondono al criterio di selezione [Sylvia"s theme] (con i doppi apici
al posto del singolo)?
Oppure i due diversi caratteri Ascii 34 e Ascii 39 sono intercambiabili in
SQL? E' mai possibile?
Oppure è la stringa Parametro che se viene creata via codice con "D" & "'" &
Onofrio è accettata dalla Query senza dare più l'errore?
Grazie della prossima risposta.
Ciao
Filippo

 NicoS dice di cambiare D'Onofrio in D"Onofrio, così non si creano più guai
Nonononononoon nonono nonon
devi cambiarlo in D apice apice Onofrio
Questo perchè se tu devi rappresentare in una stringa il carattere " o '
devi raddoppiarlo.
Esempio.
La stringa "io sono un ""mago"""
se la stampi o la usi in qualche modo viene interpretata come
io sono un "mago"
stessa cosa per gli apici e per altri caratteri speciali.
Quindi due apici singoli vengono interpretati come un solo carattere apice
alla fine.
Antonio

 NicoS dice di cambiare D'Onofrio in D"Onofrio, così non si creano più guai
Nonononononoon nonono nonon



E VAI
Finalmente ho capito
Grazie, grazie grazie
Filippo