Encadenar funciones en Access o Excel: 'Der', 'Int' y 'Val'

La publicación de hoy está estrechamente relacionada con la última que hice sobre estas cuestiones de Access o Excel: 'Encadenar funciones en Access o Excel: aprovechamiento máximo.', en donde expliqué cómo funciona le función 'Izq', además de ver cómo se escriben, no sólo en Access, sino también en Excel.

Lo que voy a desarrollar hoy es la segunda parte de la expresión:

Izq([Cuenta];[PosiciónPunto]-1) & Der(1000000000000+Int(Val(Der([Cuenta];[Longitud]-[PosiciónPunto])));12-([PosiciónPunto]-1))


Es decir, lo que está a la derecha del carácter &; está resaltado en color verde.

En esa expresión se encadenan tres funciones: 'Der', 'Int' y 'Val'.

La función 'Val' devuelve el valor numérico de un campo cuyo contenido es texto. Es lo que técnicamente se denomina como una función de conversión; aunque para mí, en este caso, no convierte nada, sólo devuelve un número.

Lo importante, es que devuelve un número, siempre y cuando, éste se encuentre a la izquierda del texto.

Supongamos, por ejemplo, que la variable [Cuenta], contiene la siguiente expresión: 'A45,36'; entonces el Val([Cuenta]) = 0.

Ahora supongamos por ejemplo que, la variable [Cuenta], contiene la siguiente expresión: '45,3A6'; entonces el Val([Cuenta]) = 45,3

La función 'Int' devuelve la parte entera de un campo cuyo contenido es numérico, es decir, desprecia los decimales.

Siguiendo los ejemplos anteriores:

- cuando el Val([Cuenta]) = 0, el Int(Val([Cuenta])) = 0
- cuando el Val([Cuenta]) = 45,3, el Int(Val([Cuenta])) = 45

Al principio de todo, ya os expliqué que la longitud de las cuentas contables sobre la que vamos a trabajar, refiriéndome al nivel máximo de las cuentas en el PGC, es de 12 dígitos.

Entonces, la cuestión a resolver en estos momentos es: ¿cómo le damos la longitud correcta a lo que estamos averiguando para completar con ceros nuestra cuenta contable?

Podríamos devanarnos los sesos en busca de la solución; pero nada mejor para estos asuntos que usar el truco del almendruco.

Si tomamos un numero que empieza por 1 y le damos tantos ceros como dígitos queremos obtener, y, a este número le sumamos el número que queramos, el resultante siempre será un número con un dígito más del total de dígitos que necesitamos: el 1 del principio.

Como lo que queremos son doce dígitos, usaremos el número 1000000000000; esto es, un 1, seguido de 12 ceros.

Siguiendo con los ejemplos anteriores:

- cuando el Val([Cuenta]) = 0, el Int(Val([Cuenta])) = 0, y, entonces:  1000000000000 + 0 = 1000000000000
- cuando el Val([Cuenta]) = 45,3, el Int(Val([Cuenta])) = 45, y, entonces: 1000000000000 + 45 = 1000000000045

Como veis, siempre nos dará un número de 13 dígitos de longitud y, lo que es más importante para lo que nos incumbe: entre el uno de la izquierda y el final del número por la derecha, siempre tendremos ceros.

Sencillo y práctico, ¿a que sí? Os puedo asegurar que este truco se usa mucho, no sólo para lo que nos concierne ahora mismo. Pero ya lo veremos en otras publicaciones futuras.

Si os fijáis bien, en la expresión del principio de esta entrada, (lo que está escrito en verde), hay dos partes, que os diferencio ahora:

Der(1000000000000+Int(Val(Der([Cuenta];[Longitud]-[PosiciónPunto])));12-([PosiciónPunto]-1))

Pues bien, para ir terminando, os explicaré con un ejemplo cómo tenéis que calcular esto.

Supongamos los siguientes valores de los campos:

[Cuenta] = "410.59" (Esto es lo que ha escrito el empleado u operador en el formulario de Access)

[Longitud] = Longitud([Cuenta]) = 6 ([Cuenta] tiene 6 dígitos)

[PosiciónPunto] = EnCad(1;[Cuenta];".";1) = 4 (Dentro de [Cuenta], el punto (.), está como cuarto dígito)

Si en la expresión anterior, sustituimos ahora lo que está en este color, por los valores que ya sabemos, quedará del siguiente modo:

Der( [Cuenta] ; [Longitud]-[PosiciónPunto] ) = Der( "410.59" ; 6 - 4 ) = Der( "410.59" ; 2 ) = 59

Val( Der( "410.59" ; 2 ) ) = Val( 59 ) = 59

Int( Val( Der( "410.59" ; 2 ) ) ) = Int( Val( 59 ) ) = Int( 59 ) = 59

Y si ahora despejamos los valores de la expresión anterior que está en este color y en este color, el resultado será el siguiente:

Der( 1000000000000 + Int( Val( Der( [Cuenta] ; [Longitud] - [PosiciónPunto] ) ) ) ; 12 - ( [PosiciónPunto] - 1 ) )

Der( 1000000000000 + Int( Val( Der( "410.59" ; 6 - 4 ) ) ) ; 12 - ( 4 - 1 ) )

Der( 1000000000000 + Int( Val( Der( "410.59" ; 2 ) ) ) ; 12 - ( 3 ) )

Der( 1000000000000 + Int( Val( 59 ) ) ; 9 )

Der( 1000000000000 + Int( 59 ) ; 9 )

Der( 1000000000000 + 59 ; 9 )

Der( 1000000000059 ; 9 ) = "000000000059"


Y, 'Voilà', hemos conseguido lo que estamos buscando; nos falta ver cómo se encadenan la 'Izq' y la 'Der' para hacer una única literal de texto, que será nuestra cuenta de 12 dígitos con los ceros pertinentes. Pero esto, ya será en la siguiente publicación, en la que, además, explicaré algunas cuestiones de menor importancia relativa, porque es necesario controlar el porqué os he puesto hoy tantos colores en las expresiones que he despejado: los paréntesis son la clave de la secuencia de los cálculos.

Pero eso ya para la semana que viene. Por hoy es suficiente.

Hasta entonces, disfruten de la semana.

No hay nadie menos afortunado que el hombre a quien la adversidad olvida, pues no tiene oportunidad de ponerse a prueba.
 Séneca





Comentarios