[Lazarus-es] obtener id recién grabado

Maxi maximiliano.duarte en gmail.com
Mie Dic 19 20:18:40 CET 2012


Hacer un select max() no sirve para la concurrencia ya que otro puede
haber pedido el mismo valor. Los generadores son atomicos a toda la
base y estan fuera de las transacciones por lo que nunca va a darte un
numero que pidio otra transaccion. Se podria decir que lo malo que
tiene que crece el numerador y si tenes muchas transacciones que no se
completan te quedan muchos huecos.
Para mi es lo mejor paa estos casos.

El día 19 de diciembre de 2012 14:53, Ismael L. Donis Garcia
<ismael en citricos.co.cu> escribió:
> Exacto debes usar la función returning de firebird.
>
> Te pongo de ejemplo SP textual que tengo en una BD:
>
> SET TERM ^ ;
> CREATE PROCEDURE P_ENC_SAL (
>     INT_IDAC INT_NNULL,
>     INT_IDA INT_NNULL,
>     INT_NUM INT_NNULL,
>     DAT_FECHA DAT_NNULL,
>     VCH_FACTURA VCH_11_NULL,
>     VCH_RECIB VCH_30_NULL,
>     VCH_TRANSP VCH_30_NULL,
>     VCH_CLAVE VCH_2_NNULL,
>     INT_USU INT_NNULL )
> RETURNS (
>     INT_SAL INT_NULL,
>     INT_IDS INT_NULL )
> AS
> BEGIN
>   /* Procedimiento para registrar el encabezado de los vales de salida */
>   insert into vteano (idac, ida, num, fecha, factura, recib, transp, clave,
> iduv)
>       values (:int_idac, :int_ida, :int_num, :dat_fecha, :vch_factura,
> :vch_recib, :vch_transp, :vch_clave, :int_usu) returning idea into :int_ids;
>   int_sal = row_count;
>   suspend;
> END^
> SET TERM ; ^
>
> El campo llave de la tabla se llama idea
>
> Saludos
> =========
> || ISMAEL ||
> =========
>
> ----- Original Message -----
> From: Martin Gomez
> To: Spanish version of Lazarus List
> Sent: Wednesday, December 19, 2012 9:18 AM
> Subject: Re: [Lazarus-es] obtener id recién grabado
>
> para cada base de datos hay una función (distinta en cada caso) que te
> devuelve el valor del último id automático utilizado.
>
> aparentemente, en firebird la forma mas sencilla es ejecutar el INSERT con
> un RETURNING al final, en vez de Query.ExecSQL utilizas Query.Open y ya
> tenes el resultado.
>
> http://www.firebirdfaq.org/faq243/
>
>
>
> 2012/12/19 Paola Bruccoleri <pbruccoleri en adinet.com.uy>
>>
>> Hola todos..
>> quizás el asunto no es muy claro, trataré de explicar lo que quiero
>> lograr.
>>
>> Tengo un form donde debo capturar unos datos que se grabarán en una tabla1
>> y a su vez capturar registros complementarios a esos datos (1 o más) que
>> serán grabados en una tabla2.
>> A la hora de grabar, tabla1 obtendrá su id en forma automática, pero debo
>> usar ese mismo id para grabar los registros complementarios a ese en tabla2.
>> Uso componentes zeos y firebird.
>> Puedo usar un store procedure, pero no se si se le puede pasar por ej un
>> array como parámetro (que serían los registros que irán a tabla2)
>> Para que tengan una idea, lo asociaré a la idea clásica de una factura y
>> sus detalles, donde el id de factura será el mismo obviamente en el maestro
>> y en el detalle.
>>
>> Agradezco cq idea
>> muchas gracias!
>>
>>
>>
>>
>> _______________________________________________
>> Lazarus-es mailing list
>> Lazarus-es en lists.lazarus.freepascal.org
>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
>
>
>
>
> --
> Try not to become a man of success but rather to become a man of value.
> Albert Einstein
>
> ________________________________
>
> _______________________________________________
> Lazarus-es mailing list
> Lazarus-es en lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
>
>
> _______________________________________________
> Lazarus-es mailing list
> Lazarus-es en lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
>



-- 
El que pregunta aprende, y el que contesta aprende a responder.

No a la obsolecencia programada:
http://dimensionargentina.blogspot.com/2011/01/todo-esta-disenado-para-romperse.html

Linux User #495070
http://domonetic.com/blog




More information about the Lazarus-es mailing list