Función 'EnCad' en Access, para la contabilidad.

La semana pasada, vimos muy por encima cómo analizar el resultado de la función 'EsNum' para el uso que nos interesa: la contabilidad que estamos desarrollando en Access y, más concretamente, averiguar si lo que hemos dad de alta en el campo 'cuenta', se puede o no tratar como un número o como un texto.

Esto nos permitirá saber si lo dado de alta, contiene caracteres diferentes a números, (si la respuesta es un -1), o si por el contrario, todo lo que contiene son números, (cuando la respuesta es 0).

Os recuerdo el objetivo de todo esto: saber en qué lugar se encuentran una coma o un punto, y de ese modo, poder rellenar con ceros el campo hasta la longitud total de la cuenta. Por ejemplo, si escribimos, 4.1 para una cuenta con una longitud de 9 caracteres, Access nos devolverá como respuesta: 400000001.

Así pues, continuemos.

La función que veremos hoy es 'EnCad'

Como os dije, por ahora no os preocupéis del cómo hacerlo, sino del porqué lo hacemos. El cómo se hace lo veremos en un video cuando acabemos de publicar la teoría.

La función 'EnCad' requiere de varios argumentos para que funcione sin dar errores. Como en muchas funciones de Access o Excel, hay argumentos que son obligatorios y los hay que son opcionales.

Los argumentos que precisa 'EnCad' son los siguientes:

1º- La posición en la que debe empezar a buscar. (Argumento obligado)
2º- En el contenido de qué campo de qué tabla debe buscar. (Argumento obligado)
3º- El carácter que debe encontrar. (Argumento obligado)
4º- El tipo de comparación que debe realizar. (Argumento opcional)

Para lo que estamos estructurando, lo que nos interesa como argumentos son:

1º- En este caso, siempre nos interesará que empiece a buscar desde la posición número uno.
2º- En este caso, hay que buscar en el campo 'cuenta' de la tabla 'T 001'.
3º- En este caso, interesa, en un primer resultado, el '.' (punto), y, en un segundo resultado, la ',' (coma).
4º- En este caso es un argumento opcional, pero nos conviene poner como queremos que sea la comparación; para el caso que nos ocupa, el argumento debe ser un uno, ya que de este modo la comparación es textual; si pusiésemos un 0, la comparación sería binaria, pero bueno, ahora esto no viene al caso.

Por lo tanto, la expresión completa, quedaría del siguiente modo, para el caso del punto (.), Así:

PosiciónPunto: EnCad(1;[T 001]![Cuenta];".";1)

Nota: 'PosiciónPunto' es el título de la variable que contendrá el resultado que devuelve EnCad con los argumentos especificados en la sintaxis escrita anteriormente.

Y para el caso de la coma (,), quedaría así:

PosiciónComa: EnCad(1;[T 001]![Cuenta];",";1)

Uniendo el resultado de la función 'EnCad' con la función 'EsNum', ya conoceremos las siguientes cuestiones:

- Primero, si todo lo dado de alta por el empleado/usuario es un número o es un texto (números y otros caracteres)
- Segundo la posición en la que se encuentran o bien el punto, (.), o bien la coma, (,).

Bien, ya vamos avanzando y, estoy seguro, vais vislumbrando a dónde queremos llegar.

Esto, en la consulta que estamos desarrollando, quedaría como sigue:


Esto veréis en el video que lo enlazará todo con exactitud, pero por ahora os adelanto que, con que lo escribáis tal cual, funciona a la perfección. En el video os mostraré que, para Access, no es necesario, ni siquiera, escribirlo, con usar su 'generador de expresiones', es suficiente y, hasta me atrevería a decir que es incluso, mucho más simple que escribirlo y con muchas posibilidades de cometer menos errores.

Pero bueno, continúo.

Si pulsamos en 'Ver', podremos visualizar el resultado de la consulta de la selección:


Bien, ya tenemos cuatro datos:

1º.- Lo que ha introducido el empelado/usuario como 'Cuenta contable'
2º.- Si lo del punto 1º se puede tratar como un texto o como un número, (EsNúmero).
3º.- Si lo del punto 1º contiene un punto, y, en caso afirmativo, en qué posición se encuentra dicho punto, ('PosiciónPunto').
4º- Si lo del punto 1º contiene una coma, y, en caso afirmativo, en qué posición se encuentra dicha coma., ('PosiciónComa').

Bien, por hoy ya me he extendido demasiado, la semana que viene veremos cómo funciona la penúltima función que necesitamos para tener todos los datos necesarios para poder rellenar de ceros el campo 'Cuenta contable': hay que averiguar la longitud en caracteres de lo que ha introducido el empleado/usuario.

Pero, antes de terminar, quiero que veáis cómo quedaría todo en el caso de que tuviésemos que saber programación:

SELECT [T 001].Cuenta, IsNumeric([Cuenta]) AS EsNúmero, InStr(1,[T 001]![Cuenta],".",1) AS PosiciónPunto, InStr(1,[T 001]![Cuenta],",",1) AS PosiciónComa, Len([T 001]![Cuenta]) AS Longitud, IIf([EsNúmero]=0,"0",IIf([Longitud]=12,[Cuenta],0)) AS CuentaLongitud, IIf([EsNúmero]=0,"0",IIf([PosiciónPunto]=0,0,IIf([PosiciónPunto]>0 And [PosiciónComa]>0,0,Left([Cuenta],[PosiciónPunto]-1) & Right(1000000000000+Int(Val(Right([Cuenta],[Longitud]-[PosiciónPunto]))),12-([PosiciónPunto]-1))))) AS CuentaPunto, IIf([EsNúmero]=0,"0",IIf([PosiciónComa]=0,0,IIf([PosiciónPunto]>0 And [PosiciónComa]>0,0,Left([Cuenta],[PosiciónComa]-1) & Right(1000000000000+Val(Right([Cuenta],[Longitud]-[PosiciónComa])),12-([PosiciónComa]-1))))) AS CuentaComa, IIf([EsNúmero]+[PosiciónPunto]+[PosiciónComa]=-1 And [CuentaLongitud]=0,[Cuenta] & Right("000000000000",12-[Longitud]),0) AS CuentaEspacio, IIf([CuentaLongitud]<>0,[CuentaLongitud],IIf([CuentaPunto]<>0,[CuentaPunto],IIf([CuentaComa]<>0,[CuentaComa],IIf([CuentaEspacio]<>0,[CuentaEspacio],"Vuelva a escribir la cuenta")))) AS Resultado
FROM [T 001]
ORDER BY [T 001].Cuenta;
 

Señores y señoras, ¡bendito generador de expresiones de Access!, porque de ese galimatías, ustedes ni caso. Access se encarga de traducirlo todo desde la generación de consultas y la generación de expresiones.

La semana que viene continuaremos, mientras tanto, piensen en la siguiente reflexión:

Yo no me encuentro a mí mismo cuando más me busco. Me encuentro por sorpresa cuando menos lo espero.
 Michel de Montaigne  

Y, para que empiecen la semana con energía, aparte del 'Cola Cao', recuerden esta danza del genial Johannes Brahms. 😉


Comentarios