Newsgroup: it.comp.lang.visual-basic
Titolo: insert di un numero

Se in una qury di inserimento devo inserire una variabile numerica come
bisogna formattare la stringa?
grazie

 bisogna formattare la stringa?
dim iNum as integer
dim sString as string
iNum=1
sString = "Prova"
sSql = "INSERT INTO tbl_demo (numero, stringa) "
sSql = sSql & "VALUES (" & iNum & ","
sSql = sSql & "'" & sString &  "')"
ciao Biagio..

 sSql = sSql & "'" & sString &  "')"
Aspetta un attimo....
Se iNum è un numerico, il codice sopra è sbagliato.
Per due motivi:
1) L'operatore & concatena due stringhe, non una stringa con un numero.
Usandolo così, si obbliga VB a fare una conversione implicita, e questo è
sempre molto male (nonchè fonte di tanti post nel NG perchè impedisce di
vedere molti bug). Il fatto che in alcuni casi funzioni (ossia solo per Int
e Long, mentre per Single, Double, Currency ecc funziona solo con
determinate impostazioni internazionali ecc...) non significa che sia il
modo corretto. Inoltre, come abitudine, è bene usare la tipizzazione come si
deve, visto che in .Net sarà tassativo.
2) Se la variabile contiene decimali, la conversione implicita utilizza
praticamente sempre la virgola come separatore (in Italia), per cui ci
troviamo un bel syntax error in Sql.
Un modo, che funziona sempre, anche se io uso una funzione mia molto più
articolata, è:
dim iNum as integer
dim sString as string
iNum=1
sString = "Prova"
sSql = "INSERT INTO tbl_demo (numero, stringa) "
sSql = sSql & "VALUES (" & replace(cstr(iNum),",",".") & ","
sSql = sSql & "'" & sString &  "')"
ciao
Alberto

 [...] Replace(cstr(iNum),",",".") [...]
Per curiosita', puoi postare la funzione "articolata" che usi?
Lokar
--
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
UGIdotNET - 
http://www.ugidotnet.org

 ha scritto nel messaggio
news:aqaquf$87su8$1...@ID-158338.news.dfncis.de...

 Avete ragione, ma questa è una notazione che si trova in qualsiasi BOOK
Microsoft!!!,
l'importante è non fare fare il casting al Database mandandogli un '1'!
se no basta aggiungere & format(iNum) & .... no?

 ha scritto nel messaggio
news:%26y9.121948$%M1.31...@twister2.libero.it...

Forse non hai visto bene, ma non è necessario il "replace", visto che iNum è
un integer!!!

 sSql = sSql & "'" & sString &  "')"
Forse non hai visto bene, ma non č necessario il "replace", visto che iNum č
un integer!!!

 Per curiosita', puoi postare la funzione "articolata" che usi?
Utilizzo:
Stringa_SQL= Decimale_Con_Punto(Text1.Text)
Stringa_SQL= Decimale_Con_Punto(Cstr(Var_Numerica))
Function
'Converte un valore in una stringa con il punto come separatore decimale
Public Function Decimale_Con_Punto(ByVal valore As String) As String
Dim conteggio_punti As Long, conteggio_virgole As Long, n As Long
If valore = vbNullString Or valore = "," Or valore = "." Then
    Decimale_Con_Punto = "0"
    Exit Function
End If
If Not IsNumeric(valore) Then
    Decimale_Con_Punto = "0"
    Exit Function
End If
'Caso particolare 1: stringa che contiene un separatore dei decimali come
primo carattere:
'Risolvo aggiungendo uno 0 davanti
If Left$(valore, 1) = "." Or Left$(valore, 1) = "," Then
    valore = "0" & valore
End If
'Caso particolare 2: stringa che contiene un separatore delle migliaia ed un
separatore
'dei decimali senza decimali successivi: risolvo aggiungendo uno 0 alla
fine.
If Len(valore) > 5 Then
    If Right$(valore, 1) = "." Or Right$(valore, 1) = "," Then
        If Left$(Right$(valore, 5), 1) = "." Or Left$(Right$(valore, 5), 1)
= "," Then
            valore = valore & "0"
        End If
    End If
End If
valore = RTrim$(LTrim$(Replace$(Replace$(Replace$(valore, " ",
vbNullString), ",", " "), ".", " ")))
n = InStrRev(valore, " ", , vbTextCompare)
If n = 0 Then 'Non ci sono separatori decimali
    Decimale_Con_Punto = CStr(CLng(valore))
Else 'Ci sono separatori decimali
    'Decimale_Con_Punto = CStr(Ccur(Replace$(Left(valore, n - 1), " ",
vbNullString))) & "." & Right$(valore, Len(valore) - n)
    Decimale_Con_Punto = Replace$(Left$(valore, n - 1), " ", vbNullString) &
"." & Right$(valore, Len(valore) - n)
End If
End Function
Test:
Private Sub Command1_Click()
Label1.Caption = Decimale_Con_Punto(Text1.Text)
Label2.Caption = Replace$(Text1.Text, ",", ".")
End Sub
Ciao
Alberto

 un integer!!!
Ho visto benissimo.
Ma che sia un integer è una tua idea. Satiro chiedeva la conversione di un
numerico, non necessariamente di un integer. E se utilizza il tuo codice, al
99% si inchioda al primo single, double, o currency.
Ciao
Alberto

 il "replace", visto che iNum è un integer!!!
Come gia' detto da Alberto, concatenare un intero con una stringa fa si che
il compilatore *converta implicitamente* l'intero in una stringa. Questa
conversione e' *localizzata* in base alle impostazioni del sistema
operativo, in particolare con le impostazioni di default italiane, al
momento della concatenazione l'intero 12.5 viene implicitamente convertito
nella stringa "12,5". Convertendo esplicitamente il tipo con CStr(iNum) e
sostituendo le "," con i "." mediante la funzione Replace, si ovvia a questo
problema.
Happy Coding =)


 l'intero in una stringa.
Ops, mi sono reso conto solo ora cosa intendevi (l'intero non ha virgole).
Sorry!
Il discorso a livello generale comunque va tenuto presente, nel momento in
cui si fanno concatenazioni fra numeri e stringhe!


 ha scritto nel messaggio
news:Ux6y9.122057$%M1.31...@twister2.libero.it...

Ma sicuramente, ma se usa un numerico non integer penserà lui ("satiro") a
fare le conversioni del caso..
In ogni caso non è neanche corretto fare la conversione di un double o
simile con un replace così semplice, anche perchè bisogna tener conto anche
delle impostazioni internazionali del sistema operativo...
Ciao, alla prossima discussione... ovviamente sempre a scopo didattico per
tutti...

 delle impostazioni internazionali del sistema operativo...
Personalmente ritengo che quello che ho postato io
[replace$(cstr(iNum),",",".")] serva appunto ad essere indipendenti dalle
impostazioni del sistema operativo.
Forse, potrebbero esserci problemi se in un sistema operativo viene
impostato come separatore dei decimali un carattere diverso, che so, la
barra / o i due punti, ma mi sembra una evenienza abbastanza improbabile, e
non so neanche se fattibile.
Che comunque serva qualcosa di più complesso, credo di averlo mostrato con
la funzione che ho postato. Ma se il punto di partenza è una variabile
numerica, di qualunque tipo, non vedo cosa ci sia di "non corretto" in
replace$(cstr(iNum),",",".").
Se sei a conoscenza di qualche problematica nell'utilizzo di questa
metodica, potresti essere più preciso, perchè credo che interessi a molti?
Ciao
Alberto

 delle impostazioni internazionali del sistema operativo...
Non direi (o sono fuso anche oggi?): Il separatore interi/decimali per dati
destinati al database dovrebbe essere sempre il punto. Come si puň fare una
Insert Into Tabella (ctext,csingle) Values ('abc',12,34) che riporta una
virgola di troppo nei "Values"?

Inoltre:
Select * From Tabella Where csingle=12,34
a me non funziona, anche se il separatore è impostato su virgola
Devo usare
Select * From Tabella Where csingle=12.34


Io ho avuto problemi in un'applicazione che ho sviluppato per la grande
distribuzione, dove avevamo riscontrato che in sistemi operativi con
settaggi non italiano, potevano avere il sepoaratore di migliaio e dei
decimali invertito: Ita: 125.000,23  Ing:   125,000.23, Quindi avavo
sviluppato una classe per la conversione di questi numeri che andava a
leggere prima le impostazioni internazionali del sistema operativo su cui
era installato.
Ciao

 ha scritto nel messaggio
news:9X6y9.121766$RO.31...@twister1.libero.it...

La sintassi SQL prevede SEMPRE il punto per i decimali e la virgola per
separare i campi.
Indipendentemente dalle impostazioni del DB, dell'utente o del S.O. su cui
il server gira.
Le impostazioni internazionali hanno invece effetto sul formato in cui il DB
restituisce i campi nel query analyzer, nella visualizzazione delle tabelle
da E.M., e nelle funzioni di conversione utizzabili (ad esempio, prova a
fare un Cast(Campo_Numerico as NVarChar(10)).
Motivo in più per utilizzare sempre il Replace della virgola col punto. Se
infatti, in VB, la conversione, implicita o meno, di un numerico in stringa
è fortemente influenzata dalle impostazioni internazionali, la stringa SQL
risultante non lo deve assolutamente essere.
Ma direi che siamo tutti (o quasi) d'accordo su questo. E' solo una
precisazione.
Ciao
Alberto

 era installato.
Ma questo non ha niente a che vedere con la conversione dei numerici in
stringa.
Al limite, è un problema di formattazione da stringa a stringa, ad esempio
da un textbox dove l'utente inserisce l'importo, ad una stringa accettabile
dal comando SQL.
Se un numerico è visualizzato 125.000,23 o 125,000.23, in realtà la
memorizzazione è comunque 125000.23, e il Replace$(Cstr(valore),",",".") va
bene anche in questo caso.
Ciao
Alberto

 precisazione.
Direi di sì, la mia voleva essere una "dimostrazione".
Mi lascia perplesso anche l'altro post di Biagio dove si parla di depositare
un valore del tio 1.234,56 in un campo. Non so se funzioni, anche con
impostazioni internazionali coerenti, personalmente "pulisco" il
valore/stringa di tutti gli eventuali separatori fra le migliaia e, in ogni
caso, sostituisco l'eventuale virgola fra interi e decimali col punto. Tutto
questo sia in scrittura che in Where.

> Per curiosita', puoi postare la funzione "articolata" che usi?
[...]
Tu supponi che il speratore delle migliaia sia il punto e dei decimali la
virgola... io preferisco controllare (tramite api) le impostazioni del
sistema. Mi sono capitati dei clienti con impostazioni sballate a dir poco
(stesso separatore per decimali e migliaia ad esempio)! :(

 bene anche in questo caso.
Ecco, CVD (vedi altro post)

 per dati destinati al database dovrebbe essere sempre il punto. Come
Si ma se tu fai un ccur("10,50") il risultato varai in base alle
impostazioni internazionali della macchina: prova ad impostare il caratte %
come separatore della virgola... e a sperimentare con l'immediata! ;-)
Ciao


Io vi garantisco che ho sbattuto molto il naso con queste cose, č ho avuto
molti problemi..., e non ero l'unico programmatore..., la risoluzione? una
libreria che al suo interno, leggeva le impostazioni internazionali e le
usavo per tutte le formattazioni e i vari replace..
Ciao a tutti.. :-))

 come separatore della virgola... e a sperimentare con l'immediata! ;-)
Mi riferivo esclusivamente alla gestione dei dati da e per il database.
Uso sempre il punto che viene correttamente gestito anche se il separatore
di impostazione è virgola o %

 ha scritto nel messaggio
news:aqaukl$i5n$1...@half.spin.it...

Non ti seguo.
Mi sembra che la funzione usi indifferentemente il punto o la virgola per
interpretare la stringa.
Anche con i separatori identici (caso improbabile ma non impossibile), la
funzione considera quello più a destra come separatore dei decimali, e tutti
gli altri per le migliaia.
Comunque sarei molto contento (?) se trovaste qualche errore nella function,
visto che la uso parecchio e mi piacerebbe individuare eventuali problemi.
Un punto su cui si potrebbe obiettare, è che "1,234" e "1.234" vengono
entrambi restituiti come "1.234", mentre teoricamente uno dei due potrebbe
rappresentare le migliaia. Ma la cosa è voluta, perchè anche in Italia, dove
le impostazioni internazionali prevedono la virgola per i decimali, è del
tutto comune che l'operatore digiti "1.234" intendendo
"unopuntoduetrequattro" e non "milleduecentotrentaquattro".
Ciao e grazie di eventuali suggerimenti/critiche
Alberto

 "unopuntoduetrequattro" e non "milleduecentotrentaquattro".
Vero che l'operatore può _digitare_ punto per intendere virgola, o
viceversa, ma preferisco intercettare il tasto e lo valido, cambiandolo nel
separatore previsto dal sistema. Così sono sempre a posto.

 Ciao e grazie di eventuali suggerimenti/critiche
Qui utilizziamo un controllo text avanzato che controlla l'input (ad esempio
se lo imposto per i numeri mi permette di scrivere e incollare solo dati
validi basati sulle impostazioni internazionali del PC).
Il dato che giocoforza è una stringa viene poi convertito in nel tipo giusto
mediante delle funzioni che utilizzano vari replace (basati sui separatori
impostati nel sistema) per le varie operazioni di calcolo... quando devo
generare la query per il salvatoaggio utilizzo un altro "pool" di funzioni
che formattano il dato nel modo corretto per il DB utilizzato (pensa ad
esempio alle date)!
Ciao

 Ciao
ciao
Alberto

 stringa SQL per Access, convertendo anche le funzioni sui campi.
Io ho abbandonato quell'idea e ho cercato di scrivere l'sql più standard
possibile distinguendo solo in certi casi (le date ad esempio).
Ciao