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 14-09-2015
jars jars is offline
Miembro
 
Registrado: mar 2004
Posts: 279
Poder: 21
jars Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 15-09-2015
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.269
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
Cita:
Empezado por jars Ver Mensaje
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.
__________________
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 15-09-2015
jars jars is offline
Miembro
 
Registrado: mar 2004
Posts: 279
Poder: 21
jars Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 15-09-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Haz antes un backup. Luego pruebas.
¿Has dicho qué base de datos usas?
Responder Con Cita
  #5  
Antiguo 15-09-2015
jars jars is offline
Miembro
 
Registrado: mar 2004
Posts: 279
Poder: 21
jars Va por buen camino
El motor es Firebird 2.5
Responder Con Cita
  #6  
Antiguo 15-09-2015
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.269
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
Cita:
Empezado por jars Ver Mensaje
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.
__________________
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
  #7  
Antiguo 15-09-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
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
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
Update registros de columna1 de tabla A con registros de columna1 de tabla B soldierxp Firebird e Interbase 0 08-09-2013 16:45:09
Cifra histórica...... egostar La Taberna 76 24-11-2008 05:40:06
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
Problema con pasaje de .AVI a .BMP zugazua2001 Varios 2 09-07-2005 03:44:10
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


La franja horaria es GMT +2. Ahora son las 14:32:02.


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