none
Obtener el ultimo ID autonumerico de una tabla Access RRS feed

Respuestas

  • Hola Enter:

     Esto que deseas no es posible con access, ya que no funciona de esa manera, lo que si puedes hacer es obtener el valor generado por el campo autonumerico inmediatamente después de hacer el insert a tu Bd pero no antes.

     Hace mucho quise hacer esto que deseas pero analizando un poco la lógica me di cuenta que era algo innecesario y como bien te lo indican en una ambiente multiusuario simplemente no servirá de nada, lo que si te recomiendo es que después de insertar el registro recuperes el valor que este genero, un ejemplo de como recuperar el valor del AutoNumerico podria ser este:

    C#:

    string query = "Insert Into Categories (CategoryName) Values (?)";
    string query2 = "Select @@Identity";
    int ID;
    string connect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|Northwind.mdb";
    using (OleDbConnection conn = new OleDbConnection(connect))
    {
      using (OleDbCommand cmd = new OleDbCommand(query, conn))
      {
        cmd.Parameters.AddWithValue("", Category.Text);
        conn.Open();
        cmd.ExecuteNonQuery();
        cmd.CommandText = query2;
        ID = (int)cmd.ExecuteScalar();
      }
    }

    Vb.Net: 

    Dim query As String = "Insert Into Categories (CategoryName) Values (?)"
    Dim query2 As String = "Select @@Identity"
    Dim ID As Integer
    Dim connect As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|Northwind.mdb"
    Using conn As New OleDbConnection(connect)
      Using cmd As New OleDbCommand(query, conn)
        cmd.Parameters.AddWithValue("", Category.Text)
        conn.Open()
        cmd.ExecuteNonQuery()
        cmd.CommandText = query2
        ID = cmd.ExecuteScalar()
      End Using
    End Using

    Pon atención en las lineas marcadas en negrita.

     Con respecto a que MySql lo puede hacer no significa que en Access o en tecnologías Microsft también de pueda y viceversa muchas cosas de SqlServer - Access no las encontraras en MySql u otro motor de Bd.


    Saludos desde Monterrey, Nuevo León, México!!!


    • Editado JoséLuisGarcía martes, 5 de noviembre de 2013 23:40 codigo Vb.Net omitido
    • Marcado como respuesta E N T E R miércoles, 6 de noviembre de 2013 16:14
    martes, 5 de noviembre de 2013 23:36

Todas las respuestas

  • Hola,

    Va a ser un poco dificil saber cual va a ser el autonumerico que se va a utilizar cuando todavia no se inserto el registro.

    Lo que se puede hacer es suponer cual seria el autonumerico que se asignara para el proximo insert, pero en un ambiente multiusuario esto no es 100% real.


    Victor Koch

    martes, 5 de noviembre de 2013 19:43
  • Me dices esto por la limitaciones de Access? por que en MySQL se puede este el codigo en 

    SELECT AUTO_INCREMENT AS id FROM information_schema.Tables WHERE TABLE_SCHEMA='alumnos' AND table_name='clientes'

    Saludos...

    martes, 5 de noviembre de 2013 21:20
  • No entiendo para que quieres obtener el registro que continua en un campo autonumerico, antes de insertar no seria mejor insertar el registro y que e te devuelva el Id que se le asigno

    martes, 5 de noviembre de 2013 21:40
  • No, lo digo porque en un ambiente multiusuario no se puede saber el ID que se va a usar en un insert hasta que este no se realiza.

    Lo que vos estas haciendo con ese select estas suponiendo cual seria el proximo ID, tal vez en un ambiente monousuario funcione pero en un ambiente multiusuario no es 100% seguro.

    Hace esta prueba:

    En una base de datos MySQL lee el ID segun tu ejemplo. De otra terminal o con cualquier aplicacion inserta un registro en la tabla con el autonumerico que consultaste. Volve a consultar el ID.


    Victor Koch

    martes, 5 de noviembre de 2013 21:45
  • Hola Enter:

     Esto que deseas no es posible con access, ya que no funciona de esa manera, lo que si puedes hacer es obtener el valor generado por el campo autonumerico inmediatamente después de hacer el insert a tu Bd pero no antes.

     Hace mucho quise hacer esto que deseas pero analizando un poco la lógica me di cuenta que era algo innecesario y como bien te lo indican en una ambiente multiusuario simplemente no servirá de nada, lo que si te recomiendo es que después de insertar el registro recuperes el valor que este genero, un ejemplo de como recuperar el valor del AutoNumerico podria ser este:

    C#:

    string query = "Insert Into Categories (CategoryName) Values (?)";
    string query2 = "Select @@Identity";
    int ID;
    string connect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|Northwind.mdb";
    using (OleDbConnection conn = new OleDbConnection(connect))
    {
      using (OleDbCommand cmd = new OleDbCommand(query, conn))
      {
        cmd.Parameters.AddWithValue("", Category.Text);
        conn.Open();
        cmd.ExecuteNonQuery();
        cmd.CommandText = query2;
        ID = (int)cmd.ExecuteScalar();
      }
    }

    Vb.Net: 

    Dim query As String = "Insert Into Categories (CategoryName) Values (?)"
    Dim query2 As String = "Select @@Identity"
    Dim ID As Integer
    Dim connect As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|Northwind.mdb"
    Using conn As New OleDbConnection(connect)
      Using cmd As New OleDbCommand(query, conn)
        cmd.Parameters.AddWithValue("", Category.Text)
        conn.Open()
        cmd.ExecuteNonQuery()
        cmd.CommandText = query2
        ID = cmd.ExecuteScalar()
      End Using
    End Using

    Pon atención en las lineas marcadas en negrita.

     Con respecto a que MySql lo puede hacer no significa que en Access o en tecnologías Microsft también de pueda y viceversa muchas cosas de SqlServer - Access no las encontraras en MySql u otro motor de Bd.


    Saludos desde Monterrey, Nuevo León, México!!!


    • Editado JoséLuisGarcía martes, 5 de noviembre de 2013 23:40 codigo Vb.Net omitido
    • Marcado como respuesta E N T E R miércoles, 6 de noviembre de 2013 16:14
    martes, 5 de noviembre de 2013 23:36
  • Y bueno me resigno entonces no hay caso con access,  PcardozaCodetracachi,R.L yo queria obtener el id autonumerico antes de insertar el registro para asignarle el nombre a un archivo, como me habia funcionado bien con MySQL queria implementar en Access.

    Luis Escobar voy implementar la manera que me dijiste.

    Saludos...


    miércoles, 6 de noviembre de 2013 12:20
  • Hola de nuevo Enter:

     Si lo que necesitas es traer el numero Mayor del campo Autonumerico de Access entonces podrías utilizar el MAX combinado con el IsNull de esta manera:

    SELECT IIF(IsNull(Max(NombreCampo), 0) AS ValorMaximo) FROM TuTabla

    Así recuperas el valor máximo del campo mencionado, desues simplemente podrías incrementarle uno para simular el siguiente autonumerico pero, como tu mencionas este dato recuperado y armado no seria 100% confiable porque se vería afectado por la eliminación del ultimo registro, si eliminas alguno que este en medio no afecta pero si eliminas el ultimo entonces si tu numeración sufre las consecuencias.

     Por ultimo no olvides cerrar la pregunta marcando las respuestas que te hayan servido a disipar tu duda y votar como útiles aquellas que consideres aportaron informacion útil.


    Saludos desde Monterrey, Nuevo León, México!!!

    miércoles, 6 de noviembre de 2013 15:38
  • Hola,

    Ese SQL para MySQL tampoco te va a funcionar en un ambiente multiusuario. La forma correcta de obtener el autonumerico asignado al ultimo insert para MySQL es la siguiente:

    SELECT LAST_INSERT_ID() AS ID

    Ese SQL hay que ejecutarlo inmediatamente despues de haber ejecutado el INSERT.


    Victor Koch

    miércoles, 6 de noviembre de 2013 17:57
  • LO QUE PUEDES HACER ES INGRESAR UN REGISTRO "MANUALMENTE" EN TU TABLA "ARTICULOS", ACCESS LE ASIGNARA EL NUMERO 1.


    CUANDO ABRAS EL FORMULARIO EN VB PARA HACER UN NUEVO INGRESO ACCESS YA TE PASARÁ AUTOMATICAMENTE EL NUMERO CORRELATIVO.


    ES LA UNICA SOLUCIÓN QUE HE ENCONTRADO, YO TENGO EL MISMO CASO QUE TU.

    ESTOY USANDO ESTE CODIGO:


    SI ENCUENTRAS OTRA SOLUCIÓN, COMPARTELA amigo!!!



    jueves, 1 de febrero de 2018 15:38
  • espero estar respondiendo alguna duda, cambie la consulta acces y me funciono

    private void NUEVO()
            {
                int COD, AUT;

                OleDbCommand cmd;
                string sql = null;

                sql = "SELECT IIf(IsNull(MAX(IdPaciente)),0,Max(IdPaciente))  FROM Paciente";


                 con.Open ();
                 cmd = new OleDbCommand (sql, con);
                 COD = Convert.ToInt32(cmd.ExecuteScalar ());
                 cmd.Dispose ();
                 con.Close ();


                if ((COD > 0))
                {

                    AUT = COD + 1; ;
                    txtIdPaciente.Text = AUT+"";
                }
                else
                    txtIdPaciente.Text = "1";
                txtNombres.Focus();
            }

                                                             
    martes, 3 de julio de 2018 17:06
  • Pienso que la forma más eficiente para que resulte exitosa esta operación en un entorno multiusuario es haciendo un programa en la base de datos que funciona como backend. Lo que sucede es que si se hace en dos periodos es posible que otro usuario llegue antes y robe el ID deseado, teniendo ambos el problema. Para eso será necesario delegar esa responsabilidad al backend, desde el frontend llamar a la función del backend que con un temporizador revisará los datos y enviará el resultado correcto devuelta. La idea es la siguiente:

    Una tabla en el backend que se llame funciones con campos de funciones y parámetros. El temporizador revisa para ver si hay alguna solicitud de la frontend, si hay alguna entonces ejecuta la función  con todas las instrucciones, y envía el resultado. La frontend que también tiene un temporizador revisa si ya se envió el resultado, entonces lo recibe y termina de procesarlo. Esta forma garantizaría el resultado correcto porque la backend no ejecutará ninguna otra función hasta que termine con la solicitud. Si se programa así el resultado será 100% seguro.


    sábado, 28 de diciembre de 2019 0:17