Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Sumar los productos que corresponden a la factura (https://www.clubdelphi.com/foros/showthread.php?t=76045)

JairoC 05-10-2011 23:52:04

Sumar los productos que corresponden a la factura
 
Hola gente del foro.... Estoy haciendo un sistema de facturacion. Tengo dos tablas: Facturas(id_factura, numero, totalfactura) Detalle(id_detalle, id_factura, id producto, cantidadproducto, preciounitario, totalproducto). Lo que quiero hacer es: cuando apreto el boton agregar producto, me sume todos los productos q correspoden a esa factura... osea una consulta sql con facturas.id_factura y detalle.id_factura... Gracias....

ecfisa 06-10-2011 00:12:43

Hola JairoC.

Si no te estoy entendiendo mál, creo que podrías hacer:
Código SQL [-]
SELECT SUM(T1.TOTALPRODUCTO) AS TOTAL
FROM DETALLE T1, FACTURA T2
WHERE T1.ID_FACTURA = T2.ID_FACTURA
O también:
Código SQL [-]
SELECT SUM(T1.TOTALPRODUCTO) AS TOTAL
FROM DETALLE T1
INNER JOIN FACTURA T2 ON T1.ID_FACTURA = T2.ID_FACTURA

Saludos.

JairoC 07-10-2011 20:54:24

Sumar los productos que corresponden a la factura
 
Gracias ecfisa... Ahora me sale un error de que no encuentra el ID_DETALLE...

JairoC 07-10-2011 21:03:49

Sumar los productos que corresponden a la factura
 
TE ENVIO EL CODIGO, PARA QUE VEA SI VOY BIEN ENCAMINADO...
Código Delphi [-]
          begin
             try

             //FACTURA_DE_VENTAS

               DM.IBDataSet_FacturasVentasNUMERO.Value:= DM.IBQuery_NumerosNUMERO.Value;//NUMERO DE FACTURA...
               DM.IBDataSet_FacturasVentasCONDICION.Value:=ComboBox_CondicionVenta.Text;
               DM.IBDataSet_FacturasVentasTIPO_FACTURA.Value:=Label_Factura.Caption;
               DM.IBDataSet_FacturasVentasFECHA.Value:=DTPFecha.Date;
         
               IF ComboBox_Comprador.Text ='CLIENTE' THEN
                   DM.IBDataSet_FacturasVentasID_CLIENTE.Value:= DM.IBDataSet_ClientesID_CLIENTE.Value
               ELSE
                   DM.IBDataSet_FacturasVentasID_EMPLEADO.Value:=DM.IBDataset_EmpleadoID_EMPLEADO.Value;
               //DM.IBDataSet_FacturasVentasID_CAJA
               if CheckBox_Reparto.Checked=True then
                  DM.IBDataSet_FacturasVentasREPARTO.Value:='SI'
               else
                  DM.IBDataSet_FacturasVentasREPARTO.Value:='NO';
               DM.IBDataSet_FacturasVentasESTADO.Value:=1;
               DM.IBDataSet_FacturasVentas.Post;
              //DETALLE_VENTAS

               DM.IBDataSet_DetalleVentasESTADO.Value:=1;
               DM.IBDataSet_DetalleVentasID_FAC_V.Value:= DM.IBDataSet_FacturasVentasID_FAC_V.Value;
               DM.ibdataset_detalleventasPRODUCTO.Value:=DBLookupComboBoxAltaProductoFactura.Text;
               DM.IBDataSet_DetalleVentasPRECIO_UNITARIO.Value:=DM.IBDataSet_ProductosPRECIO_UNITARIO.Value;
               DM.IBDataSet_DetalleVentas.Post;
               DM.Transaction.CommitRetaining;
               ShowMessage('Producto agregado.');
               with (DM.IBQuery_DetalleVenta)do
               begin
                  SQL.Clear;
                  SQL.Add('SELECT SUM(T1.TOTAL) AS TOTALP FROM DETALLE_VENTAS T1, FACTURAS_DE_VENTAS T2 WHERE T1.ID_FAC_V = T2.ID_FAC_V');  
                  // Acá me sale el error...
               end;
               DM.IBDataSet_DetalleVentas.Append;
             except
               DM.IBDataSet_DetalleVentas.Cancel;
               DM.Transaction .RollbackRetaining;
             end;
          end;

oscarac 07-10-2011 21:04:03

puedes colocar como quedo tu consulta?

Caral 07-10-2011 21:09:25

Hola
Tienes un query que se llama IBQuery_DetalleVenta.
Dale doble click y quitale los campos que estan en esa pantalla pequeña.
Saludos

JairoC 07-10-2011 21:20:13

Gracias!!!! Ahora no sale el error... Cómo hago para guardar el resultado de la suma al campo TOTAL de la tabla FACTURA_DE_VENTAS???

ecfisa 07-10-2011 21:21:06

Hola JarioC.

Te borré un mensaje por que aparentemente (el código es extenso) contenía el mismo texto que el anterior.
Te ruego que me hagas saber si lo enviaste dos veces por error, así lo borro en forma definitiva o si tenía algún cambio que se me pudiera haber pasado y en ese caso lo restauro.

Muchas gracias.:)

JairoC 07-10-2011 21:23:44

lO ENVIE SIN QUERER..PERDON..

Caral 07-10-2011 21:35:56

Hola
No entiendo.
Tienes un consulta sql que te da el total del query IBQuery_DetalleVenta, por lo tanto este contiene lo que se llama un field.
ESte field es el que necesitas para ingresarlo en donde quieras, un ejemplo:
Quieres que este field este en una variable y luego en donde quieras:
Código Delphi [-]
Var A: Real;
// todo lo demas
// etc......
// la consulta sql:
 with (DM.IBQuery_DetalleVenta)do
               begin
                  SQL.Clear;
                  SQL.Add('SELECT SUM(T1.TOTAL) AS TOTALP FROM DETALLE_VENTAS T1, FACTURAS_DE_VENTAS T2 WHERE T1.ID_FAC_V = T2.ID_FAC_V');  
             DM.IBQuery_DetalleVenta.Open;
          A:= DM.IBQuery_DetalleVenta.Fields[0].AsFloat; // le das el dato a la variable A.  
               end;
Ahora si, haces lo que quieras con la variable A.
Por ahí anda el asunto.
Saludos

JairoC 07-10-2011 22:11:48

No hay caso :-( ... Soy novato en en esto... Lo que quiero hacer es guardar la suma de la consulta SQL.Add('SELECT SUM(T1.TOTAL) AS TOTALP FROM DETALLE_VENTAS T1, FACTURAS_DE_VENTAS T2 WHERE T1.ID_FAC_V = T2.ID_FAC_V'); en el campo TOTAL de la tabla FACTURAS_DE_VENTAS... Y no se como hacerlo...

Caral 07-10-2011 22:16:01

Hola
No es complicado, solamente que no lo tienes claro.
Este dato lo quieres colocar en otra tabla o en la misma?
Recuerda que no estamos al lado tuyo, no sabemos nada, tienes que ser mas especifico.
Saludos

JairoC 07-10-2011 22:21:23

Ok, le explico bien... Tengo dos tablas: FACTURA_DE_VENTAS (ID_FACTURA, NUMERO, ID_CLIENTE, TOTAL) Y DETALLE_VENTAS (ID_DETALLE, ID_FACTURA, ID PRODUCTO, PRECIO UNITARIO)
Lo que quiero conseguir es: que cuando apreto el boton, me sume los totales de cada producto (CAMPO TOTAL.DETALLE_VENTAS) y a ese resultado me lo guarde en (CAMPO TOTAL.FACTURAS_DE_VENTAS)...

Caral 07-10-2011 22:39:37

Hola
Lo que quieres hacer se llama UpDate.
Tienes un numero de factura que es la que (por logica) va a contener el total de esa venta, es asi?.....
Ya sabemos que la consulta nos da el total.
Ese total lo vamos a pasar al campo TOTAL.FACTURAS_DE_VENTAS de la MISMA tabla, es asi?....
Bien:

Código Delphi [-]
var Dato: Real; // creamos la variable que contendra el dato
begin
             try

             //FACTURA_DE_VENTAS

               DM.IBDataSet_FacturasVentasNUMERO.Value:= DM.IBQuery_NumerosNUMERO.Value;//NUMERO DE FACTURA...
               DM.IBDataSet_FacturasVentasCONDICION.Value:=ComboBox_CondicionVenta.Text;
               DM.IBDataSet_FacturasVentasTIPO_FACTURA.Value:=Label_Factura.Caption;
               DM.IBDataSet_FacturasVentasFECHA.Value:=DTPFecha.Date;
         
               IF ComboBox_Comprador.Text ='CLIENTE' THEN
                   DM.IBDataSet_FacturasVentasID_CLIENTE.Value:= DM.IBDataSet_ClientesID_CLIENTE.Value
               ELSE
                   DM.IBDataSet_FacturasVentasID_EMPLEADO.Value:=DM.IBDataset_EmpleadoID_EMPLEADO.Value;
               //DM.IBDataSet_FacturasVentasID_CAJA
               if CheckBox_Reparto.Checked=True then
                  DM.IBDataSet_FacturasVentasREPARTO.Value:='SI'
               else
                  DM.IBDataSet_FacturasVentasREPARTO.Value:='NO';
               DM.IBDataSet_FacturasVentasESTADO.Value:=1;
               DM.IBDataSet_FacturasVentas.Post;
              //DETALLE_VENTAS

               DM.IBDataSet_DetalleVentasESTADO.Value:=1;
               DM.IBDataSet_DetalleVentasID_FAC_V.Value:= DM.IBDataSet_FacturasVentasID_FAC_V.Value;
               DM.ibdataset_detalleventasPRODUCTO.Value:=DBLookupComboBoxAltaProductoFactura.Text;
               DM.IBDataSet_DetalleVentasPRECIO_UNITARIO.Value:=DM.IBDataSet_ProductosPRECIO_UNITARIO.Value;
               DM.IBDataSet_DetalleVentas.Post;
               DM.Transaction.CommitRetaining;
               ShowMessage('Producto agregado.');
               with (DM.IBQuery_DetalleVenta)do
               begin
                  SQL.Clear;
                  SQL.Add('SELECT SUM(T1.TOTAL) AS TOTALP FROM DETALLE_VENTAS T1, FACTURAS_DE_VENTAS T2 WHERE T1.ID_FAC_V = T2.ID_FAC_V');  
               Open;
               end;
              
           // aqui lo hacemos todo
              Dato:= DM.IBQuery_DetalleVenta.Fields[0].AsFloat; // pasamos el valor
              with (DM.IBQuery_DetalleVenta)do  // usamos el mismo query
               begin
              Close;
              // hacemos el update pasandole el dato en el campo que coincida con el numero de factura
              SQL.Text:= 'Update DETALLE_VENTAS set TOTAL.FACTURAS_DE_VENTAS = :Tot where ID_FACTURA = T1.ID_FAC_V'; 
              Params[0].Value:= Dato;
              ExecSQL; // lo ejecutamos
               end;
               
             except
               DM.IBDataSet_DetalleVentas.Cancel;
               DM.Transaction .RollbackRetaining;
             end;
          end;
Si tienes dudas dilo.
Saludos
PD: No se si entiendo bien, tal vez es un insert, solamente se cambia la consulta sql y listo

JairoC 07-10-2011 22:57:47

Así es... Me sale un error que dice Column Unknown TOTAL.FACTURAS_DE_VENTAS... Justo acá ExecSQL;

Caral 07-10-2011 23:08:09

Hola
A ver si esta vez bateo mejor.
Código Delphi [-]
var Dato: Real; // creamos la variable que contendra el dato
begin
             try

             //FACTURA_DE_VENTAS

               DM.IBDataSet_FacturasVentasNUMERO.Value:= DM.IBQuery_NumerosNUMERO.Value;//NUMERO DE FACTURA...
               DM.IBDataSet_FacturasVentasCONDICION.Value:=ComboBox_CondicionVenta.Text;
               DM.IBDataSet_FacturasVentasTIPO_FACTURA.Value:=Label_Factura.Caption;
               DM.IBDataSet_FacturasVentasFECHA.Value:=DTPFecha.Date;
         
               IF ComboBox_Comprador.Text ='CLIENTE' THEN
                   DM.IBDataSet_FacturasVentasID_CLIENTE.Value:= DM.IBDataSet_ClientesID_CLIENTE.Value
               ELSE
                   DM.IBDataSet_FacturasVentasID_EMPLEADO.Value:=DM.IBDataset_EmpleadoID_EMPLEADO.Value;
               //DM.IBDataSet_FacturasVentasID_CAJA
               if CheckBox_Reparto.Checked=True then
                  DM.IBDataSet_FacturasVentasREPARTO.Value:='SI'
               else
                  DM.IBDataSet_FacturasVentasREPARTO.Value:='NO';
               DM.IBDataSet_FacturasVentasESTADO.Value:=1;
               DM.IBDataSet_FacturasVentas.Post;
              //DETALLE_VENTAS

               DM.IBDataSet_DetalleVentasESTADO.Value:=1;
               DM.IBDataSet_DetalleVentasID_FAC_V.Value:= DM.IBDataSet_FacturasVentasID_FAC_V.Value;
               DM.ibdataset_detalleventasPRODUCTO.Value:=DBLookupComboBoxAltaProductoFactura.Text;
               DM.IBDataSet_DetalleVentasPRECIO_UNITARIO.Value:=DM.IBDataSet_ProductosPRECIO_UNITARIO.Value;
               DM.IBDataSet_DetalleVentas.Post;
               DM.Transaction.CommitRetaining;
               ShowMessage('Producto agregado.');
               with (DM.IBQuery_DetalleVenta)do
               begin
                  SQL.Clear;
                  SQL.Add('SELECT SUM(T1.TOTAL) AS TOTALP FROM DETALLE_VENTAS T1, FACTURAS_DE_VENTAS T2 WHERE T1.ID_FAC_V = T2.ID_FAC_V');  
               Open;
               end;
              
           // aqui lo hacemos todo
              Dato:= DM.IBQuery_DetalleVenta.Fields[0].AsFloat; // pasamos el valor
              with (DM.IBQuery_DetalleVenta)do  // usamos el mismo query
               begin
              Close;
              // hacemos el Insert pasandole el dato y el numero de factura a la tabla FACTURAS_DE_VENTAS
              SQL.Text:= 'Insert Into FACTURAS_DE_VENTAS (ID_FACTURA, TOTAL) Values (:Fact, :tot)';
              Params[0].Value:= TU_NUMERO_DE_FACTURA; // no lo se de donde sacas el dato
              Params[1].Value:= Dato; // el valor del total
              ExecSQL; // lo ejecutamos
               end;
               
             except
               DM.IBDataSet_DetalleVentas.Cancel;
               DM.Transaction .RollbackRetaining;
             end;
          end;
Para mi es un insert no un update.
Revisa y trata de entenderlo.
Saludos

JairoC 07-10-2011 23:24:25

Muchas Gracias!!! Funciono con esta linea SQL.Text:= 'Update FACTURAS_DE_VENTAS set TOTAL = :Tot where ID_FAC_V = ID_FAC_V';
Lo unico que la suma da, por ejemplo: 44,70 y me lo redondea a 45 y así lo guarda...

Sapt_86 08-10-2011 02:32:52

Donde realizas la suma, intenta lo siguiente:

Código SQL [-]
SELECT CAST(SUM(T1.TOTAL) AS DECIMAL(10,2))AS TOTALP
FROM DETALLE_VENTAS T1, FACTURAS_DE_VENTAS T2 
WHERE T1.ID_FAC_V = T2.ID_FAC_V

De todas formas ten cuidado con el redondeo.

Caral 08-10-2011 03:36:15

Hola
Muy interesante lo desconocía.
Buen aporte, gracias.
Saludos


La franja horaria es GMT +2. Ahora son las 03:48:16.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi