Campo autonumérico.

Tengo un formulario, donde el primer campo es "nº expediente", que es numérico, porque aunque me iría mejor a la larga autonumérico, tengo que introducir más de 5000 registros y no los tengo ordenados, y me costaría mucho pasarlos si el campo fuera autonumérica.
Me gustaría si me podías decir como hacer una de estas dos opciones:
Opción 1: si una vez introducido todos los datos, puedo convertir este campo en autonumérico, sin que me modifique los registro ya entrados.
Opción 2: añadir un campo en el formulario, que proviene de una consulta que me dice el nº más alto de expediente +1, que es el que me tocaría introducir ahora.

2 Respuestas

Respuesta
1
Paso a contestar tus preguntas, suponiendo que utilices Access 2007.
1.- No puedes convertir a autonumérico un campo numércio ya creado, aunque no tenga datos, porque Access no te lo permite. Es decir, que esta opción que planteas no es posible.
2.- Sí se podría hacer lo que comentas, pero yo te propongo una solución más automática. Te explico como hacerlo, aunque te aconsejo que lo pruebes en una copia de tu base de datos, por si acaso se produce algún error.
El proceso es el siguiente:
- Con el formulario en vista diseño, coges el campo nº expediente, sacas sus propiedades, pestaña otras, y le dices "Punto de tabulación: NO". Con esto sólo podrás acceder al campo con el ratón, y no a través del teclado.
- Sacas las propiedades del formulario, te vas a la pestaña eventos y en el evento "Al cambiar registro" le asignas este código:
---
Private Sub...
Dim vNum As Variant
    vNum = Me.[nº registro].Value
        'Si el campo no está en blanco sale del proceso
    If Not IsNull(vNum) Or vNum <> "" Then Exit Sub
        'Buscamos el valor máximo de la tabla de origen
    Dim vMax As Variant
    vMax = Nz(DMax("[nº registro]", "NombreTabla"))
        'Si el valor máximo es cero por Nz porque no haya registros
'le asigna el valor uno. Si no añade una unidad al número
'más alto
    If vMax = 0 Then
        vMax = 1
    Else
        vMax = vMax + 1
    End If
        'Asignamos el nuevo valor al número
    Me.[nº registro].Value = vMax
End Sub
---
Comprueba que los valores que te he marcado en negrita sean exactamente iguales a como tienes el nombre del campo.
Por otra parte, tendrás que cambiar NombreTabla por el nombre de tu tabla donde tienes los datos.
Bueno. Ya me dirás qué tal te ha ido. Ante cualquier duda me comentas.
Buenas tardes:
Este es exactamente el código que he copiado:
Private Sub EXPEDIENTE_Nº_Change()
    vNum = Me.[EXPEDIENTE_Nº].Value
        'Si el campo no está en blanco sale del proceso
    If Not IsNull(vNum) Or vNum <> "" Then Exit Sub
        'Buscamos el valor máximo de la tabla de origen
    Dim vMax As Variant
    vMax = Nz(DMax("[EXPEDIENTE_Nº]", "TRABAJADORES"))
        'Si el valor máximo es cero por Nz porque no haya registros
'le asigna el valor uno. Si no añade una unidad al número
'más alto
    If vMax = 0 Then
        vMax = 1
    Else
        vMax = vMax + 1
    End If
        'Asignamos el nuevo valor al número
    Me.[EXPEDIENTE_Nº].Value = vMax
End Sub
Cada vez que entro en un registro nuevo, el valor que me sale es 1, no se porque!
Me podías aclarar donde me he quivocado.
Gracias
Vaya, vaya... se resiste la cosa... ;)
Haz estas comprobaciones:
- En la tabla TRABAJADORES mira el campo EXPEDIENTE_Nº y, si tiene asignado un valor predeterminado, bórraselo.
- Comprueba que los nombres de los campos (Propiedades->Pestaña Otras->Nombre) sean EXACTAMENTE iguales a los que hay en el código.
De todas maneras te he creado una miniBD para que te la puedas bajar y le eches un vistazo para poder comparar con la tuya, a ver si así tú puedes pillar alguna diferencia entre ellas. Aquí la tienes ;)
Ya me dirás cosas.
Buenas tardes:
Ya me funciona el código, a saber lo que ponía mal.
Pero tengo un problema que es el siguiente:
Cuando yo introduzco un registro, al entrar en el siguiente, en "EXPEDIENTE Nº" me pone el anterior más 1, hasta ahí todo bien, pero si no quiero introducir más, salgo, pero ese registro ya me lo guarda, sin datos per lo guarda.
No se mi explico muy bien, espero que me entiendas, lo que quiero es que si no quiero introducir más ese no lo guarde, haciendo por ejemplo que si el campo empresa de ese registro no esta lleno no lo guarde el registro o algo así...
Gracias y ya me dirás algo.
Acabas de dar en, para mí, el "problema maldito de Access" ;)
En ocasiones está bien que Access te guarde el registro sin que tú le digas que lo quieres guardar, pero en otras ocasiones es un verdadero "problema" que lo haga sin tu consentimiento. Por lo que es el problema en sí, que por intuición debería ser algo sencillo, yo he sido incapaz de encontrar una manera "fácil" de solventar este inconveniente (cuando digo fácil me refiero a unas pocas líneas de código).
Es decir, que si alguien se entera de cómo arreglar esto de una manera a la que te propongo, le estaría sumamente agradecido si me lo pudiera comentar ;)
Dicho esto te explico cómo evitar este "bache":
1.- Abre el formulario de trabajo en vista diseño
2.- Saca sus propiedades y te vas a la pestaña Eventos. Seleccionas el evento "Al cerrar" y le asignas el siguiente código:
---
Private Sub Form_Close()
Dim rst As Recordset
Dim vEmpr As Variant
Set rst = CurrentDb.OpenRecordset("TRABAJADORES", dbOpenTable)
If rst.RecordCount = 0 Then
GoTo Salida
End If
rst.MoveFirst
Do Until rst.EOF
vEmpr = rst.Fields("Empresa").Value
If IsNull(vEmpr) Then
rst.Delete
End If
rst.MoveNext
Loop
Salida:
rst.Close
Set rst = Nothing
End Sub
---
Como siempre, verifica que lo que te he marcado en negrita coincida exactamente con el nombre de tu tabla y de tu campo.
Piensa también que este código borra TODOS los registros en los que el campo "empresa" esté en blanco. Si eso supusiera un inconveniente me lo comentas y cambiaremos ligeramente el código.
Y, como siempre, ya que se van a borrar registros, te aconsejo que hagas una prueba en una copia de tu BD, que yo no tengo seguro para cubrir "desastres"... je, je... ;)
Ya me dirás qué tal. Como siempre a tu disposición.
¿Te ha ido bien lo que te recomendé?
Ya me dirás.
Muchas gracias por el tiempo.
Me ha ido muy bien lo que pasa que al final he creado un campo de texto independiente, y que me ponga allí el numero más alto +1, y yo lo escribo en el campo nº expediente si quiero introducir más, porque como el campo 1r. apellido y nombre empresa eran obligatorios si no introducía más me daba errores y era un follón.
Gracias de nuevo.
Respuesta
1
No una vez que introduces un bvalor a un campo numérico no se puede pasar a autonumérico se generan problemas de indices y demás.
Yo te aconsejaría lo siguiente
No crees una consulta donde sea ultimo + 1. por experiencia te digo que no es funcional
create una tabla que se llame por ejemplo parámetros con dos campos
Parametro Tipo TEXT
Valor Tipo numérico
Create un modulo con una Conexión ADO donde cada vez que quieras introducir un nuevo registro te devuela el ultimo valor para el parámetro
al valor devuelto por la función de dicgho modulo le sumas 1
asunto arreglado
es importante que al guardar el registro actualices el valor correspondiente de la tabla parámetros.
Este tipo de estructura es muy útil por ejemplo para sistemas de ventas donde en una misma tabla puedes tener tus últimos folios de factura, nota, entrada, salida y demás folios en general. Si gustas mandame tu bae limpia a mi correo y con gusto te hago el ejemplo
[email protected]

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas