Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
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 16-07-2013
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.681
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Perdona, pero esta calor no me deja pensar bien
El caso es que no acabo de entender exactamente el proceso.
¿Tienes los datos de los ciclistas en una tabla y quieres insertarlo en otra distinta?
Responder Con Cita
  #2  
Antiguo 16-07-2013
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 585
Poder: 20
jafera Va por buen camino
Mas o menos.

Explico el proceso:

1- Obtengo el txt nacional y lo cargo en una tabla temporal de firebird
2- Obtengo los txt autonomicos y los cargo en unas tablas temporales (una por autonomia) ya que los datos pueden variar en su formato
3- Paso los datos de la tabla temporal nacional a la tabla general de trabajo
4- Paso los datos de las tablas autonomicas a la tabla principal de trabajo, es decir quiero añadir los corredores que no tienen licencia nacional pero si autonómica.

Los pasos 3 y 4 es donde demoro mucho tiempo en actualizar, si la tabla tiene datos pues estos se actualizan sin problema con el stored procedure, pero si los datos no existen se deben añadir y no se como hacerlo.

He dudado en si seria mejor borrar toda la tabla principal y hacer un insert masivo de los datos nacionales y luego solo insertar los autonomicos que no figuren en la misma, pero estoy en el mismo punto de inflexión, no se como ejecutar estos procesos sin un update con sql el cual me lleva mucho tiempo en realizarse.

Gracias de nuevo

Josep

Última edición por jafera fecha: 16-07-2013 a las 19:32:02.
Responder Con Cita
  #3  
Antiguo 16-07-2013
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.681
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Seguramente lo más rápido es borrar la "nacional" y luego hacer inserts de las "autonómicas". Te ahorras buscar en cada uno y actualizar en los que ya existen.

Puedes hacer un select de todas las tablas "autonómicas" con inner join y luego un insert, por ejemplo, algo parecido a esto:

Código SQL [-]
delete from tbNacionales;

for select *
  from tbAndalucia ...
  inner join tbExtremadura ...
  inner join tbGalicia ...
  ...
  into dato1, dato2, dato3, dato4, dato5, ...
do
begin
  insert into tbNacionales values (:dato1,:dato2,:dato3,...)
end
Responder Con Cita
  #4  
Antiguo 16-07-2013
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 585
Poder: 20
jafera Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Seguramente lo más rápido es borrar la "nacional" y luego hacer inserts de las "autonómicas". Te ahorras buscar en cada uno y actualizar en los que ya existen.
Gracias de nuevo.

Esto seria ideal si se recibieran todas las autonomias, pero habitualmente cada una trabaja con la tabla nacional más la tabla de su autonomía como máximo la vecina.

Sigo dandole vueltas ya que me guste o no debo basarme en la tabla nacional que es la maestra, la que recoge la gran mayoria de practicantes del ciclismo y luego complementarla con la de la autonomía (cada usuario basicamente la suya).

Si cada semana borro la tabla general y la recargo con la llegada del nuevo txt, tengo la tabla nacional al dia pero luego debo añadir los datos autonomicos, no se que es lo más rápido si un borrado y un insert o un update.

La tabla nacional actualmente gira por los 60.000 registros y el update tarda unos 3 o 4 minutos.

No se a mi el calor puede que tampoco me deje pensar, esto unido a mi falta de experiencia en estos menesters sql pues me deja bastante bajo de moral y a punto de abandonar el barco, este proyecto ya ha estado mucho tiempo en dique seco por este problema y ahora lo he querido retomar despues del campeonato de España, pero creo que lo aparcaré de nuevo hasta el año próximo antes del nuevo campeonato pues me veo completamente ofuscado y vencido por el Sr. SQL.

En mi negocio tengo tambien un sistema realizado en delphi corriendo en FB 1.5 y hay procesos parecidos que se realizan en un tiempo prudencial. Este es que me saca de quicio y creo que debe haber un sistema para efectuar estos inserts o updates más rápidos, hasta un programa de carreras que usamos hecho con VB y tablas access es más rápido y los datos a procesar son los mismos origenes (txt).

No se lo dejaré por hoy y mañana será otro dia.

Gracias y saludos

Josep
Responder Con Cita
  #5  
Antiguo 16-07-2013
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.681
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Hombre, si quieres más precisión, entonces mejor danos información de las tablas implicadas.
Y recuerda que con firebird también tienes la sentencia: update or insert
No abandones el barco, eso es lo último, ya sabes
Responder Con Cita
  #6  
Antiguo 17-07-2013
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 585
Poder: 20
jafera Va por buen camino
Bunos dia a todos.

Gracias por los ánimos, no voy a abandonar el barco, soy el capitán y me hundo con él, jejeje...

Siguiendo con el problema paso a detallar la creación de las tablas:

Tabla temporal donde cargo el archivo txt nacional (a dia de hoy +o- 60.000 registros)

Código SQL [-]
 
CREATE TABLE "CTR0003E" 
(
  "C1" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C2" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C3" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C4" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C5" VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C6" VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C7" VARCHAR(20) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C8" VARCHAR(3) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C9" VARCHAR(3) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C10" VARCHAR(12) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C11" VARCHAR(12) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C12" VARCHAR(2) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C13" VARCHAR(12) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C14" VARCHAR(30) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C15" VARCHAR(3) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C16" VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C17" VARCHAR(15) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C18" VARCHAR(15) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C19" VARCHAR(15) CHARACTER SET ISO8859_1 COLLATE ES_ES
);

Tabla temporal donde cargo el archivo txt autonomico, (a dia de hoy +o- 20.000 registros de los que muchos estan en el txt nacional)

Código SQL [-]
 
CREATE TABLE "CTR0003C" 
(
  "C1" VARCHAR(3) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C2" VARCHAR(20) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C3" VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C4" VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C5" VARCHAR(20) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C6" VARCHAR(3) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C7" VARCHAR(14) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C8" VARCHAR(12) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C9" VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C10" VARCHAR(3) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C11" VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "C12" VARCHAR(12) CHARACTER SET ISO8859_1 COLLATE ES_ES
);

Tabla destino donde debo insertar o actualizar los datos procedentes primero de la nacional y luego los que no existan de la autonomica

Código SQL [-]
 
CREATE TABLE "CTR0003" 
(
  "ID_CORREDOR" INTEGER NOT NULL,
  "DORSAL" INTEGER,
  "DORSAL2" INTEGER,
  "COGNOM1" VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "COGNOM2" VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "NOM" VARCHAR(20) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "CODI_CAT" INTEGER,
  "NACIO" VARCHAR(3) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "LLICENCIA" VARCHAR(14) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "DNI" VARCHAR(12) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "CODIUCI" VARCHAR(12) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "CODI_CLUB" INTEGER,
  "CLUB" VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "ABR_CLUB" VARCHAR(3) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "PUBLICITAT" VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "SEXE" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "FEDERAT" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
  "DATA_NAIX" DATE,
  "EDAT" INTEGER,
  "CATEGORIA" VARCHAR(5) CHARACTER SET ISO8859_1 COLLATE ES_ES
);

A ver si así se puede ver de una forma más clara que proceso debo realizar para llenar esta tabla CTR0003 con los datos de CTR0003E y luego con los que no estén en CTR0003E de CTR0003C

Saludos y gracias por vuestro tiempo

Josep
Responder Con Cita
  #7  
Antiguo 17-07-2013
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.418
Poder: 24
fjcg02 Va camino a la fama
Hola jafera,

yo lo haría de un sólo paso...

1.- Ya has cargado la tabla temporal de los datos nacionales...

Ahora, inserta los de la tabla autonómica que no estén en la nacional:
Código SQL [-]
insert into "CTR0003" 
   ( "ID_CORREDOR" ,  "DORSAL" ,  "DORSAL2" , "COGNOM1" ,  "COGNOM2" ,  "NOM" ,  "CODI_CAT" ,   "NACIO" ,   "LLICENCIA" ,   "DNI" ,,   "CODIUCI" ,   "CODI_CLUB" ,   "CLUB" ,   "ABR_CLUB" ,   "PUBLICITAT",   "SEXE" ,  "FEDERAT" ,   "DATA_NAIX" ,   "EDAT" ,   "CATEGORIA" )
SELECT C1, C2, C3... FROM "CTR0003C" AUTONOMICA
LEFT JOIN "CTR0003" DEFINITIVA ON ( AUTONOMICA.DNI= DEFINITIVA.DNI )
WHERE DEFINITIVA.DNI IS NULL

Observa la segunda parte "SELECT ... LEFT JOIN ...
Si ejecutas esto en el ibexpert por ejemplo, incluyes el DNI de la tabla definitiva en la select ( DEFINITIVA.DNI) y quitas la where, te saldrán todos los registros de la tabla autonomica, y el DNI de los que que encuentre en la tabla nacional. Aquellos cuyo DNI de la tabla definitiva están vacíos son los que no encuentra en la tala definitiva. Si incluyes la clausula "WHERE DEFINITIVA.DNI IS NULL" le estás diciendo que sólo te devuelva los registros que están en la tabla autonomica y no en la definitiva. Una vez que hayas hecho esas comprobaciones, ejecuta toda la sentencia.
Inserta en la tabla definitiva todos los registros que devuelva la select que te digo. Si afinas con la select, todo en un solo paso.

Ten en cuenta que el orden de los campos en la select son importantes, ya que se cargan en el mismo orden que has puesto en la INSERT. Es decir, si en primer campo de la insert es el DNI, en la select el primer campo debe ser el DNI. ( no especificas el significado de los capos C1, C2, ...).
También ten en cuenta que la condición del where puede ser diferente ( no conozco en detalle las tablas) y por lo que comentas interviene algún campo más.

Te dejo de deberes que hagas lo siguiente:
1.- Jugar con la select hasta que te salgan los registros que necesites, así como la información que necesites ( campos en orden correcto).
2.- Ver la diferencia entre el INNER JOIN y el LEFT JOIN.
3.- Hacer la inserción ( que te tardará 15 segundos máximo).

Prueba y nos cuentas.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
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
Aportación del código de un stored procedure para conversión literal de números birmain Firebird e Interbase 12 16-07-2015 19:12:29
Insertar desde una tabla con loop en stored procedure Fita Firebird e Interbase 2 04-06-2013 00:39:23
Problema con Stored Procedure para actualizar tabla con datos de otra tabla. Adrian Murua MySQL 4 04-02-2012 02:54:49
Insertar en Un Stored Procedure DasGrun Firebird e Interbase 7 13-12-2011 23:46:20
Stored Procedure !!! Ledian_Fdez C++ Builder 0 02-03-2010 14:01:29


La franja horaria es GMT +2. Ahora son las 06:31:38.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi