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 29-03-2011
campiki campiki is offline
Miembro
 
Registrado: jun 2008
Posts: 25
Poder: 0
campiki Va por buen camino
Reemplazar en lugar de insertar

He buscado por el foro pero no supe encontrarlo. Antes de todo gracias por la ayuda.

Uso Delphi 7 y firebird.

En un momento determinado creo una tabla y en ella grabo unos registros, estos los paso mediante sql a una segunda tabla.

Lo hago así...

Cita:
ibquery1.sql.Add('insert into ');
ibquery1.sql.Add( nomfitlli);
ibquery1.SQL.Add(' (Campo1, Campo2, Campo3, Campo4... etc)');
ibquery1.sql.Add('Select Campo1, Campo2, Campo3, Campo4... etc');
ibquery1.sql.Add('From LLISTAT');
ibquery1.ExecSQL;
El problema está que este proceso debe y puede ejecutarse más de una vez, pero si lo vuelvo a ejecutar me da error por duplicar la clave.

No sé cómo puedo hacer para que los registros si ya existen se reemplacen y si son nuevos se añadan.

Pd- Antes usaba el batchmove pero va muy lento...

Gracias de nuevo.
Responder Con Cita
  #2  
Antiguo 29-03-2011
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.331
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
Pues creo que no te queda otra que primero hacer la búsqueda (por clave primaria) y dependiendo de si lo encentra o no realizar el INSERT o UPDATE.
Otra opción, pero que en el fondo es lo mismo, es realizar el INSERT, capturar el error de clave duplicada y en ese momento realizar el UPDATE.
__________________
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 29-03-2011
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Busca detalles sobre el comando MERGE de Firebird.

Por ejemplo aqui :http://www.firebirdsql.org/refdocs/l...d21-merge.html

... y te sorprenderás, al igual que lo hice yo en su día, del potencial de esa instrucción.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #4  
Antiguo 29-03-2011
campiki campiki is offline
Miembro
 
Registrado: jun 2008
Posts: 25
Poder: 0
campiki Va por buen camino
Gracias mi miraré Merge... y si no a hacer lectura sequencial...
Responder Con Cita
  #5  
Antiguo 29-03-2011
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Thumbs up

Aunque me llama la atencion del motivo de insertar muchas veces los mismo datos, pues no acabo de enteder el por qué , a no ser que ciertos campos cambien, excepto los campos primarios, pero si los datos no cambian en ningun momento, entonces es en vano estar modificando a cada rato...
Bueno.. en MySQL existe la sentencia REPLACE que funciona exactamente como INSERT, excepto que si un valor de la tabla tiene el mismo valor que un nuevo registro para un índice PRIMARY KEY o UNIQUE , el antiguo registro se borra antes de insertar el nuevo. Yo no uso Firebird pero supongo que debe existir algo similar aunque viendo el link del amigo gluglu veo que existe el comando MERGE en firebird supongo que debe ser similar.
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #6  
Antiguo 29-03-2011
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.331
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 gluglu Ver Mensaje
Busca detalles sobre el comando MERGE de Firebird.
No había oído sobre este comando. Curioso e interesante.
__________________
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 29-03-2011
campiki campiki is offline
Miembro
 
Registrado: jun 2008
Posts: 25
Poder: 0
campiki Va por buen camino
Gracias rgstuamigo, ya vi que MySql daba la posibilidad, pero Firebird no...

Explicaré porque debo hacer lo que parece una cosa ilógica...

El programa lanza un pac de albaranes, estos puede que sean los definitivos o no...

En el caso de que lo fueran, los albaranes se graban en un archivo definitivo. El problema es que algunas veces, antes de sacarlos se dan cuenta que deben hacer modificaciones... Con lo que vuelven a lanzarlos y la información se debe reemplazar en el archivo definitivo.

No nos sirve editar el albaran uno a uno, las modificaciones suelen ser en bloques, y la gestión de modificar es más complicada por la forma de trabajo que la de volver a lanzar y reemplazar... No sé si me habré explicado bien. En cualquier caso es lo que necesito.

A todos muchos gracias. Si consigo algo con MERGE lo publico.
Responder Con Cita
  #8  
Antiguo 31-03-2011
campiki campiki is offline
Miembro
 
Registrado: jun 2008
Posts: 25
Poder: 0
campiki Va por buen camino
Cita:
Empezado por gluglu Ver Mensaje
Busca detalles sobre el comando MERGE de Firebird.

Por ejemplo aqui :http://www.firebirdsql.org/refdocs/l...d21-merge.html

... y te sorprenderás, al igual que lo hice yo en su día, del potencial de esa instrucción.
Pues probado y si no me he equivocado funciona

Gracias gluglu y a todos los que habeis aportado algo.

Para que funcionara he tenido que actulizar Firebird a una versión más moderna, pues esta instrucción funciona a partir de la 2.1. Una vez realizada la actualización he implantado este código... Ahora estoy probando si funciona bien o no, el código es este.

Cita:
ibquery1.SQL.Add('MERGE into ');
ibquery1.SQL.Add( Llistat2011);
ibquery1.SQL.Add(' d using Llistat o');
ibquery1.SQL.Add('on d.dia = o.dia and d.producte = o.producte and d.ruta = o.ruta');
ibquery1.SQL.Add('when matched then');
ibquery1.SQL.Add('Update set d.campo1 = o.campo1, ');
ibquery1.SQL.Add('d.campo2 = o.campo2, ');
ibquery1.SQL.Add('d.campo3 = o.campo3 ');
ibquery1.SQL.Add('when not matched then');
ibquery1.SQL.Add(' insert (d.PRODUCTE,d.campo1,d.campo2,d.campo3, d.DIRECCIO,d.RUTA,d.DIA,)');
ibquery1.SQL.Add('values (o.PRODUCTE,o.campo1,o.campo2,o.campo3, o.DIRECCIO,o.RUTA,o.DIA,)');
ibquery1.ExecSQL;
Nuevamente gracias.

Última edición por campiki fecha: 31-03-2011 a las 12:18:55.
Responder Con Cita
  #9  
Antiguo 31-03-2011
campiki campiki is offline
Miembro
 
Registrado: jun 2008
Posts: 25
Poder: 0
campiki Va por buen camino
Funciona bien y rápido...
Responder Con Cita
  #10  
Antiguo 31-03-2011
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Me alegro !
__________________
Piensa siempre en positivo !
Responder Con Cita
  #11  
Antiguo 31-03-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.096
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Vaya, no conocía esa posibilidad
Responder Con Cita
  #12  
Antiguo 31-03-2011
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
.... nunca te acostarás sin saber algo nuevo !

Incluso después de tanto tiempo usar tu BBDD preferida. Por lo cual sigue siendo válida la teoría de revisar cada 2 o 3 años el manual de lo que estás utilizando, porque resulta que te das cuenta de que existe algo que ni siquiera sabías que podía existir !
__________________
Piensa siempre en positivo !
Responder Con Cita
  #13  
Antiguo 31-03-2011
campiki campiki is offline
Miembro
 
Registrado: jun 2008
Posts: 25
Poder: 0
campiki Va por buen camino
Cita:
Empezado por gluglu Ver Mensaje
.... nunca te acostarás sin saber algo nuevo !

Incluso después de tanto tiempo usar tu BBDD preferida. Por lo cual sigue siendo válida la teoría de revisar cada 2 o 3 años el manual de lo que estás utilizando, porque resulta que te das cuenta de que existe algo que ni siquiera sabías que podía existir !
Mi "problema", es que soy cobolero, de los de toda la vida... y en eso me muevo como pez en el agua. Pero un día cambié a Objective Cobol, un cobol basado parecido al Delphi... y luego salté a Delphi... Un mundo... y las BBDD y las SQL aún (después de tiempo) se me atragantan un poco...

Realmente hecho de menos la velocidad de Cobol bajo Unix, cuando consiga esa velocidad de precesamiento de datos que tenía antes, seré un hombre feliz...

Seguiré investigando/preguntado cuando me surja un "problemilla".
Responder Con Cita
  #14  
Antiguo 17-05-2011
campiki campiki is offline
Miembro
 
Registrado: jun 2008
Posts: 25
Poder: 0
campiki Va por buen camino
Donde dije digo digo Diego...

Funciona... pero, sólo si la tabla la tengo en Local, cuando la tabla la tengo en red me da error...

¿Alguna sugerencia?
Responder Con Cita
  #15  
Antiguo 17-05-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.096
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por campiki Ver Mensaje
[..] cuando la tabla la tengo en red me da error...
¿Alguna sugerencia?
Sí, te sugiero que pongas aquí el error
Responder Con Cita
  #16  
Antiguo 17-05-2011
campiki campiki is offline
Miembro
 
Registrado: jun 2008
Posts: 25
Poder: 0
campiki Va por buen camino
El error es el siguiente.

Código:
Dynamic SQL Error
SQL Error code = -104
Token Unknown - line 1, Column 0
MERGE.
Es el mismo error que me daba antes de actualizar a la versión 2.1 de firebird.

Si ejecuto en modo local, tanto en el servidor como en el cliente, funciona, sólo da error en red!!!

Gracias.
Responder Con Cita
  #17  
Antiguo 17-05-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.096
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Entonces en red ¿qué quiéres decir exactamente? ¿que está en otro ordenador de servidor?, entonces es que ese servidor tiene otra versión de firebird seguramente.
Responder Con Cita
  #18  
Antiguo 17-05-2011
campiki campiki is offline
Miembro
 
Registrado: jun 2008
Posts: 25
Poder: 0
campiki Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Entonces en red ¿qué quiéres decir exactamente? ¿que está en otro ordenador de servidor?, entonces es que ese servidor tiene otra versión de firebird seguramente.
Tiene la misma... Ya lo comprobé y si ejecuto el programa directamente en local en cualquier máquina funciona, sólo cuando accedo a la información por red es cuando da el error... Raro raro raro...
Responder Con Cita
  #19  
Antiguo 17-05-2011
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
El error que te dá te está indicando que no entiende el comando MERGE.

Algo tienes que tener con diferentes versiones de Firebird, o con algún tipo de configuración específica.

Te funciona el resto de la aplciación ? Puedes acceder a la BD en red ?

Si es así, y lo que pasa es que no entiende el comando MERGE entonces es la versión, como te indica Casimiro. Si ni siquiera puedes ejecutar la aplicación u otro parte de tu código, entonces es que no estás accediendo a la BD.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #20  
Antiguo 17-05-2011
campiki campiki is offline
Miembro
 
Registrado: jun 2008
Posts: 25
Poder: 0
campiki Va por buen camino
Todo funciona correctamente. Menos el Merge en Red.

Ya he comentado, la versión de Firebird es la misma en las dos máquina, todo funciona correctamente menos Merge.

Seguiré buscando...
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
Insertar registro en grilla en un lugar particular zugazua2001 Varios 3 05-02-2010 16:14:06
Como insertar una tabla en un lugar especifico....WORD juliobuitrago Servers 3 02-10-2008 18:00:05
Cada cosa en su lugar jcarteagaf Humor 2 22-05-2008 15:58:53
Lugar en un String Carmelo Cash Varios 2 13-08-2004 15:20:47
El mas novato del lugar pepelu1975 OOP 1 10-02-2004 16:55:39


La franja horaria es GMT +2. Ahora son las 01:09:04.


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