Newsgroup: it.comp.lang.visual-basic
Titolo: Dramma virgola

Ciao,
in una misera query di aggiornamneto trovo un errore quando cerco di salvare
una cifra con la virgola
La sintassi della query č:
"UPDATE SOSPESI SET IMPORTO=" & CIFRA & " WHERE IDSOSPESO=" & CODICE
Mi dice Errore di sintassi perchč ad es. quando cifra=23,54 (maledetto Euro)
vb crede che io voglia introdurre qualche altro campo.
Qualcuno ha qualche idea?
Ciao e grazie in anticipo GG



Usa str$(CIFRA)
Ciao

 Usa str$(CIFRA)
Cosě non funziona!
Bisogna usare Replace(CIFRA, ",", ".")
Ciao

 ha scritto nel messaggio
news:i4798.51541$3J1.1...@news2.tin.it...

O se non usi VB6:
Public Function replacechar(TotalString As String, _
OldChar As String, NewChar As String)as string
Dim i As Integer
i = 0
Dim p1, p2, p3, p4 As String
p1 = TotalString
i = InStr(p1, OldChar)
Do Until i = 0
i = 0
If Len(OldChar) > 1 Then
p2 = Left(p1, InStr(p1, Len(OldChar) - _
Len(OldChar))) & NewChar
Else:
p2 = Left(p1, InStr(p1, OldChar) - 1) & NewChar
End If
p3 = Right(p1, Len(p1) - InStr(p1, OldChar))
p1 = p2 & p3
i = InStr(p1, OldChar)
Loop
replacechar = p1
End Function
Ciao
--
Timothy Redaelli
P.S. Si usa cosě cifra=replacechar(cifra,",",".")
*NON TESTATO*

 Dim p1, p2, p3, p4 As String
Tre Variant ed una String?
Vedi cosa succede quando si utilizzano più linguaggi
contemporaneamente? :-P
Ciao.
--
BSD is for UNIX-lovers -- linux is for Windows-haters.



Anche io usavo Replace, infatti lo suggrivo sempre, ma poi mi hanno
consigliato di usare str$ e ho visto che funziona perfettamente.
Qual'e' il problema che a te da?
Ciao Zanna

 OldChar As String, NewChar As String)as string
Questo è quello che mi ero fatto per VB4
Function ReplaceSubStr(ByVal Str As String, ByVal SubStr As String, ByVal
NewSubStr As String, Optional Compare As VbCompareMethod = vbBinaryCompare)
As String
    Dim i As Long
    If Len(SubStr) > 0 And StrComp(SubStr, NewSubStr, Compare) <> 0 Then
        Do
            i = InStr(i + 1, Str, SubStr, Compare)
            If i > 0 Then
                Str = Mid$(Str, 1, i - 1) & NewSubStr & Mid$(Str, i +
Len(SubStr))
            End If
        Loop While i > 0
    End If
    sReplaceSubStr = Str
End Function
Testato e funziona :)

 Perché passare i parametri ByRef se non devono essere modificati?
Non so se era voluto, ma con le stringhe è meglio passarle ByRef.
Passandole ByVal se fossero troppo consistenti si rischierebbe di
sovraccaricare lo stack, o comunque il processore e la memoria per le copie
implicite.
Ciao

 Qual'e' il problema che a te da?
Beh, in effetti funziona.
Dà solo problemi se usando le impostazioni americane gli passi un "xxx,yyy",
ma se si rimane coerenti fino in fondo questo è impossibile :)
Ciao

 ma se si rimane coerenti fino in fondo questo è impossibile :)
 è da leggersi
Dà problemi se gli viene passata una stringa contenente una virgola.
Ciao

 le copie implicite.
Oltretutto nell'algoritmo in questione viene passata la stringa per
riferimento ed all'inizio della funziona viene fatta un inutile
copia della stessa, vanificando in ogni caso il passaggio byref.
Comunque, se hai la necessità di passare stringhe veramente
consistenti (il passaggio ad altri linguaggi sarebbe la cosa
migliore in questi casi), puoi sempre spezzarle in più parti.
Ti consiglio poi di riscrivere la tua funzione in questa maniera,
perché nel caso in cui le due sottostringhe siano della stessa
lunghezza ottieni un incremento di prestazioni di circa un migliaio
di volte:
<code>
Function ReplaceSubStr(ByVal str As String, ByVal SubStr As String,
_
    ByVal NewSubStr As String, Optional Compare As VbCompareMethod =
vbBinaryCompare) As String
    Dim i As Long
    Dim SubStrLen As Long
    Dim NewSubStrLen As Long
    If Len(SubStr) > 0 And StrComp(SubStr, NewSubStr, Compare) <> 0
Then
        Do
            i = InStr(i + 1, str, SubStr, Compare)
            If i > 0 Then
                If SubStrLen = NewSubStrLen Then
                    Mid$(str, i, SubStrLen) = NewSubStr
                Else
                    str = Left$(str, i - 1) & NewSubStr & Mid$(str,
i + SubStrLen)
                End If
            End If
        Loop While i > 0
    End If
    ReplaceSubStr = str
End Function
</code>


 di volte:
Vero, l'uso ripetuto di Len() è un bel baco, e l'uso di <Mid$() => E'
senz'altro una soluzione ottimale (un altro bacozzo).
Ciao

 Vero, l'uso ripetuto di Len() è un bel baco,
Quello è il meno, in effetti la differenza fra l'utilizzo della
variabile e la valutazione della lunghezza è trascurabile.
Quello che velocizza estremamente è l'utilizzo l'ottimizzazione nel
caso che le due stringhe siano della stessa lunghezza.
