Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Editar un registro de un ClientDataSet (https://www.clubdelphi.com/foros/showthread.php?t=93193)

oh.mely 12-06-2018 00:53:12

Editar un registro de un ClientDataSet
 
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.

Código Delphi [-]
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:
Código Delphi [-]
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ó!


La franja horaria es GMT +2. Ahora son las 22:31:05.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi