Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-01-2005
VRO VRO is offline
Miembro
 
Registrado: abr 2004
Posts: 230
Poder: 21
VRO Va por buen camino
Problema con una consulta hecha de 3 formas

Hola, tengo un problemón llevo 8 horas para hacer una consulta, la he intentado hacer de 3 formas distintas.

Primeramente utilizo la tabla texportar (contador,fecha,lectura,consumo) son sus campos.
Lo que pretendo es exportar datos a esta tabla mediante un query y lo que tiene que hacer la consulta es si el contador (que es la clave principal de la tabla) que pretendo introducir en la tabla texportar ya existe en esa tabla modifico sus datos (fecha,lectura,consumo) y si no existe los inserto. Necesito hacer la consulta de una vez para evitar la conexión repetida al servidor ya que la consulta está dentro de un bucle ó lazo.

Acontinuación os pongo el código de como la intentado hacer.Por cierto utilizo Firebird 1.5:

La primera opción por la que opté fue:
Código Delphi [-]
query.Close;
query.SQL.Add('replace texportar(contador,fecha,lectura,consumo)VALUES ('+datos.IBADOQ.fieldbyname('numero').text+',#'+FormatDateTime('mm/dd/yy',datos.IBADOQ.fieldbyname('fecha').asdatetime)+'#,'+datos.IBADOQ.fieldbyname('lectura').text+','+  datos.IBADOQ.fieldbyname('consumo').text+')');
query.ExecSQL;

Creo que no ha resultado porque el replace pertenece a MySql y no a SQL estandar,si no me equivoco.

Segunda forma:
Código Delphi [-]
query.SQL.Clear;
query.SQL.Add('insert into texportar(contador,fecha,lectura,consumo)values('+ datos.IBADOQ.fieldbyname('numero').text+',#'+FormatDateTime('mm/dd/yy',datos.IBADOQ.fieldbyname('fecha').asdatetime)+'#,'+datos.IBADOQ.fieldbyname('lectura').text+','+  datos.IBADOQ.fieldbyname('consumo').text+')on duplicate key (update fecha=#'+FormatDateTime('mm/dd/yy',datos.IBADOQ.fieldbyname('fecha').asdatetime)+'#, lectura='+datos.IBADOQ.fieldbyname('lectura').text+ ',consumo='+datos.IBADOQ.fieldbyname('consumo').text+')');
query.ExecSQL;

Esta opción creo que falla por lo mismo que la anterior porque el on duplicate key es de MySql

Tercera:
Código Delphi [-]
query.Close;
query.SQL.Text:='INSERT INTO texportar SELECT contador,fecha,lectura,consumo, (IF ((SELECT contador FROM texportar';
query.SQL.Text:=query.sql.Text+' WHERE contador<>'+datos.IBADOQ.fieldbyname('numero').text+')then';
query.SQL.Text:=query.sql.Text+' INSERT INTO texportar (contador,fecha,lectura,consumo)values('+datos.IBADOQ.fieldbyname('numero').text+'';
query.SQL.Text:=query.sql.Text+',#'+FormatDateTime('mm/dd/yy',datos.IBADOQ.fieldbyname('fecha').asdatetime)+'#,'+datos.IBADOQ.fieldbyname('lectura').text+'';
query.SQL.Text:=query.sql.Text+','+datos.IBADOQ.fieldbyname('consumo').text+')else UPDATE texportar'+'';
query.SQL.Text:=query.sql.Text+'SET fecha=#'+FormatDateTime('mm/dd/yy',datos.IBADOQ.fieldbyname('fecha').asdatetime)+'#';   query.SQL.Text:=query.sql.Text+',lectura='+datos.iBADOQ.fieldbyname('lectura').Text+',consumo='+dato  s.IBADOQ.fieldbyname('consumo').Text+' where contador='+ datos.IBADOQ.fieldbyname('numero').Text+')) from texportar';
query.Open;

Esta opción realmente no se porque falla ya que los if si son permitidos en Sql estandar.

Por favor, si laguien sabe como resolver esta consulta, ó si sabe otra forma de hacerla aunque sea partiendo la consulta en varias..

P.D:
datos.IBADOQ= corresponde a otro query de interbase ya que con el saco los datos que quiero exportar.

desde ya mismo , muchas gracias.
Responder Con Cita
  #2  
Antiguo 21-01-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Tu mensaje es casi imposible de leer.

Te sugiero que lo edites para cortar las líneas. Más aún, sería mejor si escribieras las consultas SQL directamente sin código Delphi.

// Saludos
Responder Con Cita
  #3  
Antiguo 21-01-2005
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
Hola VRO!

Con respecto a esta consulta coincido en que es mejor hacerla directamente en SQL.

Ya que estás utilizando FireBird 1.5 puedes aprovechar la sintaxis de los
procedimientos almacenados para facilitarte este trabajo.

En la definición del procedimiento puedes declarar las variables y los parámetros,
utilizar sentencias IF THEN ELSE, WHILE , etc.

Un ejemplo:

Código SQL [-]
SET TERM!!;
CREATE PROCEDURE PRUEBA( param1 INTEGER, param2 VARCHAR(40))
AS
  DECLARE VARIABLE var1 INTEGER;
BEGIN
   SELECT 
     COUNT(clave)
   FROM tabla1
   WHERE clave=aram1;
   INTO :var1;/*Cuenta los registros y los almacena en var1*/
 
   IF (var1=0) THEN 
       INSERT INTO tabla1 (clave,nombre)
       VALUES (aram1,aram2);
  ELSE
      UPDATE tabla1 
      SET nombre=aram2
      WHERE clave=aram1;
  .
  .
  .
END!!
SET TERM;!!

Te recomiendo que busques información de los procedimientos almacenados en Firebird.

Un Saludo.
Responder Con Cita
  #4  
Antiguo 24-01-2005
VRO VRO is offline
Miembro
 
Registrado: abr 2004
Posts: 230
Poder: 21
VRO Va por buen camino
Perdonad pero se ma ha olvidado deciros lo mas importante, la tabla texportar no es una tabla de la base de datos Firebird 1.5 si no que es una tabla que he creado yo directamente con codigo Delphi, en Access, solamente para exportar los datos de la tabla lecturas de Firebird 1.5(numero,fecha,lecturas, consumo), por lo que la comprobación de si existe el contador modifico los datos y si no existe inserto el datos es sobre una tabla en Access poerlo que no pùedo utilizar procedimientos almacenado ya que Access no tiene esa función.

Espero que después de esta torpeza siga contando con vuestra ayuda. Muchas gracias
Responder Con Cita
  #5  
Antiguo 24-01-2005
VRO VRO is offline
Miembro
 
Registrado: abr 2004
Posts: 230
Poder: 21
VRO Va por buen camino
Gracias

Gracias, en verdad al final lo he hecho con procedimientos almacenado guardandolo en una tabla en Interbase y despues transportanto los registros a Access
Responder Con Cita
  #6  
Antiguo 24-01-2005
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
Cita:
Empezado por VRO
Espero que después de esta torpeza siga contando con vuestra ayuda.
Estoy seguro de que en este foro siempre encontrarás algún amigo que este dispuesto a brindar ayuda, eso ni duda cabe.

Por otra parte yo no le llamaría torpeza, todos aquí estamos en el mismo proceso de aprendizaje y retroalimentación.

Un saludo.
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


La franja horaria es GMT +2. Ahora son las 06:42:37.


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