Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-09-2019
NEURAL NEURAL is offline
Registrado
 
Registrado: sep 2019
Posts: 5
Poder: 0
NEURAL Va por buen camino
Problemas al Insertar registros de una tabla a otra periódicamente

Hola buenas, es mi primera consulta y, como novato, espero me perdonéis si no hago alguna cosa correctamente. Gracias de antemano a todos..

Tengo una duda sobre una consulta SQL ejecutada desde delphi 7 sobre MySQL que me está volviendo loco.. Agradezco si me echáis una mano..

Es simple. Tengo 2 tablas: 'TablaDestino', que está vacía, y 'TablaOrigen' que contiene los valores que deseo insertar en la primera tabla, y deseo hacerlo periódicamente en paquetes de 100 registros ordenados por el ID, es decir, primero copio del 1 al 100, luego del 101 al 200, y así..

Ambas son idénticas en estructura, tienen los mismos campos: ID,DT,TIME,V1,V2. En ambas el ID es la clave primaria autoincremental y el resto son datos sin más. Para ello realizo la siguiente consulta:

'INSERT INTO TablaDestino SELECT * FROM TablaOrigen ORDER BY ID ASC LIMIT 100'

Y luego borro de la tabla 'TablaOrigen' esos 100 registros, de forma que la siguiente vez, coja los 100 siguientes..

Bueno, pues el caso es que lo hace bien la primera consulta (lo he comprobado en ambas tablas, inserta y borra), pero la siguiente vez me da error de sintaxis en la SQL..

He pensado que podía ser un tema de índices, por lo que he probado a insertar todos los campos menos el indice 'ID', pero tb me da error:

'INSERT INTO TablaDestino (DT,TIME,V1,V2) VALUES (DT,TIME,V1,V2) FROM TablaOrigen ORDER BY ID ASC LIMIT 100'

Alguien me podría dar alguna pista?

Mil gracias
Responder Con Cita
  #2  
Antiguo 08-09-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por NEURAL Ver Mensaje
'INSERT INTO TablaDestino (DT,TIME,V1,V2) VALUES (DT,TIME,V1,V2) FROM TablaOrigen ORDER BY ID ASC LIMIT 100'
No recuerdo que se pudiera hacer eso, creo que deben ser todos los campos.
Responder Con Cita
  #3  
Antiguo 09-09-2019
NEURAL NEURAL is offline
Registrado
 
Registrado: sep 2019
Posts: 5
Poder: 0
NEURAL Va por buen camino
Problemas al Insertar registros de una tabla a otra periódicamente

Gracias por contestar Casimiro.

Si pongo todos los campos (tb el ID) me sale el mismo error: 'You have an error in your SQL sintax; check de manual.."

He cambiado por esta otra y tampoco..

'INSERT INTO TablaDestino (SELECT ID,DT,TIME,V1,V2 FROM TablaOrigen ORDER BY ID ASC LIMIT 100) ORDER BY ID'

Pero lo desconcertante para mí es que, tanto en ésta última como en la más sencilla y que debería funcionar ('INSERT INTO TablaDestino SELECT * FROM TablaOrigen ORDER BY ID ASC LIMIT 100'), la instrucción la haga bien la primera vez y luego salga el error.. Porque entonces no puede ser un error de sintaxis..

Puede ser que al borrar de la tabla origen los 100 ya copiados pase algo con los índices que a mí se me escapa? En las tablas no veo ningún indice duplicado ni saltado.. Aparentemente lo hace bien cada vez que lo pongo en marcha (solo que solo lo hace una vez y a la siguiente sale el error).

Alguna sugerencia?

Muchas gracias!
Responder Con Cita
  #4  
Antiguo 09-09-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Habría que ver el código que usas, poco más podemos ayudar con esa información.
Responder Con Cita
  #5  
Antiguo 09-09-2019
NEURAL NEURAL is offline
Registrado
 
Registrado: sep 2019
Posts: 5
Poder: 0
NEURAL Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Habría que ver el código que usas, poco más podemos ayudar con esa información.
Ahí va el código:

procedure TFprincipal.THaonlineTimer(Sender: TObject);
VAR
idprimero:integer;
begin
Consulta.Close;
Consulta.SQL.Add('INSERT INTO '+Tabladestino.TableName+' SELECT * FROM '+TablaOrigen.TableName+' ORDER BY ID ASC LIMIT 100');
Consulta.ExecSQL;
Tabladestino.ApplyUpdates;

TablaOrigen.Open;
TablaOrigen.first;
idprimero:=TablaOrigen.Fieldbyname('ID').asinteger;
Consulta.Close;
Consulta.SQL.Clear;
Consulta.SQL.Add('DELETE FROM '+TablaOrigen.TableName);
Consulta.SQL.Add(' WHERE ID>=:miID1 AND ID<=:miID2');
Consulta.ParamByName('miID1').asinteger:= idprimero;
Consulta.ParamByName('miID2').asinteger:= idprimero+99;
Consulta.ExecSQL;
TablaOrigen.ApplyUpdates;
TablaOrigen.close;
end;

Las Tablas tienen la propiedad cachedupdates a true. El procedimiento es un evento Ontimer que se ejecuta cada 5 sg.

Si necesitáis información distinta a ésta me decís..

Gracias
Responder Con Cita
  #6  
Antiguo 09-09-2019
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
hola a todos!!

Prueba añadiendo un SQL.clear antes de hacer la consulta INSERT INTO (linea en rojo del código)
Código Delphi [-]
procedure TFprincipal.THaonlineTimer(Sender: TObject);
var
  idprimero: integer;
begin
  Consulta.Close;
  Consulta.SQL.clear;
  Consulta.SQL.Add('INSERT INTO ' + Tabladestino.TableName + ' SELECT * FROM ' + TablaOrigen.TableName + ' ORDER BY ID ASC LIMIT 100');
  Consulta.ExecSQL;
  Tabladestino.ApplyUpdates;

  TablaOrigen.Open;
  TablaOrigen.first;
  idprimero := TablaOrigen.Fieldbyname('ID').asinteger;
  Consulta.Close;
  Consulta.SQL.Clear;
  Consulta.SQL.Add('DELETE FROM ' + TablaOrigen.TableName);
  Consulta.SQL.Add(' WHERE ID>=:miID1 AND ID<=:miID2');
  Consulta.ParamByName('miID1').asinteger := idprimero;
  Consulta.ParamByName('miID2').asinteger := idprimero + 99;
  Consulta.ExecSQL;
  TablaOrigen.ApplyUpdates;
  TablaOrigen.close;
end;
Responder Con Cita
  #7  
Antiguo 09-09-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
No olvides usar las etiquetas para el código.


Responder Con Cita
  #8  
Antiguo 09-09-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por bucanero Ver Mensaje
Prueba añadiendo un SQL.clear antes de hacer la consulta INSERT INTO (linea en rojo del código)
Ese es el problema.
Siempre utilizo sql.text en lugar de add, porque así no hay problema nunca.

Código Delphi [-]
consulta.sql.text := 'select ...';
Responder Con Cita
  #9  
Antiguo 09-09-2019
NEURAL NEURAL is offline
Registrado
 
Registrado: sep 2019
Posts: 5
Poder: 0
NEURAL Va por buen camino
Cita:
Empezado por bucanero Ver Mensaje
hola a todos!!

Prueba añadiendo un SQL.clear antes de hacer la consulta INSERT INTO (linea en rojo del código)
Código Delphi [-]
procedure TFprincipal.THaonlineTimer(Sender: TObject);
var
  idprimero: integer;
begin
  Consulta.Close;
  Consulta.SQL.clear;
  Consulta.SQL.Add('INSERT INTO ' + Tabladestino.TableName + ' SELECT * FROM ' + TablaOrigen.TableName + ' ORDER BY ID ASC LIMIT 100');
  Consulta.ExecSQL;
  Tabladestino.ApplyUpdates;

  TablaOrigen.Open;
  TablaOrigen.first;
  idprimero := TablaOrigen.Fieldbyname('ID').asinteger;
  Consulta.Close;
  Consulta.SQL.Clear;
  Consulta.SQL.Add('DELETE FROM ' + TablaOrigen.TableName);
  Consulta.SQL.Add(' WHERE ID>=:miID1 AND ID<=:miID2');
  Consulta.ParamByName('miID1').asinteger := idprimero;
  Consulta.ParamByName('miID2').asinteger := idprimero + 99;
  Consulta.ExecSQL;
  TablaOrigen.ApplyUpdates;
  TablaOrigen.close;
end;
Mil gracias Bucanero!! Vaya fallo tonto Está claro que el ojo no ve lo evidente a veces.. Podía haber estado semanas sin darme cuenta!!!

Gracias de nuevo
Responder Con Cita
  #10  
Antiguo 09-09-2019
NEURAL NEURAL is offline
Registrado
 
Registrado: sep 2019
Posts: 5
Poder: 0
NEURAL Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Ese es el problema.
Siempre utilizo sql.text en lugar de add, porque así no hay problema nunca.

Código Delphi [-]
consulta.sql.text := 'select ...';
Gracias, tienes razón.. Con text esto no me hubiera pasado.. Y no volverá a pasar..

Ah y utilizaré las etiquetas!

Un saludo y gracias de nuevo
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
actualizar tabla al insertar en otra tabla hybrid Conexión con bases de datos 14 02-12-2009 15:09:13
enviar registros de una tabla a un campo de otra tabla a travez de ciclo IF en MYSQL CLUSTERBIT SQL 8 23-10-2008 15:50:03
Dbgrid para insertar en una tabla pero cogiendo datos de otra tabla taru MySQL 1 27-07-2006 15:36:12
Seleccionar registros en una tabla, envio, e insercion en otra tabla!! EfrainSanmiguel Conexión con bases de datos 3 21-10-2004 01:12:43
Como insertar datos de una tabla en otra tabla? Salomon Firebird e Interbase 1 28-08-2003 11:29:40


La franja horaria es GMT +2. Ahora son las 21:36:43.


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