Visual Basic Foro

Programación => Bases de Datos => Mensaje iniciado por: E N T E R en Noviembre 04, 2013, 03:45:56 pm

Título: Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: E N T E R en Noviembre 04, 2013, 03:45:56 pm
Hola este codigo me funciona muy bien para MySQL era que me paso el amigo Seba para access alguien tiene idea de como es.

Código: (VB) [Seleccionar]
    '+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
    '// Conectar la Base Datos con ADO
        Call ConectarADO
    '+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
       
        StrSQL = "SELECT AUTO_INCREMENT AS id FROM information_schema.Tables WHERE TABLE_SCHEMA='bodega' AND table_name='articulos'"
        rsADO.Open StrSQL, cnADO, adOpenStatic, adLockOptimistic, adCmdText

        Do Until rsADO.EOF
            With rsADO
                lblFoto.Caption = .Fields("id")
                rsADO.MoveNext
            End With
        Loop
   
    '+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
    '// Cerrar la base de datos y liberar la memoria
        Call CerrarADO
    '+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: Waldo en Noviembre 05, 2013, 10:11:05 am
Hola amigo Enter, en teoria deberia funcionar la misma instruccion que se utiliza para SQL Server:
"SELECT @@IDENTITY" devuelve el ultimo autonumerico creado, yo lo quise probar y no me funcionó, debe ser un jet4.0.
Aca hablan un poco el tema:
http://www.xtremevbtalk.com/archive/index.php/t-299232.html

Y sino la otra es hacer directamente un : SELECT MAX(campoID) as ID FROM TuTabla y listo, ahi obtenes el ID mas alto de la tabla
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: E N T E R en Noviembre 05, 2013, 10:59:04 am
Con este creo que ya soluciono amigo. Te agradezco.

Código: (SQL) [Seleccionar]
SELECT MAX(campoID) as ID FROM TuTabla
Saludos...
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: E N T E R en Noviembre 05, 2013, 11:15:43 am
Un pequeño detalle con lo que me habia pasado el amigo Seba, por ejemplo si el ultimo ID fue 5 el proximo tiene que ser 6 el codigo que mostre arriba ya te trae lo que va a ser el nuevo ID o sea el 6

Pero con el codigo que me pasaste lo solucione asi:

Código: (SQL) [Seleccionar]
SELECT MAX(campoID+1) AS ID FROM TuTabla
Saludos...
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: ssccaann43 en Noviembre 05, 2013, 11:53:40 am
Un pequeño detalle con lo que me habia pasado el amigo Seba, por ejemplo si el ultimo ID fue 5 el proximo tiene que ser 6 el codigo que mostre arriba ya te trae lo que va a ser el nuevo ID o sea el 6

Pero con el codigo que me pasaste lo solucione asi:

Código: (SQL) [Seleccionar]
SELECT MAX(campoID+1) AS ID FROM TuTabla
Saludos...

Buenos días,

Enter esto no es del todo correcto. Te explico la razón:

si creas un registro con el ID 6, el proximo ID debería ser 7, y en teoría es el 7. Pero que pasa si creas el ID 7 y luego lo borras?
Cuando vas a crear el nuevo Registro, el ID que tendrás será el 8 y no el 7. Tendrás un error allí.

Espero me comprendas la idea.

Saludos
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: Waldo en Noviembre 05, 2013, 11:54:41 am
ah..si claro el MAX justamente obtiene el mas alto, pero pensé que querias saber cual fuel el ultimo ID para usarlo con alguna otra consulta.
Ahora si le sumas uno, como es la cosa? la tabla no es autoincremento y vos elegis el ID "a mano" ?
O es autonumerico e imaginas que el 6 va a ser el proximo? ojo con eso porque si estas insertando un nuevo registro(autonumerico) y da error, el 6 que era el generado, dio error y no se agrego a la tabla, es decir que la tabla te va a quedar 5,7
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: Jeronimo en Noviembre 05, 2013, 12:35:18 pm
ojo con eso porque si estas insertando un nuevo registro(autonumerico) y da error, el 6 que era el generado, dio error y no se agrego a la tabla, es decir que la tabla te va a quedar 5,7
¿Eso no se soluciona trabajndo con transacciones? Lo que quiero decir es: si abrís una transacción y luego intentás insertar un registro que, como decís, da error, ¿al hacer RollBackTrans (en VB6.0) no anula todo y deja intacto el que sería el siguiente id (en este ejemplo, el 6)?

Jerónimo
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: E N T E R en Noviembre 05, 2013, 01:12:47 pm
Tenes razon Miguel, justamente por eso era que me paso ese metodo Seba. Lo que yo quiero hacer "algo que me funciono muy bien en MySQL" saber cual va a ser el nuevo id autonumerico de esa tabla me sirve para nombrar un archivo que va estar relacionado con el articulo.

Asi creo un nuevo registro leo cual va a ser el nuevo ID autonumerico y a la foto lo llamo lo que me devuelve el id autonumerico.
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: YAcosta en Noviembre 05, 2013, 02:54:57 pm
ojo con eso porque si estas insertando un nuevo registro(autonumerico) y da error, el 6 que era el generado, dio error y no se agrego a la tabla, es decir que la tabla te va a quedar 5,7
¿Eso no se soluciona trabajndo con transacciones? Lo que quiero decir es: si abrís una transacción y luego intentás insertar un registro que, como decís, da error, ¿al hacer RollBackTrans (en VB6.0) no anula todo y deja intacto el que sería el siguiente id (en este ejemplo, el 6)?

Jerónimo

OFF TOPIC:
Hola amigo Jeronimo, no se como es en Access y no lo he probado en otros motores, pero solo por si aca el comentario te sea util, en el caso de Firebird cuando dentro de una transacción tocaste un campo "autonumerico" y luego haces el rollback el "autonumerico" no se revierte porque se realiza fuera de la transacción al llamar a un trigger que hace el incremento. Hace un par de años ese detalle me frego un trabajo pues cuando hacia un rollback y veia el generador este no regresaba al numero anterior, en este caso se utiliza otro metodo que ya no viene a cuento explicarlo en este post, lo que remarco es que chequen si Access (puede que si pq Access perdona mucho lo cual no es serio) tras un rollback recompone el id.

ENTER
El Max devuelve el ultimo registro grabado dentro de la columna a la que le apliques dicho Max, luego, no uses MAX(campoID+1) sino MAX(campoID) + 1, si vas a usar Max entonces mejor gestiona tus propios numéricos con una tabla aparte y solo consultas a esa tabla (que solo seria con un simple select a una tabla pequeña) porque como dice Miguel tienes el problema de los borrados. Mas de Access y su motorcito Jet no se.

:-)
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: Jeronimo en Noviembre 05, 2013, 03:27:05 pm
Como siempre, Yván, muchas gracias por tu explicación. Desconocía el detalle técnico. Hace mucho tiempo me había pasado lo que contás, pero no recordaba si había trabajado con transacciones, por lo cual no estaba seguro de lo que sucedía en esos casos.
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: YAcosta en Noviembre 05, 2013, 04:29:42 pm
Ojo, que con la alternativa de una tabla de numéricos si controlas por transacción, es decir, si haces un rollback allí si te retorna el valor previo porque estas gestionando desde la transacción que abrió el aplicativo ademas que estamos con una tabla común y silvestre, en algunos casos esta forma va pero muy bien, en otros no, eso dependerá de las necesidades del amigo ENTER.
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: Jeronimo en Noviembre 05, 2013, 05:29:05 pm
Exactamente. ¡Gracias!
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: E N T E R en Noviembre 05, 2013, 06:26:26 pm
El tema es que no quiero usar otra tabla, la idea de saber cual va a ser el autonumerico que va a generar es que ese numero uso para nombrar un archivo .jpg que se va a grabar en una carpeta determinada.

Eso me sirve para eliminar, editar, mostrar etc solo con obtener el id del articulo.

Saludos...
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: Waldo en Noviembre 06, 2013, 09:36:03 am
De curioso nomas, y no es mejor una vez que se genere el ID ahi generar el archivo, ya sabiendo que el id se creo en la base?
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: Jeronimo en Noviembre 06, 2013, 09:45:08 am
Entiendo que ENTER quiere hacer todo en la misma consulta.
Si no fuese ese el caso, yo primero insertaría el registro y luego consultaría qué id se asignó a ese registro y luego lo emplearía para guardar el archivo, etc.
Código: (SQL) [Seleccionar]
SELECT MAX(campoID) AS IDMaximo FROM TuTablaO...
Código: (SQL) [Seleccionar]
SELECT ID FROM TuTabla ORDER BY ID DESC LIMIT 1
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: E N T E R en Noviembre 06, 2013, 11:38:19 am
El tema de insertar primero el registro no me vale por que de repente podes cancelar el nuevo registro. Por ejemplo apretas el boton nuevo y despues cancelar entonces tengo que estar eliminando otra ves ese registro.

Ya me resigne que no se puede en access, por que formule en otro foros la misma pregunta y la verdad esta luego mal planteado como yo quiero. aunque en access iva a funcionar por que no va a ser multiusuario.

Lo que me explicaron en otro foro es que si yo ya se el id autonumerico que va a tener si en otra maquina esta registrando otro articulo puede que haya un duplicado pero eso solo pasaria en un multi usuario.
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: Waldo en Noviembre 06, 2013, 12:27:58 pm
Pero amigo, apretan el boton nuevo registro... mostras el form de carga (seguramente modal), pero hasta que el tipo no le da click al OK, no se agrega el registro, y si le da cancelar, simplemente cerras el form, pero no hiciste ningun cambio en la base. resumiendo el INSERT recien se aplica cuando el tipo da OK, ahi ya no puede cancelar nada
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: E N T E R en Noviembre 06, 2013, 01:12:17 pm
Claro primero hay un formulario donde muestra la lista de articulos, se aprieta un boton NUEVO abre otro form (al apretar el boton nuevo capturo el nuevo id autonumerico anoto en un label)

Después al pulsar el Boton GUARDAR se guarda el registro mas el archivo .jpg con el id que capture.

Si presiono cancelar no pasa nada. Siempre al pulsar nuevo capturo el ID.
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: Waldo en Noviembre 06, 2013, 01:46:50 pm
cada uno tiene sus criterios, pero yo haria que cuando el tipo le da guardar, recien ahi hago el INSERT, busco cual fue el ultimo ID creado en la tabla, y ahi mismo con ese ID creo el jpg
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: E N T E R en Noviembre 06, 2013, 03:14:59 pm
El tema es ahi SI ES multiusuario al mismo tiempo si se guardo 2 registro el sistema va estirar lo que el otro usuario ha creado, por eso decia que este metodo no es tan confiable aunque de mil en 1 puede pasar eso pero puede pasar, por eso dije que estaba mal planteado usar esta forma.

Saludos...
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: Waldo en Noviembre 06, 2013, 04:07:09 pm
Bueno, creo que ahi lo pude hacer con el SELECT @@IDENTITY
Corri dos exe´s, hice INSERT en los dos, deje un msgbox en c/u en espera de aceptacion, luego consulte el ID, y cada exe devolvio el ID correcto.

Aca prepare un ejemplo
https://drive.google.com/file/d/0B5r4oJfTy3JLZ3BEWl9HZ3JoaDg/edit?usp=sharing


Código: [Seleccionar]

Option Explicit
Dim cn As Connection

Private Sub Command1_Click()
    Dim recAf As Integer
    Dim rs As Recordset
   
    cn.Execute "INSERT INTO Tabla1 (campo1) VALUES ('" & Format(Now) & "')", recAf, adCmdText + adExecuteNoRecords
    MsgBox "Reg. Insertado: " & recAf
   
    Set rs = cn.Execute("SELECT @@IDENTITY", , adCmdText)
    MsgBox "ID=" & rs(0)
   
    rs.Close
    Set rs = Nothing
   
End Sub

Private Sub Form_Load()
   
    Set cn = New Connection
    cn.Open CnnString_JET40(App.Path & "\bd1.mdb")
   
   
End Sub

Private Sub Form_Unload(Cancel As Integer)
   
    cn.Close
    Set cn = Nothing
   
End Sub

Public Function CnnString_JET40(ByVal sPath_con_MDB As String, Optional sPassword As String = "") As String

    Dim strTmp As String
   
    If sPassword <> vbNullString Then
        strTmp = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sPath_con_MDB & ";" & _
                "Jet OLEDB:Database Password=" & sPassword & ";"
    Else
        strTmp = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=" & sPath_con_MDB & ";" & _
                "User Id=admin;Password=;"
    End If
   
    Debug.Print strTmp
   
    CnnString_JET40 = strTmp
   
End Function





Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: YAcosta en Noviembre 06, 2013, 07:11:54 pm
El tema es ahi SI ES multiusuario al mismo tiempo si se guardo 2 registro el sistema va estirar lo que el otro usuario ha creado, por eso decia que este metodo no es tan confiable aunque de mil en 1 puede pasar eso pero puede pasar, por eso dije que estaba mal planteado usar esta forma.

Saludos...

El código de Waldo es tu solución.

Comentario aparte:
Papa, es que tu no usas transacciones (begin/commit/roll) y si vas a estar en red debes usar ello para que no tengas ese temor de si otro usuario toma el id ya tomado, incluso con Access se puede aplicar el begin/commit.

Al margen de lo anterior y dado que comentas sobre una tabla maestra, quizás debas revisar la usabilidad puesto que no todos los módulos debieran estar a la mano de usuarios que lo usen a la vez desde dos o mas pcs, considero que los maestros de artículos no debe operarse en mas de un terminal a la vez, "que se pueda no implica que se deba", eso ya pasa por un tema de seguir procedimientos, y la posibilidad de que alguien rompa el procedimiento mas la posibilidad de que lo hagan a la vez a la misma tabla es tan ínfima que no vale la pena ningún esfuerzo, bien por hacerlo y lograr cubrir todas las excepciones posibles pero te cuento que con mas de 5 años de rigor con programas que corren en red en varias empresas, con un batallón de usuarios salvajes y con el único mandato verbal a dichos usuarios de que ciertos módulos se operan SOLO en administración, NUNCA se me presentó un inconveniente así. ¿Que es posible que ocurra? SI, ¿Que es probable? lo veo muy improbable.
Fin del margen.

Checa trabajar con transacciones con mas razon si sera en red, acabo de probar con Access y efectivamente te perdona el autonumerico, o sea te lo devuelve y si dentro de esa transacción metes la consulta de recuperacion del ID ya tendrías un problema menos que abordar.

SAludos
 


   
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: raul338 en Noviembre 07, 2013, 12:41:32 am
El tema es ahi SI ES multiusuario al mismo tiempo si se guardo 2 registro el sistema va estirar lo que el otro usuario ha creado, por eso decia que este metodo no es tan confiable aunque de mil en 1 puede pasar eso pero puede pasar, por eso dije que estaba mal planteado usar esta forma.

Saludos...

Si es en red y usas access vas un poco limitado.

En MySQL puedes usar Locks de usuarios para saber si alguien esta insertando/editando un registro o ALGO en particular y así informar al usuario de esperar
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: E N T E R en Noviembre 07, 2013, 10:40:52 am
Solucionado con el code que paso el amigo Waldo. Lo de transacción si uso amigo Yban yo decia que se podia duplicar con el metodo que yo hacia por que al apretar nuevo leo el id y justo otro usuario puede apretar también nuevo y va a leer el mismo id.

Y lo ideal seria usar como paso Waldo insertar primero el registro leer el id y nombrar así a la foto.

Gracias a todos por responder.
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: seba123neo en Noviembre 11, 2013, 03:50:43 pm
a ver si queda claro, el codigo usando la funcion MAX() es para "simular" un autonumerico, no es un autonumerico creado por la base de datos, es simplemente un campo entero que cuadno uno inserta, lo va incrementando manualmente + 1, sino no tendria sentido hacer el MAX(), ya que el campo sube automaticamente.

para obtener el codigo insertado de un campo "realmente autonumerico", hay que ejecutar "SELECT SCOPE_IDENTITY() AS id" luego de hacer el insert, esto en SQL Server.
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: wolf_kof en Noviembre 14, 2013, 11:05:44 pm
Estan perdiendo el tiempo, es sencillo dentro de la base de datos creas un campo temporal y lo pones como clave secundaria y guardas una variable, despues buscas el registro por esta variable y despues eliminas la variable dentro del campo para dejarlo nulo.
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: ssccaann43 en Noviembre 15, 2013, 11:33:29 am
El tema es ahi SI ES multiusuario al mismo tiempo si se guardo 2 registro el sistema va estirar lo que el otro usuario ha creado, por eso decia que este metodo no es tan confiable aunque de mil en 1 puede pasar eso pero puede pasar, por eso dije que estaba mal planteado usar esta forma.

Saludos...

Permiteme aclararte algo...!

Si el software es MULTIUSUARIO, dificilmente y estadisticamente es imposible que 2 usuarios al mismo tiempo, es decir en el MISMO SEGUNDO:MILISEGUNDO, hagan click...! Por tal motivo al momento de hacer el insert y consultar, es tan rapido, que no tendrías problemas..!

Yo ya he pasado por esto, y creeme no he tenido problemas..!

Saludos...!
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: YAcosta en Noviembre 15, 2013, 12:03:34 pm
Estan perdiendo el tiempo, es sencillo dentro de la base de datos creas un campo temporal y lo pones como clave secundaria y guardas una variable, despues buscas el registro por esta variable y despues eliminas la variable dentro del campo para dejarlo nulo.

No es perdida de tiempo papa, estamos dando diferentes opciones y puntos de vista, no creo que pienses que la solución que planteas sea la mejor para todos los escenarios. Ya el amigo Enter con toda esta buena info podra elegir la que mejor se adapte a resolver su problema.

Saludos
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: YAcosta en Noviembre 15, 2013, 12:05:35 pm
El tema es ahi SI ES multiusuario al mismo tiempo si se guardo 2 registro el sistema va estirar lo que el otro usuario ha creado, por eso decia que este metodo no es tan confiable aunque de mil en 1 puede pasar eso pero puede pasar, por eso dije que estaba mal planteado usar esta forma.

Saludos...

Permiteme aclararte algo...!

Si el software es MULTIUSUARIO, dificilmente y estadisticamente es imposible que 2 usuarios al mismo tiempo, es decir en el MISMO SEGUNDO:MILISEGUNDO, hagan click...! Por tal motivo al momento de hacer el insert y consultar, es tan rapido, que no tendrías problemas..!

Yo ya he pasado por esto, y creeme no he tenido problemas..!

Saludos...!

Mas aun si usa transacciones (Begin/Commit) que hasta ahora no le creo a mi amigo Enter que las use jeje, lo digo porque en en ninguno de los codigos que publico he visto esa linea, mas bien siempre veo que por cada transacción abre la conexión, registra y la cierra como si trabajara en web.
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: raul338 en Noviembre 15, 2013, 08:40:17 pm
Permiteme aclararte algo...!

Si el software es MULTIUSUARIO, dificilmente y estadisticamente es imposible que 2 usuarios al mismo tiempo, es decir en el MISMO SEGUNDO:MILISEGUNDO, hagan click...! Por tal motivo al momento de hacer el insert y consultar, es tan rapido, que no tendrías problemas..!

Yo ya he pasado por esto, y creeme no he tenido problemas..!

Si pero hay mas factores a tener en cuenta. Se mandan consultas por separado, si la red es lenta (o por pura casualidad el programa se "cuelga"  ::) ) puede que se intercalen las consultas y salga mal, pero bueno, el margen existe :P
Título: Re:Obtener el ultimo ID autonumerico de una tabla Access
Publicado por: ssccaann43 en Noviembre 18, 2013, 01:29:30 pm
Permiteme aclararte algo...!

Si el software es MULTIUSUARIO, dificilmente y estadisticamente es imposible que 2 usuarios al mismo tiempo, es decir en el MISMO SEGUNDO:MILISEGUNDO, hagan click...! Por tal motivo al momento de hacer el insert y consultar, es tan rapido, que no tendrías problemas..!

Yo ya he pasado por esto, y creeme no he tenido problemas..!

Si pero hay mas factores a tener en cuenta. Se mandan consultas por separado, si la red es lenta (o por pura casualidad el programa se "cuelga"  ::) ) puede que se intercalen las consultas y salga mal, pero bueno, el margen existe :P

Si pensamos en problemas de RED LENTA o de que el Software se cuelgue, para cualquiera de los casos se le jode la operación. Y en ese caso, cito a Yvan, con el uso de begin/commit. Aún así, usando correctamente el begin/commit, siendo la red lenta, colgandose el software, es seguro...!

Saludos