Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-01-2006
Mathom Mathom is offline
Miembro
 
Registrado: nov 2005
Posts: 72
Poder: 19
Mathom Va por buen camino
Error Key Violation al copiar tablas

Hola a todos, os comento a ver si me podéis indicar a que es debido un error. Os explico. Tengo una tabla en una dirección con alias (AAA) y al pulsar un botón quiero que dicha tabla se me copie en otra dir. con alias (BBB). Bien, el dódigo que utilizo es el siguiente:

Código:
procedure TFormPrincipal.Realizarcopia1Click(Sender: TObject);
begin
DM.TblDep_seg.Insert;
DM.TblDep_seg.FieldByName('Nombre').AsString := DM.TblDep.fieldbyname('Nombre').AsString;
DM.TblDep_seg.FieldByName('Cod_dep').AsString := DM.TblDep.fieldbyname('Cod_dep').AsString;
DM.TTblDep_seg.Post;
DM.TblDep_seg.Refresh;
end;
El campo "Cod_dep" es clave primaria. Tanto Cod_dep como Nombre son String´s y la tablas son Paradox.

Bien, pues cuando pulso dicho botón me aparece el mensaje de error "Key Violation". Tiene que ver con la clave primaria?? que estoy haciendo mal??

Gracias de antemano y un saludo.
Responder Con Cita
  #2  
Antiguo 10-01-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.279
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Seguramente en la tabla destino ya existe un valor igual al que estás intentando copiar.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 10-01-2006
Mathom Mathom is offline
Miembro
 
Registrado: nov 2005
Posts: 72
Poder: 19
Mathom Va por buen camino
Antes que nada y como siempre gracias Neftali. Efectivamente, lo que quiero hacer es una especie de copia de seguridad muy simple por lo que habrá datos que estarán en las dos tablas. Como puedo hacer para poder copiar datos repetidos??
Responder Con Cita
  #4  
Antiguo 10-01-2006
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Hola:

Si están definido en la otra tabla como llave primaria no podrás copiar esos datos repetidos porque el motor se encargará de mantener dicha consistencia.

Hasta Luego -
__________________
No todo es como parece ser...
Responder Con Cita
  #5  
Antiguo 10-01-2006
Mathom Mathom is offline
Miembro
 
Registrado: nov 2005
Posts: 72
Poder: 19
Mathom Va por buen camino
Entonces cómo podría hacer para copiar una tabla entera machacando resultados??, ya que la aplicación tendrá otro botón que será restaurar la copia, es decir, la acción inversa (de la tabla de seguridad a la original).

Responder Con Cita
  #6  
Antiguo 10-01-2006
Mathom Mathom is offline
Miembro
 
Registrado: nov 2005
Posts: 72
Poder: 19
Mathom Va por buen camino
Quizás creando una tabla nueva??...respetaría las claves??
Responder Con Cita
  #7  
Antiguo 10-01-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
O eliminando los registros de la tabla destino antes de hacer la copia...
Responder Con Cita
  #8  
Antiguo 10-01-2006
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
o tal vez:
Código:
 insertar
 si hay error de violación de clave entonces
  actualizar
__________________

Responder Con Cita
  #9  
Antiguo 11-01-2006
Mathom Mathom is offline
Miembro
 
Registrado: nov 2005
Posts: 72
Poder: 19
Mathom Va por buen camino
Ya estoy aquí, he estado probando y me compila pero después al intentar ejecutarlo se me cuelga, os indico el código a ver si sabeis que pasa...fijo que es un error en un while y no lo veo....

Código:
procedure TFormPrincipal.Realizarcopia1Click(Sender: TObject);
begin
  while not DM.TblDepartamentos_seg.Eof do
          DM.TblDepartamentos_seg.Delete;

  while not DM.TblDepartamentos.Eof do
    DM.TblDepartamentos_seg.Insert;
    DM.TblDepartamentos_seg.FieldByName('Nombre').AsString := DM.TblDepartamentos.fieldbyname('Nombre').AsString;
    DM.TblDepartamentos_seg.FieldByName('Cod_dep').AsString := DM.TblDepartamentos.fieldbyname('Cod_dep').AsString;
    DM.TblDepartamentos_seg.Post;
    DM.TblDepartamentos_seg.Refresh;
end;
Gracias por vuestra ayuda
Responder Con Cita
  #10  
Antiguo 11-01-2006
Mathom Mathom is offline
Miembro
 
Registrado: nov 2005
Posts: 72
Poder: 19
Mathom Va por buen camino
no hagais caso, me he dejado el begin. Lo siento mea culpa....
Responder Con Cita
  #11  
Antiguo 11-01-2006
Mathom Mathom is offline
Miembro
 
Registrado: nov 2005
Posts: 72
Poder: 19
Mathom Va por buen camino
Perdón por el error anterior. Ya me funciona, también se me había olvidado poner que las tablas fuesen adelantando un registro. Al final para aquel que le interese el código ha quedado del siguiente modo:

Código:
procedure TFormPrincipal.Realizarcopia1Click(Sender: TObject);
begin
  while not DM.TblDepartamentos_seg.Eof do
          DM.TblDepartamentos_seg.Delete;
  DM.TblDepartamentos_seg.Refresh;
  while not DM.TblDepartamentos.Eof do
  begin
    DM.TblDepartamentos_seg.Insert;
    DM.TblDepartamentos_seg.FieldByName('Nombre').AsString := DM.TblDepartamentos.fieldbyname('Nombre').AsString;
    DM.TblDepartamentos_seg.FieldByName('Cod_dep').AsString := DM.TblDepartamentos.fieldbyname('Cod_dep').AsString;
    DM.TblDepartamentos_seg.Post;
    DM.TblDepartamentos_seg.Refresh;
    DM.TblDepartamentos_seg.Next;
    DM.TblDepartamentos.Next;
  end;
end;
Gracias por vuestra ayuda.
Responder Con Cita
  #12  
Antiguo 12-01-2006
Mathom Mathom is offline
Miembro
 
Registrado: nov 2005
Posts: 72
Poder: 19
Mathom Va por buen camino
Hola a todos, de nuevo con mis problemas...seguramente tontos.

Recordais que quería hacer una copia de seguridad (esplicada más arriba) y que, resumiendo, tenía que borrar los registros antes de copiarlos??? Bien, pues en eso estoy, el caso es que tengo tablas maestro- detalle. La idea es borrar todas las tablas una por una por lo que el código se me queda del siguiente modo:

Código:
procedure TFormPrincipal.Realizarcopia1Click(Sender: TObject);
begin
  DM.TblPedidos_seg.First;
  while not DM.TblPedidos_seg.Eof do
  begin
    DM.TblArticulosPedido_seg.First;
    while not DM.TblArticulosPedido_seg.Eof do
       DM.TblArticulosPedido_seg.Delete;
    DM.TblPedidos_seg.Delete;
    DM.TblPedidos_seg.Refresh;
  end; 

    DM.TblAlbaranes_seg.First;
    While not DM.TblAlbaranes_seg.Eof do
    begin
      DM.TblDetalleAlbaranes_seg.First;
      while not DM.TblDetalleAlbaranes_seg.Eof do
          DM.TblDetalleAlbaranes_seg.Delete;
      DM.TblAlbaranes_seg.Delete;
      DM.TblAlbaranes_seg.Refresh;
    end;
..............

DM.TblDepartamentos_seg.First;
  while not DM.TblDepartamentos_seg.Eof do
          DM.TblDepartamentos_seg.Delete;
  DM.TblDepartamentos_seg.Refresh;
...........
El final del código sería la copia de las tablas pero primero esto.
EL tema es que lo ejecuto y al pulsar en ralizar copia me aparece el mensaje de error:

"TblPedidos_seg:Cannot perfom this operation on an empty dataset"

El caso es que me borra los registros u posteriormente saca este error por lo que la aplicación (la copia de seguridad, o sea, lo borrados de las otras tablas) se detiene. El resto de la aplicación sigue funcionando.

Si la acaba de borrar la de pedidos por que da el error?? en todo caso no debería ser si estuviese vacia desde un principio??

A ver si me lo aclarais un poco, porque no entiendo nada..

gracias...
Responder Con Cita
  #13  
Antiguo 12-01-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Prueba quitando la línea que hace el Refresh...

Es lo único que veo en tu código que podría estar provocando el error.


Saludos...
Responder Con Cita
  #14  
Antiguo 12-01-2006
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
¿No sería mejor usar un "Drop table" o un "delere from" en lugar de ir borrando registro por registro?
__________________

Responder Con Cita
  #15  
Antiguo 12-01-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Tomando lo que dice ContraVeneno, el componente TTable tiene un método llamado EmptyTable que bien te podría servir para lo que buscas.



Saludos...
Responder Con Cita
  #16  
Antiguo 12-01-2006
Mathom Mathom is offline
Miembro
 
Registrado: nov 2005
Posts: 72
Poder: 19
Mathom Va por buen camino
Gracias....he quitado la línea del refresh y me ha funcionado. Pero no lo entiendo, por que daba el error???

De nuevo, gracias.
Responder Con Cita
  #17  
Antiguo 16-01-2006
Mathom Mathom is offline
Miembro
 
Registrado: nov 2005
Posts: 72
Poder: 19
Mathom Va por buen camino
Hola e nuevo, vuelvo con mis dudas...me encuentro en el intento de copiar los datos de una tabla maestro detalle a otra maestro-detalle. En un principio intentaba copiar las tablas por separado pero no me aparece la información correcta en la detalle y no me aparecía nada en la pedidos. Ahora estoy probando de otro modo, el código que utilizo es el siguiente:

Código:
DM.TblPedidos.First;
  while not DM.TblPedidos.Eof do
  begin
    DM.TblPedidos_seg.Insert;
    DM.TblPedidos_seg.FieldByName('Id').AsString := DM.TblPedidos.fieldbyname('Id').AsString;
    DM.TblPedidos_seg.FieldByName('Proveedor').AsString := DM.TblPedidos.fieldbyname('Proveedor').AsString;
    DM.TblPedidos_seg.FieldByName('Cod_Pedido').AsString := DM.TblPedidos.fieldbyname('Cod_Pedido').AsString;
    DM.TblPedidos_seg.FieldByName('Nom_Proveedor').AsString := DM.TblPedidos.fieldbyname('Nom_Proveedor').AsString;
    DM.TblPedidos_seg.FieldByName('Fecha').AsString := DM.TblPedidos.fieldbyname('Fecha').AsString;
    DM.TblPedidos_seg.FieldByName('Fecha_prevista').AsString := DM.TblPedidos.fieldbyname('Fecha_prevista').AsString;
    DM.TblPedidos_seg.FieldByName('Fecha_llegada').AsString := DM.TblPedidos.fieldbyname('Fecha_llegada').AsString;
    DM.TblPedidos_seg.FieldByName('Gen_Albaran').AsString := DM.TblPedidos.fieldbyname('Gen_Albaran').AsString;
    while not DM.TblArticulosPedido.Eof do
      begin
        DM.TblArticulosPedido_seg.Insert;
        DM.TblArticulosPedido_seg.FieldByName('Articulo').AsString := DM.TblArticulosPedido.fieldbyname('Articulo').AsString;
        DM.TblArticulosPedido_seg.FieldByName('Id').AsString := DM.TblArticulosPedido.fieldbyname('Id').AsString;
        DM.TblArticulosPedido_seg.FieldByName('Cod_Pedido').AsString := DM.TblArticulosPedido.fieldbyname('Cod_Pedido').AsString;
        DM.TblArticulosPedido_seg.FieldByName('Cantidad').AsString := DM.TblArticulosPedido.fieldbyname('Cantidad').AsString;
        DM.TblArticulosPedido_seg.FieldByName('Ultimo_precio').AsString := DM.TblArticulosPedido.fieldbyname('Ultimo_precio').AsString;
        DM.TblArticulosPedido_seg.Post;
        DM.TblArticulosPedido_seg.Next;
       DM.TblArticulos.Next;
      end;
    DM.TblPedidos_seg.Post;
    DM.TblPedidos_seg.Next;
    DM.TblPedidos.Next;
  end;
Pero me da el siguiente error:

"Corrupt Index. Index E:\webs\Hotels\delphi\DBHG_seg\DB\PEDIDOS.PX"

Entonces mis preguntas son:

- PQ no se pueden copiar las tablas por separado??
- Es el código lo que hace que me de el error comentado??

Espero que me podais echar una mano.

Un saludo y gracias...
Responder Con Cita
  #18  
Antiguo 16-01-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
El problema puede estar en que en las relaciones maestro-detalle, se necesita que exista el registro padre antes de poder insertar los registros hijos, por aquello de la integridad referencial.

Entonces, en tu código, insertas un registro padre, pero antes de hacer el post, insertas los registros hijos y haces post a cada hijo, pero al no existir un registro padre se produce un error.

Trata haciendo el post del registro padre antes de insertar los registros hijos.



Saludos...
Responder Con Cita
  #19  
Antiguo 17-01-2006
Mathom Mathom is offline
Miembro
 
Registrado: nov 2005
Posts: 72
Poder: 19
Mathom Va por buen camino
Hola a todos desde lo más profundo de la desesperación..después del último comentario de maeyanes parecía que me había funcionado pero de nuevo me da algún error en tiempo de ejecución, cuando no es un Corrupt Index es un Key Violation y si no un Table is not in insert o edit mode....resumiendo que me desespero. Por lo tanto os quería pedir permiso para poneros todo el código que envuelve ala operación de realizar copia para ver si de una vez por todas lo puedo a echar para adelante. No es demasiado código, y es muy simple (muy repetitivo, lo mismo para cada una de las tablas) pero es bastante y no quisiera ni que os aburrais antes de leerlo ni abusar.

Bien, espero vuestra respuesta para pasaroslo y explicaros como está hecho.

Gracias de antemano y espero no estar abusando pero empiezo a estar un poco (por decir algo) de los nervios.
Responder Con Cita
  #20  
Antiguo 17-01-2006
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
  • Creo que solo bastaría el "Next" que utilizas para controlar el ciclo "While" pero ¿Para qué sirve la instrucción "Next" que pones despues de cada "Post"?
  • Si lo que quieres copiar el contenido de una tabla en otra, ¿es necesario hacerlo registro por registro? ¿SQL podría funcionar?
  • Con todo respeto, si pones todo el código yo no lo leería
__________________

Responder Con Cita
Respuesta



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
Transacción en tablas InnoDB FunBit MySQL 1 02-01-2006 17:26:58
Copiar tablas Access TONIAM Conexión con bases de datos 0 22-04-2005 11:36:18
Copiar registros ordenados a otras tablas... Phacko Conexión con bases de datos 6 06-01-2005 01:08:27
ayuda al copiar dos tablas.... ronimaxh Firebird e Interbase 4 16-04-2004 17:34:39


La franja horaria es GMT +2. Ahora son las 09:40:16.


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