Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2012-12

obtener id recién grabado

16 messages · 9 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Paola Bruccoleri

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!

Reply by email

Martin Gomez
to Paola Bruccoleri

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>

Show quoted text 26 lines
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<Lazarus-es en lists.lazarus.freepascal.org> http://lists.lazarus.**freepascal.org/mailman/**listinfo/lazarus-es<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* ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20121219/5f5b493f/attachment.html>

Reply by email

christian Ortiz
to Paola Bruccoleri: Hola todos.. quiz�s el asunto no es muy claro, tratar� de explicar lo que quiero…

puedes hacer esto :

obtienes la serial del maestro antes de grabar ( en posgres es algo como "select nextval('nombre_seccuencia')" ) ESta deberas grabarla en la tabla maetra y la tendras para grabarla en el detalle.

El 19 de diciembre de 2012 09:09, Paola Bruccoleri < pbruccoleri en adinet.com.uy> escribi�:

Show quoted text 26 lines
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<Lazarus-es en lists.lazarus.freepascal.org> http://lists.lazarus.**freepascal.org/mailman/**listinfo/lazarus-es<http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es>
Christian ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20121219/a035f2c5/attachment.html>

Reply by email

Maxi
to Martin Gomez: para cada base de datos hay una funci�n (distinta en cada caso) que te devuelve el…

El d�a 19 de diciembre de 2012 11:18, Martin Gomez <mmgomez en gmail.com> escribi�:

Show quoted text 52 lines
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

Muy buen dato Martin.
La otra forma es usar generadores los cuales al utilizarlos no pueden volver atras aunque la operacion se cancele. Generas un nuevo numero y ya podes utilizarlo las veces que necesites. y te simplificas la programacion en el motor y el soft.

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

Reply by email

José Mejuto
to Paola Bruccoleri: Hola todos.. quiz�s el asunto no es muy claro, tratar� de explicar lo que quiero…

El 19/12/2012 15:09, Paola Bruccoleri escribi�:

Show quoted text 15 lines
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.

Hola,

Con Zeos m�rate la ayuda del componente ZSequence que es para esas cosas.

Reply by email

Ismael L. Donis Garcia
to Martin Gomez: para cada base de datos hay una funci�n (distinta en cada caso) que te devuelve el…

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 ||
=========

Earlier message 37 lines
----- 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!

Reply by email

Ismael L. Donis Garcia
to christian Ortiz: puedes hacer esto : obtienes la serial del maestro antes de grabar ( en posgres es algo…

Esto te puede causar problemas si tienes muchas concurrencias. El valor siempre debes obtenerlo despu�s de asignado.

Saludos
=========
|| ISMAEL ||
=========

Earlier message 33 lines
----- Original Message ----- From: christian Ortiz To: Spanish version of Lazarus List Sent: Wednesday, December 19, 2012 9:35 AM Subject: Re: [Lazarus-es] obtener id reci�n grabado puedes hacer esto : obtienes la serial del maestro antes de grabar ( en posgres es algo como "select nextval('nombre_seccuencia')" ) ESta deberas grabarla en la tabla maetra y la tendras para grabarla en el detalle. El 19 de diciembre de 2012 09:09, Paola Bruccoleri <pbruccoleri en adinet.com.uy> escribi�: 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!

Reply by email

Maxi
to Ismael L. Donis Garcia: Exacto debes usar la funci�n returning de firebird. Te pongo de ejemplo SP textual que…

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�:

Show quoted text 103 lines
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

Reply by email

Ismael L. Donis Garcia
to Maxi

Yo no puse esa parte, pero lo tengo as�, siguiendo el ejemplo tengo el siguiente trigger en dicha tabla:

SET TERM ^ ;
CREATE TRIGGER VTEANO_BI FOR VTEANO ACTIVE
BEFORE INSERT POSITION 0
AS
BEGIN
  /* Trigger para actualizar la llave primaria */
  if (new.idea is null) then
    begin
      if (gen_id(gen_vteano_id, 0) >= 2147483645) then
        new.idea = gen_id(gen_vteano_id, (gen_id(gen_vteano_id, 0) * -2) +
1);
      else
        new.idea = gen_id(gen_vteano_id, 1);
    end
END^
SET TERM ; ^

Saludos Reiterados
=========
|| ISMAEL ||
=========

Earlier message 138 lines
----- Original Message ----- From: "Maxi" <maximiliano.duarte en gmail.com> To: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus.freepascal.org> Sent: Wednesday, December 19, 2012 2:18 PM Subject: Re: [Lazarus-es] obtener id reci�n grabado 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

Reply by email

Paola Bruccoleri
to Martin Gomez: para cada base de datos hay una funci�n (distinta en cada caso) que te devuelve el…

El 19/12/2012 12:18 p.m., Martin Gomez escribi�:

Show quoted text 9 lines
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/

Hola MArt�n y dem�s compa�eros..
ya tengo definidos generadores y disparadores en esas tablas. Ya he probado en otras tablas que al grabar, se genera autom�ticamente el id correspondiente sin necesidad de usar un componente zsequence. Ahora estoy probando de usar el RETURNING... en un zquery coloqu� algo as�:

insert into tabla (c1, c2, c3) values (:c1, :c2, :c3) returning codigo

cargo los par�metros
hago un qry.open;

pero no se como capturar el campo c�digo para usarlo en el otro query con el insert.

hice algo as�:
nCodigo:= qry.FieldByName('codigo').AsInteger;
pero no funciona!.. (lo mismo usando ParamByName)
no se cual ser� la sintaxis correcta...

muchas gracias!

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20121219/58a1a48e/attachment.html>

Reply by email

Maxi
to Paola Bruccoleri

no te lo devuelve como campo?

El d�a 19 de diciembre de 2012 17:10, Paola Bruccoleri <pbruccoleri en adinet.com.uy> escribi�:

Show quoted text 40 lines
El 19/12/2012 12:18 p.m., Martin Gomez escribi�: 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/ Hola MArt�n y dem�s compa�eros.. ya tengo definidos generadores y disparadores en esas tablas. Ya he probado en otras tablas que al grabar, se genera autom�ticamente el id correspondiente sin necesidad de usar un componente zsequence. Ahora estoy probando de usar el RETURNING... en un zquery coloqu� algo as�: insert into tabla (c1, c2, c3) values (:c1, :c2, :c3) returning codigo cargo los par�metros hago un qry.open; pero no se como capturar el campo c�digo para usarlo en el otro query con el insert. hice algo as�: nCodigo:= qry.FieldByName('codigo').AsInteger; pero no funciona!.. (lo mismo usando ParamByName) no se cual ser� la sintaxis correcta... muchas gracias! _______________________________________________ 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

Reply by email

Paola Bruccoleri
to Martin Gomez: para cada base de datos hay una funci�n (distinta en cada caso) que te devuelve el…

El 19/12/2012 12:18 p.m., Martin Gomez escribi�:

Show quoted text 10 lines
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/

Hola Mart�n.. reci�n envi� un mail que no se si lleg�, pero ya logr� el cometido:
en el returning hay que poner el nombre real del campo, en mi caso id, y luego obtenerlo con el Fieldbyname.

El tema de los generadores, como dice maxi, es que te quedan varios huecos de n�meros si la transacci�n falla, como me pas� a mi ahora probando. Supongo que otra forma no hay, a no ser que se lleve un contador de n�meros aparte para esto, tal como se har�a en caso de los nros de factura, que no pueden andar quedando huecos por ah�)

SAludos!

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20121219/ecc5ce81/attachment.html>

Reply by email

Ismael L. Donis Garcia
to Paola Bruccoleri: El 19/12/2012 12:18 p.m., Martin Gomez escribi�: Hola MArt�n y dem�s compa�eros..…

Ponlo en un procedimiento almacenado que retorne el valor. Si analizas el ejemplo que te mand� retorna 2 valores: 1 el ide del campo y otro que si es mayor que 0 insert� el registro.

Como dice Mart�n debes hacer un .Open y revisas el valor del registro.

Saludos Reiterados
=========
|| ISMAEL ||
=========

Earlier message 44 lines
----- Original Message ----- From: Paola Bruccoleri To: Spanish version of Lazarus List Sent: Wednesday, December 19, 2012 3:10 PM Subject: Re: [Lazarus-es] obtener id reci�n grabado El 19/12/2012 12:18 p.m., Martin Gomez escribi�: 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/ Hola MArt�n y dem�s compa�eros.. ya tengo definidos generadores y disparadores en esas tablas. Ya he probado en otras tablas que al grabar, se genera autom�ticamente el id correspondiente sin necesidad de usar un componente zsequence. Ahora estoy probando de usar el RETURNING... en un zquery coloqu� algo as�: insert into tabla (c1, c2, c3) values (:c1, :c2, :c3) returning codigo cargo los par�metros hago un qry.open; pero no se como capturar el campo c�digo para usarlo en el otro query con el insert. hice algo as�: nCodigo:= qry.FieldByName('codigo').AsInteger; pero no funciona!.. (lo mismo usando ParamByName) no se cual ser� la sintaxis correcta... muchas gracias! ------------------------------------------------------------------------------

Reply by email

Antonio Evora
to Paola Bruccoleri: El 19/12/2012 12:18 p.m., Martin Gomez escribi�: Hola Mart�n.. reci�n envi� un…

Pues yo pensaba que ese escenario no deber�a darse, y lo de no deber�a me refiero que pensaba que para darse ese caso podr�a darse solamente en el caso de que el trigger asignara el nuevo id usando el generador y que al momento de grabarse de alg�n modo se "jodiera el servidor", como un fallo de corriente, falla en disco,... Es decir algo bastante improbable, o al menos eso pensaba.

�podr�ais explicarme esto o indicarme donde podr�a documentarme al respecto? Con lo que si veo problemas es con utilizar un contador de n�meros a parte por el tema de la concurrencia �No?

Un cordial saludo.

El 19/12/2012, a las 21:46, Paola Bruccoleri <pbruccoleri en adinet.com.uy> escribi�:

El tema de los generadores, como dice maxi, es que te quedan varios huecos de n�meros si la transacci�n falla, como me pas� a mi ahora probando. Supongo que otra forma no hay, a no ser que se lleve un contador de n�meros aparte para esto, tal como se har�a en caso de los nros de factura, que no pueden andar quedando huecos por ah�)

Reply by email

Jesus Reyes
to Paola Bruccoleri: El 19/12/2012 12:18 p.m., Martin Gomez escribi�: Hola MArt�n y dem�s compa�eros..…

--- El mi� 19-dic-12, Paola Bruccoleri <pbruccoleri en adinet.com.uy> escribi�:

cargo los par�metros

    hago un qry.open;
    pero no se como capturar el campo c�digo para usarlo en el otro
    query con el insert.
    hice algo as�:
    nCodigo:= qry.FieldByName('codigo').AsInteger;������
    pero no funciona!.. (lo mismo usando ParamByName)
    no se cual ser� la sintaxis correcta...
    muchas gracias!

En cualquier consulta que regrese campos se puede acceder a ellos num�ricamente mediante su indice (el cual esta basado en 0). En �ste ejemplo: qry.Fields[0].asInteger deber�a funcionar.

Jes�s Reyes A.

------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20121219/ed58992b/attachment.html>

Reply by email

Ulises Díaz

Puedes utilizar transacciones, captura de errores con TRY y utilizando los componentes Zeos. En el siguiente ejemplo puedes ver la idea (no es funcional). A manera de ilustraci�n.

TryQuery1.Post; // Se guarda la informaci�n de la primera tabla.CodigoTabla1:= Query1.fielbyname('id').Asinteger; // Se toma el c�digo del registro activo, osea el �ltimo que se ingres� obviamente. //Aqu� se ejecuta la sentencia para la tabla2, insertando en el campo corespondiente el valor de CodigoTabla1. //Aqu� se hace un Commit (Postgresql tiene activo el autocomit);Query1.SQL.clear;Query1.SQL.ADD('COMMIT'); // Se deshacen todos los cambios realizados a la base de datosQuery1.ExcecSql; Except //Si la operaci�n se interrumpe antes de terminar se hace un Rollback, no se guarda nada.Query1.SQL.clear;Query1.SQL.ADD('ROLLBACK'); // Se deshacen todos los cambios realizados a la base de datosQuery1.ExcecSql;End; De esta forma lo he realizado con PostgreSQL.
Espero que sea de utilidad y haber sido lo suficientemente claro. Ulises D�azSkype: udiaz60
Ing. de SistemasColombia
------------ pr�xima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20121219/76bc175a/attachment.html>

Reply by email