Newsgroup: it.comp.lang.visual-basic
Titolo: format numerici per database

ciao
Uso VB6 su Win98
una volta inserito un valore numerico (con 2 decimali), all'evento
lostFocus della casella di testo applico l'istruzione:
txtR = Format(txtR, "##,##0.00") in maniera da visualizzare il numero nel
formato seguente:
per esempio: 
15000,50 verrà visualizzato come 15.000,50
Mi si presentano 2 problemi:
1) se uso il tasto punto del tastierino numerico per inserire i decimali,
inserendo
15000.30 mi propone 1.500.030,00
in questo caso devo per inserire i decimali devo per forza usare la
virgola, ...e quindi rinunciare al ben più comodo tasto punto del
tastierino numerico...
2) dopo aver inserito i numeri, essi saranno ben formattati (es:
15.000,50), ma ora devo scrivere i valori in un database, dove la virgola
del decimale viene interpretata come fine campo e quindi il valore
decimale (il 50) viene visto come un valore numerico di un nuovo campo,
con evidenti errori del programma;
Esiste una funzione tipo unformat per eliminare la formatazione sulla
casella di testo?
Domande:
1) Come posso consentire l'uso del tasto punto nel tastierino numerico per
inserire i decimali?
2) Che tipo di formattazione devo dare alle caselle di testo prima di fare
(insert o update sul database)?
ciao e grazie
Alessandro
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Mi si presentano 2 problemi:
[cut]
Tutto nasce dal fatto che utilizzi una conversione implicita (oltretutto
'nascosta' perchè usi anche la proprietà predefinita).
Il tuo codice:
txtR = Format(txtR, "##,##0.00")
è, in realtà:
txtR.Text = Format$(CDbl(txtR.Text), "##,##0.00")
Questo secondo codice, molto più leggibile perchè quantomeno ti visualizza
cosa effettivamente avviene, ti porta immediatamente a scovare il problema.
Sta tutto in quel CDbl, che risente delle impostazioni internazionali.
Devi scriverti una funzioncina che prenda il .Text del textbox e, vedi tu se
leggere e utilizzare le impostazioni internazionali o imporre un formato
tuo, ti restituisca il VALORE NUMERICO dell'espressione stringa, che potrai
poi sottoporre al format$ in maniera pulita.
Ciao
Alberto

 fare (insert o update sul database)?
Usa la MaskEditBox se proprio devi..
bye
-- 
Esistono 10 tipi di persone: chi conosce il binario e chi no.
www.nicolaottomano.it

 Uso VB6 su Win98
Il punto corrisponde al KeyAscii=46
Se lo intercetti nell'evento KeyPress
lo puoi convertire.
Non hai specificato il db
Prova a costruira l'istruzione sql con i parametri.
Ave
giuseppeD

 lo puoi convertire.
Beh, mi sembra una soluzione eccessivamente soft.
Se faccio un copia-incolla nel textbox, il punto me lo trovo lo stesso.
E poi, se un utente vuole effettivamente inserire i punti come separatori
delle migliaia, cosa fai, gli metti virgole ovunque?
Per non parlare del fatto che, se il pc è in inglese, ci vuole proprio il
punto...
Ciao
Alberto

> Non hai specificato il db
Il DB è Access97
ciao


 punto...
Per la simbologia, punto o virgola,
si può leggere le impostazioni Opzioni internazionali,
del sistema operativo, e regolarsi di conseguenza.
Certo, se arrivano dei dati, in file txt o xml, con semantica inglese,
e si devono inserire in una tabella con sistema italiano,
devo intervenire con codice di conversione.
Ave
giuseppeD

 devo intervenire con codice di conversione.
Beh, solo parlando di 'tabella' intendendo una griglia o qualcosa comunque
di visualizzato, non di una tabella di un database, per il quale valgono
solo le formattazioni inglesi (per i numerici).
Comunque, io sono personalmente contrario agli accrocchi una-tantum o con
troppi se e ma. Seguendo quanto dicevo io, ossia creare una piccola
funzioncina che prenda una stringa e restituisca un valore, ci si para il
posteriore da qualsiasi tipo di poccio, dai separatori delle migliaia,
impostazioni internazionali, stringhe vuote, caratteri o simboli nella
stringa.
Per la conversione opposta, ossia da numerico a stringa, per inserire in un
db, esiste una ed una sola formattazione accettata, che è quella inglese.
Per cui, con due funzioncine (Stringa_to_Valore e Valore_to_Stringa_per_db)
si risolvono tutti i problemi per sempre.
Ciao
Alberto

 fatto che con altri software si può, mentre con il tuo no?
Se acquisto un programma confezionato, tengo il costruito,
se lo devo ordinare, un parser su quello che si inserisce.
Solo la punteggiatura per i decimali. Quindi,  un solo punto o una sola
virgola.
L'inseritore sa che dopo, sono decimali.
Per il salvataggio in tabella, utilizzo la funzione da te suggerita.
Ave
giuseppeD

 L'inseritore sa che dopo, sono decimali.
Beh, diciamo che questa è una di quelle cose che fa parte del pregiudizio
comune.
Un parser banale banale riesce a distinguere, anche se l'operatore li
inverte rispetto alle impostazioni internazionali, i separatori delle
migliaia da quelli dei decimali.
Io inserisco questo concetto in ogni software, per cui nei nostri sw
l'operatore può scrivere quello che vuole. L'unico caso in cui si creano
dubbi, e in tal caso vincono le impostazioni internazionali, è se inserisco
un qualcosa con 3 cifre dopo il separatore, per cui in tal caso potrebbe
essere migliaia o decimali. E qui guardiamo secondo le 
imp.int
., in quale
senso debba essere considerato.
Noi siamo fornitori di Erp per un colosso industriale, e ti posso garantire
che non abbiamo MAI ricevuto una segnalazione per un importo mal
interpretato. Piuttosto, è quando ci dobbiamo interfacciare con sw di altri,
che vediamo gli operatori andare in crisi perchè 'non mi ricordo se qui devo
usare le virgole o i punti...'.
ciao
Alberto

Grazie ad Ottomano e Albe;
ho risolto per il tasto punto del tastierino numerico allo scopo di poter
inserire velocemente i decimali;
Per quanto riguarda il separatore delle migliaia quello NON va
considerato, cioè il numero sarà formattato dopo il lost focus sulla
casella di testo (come fa Excel).
Per quanto riguarda l'inseriemnto e modifiche sul Database di Access97 ho
visto che se prendo direttamente i valori dalla textBox, e quindi
formattati (Es: 15.000,50) nelle istruzioni SQL posso considerarle tipo
testo cioè mettendo il valore fra apici:
Esempio:
sql = sql & ",SSSecSal='" & TxtP(19) & "'"
(SSSecSal è il campo numerico, ed TxtP(19) contiene il numero formattato)
Per fare i calcoli nel programma invece ho adottato questa soluzione:
Ho un vettore di double con i valori numerici senza formattazione, e
quindi posso fare i calcoli senza nessun problema
ciao


 casella di testo (come fa Excel).
Beh, il punto era proprio questo.
Per formattare una stringa che rappresenta un valore numerico, prima devi
forzatamente ricavarne il valore (anche se non lo scrivi espressamente).
E per ricavarne il valore devi comunque interpretare la stringa, e siamo
daccapo...
Ciao
Alberto