Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-10-2008
FerCastro FerCastro is offline
Miembro
 
Registrado: abr 2006
Posts: 97
Poder: 18
FerCastro Va por buen camino
Update duplica registro

Hola al foro,

Tengo una pequeña aplicación la cual estaba trabajando aparentemente bien hasta hace unos dias que comenzó a hacer algo sumamente extraño.

Cuando quiero modificar los datos de un registro al momento de grabar me duplica el registro. No se que haya podido suceder para que esto sucediera, pues anteriormente no lo hacía. Alguna idea? dejo el código que tengo:

Código Delphi [-]

      With Data.qEditaEmpleado do
        Begin
          Close;
          SQL.Clear;
          SQL.Add('SELECT * FROM empleado WHERE IDEmpleado = ' + IntToStr(Data.qEmpleado.FieldByName('IDEmpleado').AsInteger));
          Open;
          Edit;
          FieldValues['IDEmpresa']:=FMain.oVariables.nEmpresa;
          FieldValues['Apaterno']:=cPaterno.Text;
          FieldValues['AMaterno']:=cMaterno.Text;
          FieldValues['Nombre']:=cNombre.Text;
          Post;
          Close;
        End;


Muchas gracias
Fernando Castro
México
Responder Con Cita
  #2  
Antiguo 27-10-2008
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
No se aprecia motivo para este fenómeno en el código que adjuntas, supongo que pueda deberse a algún evento que hace que el código se ejecute dos veces en vez de una ....?

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 27-10-2008
FerCastro FerCastro is offline
Miembro
 
Registrado: abr 2006
Posts: 97
Poder: 18
FerCastro Va por buen camino
Hola Marcos, gracias por tu atención. Fijate que el proceso no se ejeceuta dos veces, de hecho haciendo el debug inmediatamente después del post actualizo la vista de mi tabla y ahi esta ya duplicado el registro.

No tengo idea del por qué de este comportamiento, pero te comento que no lo hacía, lo comenzó a hacer de repente.

Saludos!!
Responder Con Cita
  #4  
Antiguo 27-10-2008
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
amigo, no te convendría más ejecutar un query?
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #5  
Antiguo 27-10-2008
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Esto me hace sospechar que algo le paso a la tabla, porque no la creas de nuevo y le traspasas los datos y pruebas a ver que pasa.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #6  
Antiguo 27-10-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Y, el registro duplicado, ¿es exactamente igual en todos sus campos? El campo IDEmpleado, ¿es un campo llave?.

// Saludos
Responder Con Cita
  #7  
Antiguo 27-10-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Respuesta Repetida.

Parece que también aquí hay un problema de duplicados

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney

Última edición por egostar fecha: 27-10-2008 a las 18:12:43. Razón: Post repetido :S
Responder Con Cita
  #8  
Antiguo 27-10-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Hola

Yo creo que deberias de validar que existan datos antes de hacer el edit.

Código Delphi [-]
with Data.qEditaEmpleado do begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM empleado WHERE IDEmpleado = ' + IntToStr(Data.qEmpleado.FieldByName('IDEmpleado').AsInteger));
    Open;
    if recordcount > 0 then begin //Validamos que existan datos y no editar un registro vacio.
       Edit;
       FieldValues['IDEmpresa']:=FMain.oVariables.nEmpresa;
       FieldValues['Apaterno']:=cPaterno.Text;
       FieldValues['AMaterno']:=cMaterno.Text;
       FieldValues['Nombre']:=cNombre.Text;
       Post;
    end;
    Close;
end;

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #9  
Antiguo 27-10-2008
FerCastro FerCastro is offline
Miembro
 
Registrado: abr 2006
Posts: 97
Poder: 18
FerCastro Va por buen camino
Gracias por las respuestas:

- Egostar, ya hice lo que me comentas y sigue duplicando.
- Marcos, ya creé de nuevo la tabla, pasé los registros y sigue dulpicando.
- Román, si es un campo llave.

Gracias!! y saludos a todos

FCG
Responder Con Cita
  #10  
Antiguo 27-10-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿¡¡¡Es un campo llave y aún así se duplica el registro!!!? ¿Pues qué gestor usas?

// Saludos
Responder Con Cita
  #11  
Antiguo 27-10-2008
FerCastro FerCastro is offline
Miembro
 
Registrado: abr 2006
Posts: 97
Poder: 18
FerCastro Va por buen camino
Román, el registro se duplica excepto en el campo llave. Pero en efecto, el campo llave es autoincrementable y toma el siguiente ID manteniendo todos los demás valores en un nuevo registro
Responder Con Cita
  #12  
Antiguo 27-10-2008
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 23
BlueSteel Va por buen camino
Wink

Cita:
Empezado por FerCastro Ver Mensaje
Gracias por las respuestas:

- Egostar, ya hice lo que me comentas y sigue duplicando.
- Marcos, ya creé de nuevo la tabla, pasé los registros y sigue dulpicando.
- Román, si es un campo llave.

Gracias!! y saludos a todos

FCG

mmm... extraño sintoma.... pero si IdEmpleado es un campo llave, no debiera duplicarte el registro o al menos deberia darte un error de duplicado...

Por que no haces un Refresh despues del post ??? a ver k tal..., o lo otro seia cambiar de forma de actualizar el registro...

Código Delphi [-]
With Datos Do
Begin
     AQ_Actualiza.Close;
     AQ_Actualiza.SQL.Clear;
     AQ_Actualiza.SQL.Add('Update Empleado Set Emp_Empresa=:v01, Emp_Paterno=:v02, Emp_Materno=:v03, Emp_Nombre=:v04');
     AQ_Actualiza.SQL.Add('Where Id_Empleado =:Var05');
     AQ_Actualiza.Parameters[0].Value :=FMain.oVariables.nEmpresa;
     AQ_Actualiza.Parameters[1].Value := cPaterno.Text;
     AQ_Actualiza.Parameters[2].Value := cMaterno.Text;
     AQ_Actualiza.Parameters[3].Value := cNombre.Text;
     AQ_Actualiza.Parameters[4].Value :=Data.qEmpleado.FieldByName('IDEmpleado').AsInteger;
    AQ_Actualiza.ExecSQL;
End;

bueno, no se con que componentes haces tu sentencia... el ejemplo anterior es usando SQL Server y ADO....

Salu2
__________________
BlueSteel
Responder Con Cita
  #13  
Antiguo 28-10-2008
FerCastro FerCastro is offline
Miembro
 
Registrado: abr 2006
Posts: 97
Poder: 18
FerCastro Va por buen camino
Gracias, siguiendo los consejos de Poli y del Ego esto ya quedo arreglado:


Código Delphi [-]
      cCadena := ' UPDATE empleado SET '+
                          ' IDEmpresa = '+ QuotedStr(IntToStr(FMain.oVariables.nEmpresa))+
                          ' , IDSucursal = '+ QuotedStr(IntToStr(FMain.oVariables.nSucursal))+
                          ' , IDDepartamento = '+ QuotedStr(IntToStr(nIDDepartamento))+
                          ' , IDPuesto = '+ QuotedStr(IntToStr(nIDPuesto))+
                          ' , IDRegistro = '+ QuotedStr(cRegistro.Text)+
                          ' , IDNomina = '+ QuotedStr(cNomina.Text)+
                          ' , Apaterno = '+ QuotedStr(cPaterno.Text)+
                          ' , AMaterno = '+ QuotedStr(cMaterno.Text)+
                          ' , Nombre = '+ QuotedStr(cNombre.Text)+
                          ' , NombreCompleto = '+ QuotedStr(TRIM(cPaterno.Text) + ' ' + TRIM(cMaterno.Text)+ ' ' + TRIM(cNombre.Text))+
                          ' , CentroCostos = '+ QuotedStr(cCostos.Text)+
                          ' , Sucursales = '+ QuotedStr(FDatosEmpleado.cSucursalesEvento)+
                          ' , FNacimiento = '+ QuotedStr(DatetoStr(dCumple.Date))+
                          ' , FIngreso = '+ QuotedStr(DatetoStr(dCumple.Date))+
                          ' , Telefono = '+ QuotedStr(cTelefono.Text)+
                          ' , Correoe = '+ QuotedStr(cCorreo.Text)+
                          ' , Dir1 = '+ QuotedStr(cDir1.Text)+
                          ' , Dir2 = '+ QuotedStr(cDir2.Text)+
                          ' , Dir3 = '+ QuotedStr(cDir3.Text)+
                          ' , CURP = '+ QuotedStr(cCURP.Text)+
                          ' , Ciudad = '+ QuotedStr(cCiudad.Text)+
                          ' , Estado = '+ QuotedStr(cEstado.Text)+
                          ' , CP = '+ QuotedStr(cCP.Text)+
                          ' , Activo = '+ QuotedStr(IntToStr(1))+
                          ' , Usuario = '+ QuotedStr('FCastro')+
                          ' , U_Fecha = '+ QuotedStr(DateToStr(now))+

                          ' WHERE IDEmpleado = '+ QuotedStr(IntToStr(Data.qEmpleado.FieldByName('IDEmpleado').AsInteger));

      With Data.qEditaEmpleado do
        Begin
          SQL.Text := cCadena;
          ExecSQL;
        end;

Ahora, porque lo metí a una cadena de texto? la verdad es que si no lo dejaba así el query no se ejecutaba, enigmas de la vida no?

Mil gracias a todos en el foro por la ayuda. "Agradezco a san poli por los favores y las ayudas recibidas"

Saludos!
Responder Con Cita
  #14  
Antiguo 28-10-2008
FerCastro FerCastro is offline
Miembro
 
Registrado: abr 2006
Posts: 97
Poder: 18
FerCastro Va por buen camino
Siguiendo con el mismo hilo, pero con diferente tema, estoy modificando los comandos que tenía por sentencias Update, pero tengo el siguiente problema:

Cuando quería registrar los cambios en un cambio datetime, tomando en cuenta solo la hora hacía esto:

Código Delphi [-]
FieldValues['HoraInicio1']:=TimeToStr(dsInicio1.Time);
FieldValues['HoraInicio2']:=TimeToStr(dsInicio2.Time);
FieldValues['HoraInicio3']:=TimeToStr(dsInicio3.Time);


Pero la momento de querer hacer lo mismo para generar la sentencia SQL, que queda así:

Código Delphi [-]
' , HoraInicio1 = '+ QuotedStr(TimeToStr(dsInicio1.Time))+
' , HoraInicio2 = '+ QuotedStr(TimeToStr(dsInicio2.Time))+
' , HoraInicio3 = '+ QuotedStr(TimeToStr(dsInicio3.Time))+

EL resultado en SQL queda asi:

Código SQL [-]
HoraInicio1 = '09:00:00 a.m.' , 
HoraInicio2 = '04:00:00 p.m.' , 
HoraInicio3 = '12:00:00 a.m.'

Pero me manda el siguiente error :

Error de conversión al convertir una cadena de caracteres a datetime.

Quiero hacer la sentencia con un convert, por consejo de Poliburro, pero pues no doy pie con bola.

Alguien sabe que se tiene que hacer? por que no me está aceptando los datos en la sentencia SQl?

Muchas gracias por la ayuda

FCG
Responder Con Cita
  #15  
Antiguo 28-10-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Lo recomendado siempre en estos casos es usar parámetros y suplir su valor con los métodos adecuados al tipo:

Código Delphi [-]
Query1.ParamByName('HoraInicio1').AsDateTime := dsInicio1.Time

De esta forma le dejas el trabajo y pormenores de la conversión al componente en sí.

// Saludos
Responder Con Cita
  #16  
Antiguo 28-10-2008
FerCastro FerCastro is offline
Miembro
 
Registrado: abr 2006
Posts: 97
Poder: 18
FerCastro Va por buen camino
Hola Román,

La verdad es que nunca he usado parámetros, dónde puedo hallar un ejemplo pequeño de cómo hacerlo?

Gracias

Fernando
Responder Con Cita
  #17  
Antiguo 28-10-2008
FerCastro FerCastro is offline
Miembro
 
Registrado: abr 2006
Posts: 97
Poder: 18
FerCastro Va por buen camino
Hallé esto en el foro:

Código Delphi [-]
cadena := 'Update Documentos set doc_apel1=:apel1 ,doc_apel2=:apel2';
cadena := cadena + ', doc_nombre=:nombre';
cadena := cadena + ', usuario=:usu, fechagrab=:Fecha';
cadena := cadena + ' where doc_id=:id and doc_NH=:NH';
ADOQVarios.Active:=false;
ADOQVarios.SQL.Clear;
ADOQVarios.SQL.Add(cadena);
ADOQVarios.Parameters.ParamByName('id').DataType := ftInteger;
ADOQVarios.Parameters.ParamByName('id').Value :=cod;
ADOQVarios.Parameters.ParamByName('apel2').DataType := ftString;
ADOQVarios.Parameters.ParamByName('apel2').Value := eApe2.text;
ADOQVarios.Parameters.ParamByName('apel1').DataType := ftString;
ADOQVarios.Parameters.ParamByName('apel1').Value := eApe1.text;
ADOQVarios.Parameters.ParamByName('Nombre').DataType := ftString;
ADOQVarios.Parameters.ParamByName('Nombre').Value := eNombre.text;
ADOQVarios.Parameters.ParamByName('NH').DataType := ftInteger;
ADOQVarios.Parameters.ParamByName('NH').Value :=StrToInt(eNH.text);
ADOQVarios.Parameters.ParamByName('Fecha').DataType := ftDateTime;
ADOQVarios.Parameters.ParamByName('Fecha').Value := Now;
ADOQVarios.Parameters.ParamByName('Usu').DataType := ftString;
ADOQVarios.Parameters.ParamByName('Usu').Value :=MFunciones.GetLoginName;
ADOQVarios.ExecSQL;

Solo una pregunta, los parámetros se tiene que declarar todos y cada uno como variables?

Perdon por la pregunta, solo es una duda.

Saludos
Responder Con Cita
  #18  
Antiguo 28-10-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Se puede interpretar a los parámetros como unas variables especiales que luego serán sustituídas por los valores que se desean suministrar. Un parámetro se distingue en el SQL anteponiendo los dos puntos. Algo como:

Código SQL [-]
SELECT tus_campos
FROM tu_tabla
WHERE Campo1 = :ElParametro

En este caso el parámetro se llama ElParametro.

Luego, se debe indicar de donde va obtener los datos el parámetro. Esto se hace con:
Código Delphi [-]
TQuery1.Params.ParamByName('NombreParametro').AsTipo := ....

Recomiendo la lectura de la ayuda que proporciona al respecto.
Como podrás comprobar, si haces unas búsquedas encontrarás muchos hilos que hablan al respecto.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #19  
Antiguo 28-10-2008
FerCastro FerCastro is offline
Miembro
 
Registrado: abr 2006
Posts: 97
Poder: 18
FerCastro Va por buen camino
Román y todos, muchas gracias por la ayuda, ya quedó.

Hoy aprendí algo, ya me puedo dormir tranquilo

Perdón por las preguntas de párvulo, así pasa cuando uno apenas está aprendiendo.

FCG

Código Delphi [-]
        cCadena := ' UPDATE segmento SET '+
                    ' IDEmpresa = '+ QuotedStr(IntToStr(FMain.oVariables.nEmpresa))+
                   ' , IDSucursal = '+ QuotedStr(IntToStr(FMain.oVariables.nSucursal))+
                   ' , Nombre = '+ QuotedStr(csNombre.Text)+
                   ' , Comentario = '+ QuotedStr(csComentario.Text)+
                   ' , Lapsos = '+ QuotedStr(IntToStr(nLapsos))+
                   ' , Usuario = '+ QuotedStr(FMain.oVariables.cUsuario)+
                   ' , U_Fecha = '+ QuotedStr(DateToStr(Now))+
                   ' , Juntar1 = '+ QuotedStr(FloatToStr (nsJuntar1.Value))+
                   ' , Juntar2 = '+ QuotedStr(FloatToStr (nsJuntar2.Value))+
                   ' , Juntar3 = '+ QuotedStr(FloatToStr (nsJuntar3.Value))+
                   ' , Juntar4 = '+ QuotedStr(FloatToStr (nsJuntar4.Value))+
                   ' , Juntar5 = '+ QuotedStr(FloatToStr (nsJuntar5.Value))+
                   ' , Juntar6 = '+ QuotedStr(FloatToStr (nsJuntar6.Value))+
                   ' , Juntar7 = '+ QuotedStr(FloatToStr (nsJuntar7.Value))+
                   ' , Juntar8 = '+ QuotedStr(FloatToStr (nsJuntar8.Value))+
                   ' , Juntar9 = '+ QuotedStr(FloatToStr (nsJuntar9.Value))+
                   ' , Juntar10 = '+ QuotedStr(FloatToStr (nsJuntar10.Value))+

                   ' , HoraInicio1 = :h1'+
                   ' , HoraInicio2 = :h2'+
                   ' , HoraInicio3 = :h3'+
                   ' , HoraInicio4 = :h4'+
                   ' , HoraInicio5 = :h5'+
                   ' , HoraInicio6 = :h6'+
                   ' , HoraInicio7 = :h7'+
                   ' , HoraInicio8 = :h8'+
                   ' , HoraInicio9 = :h9'+
                   ' , HoraInicio10 = :h10'+

                   ' , HoraFin1 = :f1'+
                   ' , HoraFin2 = :f2'+
                   ' , HoraFin3 = :f3'+
                   ' , HoraFin4 = :f4'+
                   ' , HoraFin5 = :f5'+
                   ' , HoraFin6 = :f6'+
                   ' , HoraFin7 = :f7'+
                   ' , HoraFin8 = :f8'+
                   ' , HoraFin9 = :f9'+
                   ' , HoraFin10 = :f10'+
                  ' Where IDSegmento = '+ QuotedStr(IntToStr(nIDSegmento)) ;

          SQL.Clear;
          SQL.Add(cCadena);
          Parameters.ParamByName('h1').Value := dsInicio1.Time;
          Parameters.ParamByName('h2').Value := dsInicio2.Time;
          Parameters.ParamByName('h3').Value := dsInicio3.Time;
          Parameters.ParamByName('h4').Value := dsInicio4.Time;
          Parameters.ParamByName('h5').Value := dsInicio5.Time;
          Parameters.ParamByName('h6').Value := dsInicio6.Time;
          Parameters.ParamByName('h7').Value := dsInicio7.Time;
          Parameters.ParamByName('h8').Value := dsInicio8.Time;
          Parameters.ParamByName('h9').Value := dsInicio9.Time;
          Parameters.ParamByName('h10').Value := dsInicio10.Time;

          Parameters.ParamByName('f1').Value := dFin1.Time;
          Parameters.ParamByName('f2').Value := dFin2.Time;
          Parameters.ParamByName('f3').Value := dFin3.Time;
          Parameters.ParamByName('f4').Value := dFin4.Time;
          Parameters.ParamByName('f5').Value := dFin5.Time;
          Parameters.ParamByName('f6').Value := dFin6.Time;
          Parameters.ParamByName('f7').Value := dFin7.Time;
          Parameters.ParamByName('f8').Value := dFin8.Time;
          Parameters.ParamByName('f9').Value := dFin9.Time;
          Parameters.ParamByName('f10').Value := dFin10.Time;


          SQL.Text := cCadena;
          ExecSQL;
Responder Con Cita
  #20  
Antiguo 28-10-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por FerCastro Ver Mensaje
Román y todos, muchas gracias por la ayuda, ya quedó.

Hoy aprendí algo, ya me puedo dormir tranquilo

Perdón por las preguntas de párvulo, así pasa cuando uno apenas está aprendiendo.

FCG
Ya ves wey, y no querias usar parámetros

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Duplica registro en ClientDataSet maestro-detalle Josepo Conexión con bases de datos 8 07-05-2013 11:59:09
Duplica informacion en archivo txt muppett Varios 5 22-02-2008 14:08:28
Update!!!, pero solo para un registro ELINK Firebird e Interbase 6 08-01-2008 21:26:41
INSERT INTO duplica registros. Duc SQL 3 02-08-2004 17:46:09
Update registro - fallo con variable Gorehide SQL 4 13-07-2004 20:12:32


La franja horaria es GMT +2. Ahora son las 20:00:37.


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
Copyright 1996-2007 Club Delphi