Dbgrid & DBNavigator

Tengo una pequeña duda, espero me ayudes, tengo un dbgrid donde tiene 3 campos, Cantidad, Precio y Precio Total, si tengo por ejemplo 2 renglones llenos en el dbgrid, por ejemplo (2,10,20;3,30,90), y en el dbnavigator le doy Agregar(+), lleno los 2 primeros campos(1,10), luego presiono un botón donde me saca la multimplicacion de 1,10, o sea, se llena el tercer renglón(1,10,10), ahí todo va bien, luego tengo otro botón, donde suma el total de los 3 precios totales(20,90 y 10), pero a la hora de recorrer el dbgrid para sumar los totales, el ultimo precio total que se agrego, lo suma 2 veces, o sea recorre el dbgrid 4 veces(20+90+10 "+10"), siendo que solamente deben de ser 3 renglones los que debe recorrer, por lo tanto la suma final no resulta lo que yo deseo;
1

1 Respuesta

47.200 pts. Analista/Programador de Sistemas Oracle
Sin ver tu código no puedo adivinar que es lo que te pasa. En principio parece que no debiera haber ningún problema.
Mi código sería el siguiente, quizá te aclare algo, sino, envíame el código que usas para recorrer la dbgrid:
Accedo a la dbgrid a nivel de dataset de la forma:
procedure Sumar;
var
total : Integer;
//Si es campo es del tipo real:
total : Real;
begin
total := 0;
With dbgrid1.datasource.dataset do
begin
First;
While not eof do
begin
total := total + Fieldbyname('Precio_Total').AsInteger;
//Si es campo es del tipo real:
//total := total + Fieldbyname('Precio_Total').AsFloat;
Next;
end;
end;
showmessage(Inttostr(total));
//Si es campo es del tipo real:
//showmessage(FormatFloat('0.00',total));
end;
Te comentaba que aquí tenia 2 botones, el primer botón es para calcular el precio total de cada uno de los renglones y este es el código, de hecho aquí es donde cuando en el dbnavigator hago click en Agregar(+) me crea 2 veces el renglón que hice...
cont:=0;
bitbtn1.Enabled:=True;
total:=0.0;
With DBGrid1.DataSource.DataSet do
begin
DisableControls;
First;
fieldbyname('Total').ReadOnly:=False;
while not eof do
begin
cont:=cont+1;
Cantidad:= Fieldbyname('Cantidad').AsInteger;
Precio:= Fieldbyname('Precio').AsFloat;
Total:=(Cantidad)*(Precio);
table2.edit;
Fieldbyname('Total').AsFloat:=Total;
Next;
end;
EnableControls;
table1.Edit;
table1.Fields.Fields[14].AsInteger:=cont;
table1.Post;
table1.ApplyUpdates;
table1.Edit;
table2.edit;
table2.post;
table2.applyupdates;
fieldbyname('Total').ReadOnly:=True;
end;
cAmount := FormatFloat( ' ##0.00', Total);
bitbtn3.Enabled:=False;
Después de esto, ya me aparecen en el dbgrid el total de cada uno de los renglones, pero, si con la flecha del teclado bajo en el dbgrid, aparece el "extra" que esta apareciendo en la suma total de los Precios Totales del DBGrid, el código del 2 botón, que es el que recorre el dbgrid sumando los Precios totales de cada renglón es...
Total:=0.0;
With DBGrid1.DataSource.DataSet do
begin
DisableControls;
First;
while not eof do
begin
total := total + Fieldbyname('Total').AsFloat;
Next;
end;
EnableControls;
end;
cAmount := FormatFloat( ' ##0.00', Total);
Espero me puedas ayudar Antipauli, gracias, nos vemos...
Me gustaría que me aclararas qué se supone que hace todo esto que hay después de editar el total:
table1.Edit;
table1.Fields.Fields[14].AsInteger:=cont;
table1.Post;
table1.ApplyUpdates;
table1.Edit;
table2.edit;
table2.post;
table2.applyupdates;
Lo que veo erroneo o que quizá es lo que te provoca el desbarajuste es el no hacer:
Edit;
Fieldbyname('Total').AsFloat:=Total;
Post;
En vez de:
table2.edit;
Fieldbyname('Total').AsFloat:=Total;
Next;
Fíjate que después de editar el registro debemos hacer Post y que hago el edit sobre el dataset que recorro (así me evito posibles errores en el caso que table2 no sea el dataset recorrido por ejemplo).
Lo demás lo veo correcto.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas