Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Al Editar un Registro me lo duplica (https://www.clubdelphi.com/foros/showthread.php?t=91352)

webmasterplc 12-01-2017 11:55:28

Al Editar un Registro me lo duplica
 
Buenas, estoy tratando de editar un registro y lo que hace es que se me duplica
Base de datos MySQL
Componentes ttable MyDac

Código Delphi [-]
procedure editarcliente (clcod,clcnombre,clcrif,clcdireccion,clctelefono,clctelefono2,clccelular,clccontacto,clcciudad,clces  tado,clccorreo,clcobservaciones,clcagret:string; clcporc:Currency);
begin
with datos.tclientes do
    begin
      Close;
      Active:=False;
      Active:=True;
      Open;
      Edit;
      Append;
        FieldByname('cl_codigo').AsString := clcod;
        FieldByname('cl_descripcion').AsString := clcnombre;
        FieldByname('cl_identificacion').AsString := clcrif;
        FieldByname('cl_direccion').AsString := clcdireccion;
        FieldByname('cl_contacto').AsString := clccontacto;
        FieldByname('cl_telefono').AsString := clctelefono;
        FieldByname('cl_telefono2').AsString := clctelefono2;
        FieldByname('cl_celular').AsString := clccelular;
        FieldByname('cl_ciudad').AsString := clcciudad;
        FieldByname('cl_estado').AsString := clcestado;
        FieldByname('cl_correo').AsString := clccorreo;
        FieldByname('cl_agenteretiva').AsString := clcagret;
        FieldByname('cl_porcentajeret').AsCurrency := clcporc;
        FieldByname('cl_observaciones').AsString := clcobservaciones;

      Post;
      Close;
      Active:=False;
      MessageDlg('El Cliente Fue Modificado Exitosamente', mtCustom, [mbOK], 0);
    end;

end;

Casimiro Notevi 12-01-2017 12:12:23

Quita el append

Neftali [Germán.Estévez] 12-01-2017 12:19:12

Te sobran cosas en esa lista además de lo que comenta Casimiro:

Código Delphi [-]
Open;
Append;
=> Rellenar campos....
Post;
Close;

webmasterplc 12-01-2017 12:27:16

le quito el append y no modifica
aqui la tabla

Código SQL [-]
CREATE TABLE `csclientes` (
  `cl_id` int(6) NOT NULL AUTO_INCREMENT,
  `cl_codigo` varchar(24) COLLATE utf8_bin NOT NULL,
  `cl_descripcion` varchar(160) COLLATE utf8_bin NOT NULL,
  `cl_identificacion` varchar(24) COLLATE utf8_bin NOT NULL,
  `cl_direccion` varchar(160) COLLATE utf8_bin NOT NULL,
  `cl_contacto` varchar(50) COLLATE utf8_bin DEFAULT NULL,
  `cl_telefono` varchar(50) COLLATE utf8_bin DEFAULT NULL,
  `cl_telefono2` varchar(50) COLLATE utf8_bin DEFAULT NULL,
  `cl_celular` varchar(11) COLLATE utf8_bin DEFAULT NULL,
  `cl_ciudad` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `cl_estado` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `cl_correo` varchar(50) COLLATE utf8_bin DEFAULT NULL,
  `cl_agenteretiva` enum('true','false') COLLATE utf8_bin DEFAULT 'false',
  `cl_porcentajeret` double(5,2) DEFAULT '0.00',
  `cl_observaciones` text COLLATE utf8_bin,
  PRIMARY KEY (`cl_id`,`cl_codigo`)
) ENGINE=InnoDB AUTO_INCREMENT=2149 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='TABLA PARA LLEVAR EL REGISTRO DE CLIENTES';

webmasterplc 12-01-2017 12:40:08

Al editarlo me siguen apareciendo dos registros en el grid aunque en la base de datos me aparece solo 1 y solo desaparece al editar otro

webmasterplc 12-01-2017 12:50:54

1 Archivos Adjunto(s)
aqui les adjunto la imagen

AgustinOrtu 12-01-2017 14:48:23

Código Delphi [-]
  // estas dos lineas son equivalentes  (fijate que al final del codigo tambien repetis esto)
  Close;
  Active:=False;
   
  // estas dos lineas son equivalentes  
  Active:=True;
  Open;

Cuidado con cerrar la tabla antes de editar; al llamar a open nuevamente nada te garantiza que estas en la posicion del DataSet que estabas antes. Por lo general yo esperaria que un llamado a Open (o Active := True, en definitiva, Open hace Active := True) me posicione el DataSet en el primer registro

Luego al realizar el Post lo que deberias hacer es cerrar y abrir la tabla para refrescar el Grid, o bien, si estabas usando un Query, volver a ejecutarlo para ver los datos cambiados

Casimiro Notevi 12-01-2017 14:49:46

Para editar un registro, primero tienes que posicionarte en el mismo.

webmasterplc 12-01-2017 22:46:52

Cita:

Empezado por Casimiro Notevi (Mensaje 512314)
Para editar un registro, primero tienes que posicionarte en el mismo.

Como hacer para posicionarse

AgustinOrtu 13-01-2017 01:23:17

Hay varias formas. Programaticamente usando metodos como Prior o Next dentro de un bucle y verificando las condiciones para ver si llegaste al registro que te interesa

Tambien tenes los metodos Locate y Lookup en los que uno especifica la condicion que quiere que los campos cumplan y el DataSet se encarga de realizar la busqueda sobre si mismo, y posicionarse en el primer registro que satisface la condicion

Otra forma es usando los controles visuales, de este modo el DataSet se sincroniza automaticamente con el componente (ej. DBGrid).

Como vos estabas cerrando y abriendo el DataSet el registro actual cuando hacias el Edit es el primero y no el que el usuario habia seleccionado

Aca hay documentacion sobre como modificar datos de un DataSet


La franja horaria es GMT +2. Ahora son las 07:32:34.

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