Newsgroup: it.comp.lang.visual-basic
Titolo: [VB+SQL Server] Formattare campi money

Ciao a Tutti!!!
Ho creato una procedura per importare i dati da Access a SQL Server, però
ho un problema che riguarda i campi valuta di access e i campi money di
SQL Server.
Dichiaro 2 variabili mioImportoVendita e mioImportoVenditaCons come
currency
Senza postare tutto il codice, vi descrivo come procedo.
Leggo i dati dalla tabella tbVendita (di Access) e assegno il formato
dell'importo alle seguenti variabili:
mioImportoVendita = Format(mioRsAccess("ImportoVendita"), "##,##0.00")
mioImportoVenditaCons = Format(mioRsAccess("ImportoVenditaCons"),
"##,##0.00")
Creo una Sql per l'inserimento dei dati di Access, nella tabella tbVendita
di SQL Server.
miaSQL = "INSERT INTO
tbVenditaStrumenti(AnnoVendita,ImportoVendita,ImportoVenditaCons,IDAccess)
" & _
"VALUES('" & mioAnnoVendita & "',Convert(money," & mioImportoVendita &
"),convert(money," & mioImportoVenditaCons & "),'" & mioIDVendita & "')"
Ho dovuto usare la funzione Convert, perchè si è generato il seguente
errore:
Errore di run-time '-
2147217913
 (80040e07)
[Microsoft][ODBC SQL Server Driver][SQL Server]
La converisone implicita del tipo di dati da varchar a money, tabella
nomedb.tbVendita, colonna ImportoVendita non è consentita. 
Eseguire la query tramite funzione CONVERT.
Il mio problema è che nella tabella tbVendita di SQL Server, gli importi
non 
sono scritti come in Access.
In Access l'ImportoVendita è 1.586,94 mentre in SQL Server è 1586
In Access l'ImportoVenditaCons è  608.600,00 e in SQL Server è 608600
Ora, come posso fare per scrivere in SQL Server gli importi con lo stesso
formato di Access?
Grazie a Tutti!!!
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 "##,##0.00")
se sono currency, perchè scriverci una variant di tipo string?
che oltretutto, con le impostazioni che quasi sicuramente hai sul pc, trasforma
il numero 2,467.84 in 2.467,84 ?
--
Salutoni
Sergio

[CSSoft] scrisse:

errata corrige...
la conversione implicita da string a currency covrebbe tenere conto delle
impostazioni internazionali...
Resta il fatto che prendi un numero, lo trasformi in stringa, per poi
ritrasformarlo in numero...
--
Salutoni
Sergio

 il numero 2,467.84 in 2.467,84 ?
Ciao Sergio!
Effettivamente se formatto o no le variabili, non cambia niente, perchč
nella tabella SQL Server viene inserito 1586 e non 1.586,94 come in
Access. 


 come in Access.
come ti ho già detto, non lavoro con sql server, quindi è molto possibile che
dica castronerie...
Allora, suppongo che i campi di access da cui leggi i dati siano di tipo
numerico. prova a dimensionare le due variabili come double, mettici dentro i
dati di access senza alcuna formattazione, e poi prova a metterli nella tabella
sql.
Poi vediamo cosa succede (sospetto qualche problema sui decimali, controlla
bene)
--
Salutoni
Sergio

 possibile che dica castronerie...
guardando qui:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/replsql/replhet
_93ar.asp
dice che il campo money di sql server 2000 corrisponde al campo currency di jet
4.0.
se fai
miaSQL = "INSERT INTO
tbVenditaStrumenti(AnnoVendita,ImportoVendita,ImportoVenditaCons,IDAccess)
" & _
"VALUES('" & mioAnnoVendita & "', " & mioRsAccess("ImportoVendita") & ", " &
mioRsAccess("ImportoVenditaCons") & ", '" & mioIDVendita & "')"
(a parte la sintassi precisa, che mi devo essere un po' incartato con l'apertura
e la chiusura delle stringhe, credo che il concetto sia chiaro :-))
Cosa succede?
--
Salutoni
Sergio

> [CSSoft] ha scritto:

I campi che leggo da Access sono di tipo valuta.
Ho provato a dichiarare le variabili che uso come double, ma non cambia
nulla.
Se io nella query inserisco direttamente il valore del record, si genera
l'errore di cui ho parlato nel primo post e sono costretta a usare convert
che è una funzione di SQL Server che converte il tipo di dati di
un'espressione in un altro tipo di dati.
In SQL Server non esiste una funzione Format, ma si usa o Convert o Cast
(quest'ultima funziona in modo simile a Convert).
Non so che fare...mumble mumble.....
--------------------------------
Inviato via 
http://usenet.libero.it

 Non so che fare...mumble mumble.....
ultima stupidaggine, poi passo:
dichiara le due famose variabili come string
prima di darle in pasto a sql cambia i punti in virgole e viceversa (occhio che
devi passare da un carattere intermedio, se no fai pastrocchi)
dalle in pasto all server.
vediamo che succede....
(mi ingrimisco tutto, a scrivere delle cose così, spero solo che il buon wodkino
non le metta nel bestiario... La prossima volta che hai un problema su sql non
provo neanche a risponderti)
--
Salutoni
Sergio

 ha scritto nel messaggio
news:213Z45Z43Z134Y1...@usenet.libero.it...
salve kleila,
mi sembra di capire che fai un ciclo su un cursore e crei la corrispondente
istruzione di Insert  per ogni riga...
hai percaso provato
dim mioImportoVendita as STRING, mioImportoVenditaCons as STRING
mioImportoVendita = Format$(mioRsAccess("ImportoVendita"), "####0.00")
mioImportoVenditaCons = Format$(mioRsAccess("ImportoVenditaCons"),
"####0.00")
che dovrebbe ritornarti 123456.78
se non sei sicura che sia presente il punto come separatore decimale, puoi
aggiungere
mioImportoVendita = replace (mioImportoVendita ,",",".")
mioImportoVenditaCons = replace (mioImportoVenditaCons ,",",".")
miaSQL = "INSERT INTO ....FIELDS(....) VALUES ( " & mioImportoVendita & " ,
" & mioImportoVenditaCons & " , ..... )"
cosi' usi direttamente le stringhe, che e' quello che l'istruzione SQL si
aspetta... il numero sara' cosi' 12345.67
saluti
Andrea Montanari
montanar...@virgilio.it
http://www.asql.biz/DbaMgr.shtm
DbaMgr2k ver 0.3.0  -  DbaMgr ver 0.49.0
(my vb6+sql-dmo little try to provide MS MSDE 1.0 and MSDE 2000 a visual
interface)
--------- remove DMO to reply


Ho fatto come dici tu e ora funziona! sono contenta:)
Non avevo capito che dovevo sostituire il . alla ,
Grazie Mille per l'aiuto!!!!
Buona Serata!!!
Ciao..Ciao!!!


 non le metta nel bestiario...
Beh, però hai centrato il problema!
[CSSoft]
La prossima volta che hai un problema su sql non provo neanche a risponderti
Che fai? Mi abbandoni nel momento del bisogno?:(
Potrai anche non conoscere SQL Server, però mi hai sempre aiutata!:)
Va beh, ora vado...Buona Serata!!!
Ciao...Ciao!!!


[cut]
Scusate se mi intrometto ho sempre letto il ng ma non ho mai scritto ma oggi
mi sono deciso
Io piuttosto che perdersi via con le varie trasformazioni e format Io avrei
due soluzioni
1) Creare un oggetto command che inserisca i dati come parametri del tipo
Set Adocmd = New ADODB.Command
With Adocmd
    Set .ActiveConnection = myConnection
    .CommandText = "INSERT INTO tbVenditaStrumenti
(AnnoVendita,ImportoVendita,ImportoVenditaCons,IDAccess) Values ( ?,?,?,')
    .Parameters.Append px
    Set px = .CreateParameter("pAnnoVendita", adinteger, adParamInput)
    .Parameters.Append px
    Set px = .CreateParameter("pImportoVendita", adcurrency, adParamInput )
    .Parameters.Append px
    Set px = .CreateParameter("pImportoVenditaCons", adcurrency,
adParamInput )
   .Parameters.Append px
    Set px = .CreateParameter("IDAccess", adinteger, adParamInput )
    .Parameters.Append px
End With
Fare un loop sul cursore di access eseguendo ad ogni riga il command dopo
aver impostato i parametri
La cosa però non risulta molto veloce perche il prg prima ottiene il cursore
su access e poi deve eseguire il loop...
2) Cosa più performante sarebbe far eseguire il tutto al jet e che si
dovrebbe risolvere con una riga di codice
con una query che esegue il link in sql tramite ODBC del tipo:
INSERT INTO [ODBC;DRIVER=SQL Server;SERVER="nome
server";UID=sa;PWD=;DATABASE=test].tbVenditaStrumenti
(AnnoVendita,ImportoVendita,ImportoVenditaCons,IDAccess)
SELECT * from [tabellaaccess] where tue condizioni
Quest'ultima e' buttata li ma dovrebbe funzionare fammi sapere ;-)

 Ciao..Ciao!!!
felice di averti aiutata...


 Beh, però hai centrato il problema!
troppo buona.
in realtà, ripensandoci sulla strada verso casa, avevo realizzato che le
cose stavano esattamente così, e mi sono dato dello scemo per non esserci
arrivato prima.
ma soprattutto: perchè non ti sei aperta un bel recordset anche verso la
tabella di sql e non sei andata di addnew, che ci risparmiavamo una marea di
problemi (penso) non dovendo trasformare i campi da numerico a stringa, con
tutti i casini delle impostazioni internazionali?
--
Salutoni
Sergio

 tutti i casini delle impostazioni internazionali?
Ciao Sergio!!!
La tua è un'ottima idea, a cui io non ho pensato! ma per curiosità ho creato
una
procedura che usa il metodo addnew del recordset e devo dire che funziona
senza
problemi. Il codice però l'ho gestito come mi ha detto Andrea Montanari, per
evitare di creare altre procedure. Ora sembra che tutto funzioni.
Grazie Mille per il tuo aiuto e la tua disponibilità!!!
Buona Giornata! :)


 SELECT * from [tabellaaccess] where tue condizioni
Ho provato il tuo codice, ma non sono riuscita ad inserire dati
nella tabella di SQL Server, ma a parte questo non capisco che
differenza c'è fare l'inserimento come fai tu
e quello che faccio io:
miaSQL = "INSERT INTO tbVenditaStrumenti
(AnnoVendita,ImportoVendita,ImportoVenditaCons)" & _
"VALUES('" & mioAnnoVendita & "'," & mioImportoVendita & "," &
mioImportoVenditaCons & ")"
miaconnSQL.Execute miaSQL
Cmq ora, tutto funziona, grazie per l'interesse!!!:)


 Cmq ora, tutto funziona, grazie per l'interesse!!!:)
Se (possibile?) il campo AnnoVendita è testo...

 Se (possibile?) il campo AnnoVendita è testo...
Si, il campo AnnoVendita è testo.
