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.
Para el ejemplo, utilizaremos las siguientes tablas:
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.
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
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:
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". |
Carlos Luis Cuenca
Carlos es ingeniero informático por la UPM (Politécnico de Madrid), especializad...