none
Es posible ? Asignar resultado de consulta a variable RRS feed

  • Pregunta

  • Me preguntaba si es posible asignar el resultado de una consulta a una variable tal y como vemos en este ejemplo y cual seria el mejor metodo para hacerlo.

    fuction precios()

    begin

    select numero_precio into tprecio1 from marg_clie_prov

    where cliente=@cliente and proveedor=@proveedor

    if found=true then begin

    let tprecio=tprecio1

     

    El If found=true then begin tiene algun comando similar en VB2005 ? Este select esta construido en T-SQL y esta incluido dentro de una funcion

     

    Gracias

    • Cambiado Enrique M. Montejo martes, 10 de mayo de 2011 11:46 acceso a datos (De:Lenguaje VB.NET)
    lunes, 18 de diciembre de 2006 18:33

Todas las respuestas

  • Yo te aconsejo que utilices el método ExecuteEscalar de SqlCommand:

    using System;

    using System.Data;

    using System.Data.SqlClient;

    using System.Collections.Generic;

    using System.Text;

    namespace Ejemplo

    {

    class Program

    {

    static void Main(string[] args)

    {

    using (SqlConnection con = new SqlConnection("server=localhost;uid=sa;password=*;database=northwind"))

    {

    con.Open();

    SqlCommand comando = new SqlCommand("SELECT COUNT(*) FROM CUSTOMERS", con);

    int iCount = (int)comando.ExecuteScalar();

    Console.WriteLine("Nº de Clientes {0}", iCount);

    }

    }

    }

    }

    O para recuperar el precio de un producto:

    using System;

    using System.Data;

    using System.Data.SqlClient;

    using System.Collections.Generic;

    using System.Text;

    namespace Ejemplo

    {

    class Program

    {

    static void Main(string[] args)

    {

    using (SqlConnection con = new SqlConnection("server=localhost;uid=sa;password=*;database=northwind"))

    {

    con.Open();

    SqlCommand comando = new SqlCommand("SELECT UnitPrice FROM Products WHERE ProductId=16", con);

    decimal dPrice = (decimal)comando.ExecuteScalar();

    Console.WriteLine("Precio del Producto {0}", dPrice);

    }

    }

    }

    }

     

    Ojo: Debes tener cuidado cuando hagas el casting para trabajar con el tipo de dato que quieres, puesto que executeescalar devuelve object pero en el caso del precio es mejor trabajar con un decimal para tener en cuenta los decimales.

    Salu2.

    lunes, 18 de diciembre de 2006 18:57
  • Mucha gracias por tu respuesta Luis, pero la verdad es que no estoy muy puesto y me he quedado algo perdido con lo del executeescalar.

    Te explico, estoy usando sql express para probar el funcionamiento del programa y si no te parece mal te paso el procedimiento que otro programador hizo en T-SQL para el calculo de precios, como te digo, este es muy rápido mientras que yo necesito hacer lo mismo pero en VB 2005 que es donde estoy trabajando.

    Este procedimiento usa varias funciones como podras ver y este es otro tema donde me he perdido un poco, quizas tu con mas experiencia y viendo el codigo puedas darme una aclaración y ejemplo sobre como crear el mismo procedimiento pero en nuestro VB

        Precios:

     

          select * into warticulos.* from articulos

                where codigo =

     

          select * into wclientes.* from clientes

                where codigo =

     

           let wproveedor = 0

             select proveedor into wproveedor from articulos_proveed

                where articulo =

     

           let wmargen = 0

           let wminimo = 0

           let wdto    = 0

           let tprecio = wclientes.precio

           let wpvp    = 0

     

           let wmargen1 = 0

           let wminimo1 = 0

           let wdto1    = 0

           let wpvp1    = 0

           let tprecio1 = 0

     

     

           if prec_clie != 0 and prec_clie != 999999 then call precios()

           if prec_clie = 0 or prec_clie = 999999 then call todos()

     

     

    function todos()

          declare cursor cprecios1 for

             select codigo into wprecio from precios

                group by 1

          control

                on every row

                call grabar_scra()

            end control

            foreach cprecios1

              begin end

         

          declare cursor cprecios2 for

             select numero_precio into wprecio from margenes_prov

                group by 1

          control

                on every row

                call grabar_scra()

            end control

            foreach cprecios2

              begin end

         

          declare cursor cprecios3 for

             select numero_precio into wprecio from marg_prov_fam

                group by 1

          control

                on every row

                call grabar_scra()

            end control

            foreach cprecios3

              begin end

     

          declare cursor cprecios4 for

             select * into wscra.* from scra

                order by 1

          control

                on every row

                let tprecio = wscra.precio

     

                let wmargen = 0

                let wminimo = 0

                let wdto    = 0

                let wpvp    = 0

     

                let wmargen1 = 0

                let wminimo1 = 0

                let wdto1    = 0

                let wpvp1    = 0

                let tprecio1 = 0

     

                  call ver_precios_prov()

     

                call calcular_precio()

     

                let wmarg_prec_art.pvp = 0

     

                select margen_calculo, margen_minimo, dto_1, pvp into

                   wmargen1, wminimo1, wdto1, wpvp1 from marg_prec_art

                   where articulo = $prec_arti

                     and numero_precio = $wscra.precio

                if wpvp1 != 0 then begin

                      let wpvp = wpvp1

                      let wdto = wdto1

                end

                if wpvp1 = 0 then begin

                      let wpvp = 0

                      let wdto = wdto1

                      let wmargen = wmargen1

                      let wminimo = wminimo1

                      if wminimo = 0 then begin

                         if wdto != 0 then let wminimo = wdto * -1

                      end

                        call calcular_precio()

                end

     

                if wpvp is not null then begin

                   update scra set pvp = $wpvp,

                            dto = $wdto

                      where precio = $wscra.precio

                end

            end control

            foreach cprecios4

              begin end

     

          if prec_clie = 0 then begin

             window scroll from select * from scra

                where pvp != 0

                   order by precio

                14 lines label "Precios" at 1,15

          end

     

          if prec_clie = 999999 then begin

             let warticulos.pvp1 = 0

             let warticulos.pvp3 = 0

             let warticulos.pvp5 = 0

               let warticulos.pvp4 = 0

             declare cursor carticulo for

                select * into wscra.* from scra

                   order by 1

             control

                   on every row

                  if wscra.precio = 1 then let warticulos.pvp1 = wscra.pvp

                  if wscra.precio = 3 then let warticulos.pvp3 = wscra.pvp

                      if wscra.precio = 99 then let warticulos.pvp4 = wscra.pvp

                  if wscra.precio = 25 then let warticulos.pvp5 = wscra.pvp

               end control

               foreach carticulo

                 begin end

     

             update articulos set pvp1 = $warticulos.pvp1,

                      pvp3 = $warticulos.pvp3,

                            pvp4 = $warticulos.pvp4,

                      pvp5 = $warticulos.pvp5

                where codigo = $prec_arti

          end

    end function

     

    function grabar_scra()

    begin

          let wscra.precio = wprecio

          let wscra.pvp = 0

          let wscra.dto = 0

          select * from scra where precio = $wscra.precio

          if found = false then begin

                insert into scra values ($wscra.*)

          end

    end function

     

    function precios()

    begin

           call ver_precios_prov()

     

           select numero_precio into tprecio1 from marg_clie_prov

              where cliente = $prec_clie

                and proveedor = $wproveedor

           if found = true then begin

                let tprecio = tprecio1

                  call ver_precios_prov()

           end

     

           select numero_precio into tprecio1 from marg_clie_fam

              where cliente = $prec_clie

                and proveedor = $wproveedor

                and familia = $warticulos.marca

           if found = true then begin

                let tprecio = tprecio1

                  call ver_precios_prov()

           end

     

           select numero_precio into tprecio1 from marg_clie_art

              where cliente = $prec_clie

                and articulo = $prec_arti

           if found = true then begin

                let tprecio = tprecio1

                  call ver_precios_prov()

           end

     

           select numero_precio, margen_calculo, margen_minimo, dto_1, pvp into

                tprecio1, wmargen1, wminimo1, wdto1, wpvp1 from marg_prec_art

              where articulo = $prec_arti

                and numero_precio = $tprecio

           if found = true then begin

                let tprecio = tprecio1

                if wmargen1 = 0 and wminimo1 = 0 and wpvp1 = 0 then begin

                     call ver_precios_prov()

                end

                if wpvp1 = 0 then begin

                      let wpvp = 0

                      let wdto = wdto1

                      let wmargen = wmargen1

                      let wminimo = wminimo1

                      if wminimo = 0 then begin

                         if wdto != 0 then let wminimo = wdto * -1

                      end

                end

                if wpvp1 != 0 then begin

                      let wpvp = wpvp1

                      let wdto = wdto1

    {

                      let wmargen = 0

    }

                      let wminimo = wminimo1

                      if wminimo = 0 then begin

                         if wdto != 0 then let wminimo = wdto * -1

                      end

                end

           end

     

           call calcular_precio()

     

    end function

     

     

    function calcular_precio()

    begin

           let wpvp2 = 0

           let wcosto = 0

     

           if warticulos.pcio_ult_entrada <> 0 then begin

              let wcosto = warticulos.pcio_ult_entrada

           end

           if wcosto = 0 and warticulos.pcio_net_ult_entr <> 0 then begin

              let wcosto = warticulos.pcio_net_ult_entr

           end

           if wcosto = 0 and warticulos.pcio_costo <> 0 then begin

              let wcosto = warticulos.pcio_costo

           end

     

           if wmargen != 0 and wpvp = 0 then begin

              if wcosto != 0 then begin

                let wpvp =

                   warticulos.pcio_ult_entrada +

                   round((((wcosto * wmargen) / 100)),3)

              end

           end

           if wmargen = 0 and wpvp = 0 then begin

              if wcosto != 0 then begin

                 let wpvp = wcosto

              end

           end

           if wminimo != 0 then begin

                   let wpvp2 =

                     wcosto +

                     round((((wcosto * wminimo) / 100)),3)

           end

     

     

          let wdto_max = 0

          if wpvp != 0 and wpvp2 != 0 then begin

             let wdto_max = wpvp - wpvp2

             let wdto_max = round((((wdto_max * 100) / wpvp)),3)

          end

     

          if wcosto = wpvp then let wdto_max = wdto

     

          let prec_precio = wpvp

          let prec_dto_1  = wdto

          if wdto_max < 0 then let wdto_max = 0

          let prec_dto_max = wdto_max

     

          let prec_margen = wmargen

          let prec_minimo = wminimo

          let prec_numero = tprecio

    end function

     

    function ver_precios_prov()

    begin

           select margen_calculo, margen_minimo, dto_1 into

                wmargen1, wminimo1, wdto1 from precios

              where codigo = $tprecio

           if found = true then begin

                let wmargen = wmargen1

                let wminimo = wminimo1

                let wdto    = wdto1

           end

     

           select margen_calculo, margen_minimo, dto_1 into

                wmargen1, wminimo1, wdto1 from margenes_prov

              where proveedor = $wproveedor

                and numero_precio = $tprecio

           if found = true then begin

                let wmargen = wmargen1

                let wminimo = wminimo1

                let wdto    = wdto1

           end

     

           select margen_calculo, margen_minimo, dto_1 into

                wmargen1, wminimo1, wdto1 from marg_prov_fam

              where proveedor = $wproveedor

                and familia = $warticulos.marca

                and numero_precio = $tprecio

           if found = true then begin

                let wmargen = wmargen1

                let wminimo = wminimo1

                let wdto    = wdto1

           end

    end function

     

    function crear_scra()

    begin

          create temp table scra (

                      precio            integer,

                      pvp         decimal(14,3),

                      dto         decimal(6,2))

               

    end function

    Muchas gracias por tu tiempo y espero puedas ayudarme.

    Un saludo Raziel

    martes, 19 de diciembre de 2006 11:27