none
Como puedo sumar datos de en tablas relacionadas? RRS feed

  • Pregunta

  • Hola, me gustaría que me puedan guiar o colaborar con esto que estoy intentando hacer.

    Tengo estas 3 tablas relacionadas:

    Create table Producto(
    id bigint primary key,
    NombreProducto varchar(90) not null,
    DescripcionPorducto varchar(90) not null,
    Precio float not null
    )

    Create table Pedido(
    id bigint primary key,
    FechaPedido datetime not null,
    EstadoPedido integer not null default(1),
    idCliente bigint references Cliente(id)
    )

    Create table DetallePedido(
    idPedido bigint  references Pedido(id),
    idProducto bigint  references Producto(id),
    primary key (idPedido, idProducto),
    Cantidad float not null, 
    PrecioCompra float not null
    )

    En la tabla producto cuento con los campos de id,nombreproducto,descripcion y precio, en el puedo hacer un insert, update y delete, ahí todo bien, mi pregunta es: Cómo puedo insertar datos en la tabla DetallePedido que al insertar me sume el precio total en PrecioCompra?

    Por ejemplo, en la tabla producto tengo los datos: id = 1, NombreProducto = Laptop, Descripcion = HP, Precio = 2000
    En la tabla DetallePedido: idPedido = 1, idProducto = 1, Cantidad = 2, PrecioCompra = (En este campo necesito que me sume y me inserte 4000 porque en cantidad hay 2 productos que se esta comprando.

    Espero me puedan guiar o colaborar.
    lunes, 19 de abril de 2021 19:23

Todas las respuestas

  • Que hay KaLuKaLuSoft

    Creo que en tu tabla DetallePedido te hace falta la columna Total para que puedas ingresar el importe total de la compra; esto puedes hacerlo con una multiplicación total=cantidad*precio y así te ingresará los 4000.

    No encuentro otra forma para que tengas almacenada la información, si solamente quieres que quede como información visible, entonces solamente puedes hacer lo siguiente:

    'Total'=(Cantidad*PrecioCompra)

    Y así tienes el total de la compra como tal. Pero insisto en que te falta esa columna en tu tabla para que tengas la información completa.

    Saludos.

     
    lunes, 19 de abril de 2021 19:32
  • Hola KaluKaluSoft:

    La pregunta es muy ambigua para darte una solución, ya que el escenario es muy pero que muy diverso. Al menos tanto como negocios diferentes existen.

    ¿Los artículos, solo pueden tener un precio de compra?, ¿Qué pasa, cuando sea en vez de un pedido, sea una factura de venta? ¿Qué pasa cuando el producto, vaya pasando el tiempo, y el pedido tiene una fecha, no va a cambiar?..... Existen muchas variantes, posibles, que hacen que el precio, no sea una propiedad del artículo.

    Otra opción. ¿No se puede comprar o vender a un precio diferente del artículo? ¿No se pueden hacer rebajas?

    Lo más normal, es que el precio del artículo, se herede en la líea del pedido, pero sea la linea del pedido, la que contenga esta información, y la guarde. Por ejemplo, la línea del pedido que se hizo en el año 2000, tiene que tener la información del precio que se le imputó en esa fecha, y no el precio que tiene hoy.

    Depende de la aplicación que estés implementando en el lenguaje que lo estés haciendo, lo más normal es que cuando se buscan los detalles del artículo, para presentarlos, en la línea de venta, se traslade también el precio. Luego se marcan las unidades a comprar por parte del usuario, y se calcula en el lenguaje cliente, el precio, para guardar la información según lo que detalla el lenguaje cliente. Eso no quiere decir que el usuario lo pueda manipular, ya dependerá de la lógica de la aplicación.

    Otra consideración a tener en cuenta, en las lineas de detalle, son la descripción (o concepto), que tiene el articulo, porque normalmente se puede modificar, y los impuestos que conlleva. Ya que hoy puede tener un impuesto, pero mañana, el impuesto cambia. Pero la linea que pedimos hoy tenía y tiene que tener esa información.

    Y por supuesto todo depende de lo que estés intentando implementar y del tipo de negocio, y de hasta donde quieras llegar, porque se puede necesitar infinidad de información en cada linea.


    lunes, 19 de abril de 2021 19:49
  • Hola KaluKaluSoft:

    La pregunta es muy ambigua para darte una solución, ya que el escenario es muy pero que muy diverso. Al menos tanto como negocios diferentes existen.

    ¿Los artículos, solo pueden tener un precio de compra?, ¿Qué pasa, cuando sea en vez de un pedido, sea una factura de venta? ¿Qué pasa cuando el producto, vaya pasando el tiempo, y el pedido tiene una fecha, no va a cambiar?..... Existen muchas variantes, posibles, que hacen que el precio, no sea una propiedad del artículo.

    Otra opción. ¿No se puede comprar o vender a un precio diferente del artículo? ¿No se pueden hacer rebajas?

    Lo más normal, es que el precio del artículo, se herede en la líea del pedido, pero sea la linea del pedido, la que contenga esta información, y la guarde. Por ejemplo, la línea del pedido que se hizo en el año 2000, tiene que tener la información del precio que se le imputó en esa fecha, y no el precio que tiene hoy.

    Depende de la aplicación que estés implementando en el lenguaje que lo estés haciendo, lo más normal es que cuando se buscan los detalles del artículo, para presentarlos, en la línea de venta, se traslade también el precio. Luego se marcan las unidades a comprar por parte del usuario, y se calcula en el lenguaje cliente, el precio, para guardar la información según lo que detalla el lenguaje cliente. Eso no quiere decir que el usuario lo pueda manipular, ya dependerá de la lógica de la aplicación.

    Otra consideración a tener en cuenta, en las lineas de detalle, son la descripción (o concepto), que tiene el articulo, porque normalmente se puede modificar, y los impuestos que conlleva. Ya que hoy puede tener un impuesto, pero mañana, el impuesto cambia. Pero la linea que pedimos hoy tenía y tiene que tener esa información.

    Y por supuesto todo depende de lo que estés intentando implementar y del tipo de negocio, y de hasta donde quieras llegar, porque se puede necesitar infinidad de información en cada linea.


    Es un trabajo práctico de la universidad y esos datos nos dieron, todo es en sql server
    lunes, 19 de abril de 2021 19:56
  • Que hay KaLuKaLuSoft

    Creo que en tu tabla DetallePedido te hace falta la columna Total para que puedas ingresar el importe total de la compra; esto puedes hacerlo con una multiplicación total=cantidad*precio y así te ingresará los 4000.

    No encuentro otra forma para que tengas almacenada la información, si solamente quieres que quede como información visible, entonces solamente puedes hacer lo siguiente:

    'Total'=(Cantidad*PrecioCompra)

    Y así tienes el total de la compra como tal. Pero insisto en que te falta esa columna en tu tabla para que tengas la información completa.

    Saludos.

     
    El PrecioCompra de la tabla DetallePedido es el Total como mencionas, porque ahí se detalla que se compra 2 laptop a un precio de 2000 cada una, en PrecioCompra tiene que insertarse el monto total de la compra.
    lunes, 19 de abril de 2021 20:00
  • Te sugeriría que cambiaras un poco la estructura de tus tablas, usando tus ejemplos las acomodé de la siguiente forma:

    Pedido:

    Create table Producto(
    idproducto bigint primary key,
    NombreProducto varchar(90) not null,
    DescripcionPorducto varchar(90) not null,
    Precio float not null
    )

    Pedido:

    Create table Pedido(
    idpedido bigint primary key,
    Cantidad float not null,
    FechaPedido datetime not null,
    EstadoPedido integer not null default(1),
    idProducto bigint  references Producto(idproducto),
    idCliente bigint references Cliente(idcliente)
    )

    DetallePedido:

    Create table DetallePedido(
    idDetPedido bigint  references Pedido(idpedido),
    idProducto bigint  references Producto(idproducto),
    primary key (idDetPedido, idProducto), 
    PrecioCompra float not null
    )

    Como podrás ver, en cada tabla puse el nombre del Id diferente, esto para que al momento que realices una búsqueda o cualquier tipo de búsqueda, puedas realizarla sin problemas e identifiques con claridad cada tabla y del mismo modo,  cambié la columna Cantidad de DetallePedido a Pedido.

    Ahora hice algunos insert en cada una de las tablas:

    Producto:

    INSERT INTO Producto (idproducto,NombreProducto,DescripcionPorducto,Precio) VALUES
    (1,'Laptop','HP',2000)

    Pedido:

    INSERT INTO Pedido (idpedido,Cantidad,FechaPedido,idProducto,idCliente) VALUES
    (1,2,GETDATE(),1,1)

    DetallePedido:

    INSERT INTO DetallePedido (idDetPedido,idProducto,PrecioCompra) VALUES
    (1,1,(SELECT P.PRECIO*D.Cantidad FROM PRODUCTO P INNER JOIN Pedido D ON (P.idproducto=D.idProducto)))

    De esta forma (al menos yo) logré conseguir lo que necesitabas, que en PrecioCompra te de el valor de 4,000

    Ahora como sugerencia, al estar trabajando con ID en cada tabla y estar relacionadas, te sugiero que el ID de cada tabla lo hagas autoincrementable para que no tengas problemas de inserción e intentes duplicar un ID. Para eso solamente agrega IDENTITY (1,1) después de bigint en cada una de tus tablas en su ID principal. Algo así:

    Create table Producto(
    idproducto bigint primary key IDENTITY (1,1),
    NombreProducto varchar(90) not null,
    DescripcionPorducto varchar(90) not null,
    Precio float not null
    )

    Y así el Idproducto se irá incrementando automáticamente sin que tú lo tengas que ingresar.

    No se si es lo que necesites o lo que buscabas, pero de igual forma te hago llegar mi idea y sugerencia.

    Saludos.


    lunes, 19 de abril de 2021 21:09
  • Hola KaluKaluSoft:

    Tienes dos opciones a priori aceptables para el ejercicio.

    Una es utilizar un procedimiento almacenado, para realizar las inserciones en la tabla detalle pedido, de manera que dentro del procedimiento buscas los datos de la tabla de productos

    Create procedure dbo.DetallePedido_AddLinea(
    	@idPedido bigint,
    	@idProducto bigint
    	@Cantidad float
    )
    As
    Begin
    
    Insert into dbo.DetallePedido(idPedido, idProducto, Cantidad, PrecioCompra)
    Select @idPedido, @idProducto, @cantidad, Precio*@cantidad 
    From dbo.Producto 
    	where id = @idProducto;
    End;

    Asi las inserciones, si las pasas por el mismo, ya tiene los datos de producto.

    La otra opción es crear un trigger after insert.

    Create trigger dbo.DetallePedidoAfterInsert on dbo.detallePedido
    After insert
    As
    Begin
    
    Update detallePedido set PrecioCompra = Cantidad * Producto.Precio
    	From inserted inner join Producto on inserted.idProducto = Producto.id;
    End 

    Luego cuando insertas no pones el precioCompra y este se recalcula solo.

    Al dispararse la inserción de detallePedido, updateamos el contenido de la columna, recogiendo el dato de producto.

    Trigger after insert

    https://javifer2.wordpress.com/2020/04/12/trigger-que-es-como-se-hace-y-como-funciona-after-for-insert/

    • Propuesto como respuesta Alejandro 0991 martes, 20 de abril de 2021 17:33
    martes, 20 de abril de 2021 11:01