Contesto:
Applicazione ACCESS che usa tabelle e viste SQL Server
Maschere che usano viste SQL Server
Le viste, in SQL Server, mostrano i valori decimali con ",".
La stessa vista, collegata in ACCESS, mostra alcuni numeri con "," ed altri
con "."
La soluzione "classica" (più volte espressa nelle discussioni) prevede l'uso
di Replace(numero-decimale, ".", ',') quando si verifica il problema.
Purtroppo, questo significa trasformare il numero in stringa; quindi (p.es.):
- non è possibile formattare il numero nel campo (p.es. 1 cifra decimale)
- per effettuare una banale somma dei valori visualizzati, bisogna usare il
"trucco" di trasformare (a ritroso) i valori in numeri, p.es. Origine
controllo =Somma(CSng([nome campo]))
Se poi è necessario permettere all'utente di filtrare i dati inserendo un
valore numerico? Per es. "<0"?
Magari si può creare un filtro del tipo "where CSng([campo]) < 0". Forse
funziona, ma il tutto mi sembra mmmmmoooooolto farraginoso (e inefficiente?).
Insomma, come si può fare in modo che la vista trasferisca numeri?
E pensare che se non ci fosse SQL Server di mezzo non ci sarebbe nessun
problema! Tralascio i casi in cui si opera con le date ...
Qualcuno conosce la "soluzione definitiva"?
Grazie
Ciao francosk,
la rappresentazione dei valori numerici di una vista di Sql server in access
è soggetta alla tabelle presente nel seguente articolo.
----
INFO: Improved ODBC DataType Mappings with Jet 4.0
http://support.microsoft.com/kb/214854/en-us
----
in particolare nota la riga con:
----
SQL_DECIMAL >28 N/A Text Text
----
significa che se hai un campo numerico di tipo Decimal o Numeric e la sua
scala è maggiore di 28, in Access verrà visto come campo testo, quindi ti
ritrovi il separatore decimale . (punto)
La stessa cosa vale per i campi Numeric o Decimal presenti nella vista e
sottoposti alla funzione SUM.
Come ad esempio
----
SELECT Sum(Importo) AS Totale
FROM Tabella
----
dove Importo è un campo Numeric o Decimal con, ad esempio, Scala 18 e
Precisione 2 quindi al di sotto della scala 28.
Perchè allora viene visto come testo ?
Perchè Sql Server quando esegue una sommatoria di un campo Numeric o Decimal
rende un campo avente la scala massima, ovvero 32, quindi al di sopra dei
28.
Vedi:
----
SUM (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms187810.aspx
----
Per risolvere:
Non utilizzare campi di tipo Decimal o Numeric con precisione maggiore di 28
Nelle viste che eseguono calcoli su campi di tipo Numeic o Decimal, eseguire
la conversione con una scala che Access possa interpretare come campo
numerico.
----
SELECT Convert(Numeric(28,2),Sum(Importo)) AS Totale
FROM Tabella
----
Ciao
--
Giorgio Rancati
[Office Access MVP]
ops.. correzione :
> rende un campo avente la scala massima, ovvero 32
rende un campo avente la scala massima, ovvero 38