Ver Mensaje Individual
  #8  
Antiguo 02-09-2010
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Reputación: 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