none
Ejecutar Formula RRS feed

  • Pregunta

  • Hola amigos, tengo una consulta que hacerles:

    El escenario es el siguiente:

    Estoy realiando un sistema con asp.net y sql server 2008. En este sistema tengo una tabla variables, donde almaceno la descripcion de una variables, otra tabla valores variable, donde guardo los valores de la variable, una tabla formula, que mediante un formulario construye una formula con las variables, por ejemplo

    (V10+V20)/100% -- Fórmula. Cada variable tienen un valor por ejemplo: V10=15, V20=30.... y asi con todas las variables.

    La pregunta es como puedo hacer para ejecutar dicha formula es decir pare obtener el resultado de la fórmula mediante los valores.

     

     


    Programador de VB.NET & SQL

    jueves, 23 de febrero de 2012 18:44

Respuestas

  • Hola.

    Nada te impide consultar la tabla de variables, la tabla de valores y la tabla de fórmulas, ir guardando los datos en parámetros y luego construir y/o resolver las fórmulas. Quizá puede ser un poco laborioso, pero si construyes las fórmulas de una manera ordenada, no será tan difícil. Por ejemplo, dales nombres fijos, en la línea en la que vas (V10 para el primer dato, V20 para el segundo, etc.). Te facilitará luego al remplazar los campos por sus valores.

    Un truco que te sugiero es emplear sp_executesql. Así, podrás ir cambiando variables por parámetros y ejecutarlo de una forma mucho más simple. Por ejemplo:

    --(V10+V20)/100
    declare @formula nvarchar(max) = '(V10+V20)/100'--> en tu caso, se extraería de una tabla
    declare @valor1 numeric(5,2), @valor2 numeric(5,2)
    select @valor1 = 37.5, @valor2 = 43.1
    --> Esto también deberías guardarlo en la tabla de las fórmulas, la lista de variables con sus tipos de datos
    declare @listaparametros nvarchar(max) = '@V10 numeric(5,2), V20 numeric(5,2)'
    
    
    --> Antepones una arroba a cada "V"
    select @formula = 'select ' + replace(@formula, 'V', '@V') --> 'select (@V10+@V20)/100'
    
    --> y lo ejecutas
    exec sp_executesql @formula, @listaparametros, @valor1, @valor2
    
    
    

    Lo he hecho a mano alzada, pero creo que se capta la idea. Inténtalo, si no lo logras, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/ Sígueme en twitter en http://twitter.com/qwalgrande

    • Marcado como respuesta datexcito99 viernes, 24 de febrero de 2012 18:45
    jueves, 23 de febrero de 2012 20:39
    Moderador

Todas las respuestas

  • Hola.

    Nada te impide consultar la tabla de variables, la tabla de valores y la tabla de fórmulas, ir guardando los datos en parámetros y luego construir y/o resolver las fórmulas. Quizá puede ser un poco laborioso, pero si construyes las fórmulas de una manera ordenada, no será tan difícil. Por ejemplo, dales nombres fijos, en la línea en la que vas (V10 para el primer dato, V20 para el segundo, etc.). Te facilitará luego al remplazar los campos por sus valores.

    Un truco que te sugiero es emplear sp_executesql. Así, podrás ir cambiando variables por parámetros y ejecutarlo de una forma mucho más simple. Por ejemplo:

    --(V10+V20)/100
    declare @formula nvarchar(max) = '(V10+V20)/100'--> en tu caso, se extraería de una tabla
    declare @valor1 numeric(5,2), @valor2 numeric(5,2)
    select @valor1 = 37.5, @valor2 = 43.1
    --> Esto también deberías guardarlo en la tabla de las fórmulas, la lista de variables con sus tipos de datos
    declare @listaparametros nvarchar(max) = '@V10 numeric(5,2), V20 numeric(5,2)'
    
    
    --> Antepones una arroba a cada "V"
    select @formula = 'select ' + replace(@formula, 'V', '@V') --> 'select (@V10+@V20)/100'
    
    --> y lo ejecutas
    exec sp_executesql @formula, @listaparametros, @valor1, @valor2
    
    
    

    Lo he hecho a mano alzada, pero creo que se capta la idea. Inténtalo, si no lo logras, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/ Sígueme en twitter en http://twitter.com/qwalgrande

    • Marcado como respuesta datexcito99 viernes, 24 de febrero de 2012 18:45
    jueves, 23 de febrero de 2012 20:39
    Moderador
  • Hola amigo, gracias por responder.... tu solucion esta super buena funciona a todo dar y es justo lo que necesitaba, pero ahora el problema que tengo a ver si me puedes dar una mano para terminar esta parte del sistema.

    El problema que te acabo de mencionar es que como te habrás dado cuenta la formula varia en cuanto al tamaño de sus variables es decir pueden ser:

    (V10+V20/V30)+ V50 .....etc existen varias formulas diferentes y por ende cada variable tienen un valor, el problema que tengo es al ejecutar. Es decir recupero los valores de cada variable pero como varian como haria para que no solo sean 2 valores ni tres sino que sea dinamico segun corresponda.

    exec sp_executesql @formula, @listaparametros, @valor1, @valor2

    aqui se supone que los valores (@valor1, @valor2 ) dependen de la cantidad de variables. Espero tu respuesta mi amigo.....gracias



    Programador de VB.NET & SQL

    viernes, 24 de febrero de 2012 3:38
  • Hola.

    Parametrízalo. Añade campos adicionales a la tabla fórmula que te permitan saber qué número de variables tienes y carga en función de ello. Luego, como entiendo que no habrá tanta diversidad de casos, con un simple conjunto de if..else if.. else... dejas preparado una ejecución para cada caso (con 1 variable, 2, 3, 4, 5,..). 

    Inténtalo por ti mismo y si no lo logras, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/ Sígueme en twitter en http://twitter.com/qwalgrande

    viernes, 24 de febrero de 2012 7:59
    Moderador
  • Bueno te comentare que aparte del tabla formula tengo otra en la que guardo el detalle de la formula, lo diseñe asi pensando en que me podria ser de utilidad. Aqui guardo la formula pero desmenuzda es decir si la formula es: V10+ V20 + 20 , en la tabla detalle la guarado asi

    V10       V

    +           O

    V20        V

    +           O

    20         N

    Donde (v-o-n) son los tipos de datos; variable, operador numero............. bueno con esto puedo saber que tengo dos variables y por ende dos parametros @V10 y @V20, ahora mi problema esta al momento de enviarle los valores a estos parametros, en este caso serian dos valores, ppero cuando la formula varie seian 3 o 4 etc.

    Te pregunto, como puedo hacer para enviar estos valores dinamicamente al momento de ejecutar la consulta:

    exec

      sp_executesql @formula, @listaparametros, @valor_val1, @valor_val2Estuve pensando en enviarlo como la ListaParametros, en una lista de valores :

    exec sp_executesql @formula, @listaparametros,@ListaValores

    pero me sale error, debido a que la lista la declaro como nvarchar() y esta son valores numericos como ya sabes. Alguna idea para solucionar esto.... ??... El punto que me dices anteriormnete no entiendo a que te refieres, perdona las preguntas pero soy nuevo en esto. gracias por tu ayuda de antemano.


    Programador de VB.NET & SQL

    viernes, 24 de febrero de 2012 15:11