PDA

Ver la Versión Completa : Editar un registro de un ClientDataSet


oh.mely
12-06-2018, 00:53:12
Buenas tardes, no sé si alguien pueda ayudarme, estoy usando Delphi 7 y tengo una tabla temporal en un ClientDataSet en donde almaceno datos de productos y los muestro en un ListView, no tengo problemas con insertarlos, mi problema es que no encuentro la manera de edita un registro en específico, lo trato de hacer pero se modifica siempre el primer registro.

En mi form cuando quiero agregar un producto a la venta primero lo busco en el ListView, si no lo encuentra lo agrega como uno nuevo y si sí lo encuentra quiero que modifique la cantidad.

procedure TFr_Venta.addToTableTemporal();
var
aux: Boolean;
i: Integer;
begin
//Primero usca si ya ha sido registrado el producto
aux:= False;
for i:=0 to ReporteVenta.Items.Count -1 do
begin
if producto = ReporteVenta.Items[i].Caption then
begin
T_vta.Edit;
//AQUÍ QUIERO EDITAR EL REGISTRO DE ACUERDO AL CODIGO DE BARRAS DE MI PRODUCTO

//T_vta.Fields[2].Value:= 10; //Esto lo hice como prueba y siempre lo actualiza en el primer registro
aux:= True;
end;
end;
//Si no encuentra el producto en el listView agrega uno nuevo
if not aux then
begin
T_vta.Insert;
T_vta.Fields[0].Value:= producto;
T_vta.Fields[1].Value:= precioVta;
T_vta.Fields[2].Value:= cantidad;
T_vta.Fields[3].Value:= importe;
T_vta.Fields[4].Value:= descuento;
T_vta.Fields[5].Value:= total;
T_vta.Fields[6].Value:= PrecioBruto;
T_vta.Fields[7].Value:= nomProd;
T_vta.Post;
end;

end;

Gracias.

ecfisa
12-06-2018, 05:26:01
Hola.

Por lo que te entendí podrías hacer:

procedure TFr_Venta.InsertOrUpdate(const Producto: string);
var
found: Boolean;
i : Integer;
begin
// buscar producto en ListView
i := 0;
found := False;
while (i < ReporteVenta.Items.Count) and not found do
begin
found := ReporteVenta.Items[i].Caption = Producto;
Inc(i);
end;

// insertar o modificar en ClientDataSet
if not Found then // no encontrado -> insertar
begin
T_vta.Insert;
T_vta.Fields[0].Value := producto;
T_vta.Fields[1].Value := precioVta;
T_vta.Fields[2].Value := cantidad;
...
T_vta.Post;
end
else // encontrado -> editar (modificar valores)
begin
T_vta.Locate(T_vta.Fields[0].FieldName, producto,[]);
T_vta.Edit;
{ T_vta.Fields[0].Value := ??? }
T_vta.Fields[1].Value := precioVta;
T_vta.Fields[2].Value := cantidad;
...
T_vta.Post;
end;

// Actualizar ListView
...
end;


Saludos :)

Neftali [Germán.Estévez]
12-06-2018, 08:39:31
Por lo que he visto, en el FOR que has puesto para hacer un recorrido por tus registros, realmente no estás moviendo el apuntador al registro, sino siempre estás actualizando el mismo (el primero).

A no se que sea un error en la transcripción.
Lo lógico sería recorrer el Dataset, o de alguna forma buscar el elemento del Dataset que quieres modificar. Creo que la sokución de Ecfisa va también por ahí, en su caso utilizando un Locate.

oh.mely
12-06-2018, 20:11:59
Muchas gracias por responder, si me sirvió!