Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Pasaje de registros a tabla histórica (https://www.clubdelphi.com/foros/showthread.php?t=89027)

jars 14-09-2015 18:39:38

Pasaje de registros a tabla histórica
 
Hola amigos.
En una BBDD de estadísticas hay varias tablas que recogen una gran cantidad de registros diariamente y el cliente quiere poder sacar informes de los últimos 3 años. Ante esto, nota que algunos informes se estan demorando y supongo que es por la cantidad de registros. Mi intención es darle al cliente la posibilidad de ingresar una fecha de depuración de las tablas de producción para pasar todos estos registros a tablas históricas en la misma BBDD.
Todas las tablas tienen índices y Unique-Keys y las históricas son replicas exactas.
Lo haría de desde un programa Delphi 7 y una vez que ingrese la fecha ejecutaría para cada tabla:

Código SQL [-]
BEGINTRANSACCTION
INSERT INTO H_TABLA1  SELECT * FROM TABLA1 WHERE LOGINDATE <= '20140914'
// luego
DELETE FROM TABLA1 WHERE LOGINDATE <= '20140914'
COMMIT

Mi preocupación es como manejar si ocurre alguna excepción.
Como esta programado se que el commit se hara si tanto insert como delete funciono correctamente, pero no tendría forma de saber que registro tuvo problemas.
Estas depuraciones pueden ser de varios cientos de miles de registros, que mecanismo me sugieren?

Gracias de antemano.

Neftali [Germán.Estévez] 15-09-2015 10:13:35

Cita:

Empezado por jars (Mensaje 496676)
Mi preocupación es como manejar si ocurre alguna excepción.

Si lo vas a hacer desde Delphi basta con unsar un Try..except, junto con Commit/Rollback.

La estructura sería algo así:

Código Delphi [-]
Begin Transaction
try
  Realizar el insert
  Realizar el delete  
  // Si llega aquí, todo correcto
  Realizar el commit
except
  // Si hay error, rollaback y apuntamos
  Rollback
  -> Apuntar en un log a lisrta el registro que ha dado error 
end;

por otro lado, si vas a "mover" muchos miles de registros, es posible que te sea bastante más eficiente realizare sas operaciones desde la Base de Datos, utilizando SP's.

jars 15-09-2015 13:51:13

Gracias Neftali pero usando:

Código SQL [-]
INSERT INTO H_TABLA1  SELECT * FROM TABLA1 WHERE LOGINDATE <= '20140914'

Creo que no tengo forma de capturar el registro que dio error y tengo entendido que hacer el insert de esta forma es mas rapido que hacerlo registro por registro.
Es asi o estoy equivocado?.

Gracias.

Casimiro Notevi 15-09-2015 14:02:20

Haz antes un backup. Luego pruebas.
¿Has dicho qué base de datos usas?

jars 15-09-2015 14:24:32

El motor es Firebird 2.5

Neftali [Germán.Estévez] 15-09-2015 15:23:21

Cita:

Empezado por jars (Mensaje 496725)
Creo que no tengo forma de capturar el registro que dio error y tengo entendido que hacer el insert de esta forma es mas rapido que hacerlo registro por registro.
Es asi o estoy equivocado?.


No, no estás equivocado.
Pido disculpas, porque no leí correctamente la pregunta y entendí otra cosa.

AgustinOrtu 15-09-2015 16:16:25

Y porque tardan los informes? Yo recuerdo que una vez tenía un listado de caja que era lentísimo y era porque calculaba los suma y sigue desde Delphi en un while. Movi eso a un simple SUM en la consulta sql y ahora el listado se abre al instante para algunos millones de registros :)


La franja horaria es GMT +2. Ahora son las 16:25:18.

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