Recoger valor del campo autonumérico después de insertar en ASP

Al hacer una inserción de un registro en una tabla, si el identificador es autonumérico, generalmente no sabemos cuál habrá tocado. Aquí enseñamos a obtener el identificador después de la inserción.
Cuando en una base de datos tenemos dos tablas relacionadas con una relación uno a varios, la clave primaria de la tabla con cardinalidad 1 se encuentra en la tabla con cardinalidad n como clave foránea. Normalmente las claves primarias suelen utilizar campos de tipo autoincremento.

El presente artículo detalla cómo averiguar el valor que se ha asignado a la clave primaria en una operación de inserción, para de esta manera poder introducir registros en la tabla relacionada que cuenta con la clave foránea.

Nota: Leer los comentarios, añadidos por los visitantes acerca de este artículo, para obtener algunas guías con las que resolver de otra manera el problema planteado. Hay una vía más sencilla y un ejemplo de cómo utilizarla, que puede ayudar si da problemas la descripción planteada en este documento. Los archivos que se ofrecen para descarga de manuales no incluyen los comentarios de los visitantes, por lo que hay que verlos en la versión online de la página.

Para el ejemplo, utilizaremos las siguientes tablas:

Tablas utilizadas en el ejercicio


En un principio vamos a partir que tenemos un nuevo pedido para el cual tenemos que añadir varios detalles. En este supuesto, necesitamos insertar primero el pedido, recoger el valor que la base de datos le ha asignado al campo IdPedido, y a continuación insertar los distintos detalles con ese valor de IdPedido.

Para hacer esto, vamos a utilizar un objeto recordset:

Dim rspedidos
Set rspedidos=Server.CreateObject("ADODB.Recordset")


A continuación abrimos el Recordset:

With rspedidos
    .open "Pedidos" ,adOpenDynamic, AdLockOptimistic,adCmdTableDirect


adOpenDynamic: Cursor que no tiene un conjunto único de registros, y en el que los cambios serán visibles en el recordset.
AdLockOptimistic: El registro no se bloquea hasta que no se insertan los datos
adCmdTableDirect: sirve para indicar el nombre de la tabla

La combinación de cursor, tipo de bloqueo y si el campo esta indexado o no hace que podamos recoger el campo ID, otras combinaciones pueden no funcionar.

A continuación, creamos un nuevo registro, e insertamos en el los valores de los campos:

    .AddNew
       .Fields("idcliente")=16
       .Fields("cargo")=500
       .Fields("destinatario")="pepe"


Una vez se han introducido todos los valores de los campos, se actualiza el recordset

    .update

Y a continuación, sacamos el ID que le ha asignado la base de datos:

    MiID= .Fields("IdPedido")
End With


Ahora contamos con una variable miID que nos permite hacer los inserts correspondientes en la base de datos, bien con recordsets o con sentencias sql del tipo Insert Into.

Nota: Hemos visto como insertar registros en ASP, pero hasta ahora siempre habíamos explicado otro método, consistente en construir la sentencia SQL para la inserción y ejecutándola por medio del método execute() del objeto connection. Podemos ver ese tipo de inserciones en el artículo Creación de un nuevo registro

Código completo:

Dim rspedidos
Set rspedidos=Server.CreateObject("ADODB.Recordset")
With rspedidos
    .open "Pedidos" ,adOpenDynamic, AdLockOptimistic,adCmdTableDirect
    .AddNew
       .Fields("idcliente")=16
       .Fields("cargo")=500
       .Fields("destinatario")="pepe"
   .update
    MiID= .Fields("IdPedido")
End With

Nota: Puede ser que nuestro sistema no tenga declaradas las variables del sistema del tipo adOpenDynamic, AdLockOptimistic o adCmdTableDirect. Para que queden definidas debemos incluir el archivo "adovbs.inc".

Compartir

Comentarios

kuki

19/10/2002
esto es 100% seguro?
quiero decir

si el usuario A hace un registro y en este momento el usuario B ha echo un registro

devolvera al usuario A el ID que le corresponde al usuario B. no?

RESPUESTA

Pues no, esto está pensado para que funcione como apuntamos en el ejercicio.

Carlos Cuenca

23/10/2002
Gracias a Miguel Egea, de www.portalsql.com, hemos encontrado una forma más facil de hacerlo que sirve para los select y los insert, mediante la sentencia SQL:

select @@identity

Que, al ejecutarla con el método execute() del objeto conexión, nos devuelve un recordset donde tenemos un registro que es el identificador que se acaba de insertar.

Un saludo

Mauricio

07/11/2002
Si, "select @@identity" funciona a la perfección, UNICAMENTE con SQL Server

Mauricio Jaramillo

14/1/2003
En realidad la sentencia "Select @@IDENTITY as Ident" me funciona bien en access 2000 con el motor Jet.4.0, pero un detalle importante es que no se puede ejecutar en la misma sentencia del "insert".

Suerte ... yo busque y probe varias horas.

Xuan

08/5/2003
Pues yo he tenido problemas con este código, en Win2000 y con una tabla de Access. Al final he tenido que realizar una consulta para saber el valor que le asignó al registro al darlo de alta.

Roberto

03/11/2003
Hola, yo me invente una solucion que sin saber demasiado de asp me funciona, espero que sin consumir demasiados recursos es la siguiente:

Tuve que agregar un campo id_token a la tabla de la que necesito recuperar el id del registro agregado. Antes de realizar el INSERT, creo una variable id_token que inserto juntamente con el nuevo registro, luego paso esa variable a la pagina donde necesito recuperar el registro insertado, y consulto la base buscando el registro a partir de mi id_token. Para evitar que el id_token se repita, lo genero con un numero aleatorio+el nombre del usuario+la fecha,hora,minuto,segundo de la operacion.. SALUDOS.

Andresbarr

01/12/2003
Aqui esta la forma mas simple que eh encontrado durante mucho.

<%

'---------------ABRE LA TABLA E INGRESA---------

Set RsIn = Server.CreateObject("ADODB.Recordset")
Call_table = "TABLA"
RsIn.Open Call_table, MM_conecta_STRING,1,3

RsIn.AddNew
    RsIn("Campo1") = (Request.Form("Campo1"))
    RsIn("Campo2") = (Request.Form("Campo2"))

RsIn.Update
RsIn.Close
Set RsIn = Nothing

'---------------RECUPERA EL ID INGRESADO-------

Set RsId = Server.CreateObject("ADODB.Recordset")
Fnc_Sql = "Select @@IDENTITY as Ident"
RsId.Open Fnc_Sql, MM_conn_STRING,1
Id_New = RsId("Ident")
RsId.Close
Set RsId = Nothing

'-------------------------------------------------

%>

Juver

11/8/2005
Usar el Mdac 2.6 como minimo entonces funcionara, fijarse en las Proyecto/referencias del VB 6 y verificar si lo tienen, de lo contrario usen otro camino,

suerte

ANGELUS

19/11/2005
no se si sera lo correcto pero lo que hago es

sql = "select max(id) as id from tabla"

Carlos

22/11/2006
Yo encontré una forma de obtener la identidad del insert que se acaba de realizar pero utilizando procedimientos almacenados. Espero sea de ayuda.
SCOPE_IDENTITY( )
Returns the last IDENTITY value inserted into an IDENTITY column in the same scope. A scope is a module -- a stored procedure, trigger, function, or batch. Thus, two statements are in the same scope if they are in the same stored procedure, function, or batch.

Chars

18/2/2009
Me resulto gracias a Andresbarr.

Chevere. GRACIAS!!!

Alfredo

26/7/2009
Encontrar Id Autonumerico Asignado
Amigos, yo no me complico la vida, y ya que desarrollo aplicaciones para cualquier tipo de Base de Datos y Aconsejo no se amarren a ninguna, lo que yo hago y hasta ahora no he tenido ningun problema con mis aplicacione que generalmente utilizan entre 300 y 500 usuarios as mismo tiempo y con Servidores Distribuidos para variar, es Simple...

y retomo la idea de el amigo que usa Token, yo hago lo mismo pero utilizo como clave la IP de la PC, ese valor es Unico en la red, ahh ademas le configuro para que mis aplicaciones solo puedan correr en una unica Instancia, luego unicamente hago un Select Sobre la tabla principal en la que hice la Isercion original con esa IP busco el Id, lo paso a una variable y listo, Ojo al final deben Eliminar esa IP de la Tabla principal, asi dejan preparada la tabla para otra insercion de la misma PC, como les digo no he tenido problemas y no se me complica la vida... y sobre todo, funciona por ser manipulado por codigo programador con cualquier base de datos, SQLserver, MySQL, VistaDB, FireBird, etc, espero les ayude mi solucion... y como les comente no se amarren a Funciones propias de las Bases de Datos luego tendran problemas en el Futuro a mi me paso con SQL server, y me costo 1 mes de trabajo areglar esto... Saludos

Alex

05/6/2011
Excelente Solución
Excelente Solución "Andresbarr", mira que ya tenía como 4 horas tratándo de resolver el méndigo problema y ya me etsaba arrancando las greñas. Saludos!!