none
Traer total de un precio desde la base de datos RRS feed

  • Pregunta

  • Tengo que listar este procedure sp_PrecioTotal en un text box para mostrarle el monto total al cliente con las formas que eh probado el text box carga un 0 si me dan alguna ayuda de como traer el monto, lo controlo con la cedula estoy trabajando en 3 capas c#

    reate proc sp_PrecioTotal
    @cedula nvarchar(50)
    as
    select sum (a.precio*c.Cantidad)AS 'PrecioTotal',b.Cedula  from Articulos a , Cliente b, Carrito c 
    where b.Cedula=@cedula and a.Codigo=c.codigo group by b.Cedula

    Este es el metodo que programe en la capa de Persistencia

    public override object Cargar(string pSentencia, object pClave)
            {
                Pedido unPedido = new Pedido();
                SqlDataReader dr;

                try
                {
                    AbrirConexion();
                    SqlCommand comando = new SqlCommand(pSentencia, conn);
                    comando.CommandType = CommandType.StoredProcedure;

                    SqlParameter parClave = new SqlParameter("@cedula", SqlDbType.NChar);
                    parClave.Value = Convert.ToString(pClave);
                    comando.Parameters.Add(parClave);
                    dr = comando.ExecuteReader();
                    while (dr.Read())
                    {
                        
                        pCliente objCliente = new pCliente();
                        objCliente.Cargar("sp_cargarCliente", Convert.ToString(dr["cedula"]));
                    }


                    return unPedido;

                }


    jueves, 5 de marzo de 2015 21:42

Todas las respuestas

  • hola

    no entiendo que hace la funcionalidad dentel del while ?

    porque parece que invocas otro procedure, pero no era que querias volcar los datos a controles ?

    ademas cual es la idea de agrupar por cedula si estas filtrando por esta

    select sum (a.precio*c.Cantidad)AS 'PrecioTotal' from Articulos a , Cliente b, Carrito c 
    where b.Cedula=@cedula and a.Codigo=c.codigo


    y podrias usar el ExecuteScalar()

    decimal precio = Convert.ToDecimal(comando.ExecuteScalar());

    Nota: recomiendaria uses INNER JOIN para unir las tablas en la query

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 5 de marzo de 2015 22:02
  • La query la agrupo por cedula porque sino me hace la suma de todo y yo quiero el total de compra de cada cliente,que tendria que cambiarle al metodo para traer esa consulta para cada cliente ? 

    • Editado Alexis2494 jueves, 5 de marzo de 2015 22:54
    jueves, 5 de marzo de 2015 22:52
  • pero entonces tienes que agrupar por cliente no por cedula

    o al cedula hace referencia a la cedula de identidad ?

    ----

    lo que no entiendo es porque agrupar por cedula si despues filtras por esta misma

    -si vas a taer todos no envias ningun parametros

    -si solo vas a traer un solo cliente entonces si defines el parametro, pero no agrupas

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 6 de marzo de 2015 0:17
  • Si es la cedula de identidad, asi es como tengo programada las tablas, la  forma de listar el total de la compra del cliente es atraves del agrupamiento ya que el precio lo tengo en articulos y cantidad en carrito, lo que tengo que hacer con esta consulta es mostrarsela al cliente en la web form Registro del pedido y luego guardar dicho valor en la tabla pedido en el campo total el tema mio es como hacer para mostrarle la consulta y luego guardar el valor que tengo que cambiarle al metodo para hacer eso?

    create table Articulos
    (
    Codigo int primary key  not null,

    NombreArt nvarchar(50) not null, 
        Precio float not null,
        Stock int not null,
        DescripcionArt nvarchar(100) not null,
        Imagen nvarchar(50) not null,
    CodigoCat int not null foreign key references Categoria (CodigoCat)
    )

    create table Usuario
    (
    Cedula nvarchar(50)primary key not null,
        Nombre nvarchar(50) not null,
        Apellido nvarchar(50) not null,
        NombreUsuario nvarchar(50) not null,
        Contraseña nvarchar(300) not null
    )

    create table Cliente
    (
    Cedula nvarchar(50)  not null,
    TarjetaCredito nvarchar(100) not null,
        DireccionEnvio nvarchar(50) not null,
        primary key (Cedula),
        foreign key (Cedula) references Usuario(Cedula)


    create table Administrador
    (
    Cedula nvarchar(50)  not null,
    Cargo nvarchar(50) not null,
        primary key (Cedula),
        foreign key (Cedula)references Usuario(Cedula)


    create table Carrito
    (
    Codigo int not null foreign key references Articulos(Codigo),
        Cedula nvarchar (50) not null foreign key references Cliente(Cedula),
        Fecha datetime not null,
        Cantidad int not null,

    )

    create table Pedido
    (
    IdPedido int not null identity (1,1),
    Codigo int not null foreign key references Articulos(Codigo),
    Cedula nvarchar (50) not null foreign key references Cliente(Cedula),
        Estado nvarchar(50),
        Fecha datetime not null,
        Total float not null,
    primary key (IdPedido)    
    )



    • Editado Alexis2494 viernes, 6 de marzo de 2015 1:45
    viernes, 6 de marzo de 2015 1:33
  • Hola,

    Sí lo que deseas es mostrar el total de lo que tienes cargado en el carrito de compras es simple:

    create proc sp_PrecioTotal
      @cedula nvarchar(50)
    as
    begin
      select
        a.Cedula,
        sum(b.Cantidad * b.precio)
      from
        Carrito a
        inner join Articulos b on (b.Codigo = a.Codigo)
      where
        (a.Cedula = @cedula)
    end

    Te sugiero que el precio esté en la tabla Carrito.

    viernes, 6 de marzo de 2015 2:25
  • Gracias por su ayuda!!!, ahora mi problema es como mostrar este procedure al cliente y después que se guarde en la tabla pedido, como tendría que programar los métodos en la capa de persistencia y de reglas del negocio? 
    viernes, 6 de marzo de 2015 4:29
  • >>ahora mi problema es como mostrar este procedure al cliente y después que se guarde en la tabla pedido

    sigo sin entender lo que quiers lograr

    el procedure que arma William  le falta el GROUP BY, pero no entiendo la finalidad, no se si me explico, agrupar por el mismo campo por el cual filtras o sea el resultado sera un solo registro

    lo que hizo William es equivalente a usar

    create proc sp_PrecioTotal
      @cedula nvarchar(50)
    as
    begin
      select
        sum(b.Cantidad * b.precio)
      from
        Carrito a
        inner join Articulos b on b.Codigo = a.Codigo
      where
        a.Cedula = @cedula
    end

    devuelves un valor solo que seria la suma de cantidades y precios para esa cedula

    si haces esto usas el ExecuteScalar() para tomar un unico valor

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    sábado, 7 de marzo de 2015 15:27
  • Lo que quiero lograr es mostrarle el detalle de lo que compro al cliente más el precio total en un gridview dentro del cual le permita tambien  eliminar artículos del gridview, como puedo perfeccionar el método que escribí abajo para persistir el procedure. Usando el ExecuteScalar() 

    public override object Cargar(string pSentencia, object pClave)
            {
                Pedido unPedido = new Pedido();
                SqlDataReader dr;

                try
                {
                    AbrirConexion();
                    SqlCommand comando = new SqlCommand(pSentencia, conn);
                    comando.CommandType = CommandType.StoredProcedure;

                    SqlParameter parClave = new SqlParameter("@cedula", SqlDbType.NChar);
                    parClave.Value = Convert.ToString(pClave);
                    comando.Parameters.Add(parClave);
                    dr = comando.ExecuteReader();
                    while (dr.Read())
                    {
                        
                        pCliente objCliente = new pCliente();
                        objCliente.Cargar("sp_cargarCliente", Convert.ToString(dr["cedula"]));
                    }


                    return unPedido;

                }

    sábado, 7 de marzo de 2015 21:01