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

2 comments:

  1. excelente no sabia que podian tener clase java el aplication module,muy interesante

    ReplyDelete
  2. Modificación para JDeveloper 12c y JDK7

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

    ReplyDelete