Autonumérico según numero de semana

Primero los felicito por sus aportes a la comunidad, he aprendido mucho aquí.

Mí interrogante es como puedo crear un autonumérico en un formulario que tenga el siguiente formato: 4 dígitos del año 2 del numero de semana del año en que se realiza el registro y 2 incrementables, ejemplo: 2025-01-01, 2025-01-02, 2025-01-03, etc, siendo 01 la primer semana del año 2025, (del lunes 30 de diciembre de 2024 al domingo 05 de enero de 2025).

Al cambiar de semana el contador del autonumérico se reinicie a 1, ejemplo 2025-02-01, 2025-02-02, 2025-02-03, 2025-02-04, etc, siendo esta la segunda semana del año 2025 (del lunes 06 de enero al domingo 12 de enero de 2025).

Al cambiar nuevamente de semana el autonumérico se reinicie a 1 ejemplo 2025-03-01, 2025-03-02, 2025-03-03, etc, siendo esta la tercera semana del año 2025 (del lunes 13 de enero al domingo 19 de enero de 2025).

Al cambiar de año el contador cambie el año y reinicie el incrementable de semanas ejemplo 2026-01-01, 2026-01-02, 2026-01-03, 2026-01-04, etc siendo esta la primer semana del año 2026 (del lunes 29 de diciembre de 2025 al domingo 04 de enero de 2026), y así sucesivamente.

Para terminar con mi interrogante, el autonumérico deberá cambiar de acuerdo a una fecha que se ingresará en una caja de texto.

3 respuestas

Respuesta
1

Te mando un ejemplo. Pero convendría que explicaras el último párrafo. ¿No se tiene en cuenta la fecha del sistema?

Respuesta
1

Seria interesante conocer la prevision de como se va a utilizar ese contador, me explico:

En principio no hay mayor dificultad, el año de una fecha se obtiene con la función YEAR de una fecha conocida, la semana del año se puede obtener con la función DATEPART sobre la misma fecha y el correlativo ascendente (la serie numérica) se logra con la función DMAX, solo hay que separar la parte variable (el dato ascendente) filtrando por el conjunto de AÑO-SEMANA.

Lo que es imprescindible, es conocer de forma previa al proceso la fecha de partida para el calculo, automatizar el proceso es sencillo si la referencia (la fecha) es conocida, por ejemplo la fecha del sistema de la cual se extraerá el año y semana (el resto es 'sumar las repeticiones de ese binomio).

Es fácil de lograr y sencillo de utilizar si se crea una función al efecto, a la cual se le pasa la fecha base (dato del cuadro de texto) y retorna el ID asociado.

Solo se necesitara tener en cuenta que los datos de algunas de las funciones devuelven un número (con los dígitos indispensables) y que para lograr ese final estético habrá que rellenar con ceros los espacios (función FORMAT).

La cuestión es que para crear una nueva clave se necesita la fecha de referencia dato que es volitivo (y por ello desconocido).

Se necesitaría que en la tabla el campo fuera de texto, su longitud: diez caracteres (no tiene sentido para ese dato reservar los doscientos y pico que permite) y aunque no es indispensable pero si muy aconsejable, que se le indexe sin repeticiones.

Si crees que puedes asumir en tu diseño esas condiciones, podría publicar la función, para lo que necesitaré conocer el nombre REAL de la tabla y el nombre REAL del campo, el nombre del origen de la fecha no es necesario (se le asigna como parámetro a la función al llamarla).

No es imprescindible una función, pero dado que se tienen que crear datos formateados (y algunos repetidos) es mas sencillo que crearla en una sola línea pues se necesitan las funciones NZ, LEFT, RIGHT, VAL, DMAX, YEAR, DATEPART, FORMAT ... y por supuesto una función para la cual puedes elegir el nombre (sin espacios

Respuesta
1

Pruebe con esta función cambie MiTabla por el nombre de su tabla y asumo que el campo Autonum es campo autonumérico, cópiela en un módulo.

Function ObtenerConsecutivo(FechaIngresada As Date) As String
    Dim año As Integer
    Dim semana As Integer
    Dim contador As Integer2:41 p. m. 27/01/2025
    Dim autonum As String
    Dim rs As DAO.Recordset
    Dim sql As String
    ' Calcular el año y el número de semana
    año = Year(FechaIngresada)
    semana = DatePart("ww", FechaIngresada, vbMonday)
    ' Crear la consulta para obtener el último registro de esa semana y año
    sql = "SELECT MAX(Int(Mid([Autonum],6,2))) AS UltimoContador " & _
          "FROM MiTabla " & _
          "WHERE Year([FechaCampo]) = " & año & " AND DatePart('ww', [FechaCampo], vbMonday) = " & semana
    ' Ejecutar la consulta
    Set rs = CurrentDb.OpenRecordset(sql)
    ' Si no hay registros, el contador es 1
    If rs.EOF Then
        contador = 1
    Else
        ' Si ya hay registros, incrementamos el contador
        contador = rs!UltimoContador + 1
    End If
    ' Crear el autonumérico con el formato deseado
    autonum = año & "-" & Format(semana, "00") & "-" & Format(contador, "00")
    ' Retornar el autonumérico
    ObtenerConsecutivo = autonum
    ' Cerrar el recordset
    rs.Close
    Set rs = Nothing
End Function

Ejemplo de llamada de la función.

Private Sub FechaCajaTexto_AfterUpdate()
    ' Obtener el consecutivo de la fecha ingresada
    Dim consecutivo As String
    consecutivo = ObtenerConsecutivo(Me.FechaCajaTexto) ' Cambia FechaCajaTexto por el nombre de tu campo
    ' Asignar el consecutivo al campo autonumérico
    Me.AutonumeroCampo = consecutivo ' Cambia AutonumeroCampo por el nombre de tu campo
End Sub

En este ejemplo:

Cuando el usuario ingresa una fecha en el campo FechaCajaTexto, se ejecuta la función ObtenerConsecutivo.
La función devuelve el autonumérico calculado, que luego se asigna al campo AutonumeroCampo.

Ventajas:

Puede usar la función en cualquier parte del código.
Es más modular y reutilizable.
Retorna el consecutivo directamente, lo que facilita su asignación.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas