Sunday 26 February 2012

Curso ADF 11g–Parte 5

Tema : Lógica en el Módulo de Aplicaciones

Parte importante del cualquier desarrollo, es la aplicación de reglas de negocio. Como comentamos en capítulos anteriores la implementación de reglas se realiza en el componente denominado Application Module 

En este capitulo conoceremos más sobre este componente y lo aplicaremos en nuestro desarrollo. 

Requerimiento:

  • Oracle Jdeveloper 11g. 11.1.1.3
  • Oracle Database Express 11g
  • Haber culminado la parte 4 del tutorial.

Capítulos Anteriores

Parte 1: Creación del Modelo de Datos.

Parte 2: Creación de Componentes de Negocio

Parte 3: Personalización de Entidades

Parte 4: Personalización de View Objects.

Opcional :

Si no culmino los capítulos anteriores y quiere empezar desde este capítulo, puede descargar el siguiente código para continuar el curso.

Código previo.

Introducción.

El módulo de aplicaciones (Application Module), es el lugar donde se aplica las lógica del negocio que tendrá la aplicación. El modulo de aplicaciones implementa el patrón Facade, eso implica que centralizará la reglas de negocio y será el punto de acceso de las interfaces web con el modelo de la aplicación.

Si usted es un desarrollador SQL, un equivalente a este componente sería los store procedures que usted desarrolla para implementar las reglas de negocio.

Bien, para conocer como implementar la lógica de negocio, desarrollemos las siguientes 2 reglas.

1. Se necesita implementar una funcionalidad de “Incremento” de precios de todo el catalogo de precios en base a un porcentaje.

Ejemplo: Se ingresa como parámetro 10 y todos los precios del catalogo se incrementa en 10 %

2.Se necesita clasificar a los clientes en función al total de los montos de sus movimientos. Para eso los clientes manejarán un status que se asignará de la siguiente manera

 image

La funcionalidad que se requiere es realizar el cálculo de todos los clientes para determinar su Status en función a la sumatoria de sus movimientos.

Bien, veamos como aplicamos estas reglas.

Funcionalidad Incremento de Precios.

1. Lo primero que debemos hacer es identificar la clase donde se aplicará los métodos de reglas de negocio. El componente que consolida las reglas, se llama modulo de aplicación y en nuestro desarrollo se llama VentasAM . Haga doble clic sobre el, elija la categoría Java y haga clic sobre el Botón “Edit java options”

image

2. Al igual que en el resto de casos, en esta ventana podemos asociar al componente a una clase Java. En este caso seleccionamos la casilla “Generate Application Module Class: VentasAMImpl” Pulse Ok.

image

3. Confirme que debajo del componente se hayan creado la clase java VentasAMImpl.java. Haga doble clic sobre la clase.

image

4. Analicemos por un momento el código asociado a esta clase. Notará que existen algunos métodos creados.

image

5. Por ejemplo en la imagen se muestra el método getClienteVO1(). La creación de este método se debe a que nosotros en anteriores capítulos publicamos los View Objects para que podamos probarlo. Para comprobarlo haga doble clic sobre VentasAM y seleccione la categoría DataModel 

image

Note que aparecen publicadas las vistas ClienteVO1, DetalleVO1, MovimientoVO1 y ProductoVO1. Eso implica que por cada vista que publicamos automáticamente se crea su correspondiente método get<Nombre de la Vista> en la clase java. De esta manera podemos acceder programáticamente a los datos de la vista para procesarlo.

6. Regresemos a la clase. El primer método que crearemos será imprimirProductos(), que nos servirá simplemente para consultar los productos y sus precios. El código sería similar a lo siguiente.

public void imprimirProductos(){
    System.out.println("Reporte de Productos");
    Row fila = this.getProductoVO1().first();
    while (fila !=null)
    {
       
          System.out.println(
            fila.getAttribute("Precio")
            + "\t"
            + fila.getAttribute("Descripcion")
          );
        fila =  this.getProductoVO1().next();
    }
}

Analicemos el código.

El método getProductoVO1() obtiene una referencia a los datos de la vista de productos. Es decir un puntero a los 7 registros que tiene la vista. Sin embargo, nos gustaría tener referencia a alguna de las instancias  para su procesamiento, entonces usamos  los métodos first(), next(), previous() y last() que nos recuperan un registro de la vista, de manera similar a como procesamos un cursor.

Entonces la primera línea ,

Row fila = this.getProductoVO1().first();

Nos permite obtener una referencia a la primera instancia de la vista. Ojo no olvide importar la clase oracle.jbo.Row cuando declare la instancia.

Lo que sigue a continuación es recorrer a la vista, para eso como si trabajara con un cursor recorra la vista usando las siguientes instrucciones.

  while (fila !=null)
    { …..

fila =  this.getProductoVO1().next();

     }

Es obvio que la fila toma el valor del registro siguiente haciendo uso del método next()

y Finalmente el cuerpo del bucle colocamos la sentencia para imprimir la descripcion y precio del producto.

System.out.println(
            fila.getAttribute("Precio")
            + "\t"
            + fila.getAttribute("Descripcion")
          );

Tenga en cuenta que los nombres de los atributos Precio y Descripcion corresponde a los nombres de los atributos declarados en la vista.Tenga en cuenta mayúsculas y minúsculas.

image

7. Bien, así como publicamos las vista en el módulo de aplicaciones, también será  necesario publicar el método que acabamos de crear. Entonces haga doble clic el módulo de aplicaciones, categoría Java y pulse la opción “Edit application module client interface”

image

8. En la ventana mostrada, seleccione el método y desplazelo a la izquierda, como se muestra en la figura. Pulse OK.

image

9. Probemos el método, ejecute el módulo de aplicaciones.

image

10. Ahora haga doble clic sobre la raíz del módulo de aplicaciones, aparecerá los métodos disponibles.  Note que esta seleccionado el único métodos “imprimirProductos”. Pulse “Ejecutar”.

image

 

12. En la consola se mostrará el listado de productos y sus precios.

image

13. Bien ahora agregaremos el método incrementarPrecio el cual tendrá el siguiente contenido.

public void incrementarPrecio(int porcentaje){
    System.out.println("Inicio del Proceso");
    Row fila = this.getProductoVO1().first();
    while (fila !=null)
    {
        float precio = ((Number)fila.getAttribute("Precio")).floatValue();
        float nuevoPrecio = precio * (100+ porcentaje)/100 ;
        fila.setAttribute("Precio", new Number(nuevoPrecio));
       
        fila =  this.getProductoVO1().next();
    }
   
    this.getDBTransaction().commit();
   
  System.out.println("Fin del Proceso");
}

El código lo que hace es recorrer nuevamente todos registros de la vista, sin embargo el cuerpo del bucle tiene unas líneas distintas.

        float precio = ((Number)fila.getAttribute("Precio")).floatValue();
        float nuevoPrecio = precio * (100+ porcentaje)/100 ;
        fila.setAttribute("Precio", new Number(nuevoPrecio));

Note que la variable precio recupera el valor del precio del producto. Acá lo único distinto es que casteamos el valor recuperado en un tipo Number (tipo de dato correspondiente a ese atributo que se declaro cuando se definió la entidad Producto). Una vez que recuperamos el tipo Number usamos el método floatNumber para obtener el primitivo float que necesita la variable,

Es claro lo que hace la variable nuevoPrecio y finalmente usamos el método setAttribute para devolver el valor calculado al atributo Precio. Ojo debemos devolver un tipo Number por eso instanciamos esa clase con el nuevoPrecio obtenido.

Importante, para evitar errores de compilación en esta parte, asegúrese de importar la clase Number.

import oracle.jbo.domain.Number;

 

Adicionalmente, debe observar que estamos usando la siguiente sentencia. Para aplicar los cambios hacia la base de datos.


    this.getDBTransaction().commit();

Acá es importante destacar, que este framework maneja por default el concepto de transacción, es decir que todos los cambios se mantienen en memoria y sólo cuando hacemos uso de la última sentencia persistimos los cambios contra la BD.

14 Repita los pasos 7 y 8 para publicar el método.

15. Repitamos los pasos 9 y 10 para probar el método. Sólo que ahora será necesario seleccionar ese método y definir el porcentaje de incremento, en nuestro caso 10. Pulse OK.

image

 

16. Ahora vuelva a ejecutar el método imprimirProductos y note que los precios han cambiado con lo que confirmamos que el método funciona correctamente.

image

 

CODIGO FINAL

Sunday 12 February 2012

Curso ADF 11g - Parte 4

Tema : Personalización de View Objects.

Nuestro último capítulo permitió la personalización de componentes del tipo entidad. Recuerde que ese tipo de componentes esta ligado a la “representación de datos” que tenemos en nuestra capa de modelo. Una vez que tenemos representado los datos, es momento de desarrollar “la presentación de datos”.

Cuando hablamos de presentación de datos, no nos referimos de ninguna manera a la parte de interfaz de usuario (página web) sino a la presentación de datos que se realiza en la capa de modelo. Es como si usted estuviera construyendo un reporte y antes de diseñar gráficamente el reporte, lo primero que usted elabora es la SQL que permitiría “presentar los datos”. Bien justamente estamos en esta etapa y en vez de crear la sentencia SQL, lo que se hace es elaborar componentes del tipo View Object.

Requerimiento:

  • Oracle Jdeveloper 11g. 11.1.1.3
  • Oracle Database Express 11g
  • Haber culminado la parte 3 del tutorial.

Capítulos Anteriores

Parte 1: Creación del Modelo de Datos.

Parte 2: Creación de Componentes de Negocio

Parte 3: Personalización de Entidades

Opcional :

Si no culmino los capítulos anteriores y quiere empezar desde este capítulo, puede descargar el siguiente código para continuar el curso.

Código previo.

Nuestro objetivo en esta parte será lo siguiente:

  • Personalizaremos los atributos que muestran las vistas por default.
  • Modificar las etiquetas (Label) y Formatos.
  • Asociar una lista de valores a lo campos.

PERSONALIZAR ATRIBUTOS DE VISTAS.

1. Ejecute el módulo de aplicaciones, y consulta la vista de Movimiento-Detalle.

image

2. Note que la vista de detalle, muestra entre sus atributos el Id del Producto (ProductoId). Sin embargo si vamos luego a mostrar esta información al usuario final no sería adecuado mostrar la descripción del producto en vez del Id??. Por supuesto que sí, entonces veamos que paso realizaremos para lograr este cambio.

3. Regrese al Jdeveloper y hagamos doble clic sobre la vista detalle.

image

4. Elija la categoría “Entity Objects” en el editor y note que la vista DetalleVO esta compuesto exclusivamente de la entidad Detalle. Esto tiene mucho sentido porque hemos usado el asistente para su creación.

image

5. Si hacemos clic sobre la categoría Query descubriremos que a vista recupera su información en base a una consulta SQL que usa exclusivamente la tabla DETALLE para obtener su información.

image

6. En este punto, usted seguro esta tentado a ir directamente al SQL y hacer un join con la tabla PRODUCTO y finalizar este requerimiento. Esto no es necesario, porque podemos apoyarnos en las herramientas del framework para lograr lo mismo. Regrese a la categoría “Entity Object” y ahora agreguemos la entidad Producto como parte de la vista

image

Con este paso estamos ligando una vista “DetalleVO” con 2 entidades Detalle y Producto. Esto es posible y lo hacemos porque justamente necesitamos información de otra entidad para obtener los datos que necesitamos. Esto sería la manera de hacer un join con el framework. Comprobemos estos regresando nuevamente a la categoría Query y notando que el join se realizó.

image

Ojo, esto se realizo porque existe una relación entre Detalle y Producto generó en base a la foreing key que existe entre ambas tablas en la BD>

7. Bueno, ahora será necesario indicar que atributos de la entidad Producto queremos agregar en la vista. Entonces vayamos a la categoría Attributes y elijamos la opción “Add Attribute from Entity” tal como se muestra en la figura.

image

8. Elija el atributo Descripción de la entidad Producto, agréguelo a la sección de Selected y Pulse Ok.

image

9.Ahora pulse el botón, Set Source Order para ordenar los campos.

image

10. Ordénelo tal como se muestra en la imagen.Pulse OK y grabe los cambios.

image

11. Ejecutemos el módulo de aplicación y vemos los resultados.

image

12. Veamos la vista Movimiento-Detalle y notemos que ya apareció el atributo Descripción del Producto.

image

PERSONALIZAR FORMATOS Y ETIQUETAS.

13. El siguiente cambio es muy sencillo, note que en la imagen anterior la fecha no tiene formato común en nuestra región. En vez de decir 2008-01-12 preferiríamos el valor 12/01/2012. Adicionalmente cambiaremos la etiqueta “ClienteId” por “Id Cliente” para que sea más fácil de interpretar al usuario. Veamos como hacemos esto

14. Haga doble clic en la vista MovimientoVO.Luego elija la categoría Attributes y finalmente haga doble clic sobre al atributo “Fecha”

image

15. La pantalla que se muestra se puede configurar las propiedades del atributo “Fecha”. En nuestro caso vamos a la categoría “Control Hints” donde podemos personalizar cosas como los formatos o las etiquetas.En nuestro caso modificaremos las siguientes propiedades.

Format Type: Simple Date

Format: dd/MM/yyyy

image

Pulse OK.

16. Hagamos doble clic ahora sobre el atributo “ClienteId”.

image

17. Seleccionemos nuevamente la categoría Control Hint y modifiquemos la propiedad Label por “Id Cliente”. Pulse OK y Grabe los cambios.

image

18. Ejecutemos el módulo de aplicación para verificar los cambios.

image

19. Al consultar la vista de movimiento notará que se realizaron correctamente.

image

ASOCIAR LOS ATRIBUTOS CON LISTAS DE VALORES

20. En la anterior imagen note que el atributo “Id Cliente” es un atributo del tipo Texto. Sin embargo para el usuario del sistema, que registrará esta información, sería mas intuitivo “ingresar” al cliente por medio de una búsqueda por medio de una lista, en vez de recordar el Id de dicho cliente. Bien veamos como realizar este cambio con el framework. Seleccione la vista MovimientoVO. Luego, seleccione el atribute el atributo ClienteId y haga clic sobre el botón “Add List of Values” de manera similar a la siguiente imagen.

image

21. En este paso debemos definir la fuente de datos que usaremos para poblar la lista de valores del atributo ClienteId. Por ello, hagamos clic sobre el botón “Create New View Accesors”

image

22. Seleccionemos la vista ClienteVO, pues será de esta de la que tomaremos el nombre del cliente. Pulse OK.

image

23. En el campo “List Attribute” defina el atributo que pertenece al atributo CLIENTE que estará asociado al atributo ClienteId de la vista Movimiento. En este caso el nombre es el mismo ClienteId.

image

24. Haga clic en el tab “UI Hints” para definir la forma en que se presentará los datos. Sobre esta pestana, es importante notar que el campo “Default Type List” determina la manera como mostraremos este dato. En esta caso mantenemos le valor por “Choice List” que determina un lista del tipo Combo.

Adicionalmente seleccionamos Nombre como el atributo a mostrar en la lista. Pulse OK y Grabe los cambios.

image

25. Probemos los cambios desde el módulo de aplicación y vemos que los cambios se han aplicado correctamente.

image

26. Perfecto. Ya estamos viendo que este framework es poderoso para facilitar muchas labores que implicarían horas de programación y que lo podemos resolver con unos cuantos pasos de configuración. En siguientes capítulos conoceremos aún más de este framework. Si tiene dudas, por favor comente el post para poderle ayudar a solucionarlas.

CODIGO FUENTE FINAL