xplayn > share your experience     
RSS Feed Login     Password        » Registrati «
  
          Home
  Team & Mission
          News
  Development
  Database
          Pubblicazioni
  Articoli
  Tips
  IMHO
          Risorse
  Guide/Manuali/Tools
  Glossario SQLServer
  Collabora con noi
          Blogs
  Maurizio Tammacco
  Francesco Quaratino
  Renzo Pampani
          Formazione
  Database
 
                Partners
      http://www.dotnetside.org
 
 
Pubblicazioni »
Risolvere espressioni usando SQL
Se si ha la necessità di risolvere un'espressione numerica in Visual Basic e si dispone di una connessione a un qualsiasi database SQL Server (o anche Access), è possibile farlo aprendo un recordset con una semplice interrogazione SQL tipo SELECT < espressione_numerica >. Questa caratteristica può essere sfruttata per risolvere formule contenute in un campo di database previa sostituzione dei valori delle variabili. Di seguito un esempio in VBScript che usa una connessione al database d'esempio Northwind di SQL Server. La valutazione di Err.Number permette di sapere se l'espressione fornita nella query è effettivamente numerica.

VBScript
Dim cnn, rst, connString, formula, sql
On Error Resume Next
formula = "(10 - 5/2) /2"
formula = InputBox("", "Calcola formula", formula)
connString = "DRIVER={SQL Server};DATABASE=Northwind;UID=sa;PWD=;SERVER=(local)"
Set cnn = CreateObject("ADODB.Connection")
cnn.Open connString
Set rst = CreateObject("ADODB.Recordset")
formula = Replace(formula, ",", ".")
sql = "SELECT(" & formula & ") AS Risultato"
rst.Open sql, cnn, 1, 1
If Err.Number <> 0 Then 
   Value = "L'espressione inserita non è un'espressione numerica valida"
Else 
   Value = rst.Fields("Risultato")
End If
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing
MsgBox Value

Si noti come nel codice d'esempio viene fornita di default l'espressione numerica (10 - 5/2) /2), la quale restituisce un valore intero per via del fatto che l'operatore / (divisione) del T-SQL restituisce il tipo di dati dell'argomento con precedenza maggiore (vedi Precedenza dei tipi di dati nel BookOnLine di SQL Server) che in questo caso è intero poichè gli operandi dell'espressione sono entrambi interi. Se questo risultato non è quello sperato, occorre fare un CAST di almeno uno dei due operandi

SELECT CAST( 5 AS DECIMAL) / 2

oppure aggiungere un decimale ad almeno uno dei due operandi

SELECT 5 / 2.0

Se, invece, si sta usando .net, non è più necessario disporre di una connessione attiva in quanto il datatable ed il relativo datacolumn disconnesso prevede la possibilità di inserire colonne il cui valore è calcolato a runtime attraverso una espressione impostata come proprietà.
 
Autore E-Mail Web Site Data
Francesco Quaratino francesco_AT_xplayn.org www.xplayn.org 13/06/2005
      ©Copyright 2005 - xplayn.org