Delphi - Ayuda Suma de un dbgrid

   
Vista:

Ayuda Suma de un dbgrid

Publicado por Belen (33 intervenciones) el 09/06/2016 18:51:18
Hola buenas tardes. tengo un pequeño programa que realizo ventas el cual esta asociado a una base de datos en el formulario de venta tengo un dbgrid asociado a un datasource que el mismo se asocia a la tabla detalle venta. En el dbgrid muesto los siguientes campos (productos,cantidad,precio,subtotal)
bien atravez de un boton buscar ingreso al formulario de productos y por medio de un tedit seleciono la cantidad hasta este punto todo me funciona bien.

El tema es el siguiente cuando necesito guardar el total que este se almacena en una tabla llamada venta de la base de datos (que es la suma de los subtotales que estan cargados en el dbgrid) no me realiza dicha operacion y a la vez necesito que este resultado se muestre en un tedit(eTotal) en el formulario de ventas y se sume o se reste a medida que agregue o quite productos en el dbgrid... Bien espero haber sido clara les dejo el codigo y las tabla de la base de datos

Código SQL
tabla venta
idventa
total

Código SQL
detalle_venta
iddetalle
idproducto
idventa
subtotal
precio
cantidad

Aqui el codigo del boton selecionar que se encuentra en el formulario de productos

1
2
3
4
5
6
7
8
9
10
11
12
Código Delphi [-]
 
 fmodulo.tDetalle.Insert;
 fmodulo.tDetalle['idventa']:= fmodulo.tVentas['idventa'];
 fmodulo.tDetalle['idproducto'] := fmodulo.qProductos['idproducto'] ;
 fmodulo.tDetalle['cantidad'] := StrToInt(self.eCantidad.Text);
 fmodulo.tDetalle['precio'] :=  fmodulo.qProductos['precio_unit']  ;
 fmodulo.tDetalle['subtotal']  := fmodulo.tDetalle['precio']*StrToInt(eCantidad.Text)  ;
  fmodulo.tDetalle.Post;
 fmodulo.tVentas.Edit;
 fmodulo.tVentas['total']:= fmodulo.tVentas['total'] +   fmodulo.tDetalle['subtotal'];
 fmodulo.tVentas.Post;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda Suma de un dbgrid

Publicado por E.T. (1108 intervenciones) el 10/06/2016 17:24:59
Como aseguras que no te está guardando el total? estas viendo la tabla ventas en un grid o algun otro componente?
Me atrevo a decir que esto sucede porque no hay registro que editar en la tabla ventas, explico, cuando entras a tu pantalla de venta a hacer una venta nueva, lo que haces es ir insertando en tu tabla detalle, pero en tu tabla venta no existe registro que editar y estas intentando actualizar un registro inexistente, para verificar si estoy mal, al abrir tu pantalla de venta intenta lo siguiente:

1
2
3
fmodulo.tVentas.Insert;
fmodulo.tVentas['total']:= 0;
fmodulo.tVentas.Post;

Luego sigue con tu operación normal.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por Belen (33 intervenciones) el 10/06/2016 20:20:13
Buenas tardes gracias por responder me fue de mucha ayuda me habia faltado fmodulo.tVentas['total']:= 0; ahora me muestra perfecto el total. Una consulta me surgio otro prolema
en esta linea:
1
fmodulo.tDetalle['idventa']:= fmodulo.tVentas['idventa'];
cuando consulto en la base de datos en la tabla detalle el idventa me sale null sabrias el por que del prolema ?
desde ya muchas gracias por la ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por E.T. (1108 intervenciones) el 10/06/2016 21:01:10
Bien, aqui depende de como hayas creado tu base de datos. Si tu idventa fuera autoincremental, no habria problema, pero asumo que no lo es, que manejador de base de datos usas?
Para arreglarlo, deberias hacer lo mismo que el total, obteniendo tu id maximo y sumandole 1.
1
2
3
4
5
6
7
8
9
fmodulo.tVentas.Insert;
fmodulo.tVentas['total']:= 0;
//aqui llenar los demas campos de tu tabla
//maxId debe tener el ultimo id de venta + 1
fmodulo.tVentas['idventa']:= maxId;
//fmodulo.tVentas['campo1']:= valor1;
//fmodulo.tVentas['campo2']:= valor2;
//asi con todos tus campos
fmodulo.tVentas.Post;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por Belen (33 intervenciones) el 10/06/2016 21:21:18
Hola. Si lo tengo en autoincremental. Utilizo Mysql para la creacion de la base de datos.
el
1
fmodulo.tVentas['total']:= 0;
lo escribi en la llamada del formulario venta y me funciona bien.
Disculpa es que soy nueva aun en esto de trabajar con bases de datos y varios formularios.
lo siguiente no se como hacerlo de guargar el ultimo id en" maxId" y luego en que formulario escribir el codigo
1
2
//maxId debe tener el ultimo id de venta + 1
fmodulo.tVentas['idventa']:= maxId;


Pd: Yo el siguiente codigo lo tengo del boton selecionar que esta en el formulario productos. Sera ese el prolema ?. deberia ir en el boton aceptar del formulario venta?
1
fmodulo.tDetalle['idventa']:= fmodulo.tVentas['idventa'];

Perdon tantas preguntas y mi poco entendimiento es que me surgen muchas dudas y me sirven para aprender mas, de verdad me estas ayudando bastante muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por E.T. (1108 intervenciones) el 10/06/2016 23:33:09
Fijate cuando haces esto:
1
2
3
fmodulo.tVentas.Insert;
fmodulo.tVentas['total']:= 0;
fmodulo.tVentas.Post;
verifica en tu base de datos en la tabla ventas que tiene tu idventa, para ver si te está generando tu registro con su id.
si al checar en la base de datos está bien el registro, hay que verificar cuando insertas en el detalle.
cambia tu codigo que tienes asi:
1
2
fmodulo.tDetalle.Insert;
 fmodulo.tDetalle['idventa']:= fmodulo.tVentas['idventa'];
y agrega un mensaje para ver que tiene tu encabezado, asi:
1
2
3
showmessage(fmodulo.tVentas['idventa'].asstring);
fmodulo.tDetalle.Insert;
 fmodulo.tDetalle['idventa']:= fmodulo.tVentas['idventa'];
el mensaje te va a mostrar el id con que se va a insertar el detalle, si ves que el mensaje está vacio, intenta agregando un dbgrid enlzado a tu tabla ventas para ver que hace o donde está el puntero al insertar un detalle.
Si haces algun otro movimiento en tu tabla venta, pon el codigo para verlo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por Belen (33 intervenciones) el 11/06/2016 05:23:00
Bien hice lo que me dijiste con el dbgrid y si me muestra el iddetalle y puse para verificar el idventa pero aun sigue saliendo null
verifique la base de datos y la tabla detalle se carga con su respectivos datos solo la columna idventa queda en null.
y la tabla ventas se carga bien con su idventa.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por E.T. (1108 intervenciones) el 11/06/2016 20:31:36
Lo que queria que mostraras en el bdgrid era tu tabla de venta, no la de detalle. pon un grid para cada una. En tu modulo de datos (fModulo) solo tienes una tabla tVentas? tienes un sólo modulo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por Belen (33 intervenciones) el 12/06/2016 21:18:17
Hola. Ya hice lo de poner los 2 dbgrid uno para cada tabla y ver su comportamiento en momento de ejecucion solo en la tabla venta se carga el total y recien a darle el boton aceptar se carga el idventa,fecha,hora. Si tengo solo una tabla ventas y un solo modulo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por E.T. (1108 intervenciones) el 13/06/2016 18:53:58
Prueba esto:
1
2
3
4
fmodulo.tVentas.Insert;
fmodulo.tVentas['total']:= 0;
fmodulo.tVentas['idVenta']:= 1;
fmodulo.tVentas.Post;
si te pone el 1 y no existe ya un registro asi, tu autoincremental no está bien, o no es el campo al que está generando
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por Belen (33 intervenciones) el 13/06/2016 19:21:17
http://subefotos.com/ver/?634ae2caed8bba06fa655b0447712d11o.jpg Hola mira este es el error que me larga el motor de base de datos al utilizar la linea
1
fmodulo.tVentas['idVenta']:= 1;

Desde ya muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por E.T. (1108 intervenciones) el 13/06/2016 20:21:57
Si pudieras poner el codigo completo de tu boton aceptar, el de nuevo, y cuando muestras tu form
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por Belen (33 intervenciones) el 13/06/2016 21:41:21
Bien aqui pongo los codigos
este es el codigo del boton nuevo que llama al listado de productos

1
2
3
4
5
6
7
8
procedure TfVentas.bNuevoClick(Sender: TObject);
begin
 
fmodulo.qProductos.Active:= true;
fmodulo.qProductos.ParamByName('razon').AsString := '%';
fmodulo.qProductos.Refresh;
tfListadosProductos.ShowForm(true);
end;


Aqui el codigo de llamada del formulario venta desde el menu principal
1
2
3
4
5
6
7
8
9
procedure TfPrincipal.Nueva1Click(Sender: TObject);
begin
 fmodulo.deta.Active:=true;
 fModulo.tVentas.Active:= true  ;
 fmodulo.tVentas.Insert;
 fVentas := tfVentas.Create(self) ;
 fmodulo.tVentas['totalventa'] :=0;
 fVentas.ShowModal;
end;

Aqui el codigo del boton aceptar del formulario venta

1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TfVentas.bAceptarClick(Sender: TObject);
begin
fmodulo.tVentas.Edit;
fmodulo.deta.Edit;
fmodulo.qFecha.Open;
fmodulo.tVentas['fechavent']  := fmodulo.qFecha['fecha'];
fmodulo.tVentas['horavent']:= fmodulo.qFecha['hora']  ;
fmodulo.tVentas['idcliente']  := idcliente;
fmodulo.deta.Post;
fmodulo.qFecha.Active  := false;
fmodulo.tVentas.Post;
//self.close
end;

desde ya muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por E.T. (1108 intervenciones) el 14/06/2016 17:31:27
Aqui te hace falta un post:
1
2
3
4
5
6
7
8
9
10
procedure TfPrincipal.Nueva1Click(Sender: TObject);
begin
 fmodulo.deta.Active:=true;
 fModulo.tVentas.Active:= true  ;
 fmodulo.tVentas.Insert;
 fVentas := tfVentas.Create(self) ;
 fmodulo.tVentas['totalventa'] :=0;
fmodulo.tVentas.Post;//<-----------------------------AQUI
 fVentas.ShowModal;
end;

Como comentario adicional, te recomiendo trabajar con una tabla temporal para tu venta y cuando ésta finalice, hagas el traspaso de los registros a tu tabla de datos, pues cuando activas un tTable, éste va a intentar traer toda la información que está almacenada, esto con el tiempo te va a traer problemas de lentitud al entrar a tu pantalla de venta. Si decides hacer este cambio te recomiendo tambien que la inserción de los datos de la tabla temporal a la otra sea por medio de tQuerys, para evitar hacer lo mismo de abrir tu tabla de venta, sin olvidar vaciar tu tabla temporal al finalizar cada venta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por Belen (33 intervenciones) el 14/06/2016 18:35:08
Hola si tenia la linea
1
fmodulo.tVentas.Post;

pero la misma me tira error en el motor de base de datos.El error dice lo siguiente " SQL Error Column 'idcliente' cannot be null"
por esa razon tenia el post; en el boton aceptar y este error ya no me salia.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por E.T. (1108 intervenciones) el 14/06/2016 20:24:13
Pues tienes dos opciones, darle un valor a la columna idcliente antes del post o permitir valores nulos al campo idcliente desde mysql
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por Belen (33 intervenciones) el 14/06/2016 21:06:19
Hola bien e probado poniendo idcliente para que acepte null y no tengo problema hace el post perfectamente. Pero aun asi sigue la raiz del problema que en el detalle el idventa queda en null
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por E.T. (1108 intervenciones) el 14/06/2016 23:36:27
Bien, mencionas que el idventa está en null, pero estoy viendo la imagen que dejaste hace unos dias, y ahi el id venta está con valor.
Es en realidad el idventa el que está en null o es otro campo?
Con que componenetes accedes a la base de datos?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por Belen (33 intervenciones) el 14/06/2016 23:44:27
Hola. El idventa de la tabla Ventas si tiene valor dado que es la clave primaria de dicha tabla y es autoincremental. Pero el idventa que es una clave foranea en el detalle ventas queda en null ese es el prolema
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por E.T. (1108 intervenciones) el 15/06/2016 01:33:26
Se te pasó decirme que componentes usas, pareciera ser un problema con tu transacción, lo que me hace pensar que funciona asi:
Insertas tu registro en la tabla venta, pero dependiendo del modo de transacción que usas, puede que aun no se genere el id fisico, sino uno como temporal, luego insertas tus detalles, y como aun no existe id venta por eso lo deja asi, pero es solo una teoria.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por Belen (33 intervenciones) el 15/06/2016 02:08:05
Es verdad.. Bien utilizo delphi 2010 y la base de datos mysql -5, para la Conexión, los Ttables, tquery utilizo los componentes Zeos Access


muchas gracias por tomarte el tiempo en ayudarme
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por E.T. (1108 intervenciones) el 15/06/2016 18:42:31
Pon tu codigo de configuracion de tu TZConnection, si es que lo usas. me interesan mas las propiedades "Properties" y la "TransactIsolationLevel"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por Belen (33 intervenciones) el 15/06/2016 18:52:13
Hola la conexion la tengo echa solo por medio de sus propiedades del compenente. Las propiedades que me nombras no e tocado solo deje como estaba y dicen lo siguiente
El transactIsolationlevel: TiNone
Properties: (tstring) y el codigo que tiene dentro es "Controls_cp=CP_UFt16"

Las propiedades que solo toque fueron
*Database
*hostname
*passworld
*protocolo
*user

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por E.T. (1108 intervenciones) el 15/06/2016 19:23:06
Intenta con
TransactIsolationLevel := tiReadCommitted;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por Belen (1 intervención) el 15/06/2016 21:51:13
Hola. Mira el prolema se soluciono a media podria decirce. El programa hace lo siguiente ahora cuando clikeo el boton aceptar se carga el idventa en la tabla venta y el iddetelle en la tabla detalle y se cierra el formulario debido a esta linea
1
self.close
La quito y observe el comportamiento y ahora cuando clikeo el boton aceptar hace lo que mencione antes y cuando clikeo por segunda vez recien en esta accion se carga el idventa en la tabla detalle. Es decir tengo que hacer dos veces click en el boton
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por E.T. (1108 intervenciones) el 15/06/2016 23:49:15
mmm no se que pueda ser, utiliza el procedimiento:
ApplyUpdates (fmodulo.tDetalle.ApplyUpdates) de cada tabla cuando insertas registros a ver si eso lo soluciona
usalo en las 2 cada ves que haces un insert-post
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Suma de un dbgrid

Publicado por Belen (33 intervenciones) el 16/06/2016 07:20:05
Me sale el siguiente error SQL error:Duplicate entry '69' for key idventa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

SQL error:Duplicate entry '69' for key idventa

Publicado por xve (9 intervenciones) el 16/06/2016 10:29:53
Hola Belen, ese error, es porque estas utilizando un idventa que ya existe y no se puede duplicar... puede ser que sea una clave primaria?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

SQL error:Duplicate entry '69' for key idventa

Publicado por E.T. (1108 intervenciones) el 16/06/2016 17:50:19
Como comenta Xve, verifica tu tabla detalle para ver si el indice de tu llave foranea no está definido como UNIQUE
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

SQL error:Duplicate entry '69' for key idventa

Publicado por Belen (33 intervenciones) el 17/06/2016 02:51:19
muchas gracias amigo ya funciona perfecto todo de verdad me ayudaste mucho
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

SQL error:Duplicate entry '69' for key idventa

Publicado por E.T. (1108 intervenciones) el 17/06/2016 17:14:32
Que bueno, si pudieras comentar tu solución, puede servirle a alguien más.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

SQL error:Duplicate entry '69' for key idventa

Publicado por Belen (33 intervenciones) el 18/06/2016 01:58:11
Hola aqui dejo e codigo :)
Boton aceptar del formulario ventas
1
2
3
4
5
6
7
8
9
10
11
procedure TfVentas.bAceptarClick(Sender: TObject);
begin
fmodulo.tVentas.Edit;
fmodulo.deta.Edit;
fmodulo.qFecha.Open;
fmodulo.tVentas['fechavent']  := fmodulo.qFecha['fecha'];
fmodulo.tVentas['horavent']:= fmodulo.qFecha['hora']  ;
fmodulo.tVentas['idcliente']  := idcliente;
fmodulo.deta.Post;
fmodulo.qFecha.Active  := false;
fmodulo.tVentas.Post;;

Boton seleccionar del formulario productos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TfListadosProductos.bSeleccionarClick(Sender: TObject);
begin
if (self.eCantidad.Text= '') or (self.eCantidad.Text = '0') then
  begin
    application.MessageBox('debe selecionar una cantidad','Venta',MB_OK) ;
    self.ModalResult:= mrNone;
   end
else
fmodulo.qVentas.ApplyUpdates ;
 fmodulo.qdetalle.ApplyUpdates ;
 fmodulo.qdetalle.Insert;
 fmodulo.qdetalle['idventa']:= fmodulo.qVentas['idventa'];
 fmodulo.qdetalle['idproducto'] := fmodulo.qProductos['idproducto'] ;
 fmodulo.qdetalle['cantvent'] := StrToInt(self.eCantidad.Text);
 fmodulo.qdetalle['preciovent'] :=  fmodulo.qProductos['precio_unit']  ;
 fmodulo.qdetalle['subtotalvent']  := fmodulo.qdetalle['preciovent']*StrToInt(eCantidad.Text)  ;
 
//Tabla ventas
  fmodulo.tVentas.Edit;
  fmodulo.tVentas['totalventa']:= fmodulo.tVentas['totalventa'] +   fmodulo.qdetalle['subtotalvent'];
  fmodulo.qdetalle.Post;
  fmodulo.tVentas.Post;
   end;

muchas gracias por la ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar