PDA

Ver la Versión Completa : Problema con ClientDataSet y Resta


enecumene
22-01-2008, 18:53:10
Hola compañeros del foro, estoy teniendo problemas con un borrado de datos en un clientDataSet y una resta con los valores mostrasdos en un DBGRid conectado al clientdataset, tengo lo siguiente:

para el borrado de un dato especifico del clientdataset:

procedure TFFacturar.DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_DELETE then
begin
dsFactDetalle.DataSet.Delete;
if ClientDataSet1.RecordCount > 0 then
begin
Total.Text := FLoatToStr(StrToFloat(Total.Text) - ClientDataSet1.Fields[9].AsInteger);
end;
if ClientDataSet1.IsEmpty then
begin
Total.Text := '0.00';
end;
end;
end;

el problema esta en esta linea:

Total.Text := FLoatToStr(StrToFloat(Total.Text) - ClientDataSet1.Fields[9].AsInteger);

los valores lo muestro en un edit, y el problema que me da es que no me resta los valores correcto, por ejemplo, en el DBGrid, la primera linea tiene un valor de 12 pesos, y las demas lineas son de 24, 36, el edit tiene un valor de 72 pesos, selecciono en el grid la linea con valor 24 por ejemplo, la borro, entonces en el edit me deberia resta 24-72 no?, pues no, siempre me resta el valor de la primera linea que es 12, a que se debe eso?.

Saludos.

Caral
22-01-2008, 19:04:24
Hola
Maestro no entiendo.
Creo que usas ado?, verdad.
Por que usar el cliente data set?
Que valor quieres borrar?, el de un campo?, la suma de todos?.
Por que no usar un update?
Me explicas, asi aprendo.
Saludos

juanelo
22-01-2008, 19:04:54
Que tal,
Tu error está en que primero borras y luego restas.

dsFactDetalle.DataSet.Delete;

Cuando haces lo anterior el cursor se mueve al registro anterior (que es el que tiene el valor 12).

Lo correcto sería:

procedure TFFacturar.DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_DELETE then
begin
if ClientDataSet1.RecordCount > 0 then
begin
Total.Text := FLoatToStr(StrToFloat(Total.Text) - ClientDataSet1.Fields[9].AsInteger);
dsFactDetalle.DataSet.Delete;
end;
if ClientDataSet1.IsEmpty then
begin
Total.Text := '0.00';
end;
end;
end;

Saludos

enecumene
22-01-2008, 19:09:59
Efectivamente, como dijo Juanelo ese era el problema primero borraba y luego calculaba, lo tengo asi ahora y va de 10:

procedure TFFacturar.DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_DELETE then
begin
if ClientDataSet1.RecordCount > 0 then
begin
Total.Text := FLoatToStr(StrToFloat(Total.Text) - ClientDataSet1.Fields[9].AsInteger);
end;
if ClientDataSet1.IsEmpty then
begin
Total.Text := '0.00';
end;
dsFactDetalle.DataSet.Delete;
end;
end;

Gracias a ambos por su tiempo, Saludos.;)

enecumene
22-01-2008, 19:20:21
Hola
Maestro no entiendo.
Creo que usas ado?, verdad.
Por que usar el cliente data set?
Que valor quieres borrar?, el de un campo?, la suma de todos?.
Por que no usar un update?
Me explicas, asi aprendo.
Saludos

Efectivamente Amigo Caral estoy usando en este caso ADO con base de datos Access, uso el clientDataSet porque estoy haciendo un modulo de Facturacion, y los datos los estoy mostrando en Memoria antes de registrarlo en la base de datos, asi para mi es menos trabajoso.

Saludos.

Caral
22-01-2008, 19:25:12
Hola
Gracias por la explicacion aunque sigo sin entender, bueno, la edad no perdona, me estais dejando atras demasiado rapido.
Saludos

enecumene
22-01-2008, 20:00:10
Y que te parece un pequeño ejemplo grafico para que te des una idea?.:)

http://img183.imageshack.us/img183/7708/factdetallezv8.jpg