Campos autonuméricos ‘personalizados’

Por medio de expresiones complejas podemos crear valores autonuméricos adaptados a varios escenarios de trabajo.

15-Jun-2017

Campo autonumérico

¿Qué son?

Campo cuyo valor va aumentando secuencialmente con un incremento de 1 o a partir de una secuencia aleatoria de números.

Utilizados normalmente para definir el campo clave (ID del registro) de la tabla.

VentajasInconvenientes
Nos aseguran obtener valores únicos para un campo.Valor ofrecido y no utilizado, valor perdido.
Jamás repiten un valor.No permiten crear combinaciones con otros formatos.
Son controlados por Acces, por lo que nos permiten desentendernos de ellos.Sólo se permite un campo por tabla.

Campo autonumérico personalizado

¿Qué son?

Campo cuyo valor se obtiene del último valor asignado al campo con un incremento definido por el usuario, al que le podemos aplicar un diseño de formato.

VentajasInconvenientes
Nos permiten personalizar la autonumeración de los campos.Los tenemos que generar por medio de expresiones introducidas en cuadros de texto de un formulario.
Si ofrecen un valor y no lo hemos utilizado, lo vuelven a ofrecer.En ocasiones las expresiones necesarias suelen ser largas.
Podemos tener varios campos autonuméricos en la misma tabla.Es tarea nuestra el controlar su contenido.

Campos autonuméricos de secuencia simple

Todos los autonuméricos personalizados se basan en buscar el valor más alto almacenado en un campo, para posteriormente incrementarlo en 1 u otra cantidad, para el nuevo registro.

Tomemos el siguiente ejemplo para ilustrar su funcionamiento:

Tabla Clientes


NumClienteNombreTeléfono
00001Luis666 666 666
00002Carmen666 777 888
00004Andrés666 777 999

El valor 00003 no se muestra porque el registro ha sido eliminado.

  • El valor más alto del campo NumCliente-> 00004
  • El valor para el nuevo registro sería: 00004 + 1 -> 00005
Formulario Ficha Clientes

Pasos para generar el autonumérico

Insertaremos un nuevo cuadro de texto en el formulario y a continuación escribiremos en su propiedad ‘Origen del control’ de la ficha Datos, la expresión que nos muestre el valor que necesitamos.

Origen del control del nuevo cuadro de texto
  • Primero tendremos que obtener el valor máximo del campo (valor más alto).

Para ello utilizamos la función Dmáx() perteneciente al grupo de funciones: Agregadas de dominio.

DMáx(«expresión»; «dominio»; «criterios»)

  • expresión: indicaremos el nombre del campo encerrado entre comillas dobles para el que deseamos obtener el valor máximo. Cuando vayamos a crear autonuméricos basados en formatos de varios bloques lo que haremos será utilizar una expresión.
  • domino: nombre de la tabla o consulta donde se localiza el campo encerrado entre dobles comillas.
  • criterios: condición / filtro para la selección del valor encerrado entre dobles comillas. Cuando vayamos a crear autonuméricos basados en formatos de varios bloques, tendremos que escribir condiciones para su selección.

1.- En el ejemplo de nuestra tabla de clientes la expresión quedaría de la siguiente manera:

Dmáx(“NumCliente”;”Clientes”)

Con esta función obtendríamos 4 que es el valor máximo para el campo NumCliente de la tabla de Clientes.

2.- Lo siguiente sería incrementarlo en 1 para obtener el valor para el nuevo registro:

Dmáx(“NumCliente”;”Clientes”) + 1

Ya hemos conseguido generar una expresión que nos ofrece el nuevo valor autonumérico para el campo NumCliente de la tabla de Clientes.

Expresión utilizando DMáx para obtener el valor más alto
Valor obtenido con la expresión Dmáx

Pero como no es oro todo lo que reluce, si la tabla todavía no contiene registros, la función Dmáx() devolverá un valor Nulo (Vacío), con el que no se pueden realizar cálculos y en lugar de obtener el valor 1 obtendríamos un valor Nulo.

3.- Necesitamos convertir ese posible valor Nulo (vacío) en un valor numérico con el que poder calcular:

Para ello utilizamos la función Nz() perteneciente al grupo de funciones : Conversión.

Nz(«expresión»; «valorsiesnulo»)

  • expresión: cualquier cálculo, campo o expresión que deseemos evaluar para comprobar si su valor/contenido es Nulo.  En nuestro caso es donde tendremos que escribir toda la función Dmáx() que habíamos escrito.
  • valorsiesnulo: valor que deseamos obtener si expresión resulta ser un valor Nulo. En nuestro caso indicaremos el valor 0.

Con esta función conseguimos que, si el valor obtenido con la función Dmáx es un valor Nulo, sea sustituido por un 0 con el que si podemos operar y obtener el valor 1 para el primer registro de la tabla.

La expresión final quedaría de la siguiente manera:

Nz( Dmáx(“NumCliente”;”Clientes”);  0 ) + 1

Expresión utilizando la función Nz para controlar los valores nulos

4.- A continuación, renombraremos el cuadro de texto desde su propiedad ‘Nombre’ de la ficha Otros. No es que sea un paso necesario, pero es recomendable asignarle un nombre con el que posteriormente podamos identificarlo mejor. En nuestro caso vamos a asignarle el nombre UltimoCliente.

Estableces nombre del control

5.- Ocultamos el cuadro de texto, modificando la propiedad ‘Visible’ de la ficha Formato. Es un control que lo necesitamos para realizar el cálculo, pero que no se le tiene que mostrar al usuario.

Ocultar el control que calcula las expresiones

6.- Eliminamos la etiqueta asociada al cuadro de texto.

7.- El último paso consiste en enlazar de alguna manera el cuadro de texto donde se está mostrando el contenido del campo NumCliente, con el cuadro de texto que acabamos de crear donde se muestra el valor para el nuevo registro.

8.- Seleccionamos el cuadro de texto donde se muestra el contenido del campo NumCliente y en la propiedad ‘Valor predeterminado’ de la ficha Datos, introducimos el nombre que le hemos asignado al cuadro de texto que realizar los cálculos encerrándolo entre corchetes.

[UltimoCliente]

Establecer el valor predeterminado del control NumCliente

Si ahora guardamos el formulario y lo abrimos en vista formulario, veremos cómo al insertar un nuevo registro, Access le ofrece el siguiente valor libre para números de cliente.

Si observamos el valor obtenido, podremos comprobar que, aunque es el número que esperamos, el formato con el que lo presenta no es el correcto comparado con el resto de valores del campo NumCliente.

Valor obtenido al insertar un nuevo registro con los cambios realizados

Valor obtenido -> 5, Valor con formato esperado -> 00005

9.- Para solucionarlo añadiremos una nueva función a la expresión que calcula el nuevo valor que añada ceros a la izquierda hasta completar la totalidad del tamaño del campo.

La función Format() nos permite formatear una expresión a un formato personalizado.

Format(expresión;formato)

  • expresión: es donde colocaremos toda la expresión que nos calcula el nuevo valor.
  • formato: escribiremos encerrado entre dobles comillas la expresión “00000”, con la que conseguiremos rellenar a ceros la parte del código no utilizada.

La expresión final quedaría de la siguiente manera:

Format( Nz( Dmáx(“NumCliente”;”Clientes”) ;  0 ) + 1 ; “00000”)

Expresión final utilizando la función Format

Con esta nueva expresión obtendremos el número esperado con el formato esperado.

Formulario FichaClientes con el resultado final de las expresiones

Autonumérico de dos bloques: número-fecha

En este tipo de autonuméricos personalizados, tienen la peculiaridad de que el contador está condicionado al valor de un bloque de los dos que lo componen. El valor del contador será distinto según el valor de otro de los campos de la tabla como puede suceder en la secuencia de números de factura en donde el contador se tiene que reiniciar para cada nuevo año.

Observar como al cambiar de año el contador se ha reiniciado para su secuencia de facturas.

  • El valor más alto del campo NumFactura para el año del campo Fecha-> 00002
  • El valor para el nuevo registro sería: 00002 + 1 y los dos últimos dígitos del año-> 00003-17

Si observamos los valores del campo NumFactura, veremos que están formados por dos bloques:

[Contador]-[Año]

El bloque Contador es el que tendremos que incrementar para el valor del bloque Año.

Formulario Ficha Facturas

Si acabamos de emitir la última factura del año 2016 (00158-16) y la siguiente factura la creamos ya en el año 2017 el contador tiene que ser capaz de detectarlo y reiniciarse para este nuevo año (00001-17).

La búsqueda del máximo valor la tendremos que condicionar comparando el año que se muestra en el campo Fecha de la factura con el año de la Fecha Actual del sistema.

Por un lado, tendremos que obtener el máximo valor del campo NumFactura, extraerle los primeros 5 dígitos e incrementarlo y luego añadirle los dos últimos dígitos del año que se muestre en el campo Fecha de la factura.

Pasos para crear el nuevo valor

Pasos para generar el autonumérico

Insertaremos un nuevo cuadro de texto y a continuación escribiremos en su propiedad ‘Origen del control’ de la ficha Datos, la expresión que nos muestre el valor que necesitamos.

Origen del control del nuevo cuadro de texto
  • Primero tendremos que obtener el valor máximo del campo NumFactura, condicionando el resultado a que el año del campo Fecha sea igual al año actual.

Para ello utilizamos la función Dmáx() que ya hemos comentado donde ahora si tendremos que utilizar sus tres argumentos.
DMáx(«expresión»; «dominio»; «criterios»)

    • expresión: indicaremos el nombre del campo encerrado entre comillas dobles para el que deseamos obtener el valor máximo.
    • domino: nombre de la tabla o consulta donde se localiza el campo encerrado entre dobles comillas.
    • criterios: condición / filtro para la selección del valor encerrado entre dobles comillas.

1.- En el ejemplo de nuestra tabla de Facturas la expresión quedaría de la siguiente manera:

Dmáx(“[NumFactura]”; ”Facturas”; ”Year([Fecha])=Year(Date())”)

Con esta función obtendríamos 00002-17 que es el valor máximo para el campo NumFactura de la tabla de Facturas para el año actual 2017.

Observar como la expresión de criterios (condición), por desgracia hay que escribirla utilizando los nombres de las funciones en inglés:

Year([Fecha]) -> Equivale a nuestra expresión Año([Fecha]). Extraer el año del campo Fecha.

Year(Date()) -> Equivale a nuestra expresión Año(Fecha()). Extraer el año de la fecha del sistema.

Expresión DMáx para obtener el valor máximo para el año en curso
Valor obtenido con la expresión Dmáx

 

2.- Lo siguiente sería extraer los 5 primeros dígitos del valor obtenido:

Para conseguirlo utilizaremos funciones de la categoría ‘Textos’ que nos permiten extraer un nº determinado de caracteres por la izquierda o por la derecha de una cadena.
Izq(«cadena»; «longitud»)

  • Cadena: texto del que deseamos extraer los caracteres por la izquierda.
  • Longitud: cantidad de caracteres que deseamos extraer de la cadena.

Der(«cadena»; «longitud»)

  • Cadena: texto del que deseamos extraer los caracteres por la derecha.
  • Longitud: cantidad de caracteres que deseamos extraer de la cadena.

La expresión para extraer el contador quedaría de la siguiente manera:
Izq(Dmáx(“[NumFactura]”; ”Facturas”; ”Year([Fecha])=Year(Date())”); 5)

Expresión añadiéndole la función Izq para extraer el valor del contador
Valor obtenido con la nueva expresión

3.- Necesitamos convertir ese posible valor Nulo (vacío) en un valor numérico con el que poder calcular:

Para ello utilizamos la función Nz() perteneciente al grupo de funciones : Conversión.
Nz(«expresión»; «valorsiesnulo»)

  • expresión: será toda la expresión que tenemos escrita hasta ahora.
  • valorsiesnulo: valor que deseamos obtener si expresión resulta ser un valor Nulo. En nuestro caso indicaremos el valor 0.

Con esta función conseguimos que, si el valor obtenido con la función Izq es un valor Nulo porque la función Dmax así se lo haya devuelto, sea sustituido por un 0 con el que si podemos realizar el cálculo.
Nz(Izq(Dmáx(“[NumFactura]”; ”Facturas”; ”Year([Fecha])=Year(Date())”); 5);  0 )

Expresión añadiéndole la función Nz para el control de valores nulos

4.- Sólo nos queda incrementarlo en 1.

Nz(Izq(Dmáx(“[NumFactura]”; ”Facturas”; ”Year([Fecha])=Year(Date())”); 5);  0 ) +1

Si comparamos el valor obtenido, podremos comprobar que, aunque es el número que esperamos, el formato con el que lo presenta no es el correcto comparado con el resto de valores del campo NumFactura.
Valor obtenido -> 3, Valor con formato esperado -> 00003

Valor obtenido con la nueva expresión

Para solucionarlo añadiremos una nueva función a la expresión que calcula el nuevo valor, que añada ceros a la izquierda hasta completar la totalidad del tamaño del campo.
La función Format() nos permite formatear una expresión a un formato personalizado.
Format(expresión;formato)

  • expresión: es donde colocaremos toda la expresión que nos calcula el nuevo valor.
  • formato: escribiremos encerrado entre dobles comillas la expresión “00000”, con la que conseguiremos rellenar a ceros la parte del código no utilizada.

5.- La expresión final con el relleno de ceros a la izquierda quedaría de la siguiente manera:

Expresión final
Expresión final
Valor obtenido con la última expresión

6.- A continuación, renombraremos el cuadro de texto desde su propiedad ‘Nombre’ de la ficha Otros. No es que sea un paso necesario, pero es recomendable asignarle un nombre con el que posteriormente podamos identificarlo mejor. En nuestro caso vamos a asignarle el nombre UltimaFactura.

7.- Ocultamos el cuadro de texto, modificando la propiedad ‘Visible’ de la ficha Formato. Es un control que lo necesitamos para realizar el cálculo, pero que no se le tiene que mostrar al usuario.

8.- Eliminamos la etiqueta asociada al cuadro de texto.

9.- El último paso consiste en enlazar de alguna manera el cuadro de texto donde se está mostrando el contenido del campo NumFactura con el cuadro de texto que acabamos de crear donde se muestra el valor para el nuevo registro, añadiéndole los dos últimos dígitos del año en curso.

10. -Seleccionamos el cuadro de texto donde se muestra el contenido del campo NumFactura y en la propiedad ‘Valor predeterminado’ de la ficha Datos, introducimos la expresión que toma el valor del cuadro de texto que realiza los cálculos y le añade un guion seguido del cálculo encargado de extraer los 2 último dígitos del año de la fecha actual.

[UltimaFactura] & “-” & Der(Año(Fecha());2)

Expresión para el Valor Predeterminado del Control NumFactura
Propiedad Valor Predeterminado del control NumFactura

Si ahora guardamos el formulario y lo abrimos en vista formulario, veremos cómo al insertar un nuevo registro, Access le ofrece el siguiente valor libre para números de factura en función del año de la factura.

Resultado final con el nuevo valor predeterminado