Newsgroup: it.comp.lang.visual-basic
Titolo: sommare campi numerici

Si tratta di una domanda molto elementare e scusate se oso postarla:
In una form ho due TextBox (Txt1 e Txt2)che contengono dati numerici e
su pressione di un CommundButton (CmdCalcola) dovrei sommare i due Text
Box.
codice:
Dim Som as long
  Som = Txt1 + Txt2
Anzichè sommarli li concatena, come devo fare per dire che si tratta di
numeri anzichè stringhe ?
Grazie e scusate ancora
Sergio
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 
Guida-->cerca Val,Cdbl,Cint,Clng.......
ciao,roby

 numeri anzichè stringhe ?
Ti consiglio di studiare cosa sia un 'tipo'.
Il TextBox ha una proprietà .Text che restituisce un tipo String.
Se da questa String vuoi ottenere il valore numerico, devi effettuare 
una conversione di tipo, da String a quello che ti serve.
In prima battuta, giusto per non impazzire con separatori ecc..., puoi 
usare il Val (ma non è il modo più raffinato).
Quindi, avresti:
Som=Val(Txt1.Text) + Val(Txt2.Text)
E viceversa se vuoi poi reinserirlo in un textbox:
Txt_Somma.Text = CStr(Som)
Ciao
Alberto
-- 
A questo punto hanno trovato un muro,
un muro duro, molto molto duro,
che siamo noi.

Grazie per l'immediata risposta.
Ciao


 Txt_Somma.Text = CStr(Som)
Ciao Albe,
vorrei sapere se uno fa una cosa del genere "cosa rischi"
Dim impo as currency
txt1.text=impo
Cioè senza fare la CStr.
Solitamente uso sempre una cosa del genere
decFormat = "#,##0.00"
txt1.text=format$(impo,decformat)
Ma mi capita di metterci valori integer magari con una val
txt1.text=val(miaVar)
Grazie

 txt1.text=val(miaVar)
Perchè il Val?
Se miaVar è numerico, il val è sbagliato. E' sbagliato, perchè in 
realtà avviene:
txt1.Text = CStr(Val(CStr(miaVar)))
e questa cosa, in un sistema con separatore decimale diverso dal punto, 
equivale ad un Fix, mentre in un sistema con separatore decimale uguale 
al punto, funziona correttamente. Ti trovi quindi con un codice che 
funziona in modo diverso a seconda del sistema operativo, e questo è un 
male (a meno che non sia esplicitamente desiderato).
Se miaVar è invece di tipo stringa, allora vale quanto detto sopra per 
il CStr.


 il CStr.
A volte faccio così:
AdoRs("Pippo") è Numeric o Integer (no virgola)
NoNull una function tipo stringa:
Public Function NoNull(ADOCampo As ADODB.Field) As String
If IsNull(ADOCampo) = False Then
  NoNull = ADOCampo
Else
  NoNull = ""
End If
End Function
Quindi faccio:
txtCodice=val(NoNull(adors("Pippo")))
Questo per ovviare a fare if IsNull ogni volta
Tnx

 Questo per ovviare a fare if IsNull ogni volta
E' brutto brutto (soprattutto il non utilizzare il .Value), e 
soprattutto se il campo è Numeric (e quindi potrebbe avere decimali), 
questa operazione te li tronca (non arrotonda, proprio tronca) o meno, 
a seconda del sistema operativo.
Poco deterministico.


 a seconda del sistema operativo.
Scusa con numeric intendo sempre Numeric(10,0), in pratica sono i contatori
delle tabelle o progressivi vari.
Per i decimal(10,2) ad esempio uso:
TxtPippo = Format$(Val(UsaPunto(NoNull(ADORs("NOME"))))), decFormat)
Usapunto è la famosa funzione che si occupa di trasformare un numero con la
virgola nel formato "12345.22" indipendentemente (in teoria ^_^) dalle
impostazioni dell'OS, e che ho già in mente di fare decentemente una volta
rifatta un'analisi corretta.

 TxtPippo = Format$(Val(UsaPunto(NoNull(ADORs("NOME"))))), decFormat)
Ma scusa, tu ti preoccupi di scrivere una funzione per gestire i Null 
in modo flessibile, ecc..., e poi ti comporti in modo diverso se devi 
gestire un Numeric(10,0) o un Numeric(10,1)?
Mi sembra una inutile complicazione.
Metti a punto un metodo che funzioni sempre, e sei a posto.
Ciao
Alberto
PS: e metti quel .Value, che senza è un pugno negli occhi...


 Metti a punto un metodo che funzioni sempre, e sei a posto.
Hai pienamente ragione, è che ho iniziato che ado lo conoscevo appena, e
poi i programmi sono andati avanti, via via migliorando (soprattutto quando
ci sono da fare modifiche ora si fanno molto più velocemente).
Le funzioni base sono rimaste in quel modo :)
Ora che ho scoperto adors(campo).type posso slegarmi facendo tre funzion:
FromDBtoTXT (adofield as adodb.field) as string 'per caricare da DataBase a
txt
e una funzione
FromTXTtoDB (txt as textbox,Optional tipo as string) as string'qui il tipo
di dato lo memorizzo nella txt.TAG o lo passo tramite tipo
e infine
FromDBtoDB (adofield as adodb.field) as string
Questa per trasformare le date da formatoDBLettura a formatoDBScrittura (me
le restituisce in formato Win e le vuole in 'mm-gg-aaaa'
Quando faccio adocn.execute INSERT INTO ... VALUE FromDBtoDB(Rs("CAMPO"))
da un recordset e non da una txt

 le restituisce in formato Win e le vuole in 'mm-gg-aaaa'
ADO ti restituisce le date come Date, quindi *senza* alcun formato.
Il db le vuole (se componi stringhe SQL) nel formato specifico di quel 
db. Per Access (e solo per lui) ci vuole quel formato, effettivamente.
Ciao
Alberto


 db. Per Access (e solo per lui) ci vuole quel formato, effettivamente.
Si firebird le vuole nel formato che ti ho detto, o perlomeno in quel modo
le prende correttamente, non so se ci sono altri modi.
Tnx