08 marzo 2006

Función para obtener el módulo

Tal vez aquí se podría abrir un tema de discusión, en cuanto a la capacidad de las funciones de sistema de PB para tratar números de precisión doble o real. Muchas de estas funciones, como por ejemplo truncate, round o string (para conversiones de números), solo son capaces de trabajar adecuadamente con variables decimal, aunque la ayuda no lo especifique. Por otro lado, y centrandome en el tema que me ocupa en este post, la función mod, que si parece ser capaz de trabajar con variables de precisión doble, no figurá en el browser/funtions/systemfuntions que este sobrescrita, y por código o en el watch del debug, se puede comprobar que debe existir una definición para doble y otra para long. Además, por razones de precisión cuando debe obtenerse los módulos de números muy grandes, se recomienda utilizar números enteros y no fraccionados o decimales, y el algoritmo que se necesita para dicha operación requiere cortar el número como si se tratase de una cadena, y en base de datos, el número con el que tenemos que trabajar en nuestro caso esta almacenado como cadena, ya que a excepción de la comprobación del dígito de control, no se realiza ninguna otra operación, por esto he creado una función que admite dos parámetros, por un lado un string con el número que del que hay que obtener el módulo y otro argumento con el divisor, en este caso un integer. La función queda así:

DEFINICIÓN:

integer uf_modlong(string as_valor, integer ai_divisor)
CÓDIGO:

2 comentarios:

rolo dijo...

hola, tengo un par de consultas:
¿cómo inicializas ls_mod y li_hasta?
no conozco PB, por eso te hago la consulta. La idea es replicar tu código en sql.
gracias

Michel Pérez dijo...

ls_mod es una variables string y estas por defecto se inicializan en cadena vac�a ("") y li_hasta es una variable num�rica que por defecto se inicializa en cero (0).

Saludos