Tratamiento de Campos Autonumericos


http://www.asptutor.com

 

Colaboración enviada por: Cesar Manivesa

email: sql@manivesa.com

web: http://sql.manivesa.com

 

 

Obtener valores autonuméricos de filas recién creadas

Muchas veces insertamos nuevas filas en tablas que tienen algún campo autonumérico y necesitamos ese valor. Veamos como recuperarlo...

 

Por manivesa-  http://sql.manivesa.com

Problema.
Cuando tenemos que trabajar con tablas para almacenar datos a menudo utilizamos campos que toman un valor numérico que se incrementa automáticamente cada vez que insertamos un nuevo registro. Estos campos son los que en Access reciben el nombre de ‘campos autonuméricos’ y que en SQL Server se traducen en campos ‘int’ con la propiedad ‘identidad=si’.
Cuando utilizamos este tipo de campos es habitual que al insertar un registro necesitemos obtener el valor que toma el campo autonumérico del registro recién añadido para utilizarlo posteriormente en otro insert o en un update (ejemplo típico es el caso en el que tenemos un par de tablas –Pedidos, Detalles de Pedido- para almacenar los pedidos que realizan los usuarios). Aquí es donde aparece el problema. ¿Cómo obtenemos el código de la fila recién creada para usarlo posteriormente?
Pues tenemos varias maneras para hacerlo y aquí vamos a explicar un método sencillo que pueden utilizar aquellos que, sin tener muchos conocimientos sobre bases de datos, tienen que realizar páginas Web y escogen como lenguaje el ASP.

Autonuméricos con Access
Vamos a crear una base de datos con Access a la que le ponemos de nombre ‘pruebas.mdb’ y la almacenamos en ‘C:\’. Esta base de datos tendrá una tabla ‘Personas’ con un campo autonumérico, un campo ‘Nombre’ de tipo texto y un campo ‘Apellido’ también de tipo texto. Lo que queremos es crear un par de páginas Web en ASP que sirvan para insertar una nueva persona  en la talba y nos devuelva el valor autonumérico generado para esa persona.

Lo primero será una página de nombre ‘agregar.htm’:

agregar.htm

<form action="agregar.asp" method="post">

  Nombre:  <input type="text" name="txtNombre"><br>

  Apellido:  <input type="text" name="txtApellido"><br>

  <input type="submit">

</form>

En la que nuestro usuario escribirá su nombre y su apellido y enviará los datos a la página principal.
Ahora toca la página que tiene que agregar esos datos a nuestra tabla de Access y devolvernos el valor del campo autonumérico.

Agregar.asp

<%

Dim connInsert, sSQL, rsID, nuevoId, Nombre, Apellido

Nombre= Request.Form("txtNombre")

Apellido=Request.Form("txtApellido")

Set connInsert = Server.CreateObject("ADODB.Connection")

connInsert.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\prueba.mdb; 

    Persist Security Info=False" 

sSQL = "INSERT INTO Personas(Nombre, Apellido) VALUES 

   ('" & Nombre &  "', '" &  Apellido & "')"

connInsert.Execute(sSQL) 

Set rsId = connInsert.Execute("SELECT @@IDENTITY") 

nuevoId = rsId(0) 

rsId.Close

Set rsId = Nothing

Response.write (Nombre & " " & Apellido & 

   " ha sido añadido con un id=" & nuevoId)

%>

 Como vemos está página consta de una sentencia ‘INSERT INTO Personas . . .’ sencilla que enviamos a la base de datos de Access mediante un objeto command. Una vez añadido el nombre y el apellido del usuario ejecutamos otra sentencia SQL (SELECT @@IDENTITY) que nos devuelve el valor autonumérico generado por la última instrucción enviada a la base de datos.
Pero ¿qué es eso de “SELECT @@IDENTITY”?
Pues para simplificar diremos que hay una serie de variables en el servidor que toman valores dependiendo de lo que estemos haciendo. Esta variable @@IDENTITY siempre toma el valor del último campo autonumérico generado en la base de datos.
Esto cobra más significado cuando lo vemos desde una base de datos un poco más completa como es el SQL Server.

Valores identidad desde SQL Server
Si nuestra base de datos es el SQL Server podemos tomar un camino más eficaz: los procedimientos almacenados.
Un procedimiento almacenado es un conjunto de sentencias en lenguaje TSQL que se almacenan en el servidor y que se pueden invocar directamente desde nuestro código ASP. Dentro de un procedimiento almacenado podemos utilizar variables de sistema como @@IDENTITY (y muchas otras), sentencias de control, de tratamiento de cadenas, variables de usuario . . .
Por simplificar crearemos en una base de datos en el SQL Server con nombre ‘prueba’ con una tabla ‘Personas’ con un campo de tipo ‘int’ con el valor de la propiedad ‘identidad=si’, un campo ‘Nombre’ de tipo varchar(100) y un campo ‘Apellido’ también de tipo varchar(100).
A continuación creamos un procedimiento almacenado con el siguiente código.

CREATE PROCEDURE InsertarPersona

@Nombre varchar(100),

@Apellido varchar(100)

AS

INSERT INTO Personas(Nombre, Apellido) VALUES(@Nombre, @Apellido)

RETURN @@IDENTITY

GO

 Este procedimiento almacenado recibe un par de parámetros e inserta en la tabla personas esa información. Además devuelve el último valor de identidad insertado mediante la variable @@IDENTITY. Si alguien está interesado en que es lo que esta función devuelve exactamente puede consultar los libros en pantalla del SQL Server. También se podrían utilizar funciones de TSQL como ‘IDENT_CURRENT’ o ‘SCOPE_IDENTITY’ (todas devuelven el último autonumérico creado pero con ligeras diferencias).
Este valor que obtenemos se devuelve como parámetro de salida del procedimiento almacenado.
El código de la página que utilizará este procedimiento será el siguiente.

Agregar2.asp

<%

Dim cmdInsert, nuevoId, Nombre, Apellido

Nombre= Request.Form("txtNombre")

Apellido=Request.Form("txtApellido")

set cmdInsert = Server.CreateObject("ADODB.Command")

cmdInsert.ActiveConnection = "Provider=sqloledb;Data Source=localhost;

   Initial Catalog=prueba;User Id=sa;Password="

cmdInsert.CommandText = "InsertarPersona"

cmdInsert.CommandType = 4

cmdInsert.Parameters.Append cmdInsert.CreateParameter("@RETURN_VALUE", 3, 4, 4)

cmdInsert.Parameters.Append cmdInsert.CreateParameter("@Nombre", 200, 1,100,Nombre)

cmdInsert.Parameters.Append cmdInsert.CreateParameter("@Apellido", 200, 1,100,Apellido)

cmdInsert.Execute()

nuevoId= cmdInsert.Parameters.Item("@RETURN_VALUE").Value 

Response.write (Nombre & " " & Apellido & " ha sido añadido con un id=" & nuevoId)

%>

El código empieza recuperando la información que el usuario ha escrito en la página anterior. A continuación se prepara un objeto de tipo command, se le vincula con nuestra base de datos de SQL Server, se establece su propiedad commandtext para saber que procedimiento almacenado se tiene que ejecutar y se rellena la colección de parámetros con dos parámetros de entrada (nombre y apellido) y uno de salida (que recibirá el valor autonumérico).
Lo siguiente es ejecutar el procedimiento almacenado que inserta los datos y nos devuelve el valor de identidad creado.
Por último leemos el parámetro de salida y lo mostramos por pantalla.
 

Como veis no es difícil trabajar con valores autonuméricos. Y no importa si trabjamos con una página Web en ASP, en PHP o una aplicación para Windows puesto que @@IDENTITY es propio de la base de datos, no de nuestro código.