PDA

Ver la Versión Completa : Sumar los productos que corresponden a la factura


JairoC
05-10-2011, 23:52:04
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:

SELECT SUM(T1.TOTALPRODUCTO) AS TOTAL
FROM DETALLE T1, FACTURA T2
WHERE T1.ID_FACTURA = T2.ID_FACTURA

O también:

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
Gracias ecfisa... Ahora me sale un error de que no encuentra el ID_DETALLE...

JairoC
07-10-2011, 21:03:49
TE ENVIO EL CODIGO, PARA QUE VEA SI VOY BIEN ENCAMINADO...

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:
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:


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.
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:

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