Ir al contenido


Foto

[RESUELTO] Obtener un número autoincremental después de agregar el dato


  • Por favor identifícate para responder
38 respuestas en este tema

#1 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 20 febrero 2010 - 05:16

Hola

Tengo una duda existencial, ¿ es posible obtener un número de tipo autoincremental en el momento que se agrega un registro a una tabla ?

En principio pense en obtenerlo con una consulta del último dato, sin embargo, quisiera obtenerlo sin recurrir a una consulta.

Espero haber sido lo suficientemente claro con mi duda :)

Gracias anticipadas.

Salud OS
  • 0

#2 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 20 febrero 2010 - 05:42

No entiendo bien la pregunta, pero se supone que si ya tienes un campo autoincrementable, vas a obtener de manera automatica dicho numero.




  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 20 febrero 2010 - 05:43

No entiendo bien la pregunta, pero se supone que si ya tienes un campo autoincrementable, vas a obtener de manera automatica dicho numero.


Perdón, sucede que ese número lo necesito para asignarlo en otra tabla inmediatamente después de haber agregado el registro.

Salud OS

  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 20 febrero 2010 - 05:43

NO (Eso creo :p), a menos que los componentes que utilices tenga una función que obtenga ese número sin recurrir a una consulta manual algo como: TQuery.GetLastID algo así.

Saludos.
  • 0

#5 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 20 febrero 2010 - 06:39

¿Que base de datos estas usando?

Si estas usando firebird y la función gen_id para obtener el autoincremental puedes usar algo como esto para obtener el valor de antes de hacer el insert:


sql
  1. SELECT gen_id(Generador, 1) FROM RDB$DATABASE



Y si estas usando una versión superior a la 2 de firebird puedes usar algo como esto:


sql
  1. INSERT INTO Tabla (Campo) VALUES ('Valor') RETURNING id;




  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 20 febrero 2010 - 06:55

¿Que base de datos estas usando?


Firebird 2.0 amigo :)

Si estas usando firebird y la función gen_id para obtener el autoincremental puedes usar algo como esto para obtener el valor de antes de hacer el insert:


sql
  1. SELECT gen_id(Generador, 1) FROM RDB$DATABASE



Lo he probado y funciona muy bien

Y si estas usando una versión superior a la 2 de firebird puedes usar algo como esto:


sql
  1. INSERT INTO Tabla (Campo) VALUES ('Valor') RETURNING id;



Este me interesa mucho, Ya les comento como va.

Muchas gracias a todos.

Salud OS
  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 20 febrero 2010 - 06:59

pensé que no pensabas utilizar consultas ^o| te hubiese lo dicho mismo ^o| :p
  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 20 febrero 2010 - 07:22

pensé que no pensabas utilizar consultas ^o| te hubiese lo dicho mismo ^o| :p


Bueno, lo que me interesa utilizar es la segunda opción o sea la función RETURNING, pero tengo un problema, no se como recuperar ese valor, lo hice en mi IBExpert y si me regresa el valor del ID en la ventana de Mensajes, pero en delphi no me sirve usar ParambyName() ni FieldbyName(), me dice que el campo no existe, como recupero ese dato después de ejecutar ExecSQL :s

Salud OS
  • 0

#9 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 20 febrero 2010 - 07:41

Now a feature that will make life of those who like mimicking autoincrement keys much easier, it's the great INSERT ... RETURNING ..., similar to what PostgreSQL already implemented with success.
Here is an example, it allows you to retrieve the generated value of the "autoincrementing" column in one pass (hope this will be quickly integrated in the php extension for Firebird).

SQL> select * from new_one;

      COL1 COL2
============ ==========
        1 pluto
        2 COL2
        3 COL2

SQL> insert into new_one(col2) values ('col3') returning col1;

      COL1
============
        5

SQL> select * from new_one;

      COL1 COL2
============ ==========
        1 pluto
        2 COL2
        3 COL2
        5 col3
 


paginaaqui

talvez esto te ayude a entender mejor el concepto, aunque todavia yo estoy medio confundido.
  • 0

#10 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 20 febrero 2010 - 07:47


pensé que no pensabas utilizar consultas ^o| te hubiese lo dicho mismo ^o| :p


Bueno, lo que me interesa utilizar es la segunda opción o sea la función RETURNING, pero tengo un problema, no se como recuperar ese valor, lo hice en mi IBExpert y si me regresa el valor del ID en la ventana de Mensajes, pero en delphi no me sirve usar ParambyName() ni FieldbyName(), me dice que el campo no existe, como recupero ese dato después de ejecutar ExecSQL :s

Salud OS


¿así?


delphi
  1. Id:= query1.Fields[0].Value;


  • 0

#11 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 20 febrero 2010 - 07:47

Bueno, había un pequeñisimo detalle, si utilizaba esta sentencia



sql
  1. SELECT gen_id(Generador, 1) FROM RDB$DATABASE



Se incrementaba el generador, estuve a punto de claudicar pero no podía quedarme así como idiota, así que me dí cuenta que no debe ser 1, sino 0 para que no acumulara nada, al final quedo así.



sql
  1. SELECT gen_id(Generador, 0) FROM RDB$DATABASE



Salud OS
  • 0

#12 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 20 febrero 2010 - 07:50


¿así?


delphi
  1. Id:= query1.Fields[0].Value;



Tampoco funciona de esa forma amigo seoane, me dice que está fuera de indice.... :(, por el momento lo dejo con la primer opción. :), debo continuar con mi sistema, después con un poco mas de calma veré como se debe hacer porque esa es la forma como quiero que funcione. :)

Muchas gracias

Salud OS
  • 0

#13 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 20 febrero 2010 - 07:55

Solo un pequeño detalle ¿estas usando ExecSQL o Open? Fijate que la sentencia SQL esta devolviendo datos y ExecSQL no es el método correcto, tienes que utilizar  Open
  • 0

#14 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 20 febrero 2010 - 08:00

Solo un pequeño detalle ¿estas usando ExecSQL o Open? Fijate que la sentencia SQL esta devolviendo datos y ExecSQL no es el método correcto, tienes que utilizar  Open


Ah vaya, pero..... en un INSERT INTO RETURNING puedo utilizar un Open en lugar del EXECSQL ??????

Ya lo pruebo :)

Salud OS
  • 0

#15 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 20 febrero 2010 - 08:06

Egostar si lo vas a hacer de forma secuencial, no le veo el problema. En mi primera tabla tengo un campo autoincrementable que tiene un generador hecho con ibexpert.

Despues de insertar los datos en la primera tabla, sigo y entro ese dato en la segunda tabla asi:



delphi
  1. DMmonitoreo.zquery2.parambyname('Paentradadatos').asinteger := DMmonitoreo.ZQuery1ENTRADADATOS.asinteger; 



donde zquery1entradadatos.asinteger es el dato que tomo de la primera tabla despues de insertar y

Dmonitoreo.zquery2.parambyname('paentradadatos').asinteger es el parametro que le voy a pasar al campo en la 2da tabla

y despues de esto termino con Exesql.

Claro que no se puede usar open para hacer un insert!!.



  • 0

#16 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 20 febrero 2010 - 08:11

Egostar si lo vas a hacer de forma secuencial, no le veo el problema. En mi primera tabla tengo un campo autoincrementable que tiene un generador hecho con ibexpert.

Despues de insertar los datos en la primera tabla, sigo y entro ese dato en la segunda tabla asi:



delphi
  1. DMmonitoreo.zquery2.parambyname('Paentradadatos').asinteger := DMmonitoreo.ZQuery1ENTRADADATOS.asinteger; 



donde zquery1entradadatos.asinteger es el dato que tomo de la primera tabla despues de insertar y

Dmonitoreo.zquery2.parambyname('paentradadatos').asinteger es el parametro que le voy a pasar al campo en la 2da tabla

y despues de esto termino con Exesql.

Claro que no se puede usar open para hacer un insert!!.




Gracias amigo luk, el asunto es que tampoco es secuencial, es decir, no todos los regitros los voy a agregar a la otra tabla, solo los que tienen cierto status, pero es muy importante ese consecutivo.

Salud OS

  • 0

#17 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 20 febrero 2010 - 08:13

Gracias amigo look, el asunto es que tampoco es secuencial, es decir, no todos los regitros los voy a agregar a la otra tabla, solo los que tienen cierto status, pero es muy importante ese consecutivo.

Salud OS


jeje veo que el viejito ya anda confundiendo nombres :p, no es LOOK es LUK, el primero es otro usuario ;)
  • 0

#18 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 20 febrero 2010 - 08:16



delphi
  1.   with DMmonitoreo.ZQuery1 do
  2.   begin
  3.     Close;
  4.     sql.Clear;
  5.     SQL.Add('insert into central (csid,buffer,formato,evento,detalle,fechan )');
  6.     sql.add('  values (:pcsid,:pbuffer,:pformato,:pevento,:Pdetalle,:pfechan)');
  7.     parambyname('pcsid').asstring :=trim(csid);
  8.     parambyname('Pbuffer').asstring :=buffer;
  9.     parambyname('pformato').asstring :=formato;
  10.     parambyname('Pevento').asstring :=trim(evento);
  11.     parambyname('Pdetalle').asstring :=detalle;
  12.     parambyname('pfechan').asdatetime :=now;
  13.     ExecSQL;
  14.     close;
  15.  
  16.  
  17.     if Dmmonitoreo.ZQuery1TIPO.AsString = 'A' THEN
  18.  
  19.     with DMmonitoreo.ZQuery2 do
  20.     begin
  21.     Close;
  22.     sql.Clear;
  23.     SQL.Add('insert into activas (csid,evento,fechan,entradadatos)');
  24.     SQL.add('  values (:pacsid,:paevento,:Pafechan,:paentradadatos)');
  25.     parambyname('pacsid').asstring := DMmonitoreo.ZQuery1CSID.AsString;
  26.     parambyname('Paevento').asstring :=dmmonitoreo.ZQuery1EVENTO.AsString;
  27.     parambyname('pafechan').asdatetime := DMmonitoreo.ZQuery1FECHAN.AsDateTime;
  28.     parambyname('Paentradadatos').asinteger := DMmonitoreo.ZQuery1ENTRADADATOS.asinteger;
  29.     ExecSQL;
  30.     close;
  31.    
  32.  
  33.   End;
  34.  
  35. end;
  36.  
  37. end;   



pues es lo mismo que yo hago y solo grabo en la 2da tabla en caso de que se cumpla la condicion
  • 0

#19 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 20 febrero 2010 - 08:19

Pense que me estaba diciendo que mirara, lo entendi como un spanglish 
  • 0

#20 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 20 febrero 2010 - 08:24

jeje veo que el viejito ya anda confundiendo nombres :p, no es LOOK es LUK, el primero es otro usuario ;)


Pense que me estaba diciendo que mirara, lo entendi como un spanglish 


jejeje, cabrón, es que estaba pensando en inglés :p

Salud OS
  • 0




IP.Board spam blocked by CleanTalk.