Foros del Web » Programación para mayores de 30 ;) » .NET »

Ultimo id

Estas en el tema de Ultimo id en el foro de .NET en Foros del Web. Que tal, como podria hacerle para leer el ultimo id de mi tabla y sumarle un 1 para obtener el dato en un textbox, es ...
  #1 (permalink)  
Antiguo 03/07/2011, 21:38
Avatar de eduardo2009  
Fecha de Ingreso: agosto-2009
Mensajes: 110
Antigüedad: 14 años, 8 meses
Puntos: 0
Ultimo id

Que tal, como podria hacerle para leer el ultimo id de mi tabla y sumarle un 1 para obtener el dato en un textbox, es decir

el ultimo id es 2567
y que en un textbox me muestre 2568


De antemano gracias por la ayuda

Saludos
  #2 (permalink)  
Antiguo 04/07/2011, 05:14
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ultimo id

Si la idea es hacer una reserva de ese valor para ser usado en un nuevo INSERT en la tabla de la base de datos, eso depende de cómo se haga en ese DBMS.
Oracle, DB2, SQL Server, Postgre, MySQL, todos los dDBMS tienen una forma específica de lograrlo. Oracle usa secuencias, MySQL usa un modo de hacer SELECT para INSERTs, etc.
¿Con qué vas a trabajar?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 04/07/2011, 07:07
Avatar de eduardo2009  
Fecha de Ingreso: agosto-2009
Mensajes: 110
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Ultimo id

Efectivamente lo que quiero es obtener el ultimo valor y sumarle 1 para usarlo en un insert y agregar el dato, voy a trabajar con MYSQL........
  #4 (permalink)  
Antiguo 04/07/2011, 07:36
Avatar de Aquaventus  
Fecha de Ingreso: junio-2010
Ubicación: Lima-Peru , En el alba de la naturaleza
Mensajes: 2.105
Antigüedad: 13 años, 10 meses
Puntos: 267
Respuesta: Ultimo id

Bueno mi mensaje no talvez no puede ser la respuesta para MYSQL pero dejo aqui para SQL SERVER mediante un procedure:

Código SQL:
Ver original
  1. CREATE PROCEDURE SP_ULTIMO_ID
  2. AS
  3. DECLARE @id nvarchar(12)
  4. SELECT @id=MAX(RIGHT(rtrim(ID),12))+1 FROM TUTABLA
  5. WHERE ID != '999999999999'
  6. print @id
  7. IF (@id IS NULL )
  8. BEGIN
  9. SELECT ID='000000000001'
  10. END
  11. ELSE IF(@id IS NOT NULL)
  12. BEGIN
  13. SELECT ID=RIGHT('000000000000'+ltrim(str(@id,12)),12)
  14. END
Saludos!.
__________________
Internet es tener todo el conocimiento global a tu disposición.
Desarrollo de Software - Ejemplos .Net
  #5 (permalink)  
Antiguo 04/07/2011, 07:52
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ultimo id

OK. Entonces lo que necesitas hacer a nivel de bases de datos, es un boqueo de actualización, cosa que puedes hacer declarando una transacción o bien haciendo un SELECT ... FROM ... FOR UPDATE, como puedes encontrar descripto en el manual de referencia (15.10.6. Bloqueo de la próxima clave (Next-Key Locking): evitar el problema fantasma).
La transacción tiene la ventaja de no tener que definir nada. Alcanza con usar el .BeginTransaction de la clase MysqlConnection, pero el inconveniente de que bloquea todas las tablas para actualización. En cambio, el SELECT ... FOR UPDATE puede requerir leer previamente la tabla y la ventaja de sólo bloquear una única tabla.
Si no vas a usar usuarios concurrentes, no hay problema, usa cualquiera. Si tienes usuarios concurrentes, la cosa se complica. Puede ser que bloquear la tabla sea más eficiente.

Cualquiera que sea el caso, hay una cosa que tendrás que tener en cuenta: Tanto la conexión con los objetos que lean la base de datos no pueden ser transitorios, es decir, no pueden ser objetos creados en un método o una función en forma local. Tienen que ser objetos permanentes de la clase o de la aplicación, por cuanto la destrucción del objeto conexión, el de transacción y los lectores, conllevan una implícita cancelación de la transacción (ROLLBACK) y la consiguiente liberación de todos los bloqueos.
Normalmente, la mejor forma de solucionar esto es que todo lo que sea manejo de la base de datos debe ser una clase específica, y se debe instanciar una sola vez en la aplicación para cada sesión de cada usuario, y ser permanente mientras la sesión del usuario exista.
De ese modo podrás llamar al objeto desde cualquier parte de la aplicación y no tendrás que abrir múltiples veces las conexiones, o crear en diferentes funciones y métodos los objetos necesarios. Así, el manejo de una transacción se vuelve más simple.
El problema de no hacerlo de este modo y simplemente abrir la base, leer el último ID y luego cerrar la conexión, es que si tienes usuarios concurrentes, puede que otro usuario esté haciendo la misma tarea; al hacerlo, si él inserta el registro antes que tu, al pretender insertarlo por tu cuenta estarán usando el mismo numero de ID, y como ese numero es una PK, sencillamente te dará un error de clave duplicada, y no insertará el registro.
¿Se entiende?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 04/07/2011, 07:53
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ultimo id

Cita:
Iniciado por Aquaventus Ver Mensaje
Bueno mi mensaje no talvez no puede ser la respuesta para MYSQL pero dejo aqui para SQL SERVER mediante un procedure:

Código SQL:
Ver original
  1. CREATE PROCEDURE SP_ULTIMO_ID
  2. AS
  3. DECLARE @id nvarchar(12)
  4. SELECT @id=MAX(RIGHT(rtrim(ID),12))+1 FROM TUTABLA
  5. WHERE ID != '999999999999'
  6. print @id
  7. IF (@id IS NULL )
  8. BEGIN
  9. SELECT ID='000000000001'
  10. END
  11. ELSE IF(@id IS NOT NULL)
  12. BEGIN
  13. SELECT ID=RIGHT('000000000000'+ltrim(str(@id,12)),12)
  14. END
Saludos!.
La sintaxis de los SP en SQL Server no es aplicable para MySQL. No existe un lenguaje estandar para SP, por lo que migrarlo es un problema complicado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 04/07/2011, 07:56
Avatar de Aquaventus  
Fecha de Ingreso: junio-2010
Ubicación: Lima-Peru , En el alba de la naturaleza
Mensajes: 2.105
Antigüedad: 13 años, 10 meses
Puntos: 267
Respuesta: Ultimo id

Exacto pero lo dejé por si a alguien en un futuro le pueda servir ya que el mensaje inicial de este tema no define sobre qué motor es, por lo que los usuarios puedan buscar con el mismo titulo pero para SQL, por lo que pensé que talvez sea útil para alguien que busca lo mismo pero para SQL, me doy a entender? . Saludos!.
__________________
Internet es tener todo el conocimiento global a tu disposición.
Desarrollo de Software - Ejemplos .Net
  #8 (permalink)  
Antiguo 04/07/2011, 07:59
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ultimo id

En esencia, la idea es obtnener el máximo que haya:
Código MySQL:
Ver original
  1. SELECT MAX(id) maximo
  2. FROM tabla;
Y luego usarlo para bloquearla:
Código MySQL:
Ver original
  1. SELECT * FROM tabla WHERE id >(VALORMAXIMO-1)
  2. FOR UPDATE;

El otro caso requiere que el objeto conexión y el de transacción sean globales, supongamos

Código vb:
Ver original
  1. Friend oCnx as MysqlConnection
  2. Friend oTrans as MysqlTransaction

luego, una vez creada y abierta la conexión haces:
Código vb:
Ver original
  1. oTrans = oCnx.BeginTransaction

Y después, según el caso la confirmas o la cancelas.
Código vb:
Ver original
  1. If Convert.ToBoolean(oComM.ExecuteNonQuery()) Then
  2.     oTrans.Commit()
  3. Else
  4.     oTrans.Rollback()
  5. End If
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 04/07/2011, 15:38
Avatar de eduardo2009  
Fecha de Ingreso: agosto-2009
Mensajes: 110
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Ultimo id

[QUOTE=gnzsoloyo;3915543]En esencia, la idea es obtnener el máximo que haya:
Código MySQL:
Ver original
  1. SELECT MAX(id) maximo
  2. FROM tabla;
Y luego usarlo para bloquearla:
Código MySQL:
Ver original
  1. SELECT * FROM tabla WHERE id >(VALORMAXIMO-1)
  2. FOR UPDATE;

Estoy intentando hacerlo de esta manera pero no se como asignar el valor maximo del id a un textbox para que de ahi pueda utilizarlo???

intento con este codigo no se si estoy haciendolo bien o me estoy equivocando

Cita:
Private Sub Obtener_ID()
Try
Dim cad As New MySqlConnection("Database=Pacientes;Data Source=localhost;User Id=root;Password=utan")
cad.Open()
Dim sql As String = "SELECT MAX(id) FROM generales order by id"
Dim cmd As New MySqlCommand(Sql, cad)
Dim dr As MySqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
While dr.Read
Dim value As Object = dr.Item("id")
If value IsNot DBNull.Value Then TextBox22.Text = CStr(value)
End While
dr.Close()
Catch ex As MySqlException
MessageBox.Show("Error:" & ex.Message)
Catch ex As Exception
MessageBox.Show("Error:" & ex.Message)
End Try
End Sub
Saludos y gracia spro la ayuda
  #10 (permalink)  
Antiguo 04/07/2011, 16:00
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ultimo id

Veamos algo más simple: Una función que devuelva cero (0) si la tabla está vacía, cero si se produce un error y el próximo ID si hay al menos un registro.
- No necesitas un DataReader, con un DataAdapter alcanza.
- No debes usar un ORDER BY, si estás consultando por MAX(), ya la función MAX() no sólo te esta devolviendo el mayor de todos, sino que además sólo devuelve un registro.
La idea es:
Código vb:
Ver original
  1. Private Function Obtener_ID() As Integer
  2.         Try
  3.             Dim cad As New MySqlConnection("Database=Pacientes;Data Source=localhost;User Id=root;Password=utan")
  4.             cad.Open()
  5.             Dim sql As String = "SELECT MAX(id) MaxId FROM generales;"
  6.             Dim oTabla As New DataTable
  7.             Dim cmd As New MySqlCommand(sql, cad)
  8.             Dim oReader As New MySqlDataAdapter(cmd)
  9.             oReader.Fill(oTabla)
  10.             cad.Close()
  11.             If oTabla.Rows.Count = 1 Then
  12.                 Return Convert.ToInt32(oTabla.Rows(0).Item("MaxId")) + 1
  13.             Else
  14.                 Return 1
  15.             End If
  16.         Catch ex As MySqlException
  17.             MessageBox.Show("Error:" & ex.Message)
  18.             Return 0
  19.         Catch ex As Exception
  20.             MessageBox.Show("Error:" & ex.Message)
  21.             Return 0
  22.         End Try
  23.     End Function
Usar un DataReader en una operación no secuencial no tiene ningún sentido. Tiene lógica cuando vas a obtener un conjunto de registros y realizar alguna operación on-line con la tabla en forma secuencial. No es tu caso, ya que sólo quieres un dato.
De hecho, ni siquiera requieres un datatable. Alcanzaría con esto:
Código vb:
Ver original
  1. Private Function Obtener_ID() As Integer
  2.         Try
  3.             Dim Valor As Integer
  4.             Dim cad As New MySqlConnection("Database=Pacientes;Data Source=localhost;User Id=root;Password=utan")
  5.             cad.Open()
  6.             Dim sql As String = "SELECT MAX(id) MaxId FROM generales;"
  7.             Dim cmd As New MySqlCommand(sql, cad)
  8.             Valor = Convert.ToInt32(cmd.ExecuteScalar)
  9.             Return Valor
  10.         Catch ex As MySqlException
  11.             MessageBox.Show("Error:" & ex.Message)
  12.             Return 0
  13.         Catch ex As Exception
  14.             MessageBox.Show("Error:" & ex.Message)
  15.             Return 0
  16.         End Try
  17.     End Function
Esto es porque ExecuteScalar() devuelve un único valor, si la consulta devuelve precisamente un sólo campo y un registro, como en este caso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 04/07/2011, 16:10
Avatar de eduardo2009  
Fecha de Ingreso: agosto-2009
Mensajes: 110
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Ultimo id

Ok, gracias por la explicacion, solo una duda esa Funcion en que evento la llamo para que me la muestre la consulta en un textbox.......

saludos!!!
  #12 (permalink)  
Antiguo 04/07/2011, 16:43
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ultimo id

En donde quieras. La función simplemente devuelve un entero, en dónde la invoques dependerá de lo que tu formulario haga.
Yo supongo que será en el momento de activar el formulario para ingresar un nuevo registro,pero como dije, eso depende de ti.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 04/07/2011, 16:49
Avatar de eduardo2009  
Fecha de Ingreso: agosto-2009
Mensajes: 110
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Ultimo id

Cita:
Iniciado por gnzsoloyo Ver Mensaje
En donde quieras. La función simplemente devuelve un entero, en dónde la invoques dependerá de lo que tu formulario haga.
Yo supongo que será en el momento de activar el formulario para ingresar un nuevo registro,pero como dije, eso depende de ti.
Muchas gracias por el tiempo, ya me cargo el dato excelente

Saludos!!!!!!!!!!

Última edición por eduardo2009; 04/07/2011 a las 16:55
  #14 (permalink)  
Antiguo 04/07/2011, 17:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ultimo id

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: ultimo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:13.