Asignación automática de número de registro en formato definido por el usuario.

Estoy creando el libro de registro de documentos de Entrada y Salida.

La idea es que al dar de alta a un documento, el sistema le asigne un número de expediente del tipo aaaa/n... Es decir, un código que indique el año y el número del documento. O al revés, primero el número y después el año.

¿Cómo podría hacerlo?

1 respuesta

Respuesta
1

No das muchos datos de cómo tienes tus tablas, por lo que hará algunas suposiciones y te queda a ti el "trabajo" de adaptar lo que te indico a tus circunstancias particulares. Te lo comento para la tabla Entradas, y lo mismo harías con la de Salidas:

Supongo que tienes un campo NumRegistro, de tipo texto en la tabla Entradas, y que los registros que hagas siempre serán del año actual. Además el formato será 2020/001, 2020/002..., es decir, el año con 4 dígitos, la barra y el "autonumérico" con 3 dígitos.

Los pasos serían (habría otras formas de hacerlo, pero a mi me gusta ésta):

1º/ Creas un formulario sobre la tabla

2º/ En el evento "al activar registro" le pones este código:

Dim rst As DAO.Recordset
If Not Me.NewRecord Then Exit Sub
Set rst = CurrentDb.OpenRecordset("SELECT Right(NumRegistro,3) FROM Tabla2 WHERE Left(NumRegistro,4)=" & Year(Date) & " ORDER BY Right(NumRegistro,3)")
If rst.RecordCount = 0 Then
    Me.NumRegistro= Year(Date) & "/001"
Else
    rst.MoveLast
    Me.NumRegistro= Year(Date) & "/" & Format(rst(0) + 1, "000")
End If
rst.Close
Set rst = Nothing

3º/ Guardas y listo.

Comentarios:

1º/ Si ves que con 999 registros al año no te llegan, puedes cambiar los "000" en la función Format por "0000", y los 3 del Right por 4 (o por "00000" y 5, o los dígitos que preveas usar)

2º/ Si tienes un campo FechaRegistro, podrías usarlo en vez de la fecha de sistema, en cuyo caso el código iría en el evento "después de actualizar" de ese campo FechaRegistro, lo que te permitiría añadir registros de otros años. El código sería:

Dim rst As DAO.Recordset
If not Isnull(me.NumRegistro) Then Exit Sub
Set rst = CurrentDb.OpenRecordset("SELECT Right(NumRegistro,3) FROM Entradas WHERE Left(NumRegistro,4)=" & Year(Me.FechaRegistro) & " ORDER BY Right(NumRegistro,3)")
If rst.RecordCount = 0 Then
Me.NumRegistro= Year(Me.FechaRegistro) & "/001"
Else
rst.MoveLast
Me.NumRegistro = Year(Me.FechaRegistro) & "/" & Format(rst(0) + 1, "000")
End If
rst.Close
Set rst = Nothing

Si quieres el formato 001/2020, el código sería:

Private Sub Form_Current()
Dim rst As DAO.Recordset
If Not Me.NewRecord Then Exit Sub
Set rst = CurrentDb.OpenRecordset("SELECT Left(NumRegistro,3) FROM Tabla2 WHERE Right(NumRegistro,4)=" & Year(Date) & " ORDER BY Left(NumRegistro,3)")
If rst.RecordCount = 0 Then
    Me.NumRegistro= "001/" & Year(Date)
Else
    rst.MoveLast
    Me.NumRegistro= Format(rst(0) + 1, "000") & "/" & Year(Date)
End If
rst.Close
Set rst = Nothing
End Sub

Perfecto. Lo he adaptado mis necesidades y va de lujo. Tanto para el Registro de Entradas y Salidas de documentos, como para asignar expediente a otros tipos de registros.

Muchísimas gracias amigo.

Nuevamente me veo obligado a recurrir a tu superior conocimiento en demanda de ayuda con este código..

Private Sub Fecha_Convocatoria_AfterUpdate()

Dim rst As DAO.Recordset
If Not IsNull(Me.Expediente) Then Exit Sub
Set rst = CurrentDb.OpenRecordset("SELECT Right(Expediente,3) FROM T_Sesiones_Junta_Directiva WHERE Left(Expediente,4)=" & Year(Me.Expediente) & " ORDER BY Right(Expediente,3)")

If rst.RecordCount = 0 Then
Me.Expediente = Year(Me.Fecha_Convocatoria) & "/001"
Else
rst.MoveLast
Me.Expediente = Year(Me.Fecha_Convocatoria) & "/" & Format(rst(0) + 1, "000")
End If
rst.Close
Set rst = Nothing

End Sub

Ahora resulta que me da error 94 en tiempo de ejecución, Uso no valido de Null.-

Te aclaro que el formulario depende de la tabla "T_Sesiones_Junta_Directiva"

He revisado  la tabla una y otra vez, he puesto el campo Expediente como no requerido, he quitado la llave, y por más vueltas que le doy, no encuentro el problema.

¿Que Puedo Hacer?

No dices donde te da el error, aunque lo puedo suponer...

Si quitas esta línea: If Not IsNull(Me.Expediente) Then Exit Sub

Ya no tendrás ese "problema", pero has de tener cuidado de no modificar la fecha de un registro que ya tenga número de expediente o te lo modificará.

Otra solución sería modificar la sql para no usar como filtro el campo expediente ( que no tendrá valor)

Fíjate que en la segunda línea de código le dices: "si el valor de Expediente no es nulo, entonces sal del proceso sin más". Luego si Expediente es nulo, es cuando se ejecutan el resto de líneas de código, y al ser nulo expediente, no lo puedes usar para nada (véase como filtro de la sql), solo para asignarle un valor.

He Comentado la inea del if not insnull y sigue dando error en la SQL

Tienes la explicación en mi segunda respuesta anterior: si el campo expediente es nulo ( no tiene valor) no lo puedes usar como parte del filtro de la sql

Y ahora que me fijo, puedes menos aún sacarle el año ( entiendo que expediente no es un campo de tipo fecha). Pero si lo fuera, tampoco puedes extraer un año de un nulo.

Cono no sé de qué depende la numeración de Expediente, imagino que tu sql debería ser algo así :

....WHERE Left(Expediente,4)=" & Year(Me.fecha_convocatoria ) & " ORDER BY Right(Expediente,3)")

¡Gracias! Con esa modificación en la SQL funciona perfectamente.

Ahora he comprendido por qué daba ese error. Yo había copiado la misma estructura que me indicas en la segunda opción de tu primera respuesta. 

Seguimos aprendiendo, Mucha Gracias Amigo.

Tengo una ultima duda para este tema:

Podría añadir  3 caracteres de texto al inicio del numero de expediente? para que quede, por ejemplo. asi: CON-2020/001?

Por supuesto que se puede. Te lo pongo en uno, pero tendrías que hacerlo en todos los códigos donde generas el "número" :

Me.Expediente = "CON-" & Year(Me.Fecha_Convocatoria) & "/" & Format(rst(0) + 1, "000")

¡Gracias! Funciona bien,

Lo uso para diferenciar unos expedientes de otros.

Bueno, pues aquí estoy otra vez.

A ver, te comento:

Resulta que cuando genero el primer registro, me lo hace bien, pero al generar otro, me da error en la SQL "No coinciden los tipos de datos en la expresión de criterios"

¿Por qué ocurre esto?

Vale, disculpa porque me centré únicamente en responderte a lo nuevo, y no pensé en las modificaciones del código que hay que hacer...

Al añadir las letras al principio, los dígitos del año ya no son los 4 primeros caracteres del campo ( que es lo que sacas con el Left)

Como ahora están por el medio, hay que cambiar la función Left por la función Mid, indicando dónde empieza y los caracteres a coger: Mid(Expediente, 5,4)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas