Valori decimali e salvataggio nel database

venerdì 13 marzo 2009 - 15.34

motogpdesmo16 Profilo | Senior Member

Buongiorno a tutti,
avrei la necessità di effettuare il salvataggio di un valore decimale nella tabella del mio database (Sql Server 2005). Il tipo di dato del campo della tabella numeric(6,3).
Nell'metodo KeyPress della mia textbox ho inserito sia il codice per omologare il separatore dei decimali a "." (indipendentemente, quindi, da quelle che sono le impostazioni internazionali del sistema operativo) sia quello per ammettere solo numeri decimali. Nonostante questi controlli scattino in maniera assolutamente corretta (posso inserire solo una volta il ".", non posso inserire lettere ecc), alla pressione del tasto TAB il separatore dei decimali sparisce.
Tuttavia in una textbox non bindata al campo del db, questo codice funziona perfettamente.

Sapreste aiutarmi cortesemente??
Grazie anticipatamente.

alexmed Profilo | Guru

Ciao Ducati!!!
Il mio consiglio è quello di crearti una controllo personalizzato, un NumericBox
qui trovi uno spunto interessante

http://www.dreamincode.net/forums/showtopic48794.htm

In questo modo puoi andare a bindare il campo della tabella sul tuo controllo.

Se invece vuoi capire dove sbagli (se sbagli) allora forse è il caso che ci fai vedere un pò di codice.

Prova comunque a mettere nell'evento LostFocus della TextBox questo codice:

Me.TextBox1.Text = String.Format("{0:N2}", Me.TextBox1.Text) 'dove il 2 di N2 rappresenta il numero dei decimali che vuoi far vedere

Ciao
alexmed

motogpdesmo16 Profilo | Senior Member

Ciao Alexmed,
grazie per l'interessamento al problema innanzitutto.
L'ipotesi del controllo personalizzato, una sorta di NumericText, la valuterò nello step immediatamente successivo. In questa fase sto solo mettendo a punto le varie procedure e, volta per volta, mi realizzo controlli e/o sub/function che assolvono a quelle che sono le mie necessità. Grazie del link comunque
Torniamo al mio problema: non ho problemi nel bindare il controllo al database e, anche inserendo il format al lost focus, comunque non riesco ad ottenere il valore formattato secondo le mie necessità. Ti dirò di più: debuggando, se mi fermassi al lost focus, arriva già il valore 56900 quando in realtà io avevo scritto 56.900
Quindi:
- o il binding viene effettuato in maniera errata (ma ne dubito, perchè ho tutto automatizzato e gli altri controlli funzionano perfettamente)
- o il codice è errato (ma ne dubito, perchè, come scritto nel precedente post, in un campo non associato alla fonte dati funziona perfettamente)
- il "tipo di dati" che imposto in sql server (numeric(6,3)) è errato. Lo stesso problema lo ottengo con real, decimal ecc ecc.

Un controllo analogo l'ho realizzato per un'altra textbox, che può accettare però solo numeri interi. Impostando come tipo di dati "integer" funziona tutto perfettamente. Temo veramente che il problema sia più "lato server"...

motogpdesmo16 Profilo | Senior Member

Aggiornamenti...mi son costruito il controllo personalizzato e, stando al debug, nell'oggetto c'è un valore di tipo double:

TxtPeso.xValue 134.44 Double (copiato e incollato dalla finestra delle espressioni di controllo )

Il punto è che quando vado a comporre la mia querystring per l'inserimento, il valore è sempre di 134,44 che, ovviamente, causa problemi in fase di insert.

Come posso risolvere??
Grazie

alexmed Profilo | Guru

Ciao

>Nell'metodo KeyPress della mia textbox ho inserito sia il codice per omologare il separatore dei decimali a "." (indipendentemente, quindi, da quelle >che sono le impostazioni internazionali del sistema operativo) sia quello per ammettere solo numeri decimali

Mi stò chiedendo se il database possa accettare come decimal un valore passato come 1234.45 visto che il tipo decimal prevede il punto come separatore di migliaia e la virgola per i decimali.
A questo io non sò rispondere però (chiedi magari nella stanza SQL) potresti ovviare in due modi:
1. mettendo il campo del database di tipo STRING;
2. facendo una doppia trasformazione, ovvero: il campo del db è decimal (quindi 1.234,56) e sia in fase di inserimento che in fase di lettura trasformi il tuo dato dapprima togliendo l'eventuale separatore delle migliaia e sucessivamente sostituendo la virgola con il punto in modo da visualizzarlo solo come 1234.56.

Veniamo ora alle mie personalissime considerazioni.
Perchè fai questa trasformazione? Hai la necessità di farlo?
D'altra parte in quasi tutti i sistemi il punto e la virgola hanno il loro perchè
Andare a stravolgere questo sistema potrebbe voler dire che un domani il tuo db sia inutilizzabile.
Se il problema è l'uso del tastierino numerico per inserire i dati (che in effetti prevede il punto e non la virgola) potresti semplicemente fare in modo che alla pressione del punto il programma lo trasforma in virgola.
Benchè tu abbia fatto tutte le omologazioni se io copio quel dato (che essendo numerico deve darmi la possibilita di farci delle operazioni) e lo incollo in un altro applicativo (es la calcolatrice di windows) quello mi restituirà dei valori errati.

CIao

alexmed
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5