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 01-09-2010
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Question Recuperar el valor de Returning

Buenas, tengo lo siguiente:

Código Delphi [-]
procedure insert_con_returning(query:TMDOQuery);
begin
  with query do
  begin
    Close;
    sql.Clear;
    SQL.Add('Insert into familias (cod_familia, fecha_ingreso_familia, estado_familia) ');
    sql.Add('Select gen_id(Select ibe$log, 1), current_timestamp, ');
    sql.Add('''A'' From rdb$database ');
    sql.Add('returning cod_familia ');
    try
      ExecSQL;
    except
      raise;
    end;
  end;
end;

Hasta aquí todo bien, resulta que quiero recuperar el valor que viene en Returning y no se como hacerlo. ¿Alguna sugerencia?
Uso Delphi 7, Firebird 2.1, MDO version 0.8.8.

Gracias.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.

Última edición por santiago14 fecha: 01-09-2010 a las 20:14:26. Razón: Errores en el código
Responder Con Cita
  #2  
Antiguo 02-09-2010
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Esto dice en la página 49 de Firebird 2.1 Release Notes

Rules for Using a RETURNING Clause

...

2 - The presence of the RETURNING clause causes an INSERT statement to be described by the API as
isc_info_sql_stmt_exec_procedure rather than isc_info_sql_stmt_insert. Existing connectivity
drivers should already be capable of supporting this feature without special alterations.

Creo entender que los componentes que estamos usando deberían de alguna manera capturar el dato que viene en Returning sin demasiado problema... la pregunta es como.
Bueno, espero que aporte algo esto.

Santiago.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #3  
Antiguo 02-09-2010
Avatar de Combat-F2D
Combat-F2D Combat-F2D is offline
Miembro
 
Registrado: may 2003
Ubicación: Toletum
Posts: 454
Poder: 21
Combat-F2D Va por buen camino
procedure insert_con_returning(query:TMDOQuery);

Código:
var tVardelTipodelField: tipo;

begin
with query do
begin
Close;
sql.Clear;
SQL.Add('Insert into familias (cod_familia, fecha_ingreso_familia, estado_familia) ');
sql.Add('Select gen_id(Select ibe$log, 1), current_timestamp, ');
sql.Add('''A'' From rdb$database ');
sql.Add('returning cod_familia ');
try
ExecSQL;

Código:
      tVardelTipodelField := FieldbyName('cod_familia').as....;
except
raise;
end;
end;
end;
__________________
online
Responder Con Cita
  #4  
Antiguo 02-09-2010
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Hola Combat
Al hacer lo que sugieres me sale el siguiente error:

query: Field 'cod_familia' not found
__________________
Uno es responsable de lo que hace y de lo que omite hacer.

Última edición por santiago14 fecha: 02-09-2010 a las 16:03:49. Razón: Errores de ortografía
Responder Con Cita
  #5  
Antiguo 02-09-2010
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
bueno y si en lugar de execsql se usa open?
Responder Con Cita
  #6  
Antiguo 02-09-2010
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Usando Open me dice lo mismo: query: Field 'cod_familia' not found.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #7  
Antiguo 02-09-2010
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Ya le encontré la vuelta... un segundo por favor que ya lo publico...
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #8  
Antiguo 02-09-2010
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Bueno la cosa viene así:
Pongo el código y luego lo explico, aunque es muy claro.

Código Delphi [-]
procedure insert_con_returning(codigo:Integer;query:TMDOSQL);
//procedure insert_con_returning(codigo:Integer;query:TMDOQuery);
var
  valor:Integer;
begin
  with query do
  begin
    Close;
    sql.Clear;
    SQL.Add('Insert into familias (cod_familia, fecha_ingreso_familia, estado_familia) ');
    sql.Add('Select (select nc.nro from nuevo_codigo(:nro_codigo) nc), current_timestamp, ');
    sql.Add('''A'' From rdb$database ');
    sql.Add('Returning cod_familia ');


    //ParamByName('nro_codigo').AsInteger:=codigo;
    Params.ByName('nro_codigo').AsInteger:=codigo;
    try
      //ExecSQL;
      ExecQuery;
      valor:= FieldByName('cod_familia').AsInteger;
    except
      raise;
    end;
  end;
  Application.MessageBox(PChar(inttostr(valor)), 'Resultado', MB_OK);
end;

En primer lugar debemos usar un TMDOSQL en lugar de un TMDOQuery, la consulta va igual, asignamos los parámetros de entrada con Params.ByName. Hacemos ExecQuery en lugar de ExecSQL y recuperamos el valor a través de FieldByName... Bueno esto funcionó bien.
Abajo pongo un Message para ver en la pantalla el id devuelto.
Con eso podemos recuperar de una sola vuelta los valores generados por gen_id sin tener que hacer cosas raras.
Espero haber ayudado, gracias a todos por los aportes.

Saludos.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #9  
Antiguo 27-09-2013
Avatar de pnsd_89
pnsd_89 pnsd_89 is offline
Miembro
 
Registrado: mar 2007
Posts: 112
Poder: 18
pnsd_89 Va por buen camino
Hola Amigos como estan.. Estoy tratando de Recuperar el valor del returning.
Me emocione al ver que lo han logrado con el MDO.
Pero yo utilizo DELPHI XE y Firebird 2.5 y al parecer no existen mas los componentes MDO para el XE de delphi.. alguna sugerencia?
he buscado mucho y no lo encuentro...
Responder Con Cita
  #10  
Antiguo 27-09-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Quizás puedas adaptarlos fácilmente. En todo caso podrás usar IBX que viene con delphi, son casi iguales, pero algo más avanzados.
Responder Con Cita
  #11  
Antiguo 27-09-2013
Avatar de pnsd_89
pnsd_89 pnsd_89 is offline
Miembro
 
Registrado: mar 2007
Posts: 112
Poder: 18
pnsd_89 Va por buen camino
Estoy peleando con los DBX pero no le encuentro el lado aún.
Si encuentro una solución la publico
Responder Con Cita
  #12  
Antiguo 27-09-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
De todas formas he dicho IBX, no DBX.
Responder Con Cita
  #13  
Antiguo 27-09-2013
Avatar de pnsd_89
pnsd_89 pnsd_89 is offline
Miembro
 
Registrado: mar 2007
Posts: 112
Poder: 18
pnsd_89 Va por buen camino
Ok probare con los IBX
Responder Con Cita
  #14  
Antiguo 28-09-2013
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Cita:
Empezado por pnsd_89 Ver Mensaje
Ok probare con los IBX
De seguro que con los IBX la cosa irá bien.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #15  
Antiguo 28-09-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por santiago14 Ver Mensaje
De seguro que con los IBX la cosa irá bien.
Claro, es que "returning" es posterior a la última versión de MDO, por eso no lo implementa.
Responder Con Cita
  #16  
Antiguo 30-09-2013
Avatar de pnsd_89
pnsd_89 pnsd_89 is offline
Miembro
 
Registrado: mar 2007
Posts: 112
Poder: 18
pnsd_89 Va por buen camino
hola todo mal con IBDataBase
Cuando intento conectarme tengo los siguientes mensajes.
Si coloco en el DatabaseName = C:\BD\bd_local.FDB
Me lanza el siguiente mensaje "Unavailable database"
En cambio si coloco de esta manera = 127.0.0.1:C:\BD\bd_local.FDB
me lanza lo siguiente "connection rejected by remote interface."

Lo curioso es que en el mismo DM tengo un TSQLConnetion el cual apunta a la misma BD y se conecta sin ningún problema.
Les ha pasado esto alguna vez?
Responder Con Cita
  #17  
Antiguo 30-09-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Poco podemos hacer si no explicas algo más, pones código, etc.
Yo diría que estás conectando cuando ya está conectada.
Responder Con Cita
  #18  
Antiguo 30-09-2013
Avatar de pnsd_89
pnsd_89 pnsd_89 is offline
Miembro
 
Registrado: mar 2007
Posts: 112
Poder: 18
pnsd_89 Va por buen camino
Lo que pasa es que no hay mucho codigo mas que los componentes en el IDE.
Solo inserte el componente IBDataBase en mi DataModule
Le coloque la ruta de mi BD, el usuario y contraseña y al darle TRUE en la propiedad connected del IBDataBase ya tira ese error.
Responder Con Cita
  #20  
Antiguo 01-10-2013
Avatar de pnsd_89
pnsd_89 pnsd_89 is offline
Miembro
 
Registrado: mar 2007
Posts: 112
Poder: 18
pnsd_89 Va por buen camino
Muchas gracias Casimiro por los enlaces, los he leído pero de igual manera era lo que yo ya estaba haciendo.
Cuando seleccione Local me sale un mensaje luego de apretar el test.
Y cuando selecciono remote me da el otro mensaje de error.

No creo que sea mi gds32.dll ni el fbclient.dll por que en el mismo DataModule tengo un TSqlConnetion que apunta a la misma base de datos en los parámetros y se conecta perfectamente, como también me conecto desde el IBExpert. Es por eso que me parece muy raro que me cree problemas el IBDatabase que estoy intentando conectar.

Cita:
Empezado por pnsd_89 Ver Mensaje
Local = "Unavailable database"
Remote = "connection rejected by remote interface."
Desde ya muchisimas gracias por la ayuda de siempre.. y espero poder conseguir capturar el bendito returning


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
Funcionamiento de la Clausula Returning Ricardojosep Firebird e Interbase 4 01-02-2010 01:14:01
ClientDataSet y returning de Firebird jconnor82 Firebird e Interbase 0 10-11-2009 03:20:47
Recuperar un valor de una tabla Pollo2004 Varios 3 10-10-2008 13:40:50
Como recuperar el valor de una variable en un ciclo... Arturo Varios 2 10-11-2006 18:33:52
¿Como recuperar un valor de un campo autoincrementable? SyncMaster Firebird e Interbase 3 11-05-2004 08:08:04


La franja horaria es GMT +2. Ahora son las 08:15: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