Este es el comienzo para mi blog

Mi día a día en el desarrolo de Software (JEE, Glassfish, JBoss EAP, Primefaces, Ajax, Android)

jueves, 26 de noviembre de 2015

Convertir/Pasar números a letras en Java

Seguramente en alguna oportunidad han tenido la necesidad de convertir/pasar un número a su correspondiente en letras en java. La tarea que al parecer esta complicada termina siendo bastante sencilla.

La necesidad de convertir un número a letras aparece principalmente cuando se desarrollan Sistemas de Información Financieros, debido a que en dichos sistemas es mejor presentar al usuario final el valor de una cantidad en su correspondiente en letras.

Puntos a tomar en concideración

1.- En este proceso (Convertir/Pasar números a letras en Java) se toma en cuenta el redondeo de las cifras decimales (2 cifras decimales), es decir si tenemos el número 22.258 al aplicar el redondeo de dos cifras tendremos el valor de 22.26.

2.- El número que se puede ingresar para el proceso de transformación a su correspondiente en letras debe tener como máximo nueve cifras enteras y sin que este número sea mayor que 999999998.

3.- El número que se pasa como parámetro al método debe estar expresado como una cadena de texto o su vez debe ser un objeto BigDecimal. Eje. convertNumberToLetter("999999998.789") ó convertNumberToLetter(new BigDecimal("999999998.789")).

3.- La palabra que describe la moneda es por omisión "Dólares", pero esta se la puede modificar a su necesidad.

Implementación

Luego de haber puesto en consideración los puntos tratados anteriormente dejo a su disposición el código que realiza el proceso de cambio/transformación/conversión de un número a su correspondiente en letras/texto.



Espero sea de ayuda!
No olviden dejar sus comentarios.

¿Cómo conectarse con dos bases de datos distintas con JPA?

Para quienes estamos día a día en el desarrollo de aplicaciones empresariales Java, nos es recurrente el encontrarnos con el problema de como accedera a la información de distintas Bases de Datos con el Standar JPA (independientemente de su implementación), ya que como ocurre en la vida real, hay diferentes repositorios de información de los cuales debemos obtener sus datos para poder continuar con el desarrollo del sistema de información encomendado a nosostros.

Acabe de mencionar que esto es independiente de la implementación de JPA (Hibernate, EclipseLink, TopLink...) ya que para estas herramientas es transparente el hacer uso del Standar JEE6; JPA proporciona los lineamientos de como se deben realizar los procesos, y los fabricantes lo realizan.

El conectarse a dos Bases de Datos con JPA no es nada dificil, pero hay que tener muy claro los conceptos que ha detras de esto; para lo cual mencionaré algunos aspectos muy importantes a tomar en cuenta.


jueves, 22 de octubre de 2015

¿Cómo otorgar privilegios de ejecución sobre un procedimiento almacenado en Oracle?

Problema

En el día a día de nuestro trabajo seguramente nos hemos encontrado con el problema de que un usuario de la Base de Datos (Oracle) no puede ejecutar un procedimiento almacenado creado por otro usuario (Oracle).

Solución

Para otorgar privilegios de ejecución sobre un procedimiento almacenado a un usuario no propietario del objeto en la Base de Datos (Oracle), debemos tomar en consideración estos puntos importantes.

1.- En este proceso intervienen dos tipos de usuario de la Base de Datos (Oracle), el usuario propietario del objeto (procedimiento almacenado), y el usuario ejecutor del objeto (procedimiento almacenado.)

2.- El usuario propietario del procedimiento almacenado debe otorgar, al usuario ejecutor, el privilegio de ejecución sobre este objeto.

3.- El usuario ejecutor, una vez otorgado el privilegio de ejecución sobre el objeto (procedimiento almacenado Oracle), debe crear un sinónimo (normalmente es el mismo nombre del procedimiento almacenado del usuario propietario) para poderlo ejecutar.
  • Si al sinónimo lo llaman de manera distinta al que le dio el usuario propietario al procedimiento almacenado, al momento de ejecutar el mismo, deben hacerlo con el nombre correspondiente al sinónimo creado (esto solo para el usuario ejecutor).

Implementación

Luego de haber analizado los puntos críticos que se deben tomar en cuenta para la otorgación de privilegios de ejecución sobre un procedimiento almacenado en la Base de Datos (Oracle), este es el script para su implementación:

Desde el usuario propietario:
GRANT execute ON NOMBRE_DEL_PROCEDIMIENTO_ALMACENADO TO USER_EJECUTOR


Desde el usuario ejecutor (o usuario DBA):
CREATE SYNONYM USER_EJECUTOR.NOMBRE_DEL_SINONIMO FOR USER_PROPIETARIO.NOMBRE_DEL_PROCEDIMIENTO_ALMACENADO

Espero sea de ayuda!
No olviden dejar sus comentarios.

jueves, 14 de mayo de 2015

Ocultar/mostrar un componente JSF 2.0 en Primefaces 5.0 usando Ajax

Problema

Muchos de nosotros alguna vez nos hemos encontrado con el problema de mostrar u ocultar un componente JSF (con la librería Primefaces) dependiendo de una condición (eje: si edad es >= 18); y que para obtener dicha condición sea necesario la acción de otro componente JSF (eje: la selección de una fecha en un calendario para el cálculo de la edad); lo que en principio parece ser una tarea fácil, termina convirtiéndose en un trabajo verdaderamente difícil de realizar, y lo que se pensaba implementar en "pocos minutos" termina implementandose en horas, incluso días (para desarrolladores que están empezando).

Solución

Para mostrar u ocultar un componente JSF lo primero que hay que entender y tener en cuenta es el ciclo de vida de una página JSF, ya que es éste el que gestiona de manera absoluta la forma en que se mostrará la página luego de que el usuario haga una petición (Request) al servidor de aplicaciones. Aquí pueden encontrar un enlace en donde se habla del tema.
Otra situación a tomar en cuenta y que por lo general se nos pasa por alto, es la construcción del árbol de componentes JSF (mostrados en elementos HTML) luego de que el usuario haga una petición,  un claro ejemplo de esto es si un componente JSF en primera instancia no se muestra (propiedad rendered = false) y al hacer una petición al servidor indicamos que el componente JSF se muestre, no podremos setear la propiedad rendered = true, puesto que en el árbol de componentes JSF este componente nunca estuvo presente.

Para solucionar el problema anteriormente planteado, lo que debemos hacer es lo siguiente:
  • Al componente JSF que deseamos que tenga el comportamiento de mostrarse u ocultarse según el valor que tome  alguna propiedad del backin bean lo debemos incluir en un contenedor (componente <h:panelGroup> ... </h:panelGroup>).
  • Al contenedor anteriormente mencionado debemos incluirle la propiedad "id", puesto que esta nos servirá para actualizarlo cuando se haga la petición.
  • Al hacer la petición al servidor, en la que se determinará si el componente JSF se muestra u oculta, se deberá solicitar que se actualice (propiedad update) el contenedor del componente JSF, mas no el propio componente, ya que si actualizamos el contenedor, por ende actualizamos todo lo que hay dentro de él.

Implementación

Luego de abordar el problema y ver su solución, a continuación dejo las líneas de código de la implementación de dicho problema.

Aquí está la implementación de la página JSF diseñada con la librería PrimeFaces V. 5.0, la misma que tiene cuatro componentes JSF, dos p:outputLabel (Fecha de nacimiento y Observación), un p:calendar y un p:inputTextarea, tanto el componente JSF de Observacion y la caja de texto no se muestran hasta cuando el usuario realiza una petición al servidor solicitando el cálculo de la edad,  y la esta es mayor o igual a 18.


Esta es la implementación del backing bean que controla la página JSF.


A continuación pongo las imágenes de como se ve la aplicación desplegada en el servidor de aplicaciones.

La propiedad edad del backing bean al cargar la página por primera vez es cero, por ende no se mostrarán los componentes JSF de Observación y la caja de texto.


Cuando el usuario elige la fecha de nacimiento, el sistema calcula mediante el evento SelectEvent del componente p:calendar la edad de la persona, y si esta es mayor o igual a 18, los componente JSF Observación y la caja de texto se muestran, caso contrario no lo hacen.

Espero haya sido de su utilidad.

lunes, 4 de mayo de 2015

¿Cómo calcular los meses entre dos fechas en Java?

Problema

Muchos de nosotros alguna vez nos hemos encontrado con el problema de calcular la diferencia en meses entre dos fechas en el lenguaje Java, la tarea al principio parece fácil, pero al analizar detalladamente nos encontramos con una serie de validaciones e interpretaciones que hacen difícil el programar el algoritmo. 

Como es conocido para muchos desarrolladores Java, el trabajar con fechas (Date) es algo muy tedioso, y tareas que al principio parecen fáciles de realizar, terminan convirtiéndose en un suplicio...

Solución

Para calcular la diferencia en meses entre dos fechas en Java lo primero que debemos hacer es asegurarnos de dar formato ("dd/MM/yyyy") a las fechas con las que trabajaremos, esto debido a que no es lo mismo tener "04/05/2015" a "04/05/2015 11:13:25"; evidentemente en Java la primera fecha es "menor" que la segunda, pese a ser el mismo día, mes y año.

Otro aspecto muy importante a considerar y aunque pareciera evidente, es que la fecha de finalización debe ser mayor que la fecha de inicio para calcular la diferencia en meses entre las dos fechas.

Lo siguiente a tomar en cuenta es que un mes cumplido es cuando el día de la fecha de finalización es mayor o igual al día de la fecha inicio de comparación. Por ejemplo:
Fecha inicio: 04/05/2015
Fecha finalización: 04/07/2015
Como nos podemos dar cuenta del 04 de mayo del 2015 al 04 de julio del 2015 han pasado dos meses; pero si la Fecha de finalización para el cálculo de meses entre las dos fechas es 03/07/2015, los meses cumplidos únicamente sería uno; así también, si la fecha de finalización sería 03/08/2015, los meses entre las dos fechas seguirían siendo dos.

Implementación

Luego de haber analizado los problemas para calcular la diferencia en meses entre dos fechas en Java, aquí dejo el código fuente de la implementación del algoritmo en lenguaje Java.



Espero sea de utilidad y solucione su problema.