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);
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 ');
Params.ByName('nro_codigo').AsInteger:=codigo;
try
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.