17 marzo 2006

Evaluación Visual Expert

Este producto ya lo vi hace tiempo y recientemente he tenido la oportunidad de asistir a una presentación del mismo en mi empresa, ya que se plantean la posibilidad de adquirirlo. Los AP tenemos que dar el visto bueno, y después, como en cualquier gran multinacional, empiezan los trámites burocráticos, hasta conseguir la compra. En principio, los tres AP pensamos que pueden ayudarnos en nuestro trabajo, ya que da mucha facilidad a la hora de localizar objetos dentro de la aplicación, pero ante todo la mayor ventaja es la evaluación de impacto sobre el cambio de cualquier elemento, ya que podemos visualizar de un modo cómodo, el resto de elementos que hacen uso del que nosotros queremos cambiar. Saber usarlo no parece complicado, por lo menos en cuanto a las cosas sencillas y elementales, los detalles complejos supongo que se podrán resolver mediante la ayuda, aunque esta pueda ser algo escasa, o más que escasa, que carezca de suficientes palabras claves para localizar lo que nos interesa, esto lo comento, por que en la misma presentación tuvimos una duda de uso e intente buscar en la ayuda y fue imposible localizar lo que queríamos resolver. También facilita la generación de documentación técnica e informes como por ejemplo variables sin utilizar, pudiendo especificar el alcance de las mismas, y otra serie de filtros, en general este apartado esta bien, lastima que no exista aún aplicaciones que generen la documentación funcional y el manual de usuario. El producto es multilenguaje (francés, ingles y español) y puedes cambiar el idioma en caliente, pero hay cosas que no se traducen, por supuesto la ayuda siempre estará en correcto ingles.En definitiva son muchos más pros que contras y nos puede ayudar bastante, claro esta que hay que conocer sus apellidos, que en este caso, hoy por hoy ronda los 7.000 € e incluye tres licencias, y cuantas más licencias necesites, como es de esperar, más económica resulta cada una de ellas. Si queréis más información la podéis encontrar en la Web de Visual Expert. Este es el aspecto general de la aplicación:




Aun tendremos que realizar una revisión pendiente, por lo que iré actualizando directamente el post, para poner cualquier información que se interesante destacar.

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:

06 marzo 2006

Comprobación del dígito de control del IBAN

En este script, partimos de la premisa de disponer del IBAN formateado adecuadamente, así iremos al grano, y dejo que cada cual utilice las comprobaciones que considere oportunas para ver si el IBAN tiene el formato adecuado. Para concretar más el formato utilizado para el ejemplo será AANNCCCCCCCCCCCCCCCCCCCC, donde:

  • AA: Código del país de la entidad (Letras en mayúsculas).
  • NN: Dígito de control del IBAN (Números).
  • CCCCCCCCCCCCCCCCCCCC: Número de cuenta.

En primer lugar convertimos las letras a números, contando que la A vale 10, la B vale 11 y así sucesivamente, de tal modo que BE62510007547061 quedaría 111462510007547061.


ls_letras = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
ls_aux = string(pos(ls_letras, left(as_IBAN, 1))+9)
ls_aux += string(pos(ls_letras, mid(as_IBAN, 2, 1))+9)


En segundo paso consiste en mover los primeros seis caracteres a la derecha de tal modo que 111462510007547061 quedará 510007547061111462:


as_IBAN = mid(as_IBAN, 5) + ls_aux + mid(as_IBAN, 3, 2)


Y para finalizar hay que comprobar si el resto de la división del número obtenido entre 97 es 1. Si el resultado fuese distinto, el dígito de control sería incorrecto.


mod(double(as_IBAN), 97)


En este último punto hay un temita que puede tenerse en cuenta, y es que por razones de precisión se recomienda realizar esta operación con números enteros y no fraccionados o decimales, y como pordrá comprobarse el número con el que hay que operar es mayor que el que se puede almacenar en un unsignedlong (mayor entero en PB), como un entero de 32 bits o 64 bits representa un máximo de 9 ó 18 dígitos, se puede realizar la operación por partes tal y como describo a continuación:

  1. Cálculo del módulo 97 de los primeros 9 dígitos del número.

    Ej: mod(510007547, 97) = 74
  2. Construcción del siguiente entero de 9 dígitos, colocando en primer lugar el resultado del paso anterior. seguido por los siguientes 7/8 dígitos del número y calcular el módulo 97.

    Ej: mod(740611114, 97) = 12.
  3. Repetir el paso dos hasta que todos los dígitos del número hayan sido procesados. Ej: mod(1262, 97) = 1

Script para eliminar caracteres no deseados

El siguiente script permite eliminar caracteres no deseados de un string, en este caso en concreto, elimina todos los que no sean una letra mayúscula o un número, pero si se quiere modificar los caracteres que han de eliminarse, simplemente se debe cambiar el argumento proporcionado a la función match y si fuese necesario jugar con la negación de las sentencias If. DEFINICIÓN:
public string gf_limpiar(string as_texto)
CÓDIGO:

02 marzo 2006

Standards ISO

Para la implementación de un algoritmo de validación del IBAN, que publicaré más adelante, he necesitado localizar la norma ISO que identifica que letras están asociadas con cada país. He encontrado por un lado la "English country names and code elements - ISO 3166 Code lists" publicado por el propio organismo que la implemento, y por otro lado, como siempre días después intentando localizar la página mencionada, he llegado hasta la web ADAGO, concretamente a la lista de standards ISO. Además de aparecer la lista de códigos de países hay un montón de standards interesantes.