[RESUELTO] Obtener un número autoincremental después de agregar el dato
#1
Escrito 20 febrero 2010 - 05:16
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
#2
Escrito 20 febrero 2010 - 05:42
#3
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
#4
Escrito 20 febrero 2010 - 05:43
Saludos.
#5
Escrito 20 febrero 2010 - 06:39
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:
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:
INSERT INTO Tabla (Campo) VALUES ('Valor') RETURNING id;
#6
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
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
INSERT INTO Tabla (Campo) VALUES ('Valor') RETURNING id;
Este me interesa mucho, Ya les comento como va.
Muchas gracias a todos.
Salud OS
#7
Escrito 20 febrero 2010 - 06:59
#8
Escrito 20 febrero 2010 - 07:22
pensé que no pensabas utilizar consultas te hubiese lo dicho mismo
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
Salud OS
#9
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.
#10
Escrito 20 febrero 2010 - 07:47
pensé que no pensabas utilizar consultas te hubiese lo dicho mismo
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
Salud OS
¿así?
Id:= query1.Fields[0].Value;
#11
Escrito 20 febrero 2010 - 07:47
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í.
SELECT gen_id(Generador, 0) FROM RDB$DATABASE
Salud OS
#12
Escrito 20 febrero 2010 - 07:50
¿así?
delphi
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
#13
Escrito 20 febrero 2010 - 07:55
#14
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
#15
Escrito 20 febrero 2010 - 08:06
Despues de insertar los datos en la primera tabla, sigo y entro ese dato en la segunda tabla asi:
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!!.
#16
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
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
#17
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 , no es LOOK es LUK, el primero es otro usuario
#18
Escrito 20 febrero 2010 - 08:16
with DMmonitoreo.ZQuery1 do begin Close; sql.Clear; SQL.Add('insert into central (csid,buffer,formato,evento,detalle,fechan )'); sql.add(' values (:pcsid,:pbuffer,:pformato,:pevento,:Pdetalle,:pfechan)'); parambyname('pcsid').asstring :=trim(csid); parambyname('Pbuffer').asstring :=buffer; parambyname('pformato').asstring :=formato; parambyname('Pevento').asstring :=trim(evento); parambyname('Pdetalle').asstring :=detalle; parambyname('pfechan').asdatetime :=now; ExecSQL; close; if Dmmonitoreo.ZQuery1TIPO.AsString = 'A' THEN with DMmonitoreo.ZQuery2 do begin Close; sql.Clear; SQL.Add('insert into activas (csid,evento,fechan,entradadatos)'); SQL.add(' values (:pacsid,:paevento,:Pafechan,:paentradadatos)'); parambyname('pacsid').asstring := DMmonitoreo.ZQuery1CSID.AsString; parambyname('Paevento').asstring :=dmmonitoreo.ZQuery1EVENTO.AsString; parambyname('pafechan').asdatetime := DMmonitoreo.ZQuery1FECHAN.AsDateTime; parambyname('Paentradadatos').asinteger := DMmonitoreo.ZQuery1ENTRADADATOS.asinteger; ExecSQL; close; End; end; end;
pues es lo mismo que yo hago y solo grabo en la 2da tabla en caso de que se cumpla la condicion
#19
Escrito 20 febrero 2010 - 08:19
#20
Escrito 20 febrero 2010 - 08:24
jeje veo que el viejito ya anda confundiendo nombres , 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
Salud OS