Wednesday, 30 May 2012

Evento del Grupo de Usuarios Oracle En México.

El día 23 de Junio se realizará el primer evento del grupo de usuarios ORACLE en México del cual soy miembro.

Los temas a tocar serán :

 

Tema: Implementando SOA Suite

Descripción: La sesión estará enfocada a dar tips de implementación sobre la plataforma de ORACLE SOA SUITE 11g. Dando ejemplos reales, esquemas prácticos, y tips para el desarrollador.

 

Tema: Un vistazo a Oracle Weblogic 12c

Descripción: La sesión será una introducción a los nuevos features de este release de Weblogic. Haciendo énfasis en sus bondades para Cloud Computing

 

Les recomiendo participar y conocer aún más la tecnología ORACLE.

La liga del evento es :

http://www.oramex.org/eventos.php

Tuesday, 22 May 2012

Curso Avanzado de ADF por Oracle

image Oracle Acaba de lanzar un curso Avanzado de ADF en formato eCourse. Esta muy completo, así que si usted ya tienen conocimientos de ADF y no tiene problemas con su ingles, puede aprovecharlos.

El curso que estoy escribiendo en este blog,  brinda un primer alcance que luego puede ser profundizado en este Curso de Oracle .

Me olvidaba comentarles es GRATUITO!! así que ha aprovechar el curso.

Este es el enlace

http://apex.oracle.com/pls/apex/f?p=44785:24:0::NO:24:P24_CONTENT_ID,P24_PREV_PAGE:6022,2

Tuesday, 8 May 2012

Curso ADF 11g–Parte 7

Tema : Template de la Aplicación

Luego del proceso de creación de la parte de negocio, será necesario la creación de elementos para la parte de interfaz de usuario. Esta parte es importante, teniendo en cuenta que ADF se ha convertido en el framework de facto para la parte de presentación en la plataforma Oracle Fusion Middleware.

La creación de interfaz de usuario comprenderá varios post. Pero empezaremos creando el template que luego será reusado por todas las páginas.

Requerimiento:

· Oracle Jdeveloper 11g. 11.1.1.3

· Oracle Database Express 11g

· Haber culminado la parte 6 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.

Parte 5: Lógica en el Módulo de Aplicaciones

Parte 6: Manejo de Bindings

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.

Bien, como indicamos inicialmente vamos a crear el template de nuestra aplicación. Un template es un elemento vital en cualquier aplicación, pues permite definir el aspecto gráfico y la organización que será común entre todas nuestras páginas. Esto es importante, porque nos permite estructurar el contenido de nuestras páginas y definir elementos gráficos como el banner, pie de página y logos que deberán aparecer en todas las páginas. El termino template es equiparable con conceptos como “master page” , “plantilla” ó  “machote”.

 

Los pasos a realizar son los siguientes:

1. Para empezar, usaremos la imagen (bannerVenta.jpg) como banner del template. Por, ello descarguemos esta imagen del siguiente link y usando el manejador de archivos ubíquelo en la siguiente ruta :

<RUTA_APLICACION_VENTAS>\ViewController\public_html\images ( Deberá crear la carpeta images porque no existe).

Al final usted deberá crear una imagen como esta :

 

image

 

2. Abra el jdeveloper, elija el proyecto View Controller, haga clic derecho y seleccione la opción New. Luego elija de la galería de componentes el item : JSF Page Template. Pulse OK.

image

 

3. Bien en este punto, indicaremos las propiedades del template.

  • Nombremos al template como: templateVentas
  • Ubiquemos el template no en la raiz sino en la subcarpeta \templates,

Hasta este punto usted debería tener los siguientes valores. Aún no pulse OK

image

 

4. Ahora, usaremos el asistente para determinar la estructura del template. Active el check Use a Quick Start Layout y pulse el botón Browse.

5. Deberá aparecer el asistente. En este punto elegiremos la categoria “one-column”, el tipo 2 y el layout 1, tal como muestra la figura.

image

 

Este layout tendrá como características que la parte superior ser mantendrá fija. Es decir existirá un espacio definido para albergar el banner .

La parte inferior será variable,  es decir si el usuario modifica el tamaño de la página, entonces el contenido de esa sección se “re ajustara” al tamaño que tenga la pantalla.  Es importante tener en cuenta que esto dependerá de que tipo de layouts (contenedores) coloquemos en la página. Más adelante analizaremos esto.

Pulse OK para continuar con la creación del template.

6. Bien ahora toca definir la región que podrá ser modificada por cada página que use el template. Recuerde que usamos el template para compartir su estructura entre las páginas. En consecuencia será necesario definir una región que podemos modificar cuando elaboremos las páginas.  Por ello,  usando la pestaña Facet Definitions pulsemos el botón Add para añadir un nuevo facet, que identificará a la región que podrá ser modificada. Nombremos al facet como contenido, tal como se muestra en la figura.

image

 

7. Finalmente elija la pestaña Attributes y agregue una nuevo atributo llamado titulo. Este atributo es como una variable a nivel de página y nos servirá para poner un titulo en la parte superior de cada página.

 

image

 

8. Pulse OK para culminar la creación del template.

9. Analicemos que ha creado el asistente.  Observe la paleta de estructura y notará que el asistente a incluid un componente llamado panelStrechLayout. Bien este tipo de componente se denomina contenedor ó layout y sirve para albergar a otros layouts ó contenedores. Este tipo de panel tiene la característica de ajustar sus dimensiones en función del tamaño que se defina en el browser.

 

image

 

El panel define 2 regiones center y top ( Note que el resto de regiones se encuentra deshabilitadas porque no se usan) . El top se usará para mostrar el banner de nuestra aplicación y la parte de center, incluirá el contenido que se poblará cuando se construya cada página que utilice el template.

10. Revisemos las propiedades del panelStrechLayout, notaremos que existe una propiedad que define el alto de la sección top (TopHeight). Por default considera 50 pixeles lo cual es conforme con el alto que tiene la imagen que tenemos. Eventualmente usted podría cambiar el valor de el alto en función del alto de su banner.

image

 

11. En la sección top colocaremos el banner descargado previamente. Una alternativa sería colocar un control imagen en esta sección, sin embargo nosotros queremos colocar la imagen del banner y encima de esta imagen un texto que describa la pantalla que estamos mostrandk. Por ello usaremos como control un layout la cual permite defijir una imagen de fondo y además servir de contenedor de otros controles como textos. Hagamos esto, arrastre un Panel Group Layout en la region top.

image

 

12. Modifiquemos las propiedades del  Layout con los siguientes valores :

Halign:center : Centrado de manera horizontal

Valign: middle: Centrado de manera vertical

Layout: vertical : Permitirá que todos los componentes que se agreguen se colocarán de manera vertical

 

image

 

13. Ahora apliquemos como valor de fondo la imagen descargada previamente, usando la propiedad image de la seccion Style and Theme como se indica en la figura.

image

14. Nuestro template debería quedar de la siguiente manera :

image

 

15. Debemos ahora asignarle un Titulo a nuestro template y adicionalmente un texto que será variable y que estará relacionado a la pagina que se muestre. Por eso, arrastre 2 OutputText sobre el layout creado.

image

 

Note que hos textos se están montando sobre la imagen que era lo que queríamos

 

16. Ahora , modifique los valores de las propiedades de los textos. Al primero se le pondrá como value : “SISTEMA DE VENTAS” y se cambiará su color y texto tal como lo mostrado a continuación.

image

17. Sobre el segundo outputText realizar la misma configuración del paso anterior, pero adicionalmente definir en la propiedad value la expression: #{attrs.titulo} que identificará al parámetro  definido en el punto 7.

image

 

18. Para terminar nuestro template, tenemos que definir que región de nuestro template será completado por las paginas que se construyan. En nuestro caso esa región se ubicará en la seccion center de nuestro template. Sin embargo nosotros lo “nombraremos” como “contenido” que fue definido en el punto 6.

Para eso, arrastremos el control Facet Ref sobre la región center y haciendo uso de la ventana emergente elegir el valor contenido. Pulse OK.

 

image

 

19. Nuestro template deberia tener la siguiente estructura.

image

 

 

20 Finalmente para probar el template, será necesario crear una página de prueba que la use. Haga clic derecho sobre el paquete de pages y elija la opción new.

image

 

21. Seleccione JSF –Page y pulse OK

 

image

 

22. Nombremos a nuestra página como pruebaTemplate y aseguremosno de que este seleccionado el templateVentas tal como se muestra a continuación. Pulse OK

 

image

 

 

23. Sobre la pagina creada, utilice la paleta de estructura para ubicar la referencia al template. Note que en la paleta de propiedades apareció la propiedad titulo que hace referencia a la variable asociada al template. Modifique su valor por “PRUEBA DE VENTAS”

 

 

image

 

24. Finalmente probemos la pagina haciendo clic derecho sobre ella y pulsando la opción de Run

 

image

 

25. La página ejecutada debe ser similar a la siguiente.

image

 

Código Final

Wednesday, 21 March 2012

Curso ADF 11g–Parte 6

Tema : Capa ADF Model

Si ha seguido los post anteriores notará que estamos en la etapa de construcción de Interfaz de usuario. Sin embargo antes de construir las páginas de la aplicación debemos comprender una de las capas previas que tiene el framework ADF denominado ADF Model y que permite exponer los componentes de negocio hacia la capa de Vista.

Requerimiento:

  • Oracle Jdeveloper 11g. 11.1.1.3
  • Oracle Database Express 11g
  • Haber culminado la parte 5 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.

Parte 5: Lógica en el Módulo de Aplicaciones

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.

Como lo comentamos inicialmente, el framework cuenta con una capa que sirve de interfaz de los componentes de negocio. Esto permite un bajo acoplamiento entre la capa de negocio y capa web que desarrollaremos más adelante. De esta manera no importa la manera que se implemente la capa de negocio (ADF BC,EJB,Java Beans) la capa de Vista siempre accederá de una manera común a los componentes de negocio. Un Imagen que nos ayuda a ilustrar esto se muestra a continuación :

 

 

Note que en las capas inferiores podemos usar distintas tecnologías para implementar los servicios de negocio. En nuestro caso, estamos usando ADF Business components, pero se podría usar otra tal como se muestra en la figura.

La capa de Model  sirve como un traductor, que “traduce” cualquiera de las tecnologías inferiores en unos componentes comunes. De esta forma la capa Controller y View no se enteran como se ha implementado las reglas de negocio sino que simplemente interactúan con los componentes que ofrece la capa Model.

La capa de Model en ADF tiene la siguiente arquitectura.

 

 

 image

 

Business Service :  Esto esta compuesto por los componentes de negocio que hemos implementado en los capítulos anteriores con los ADF Business Componentes.

DataControl : Es la interfaz que expone los componentes de negocio que tiene los business service. Básicamente expone los componentes que hemos “publicado” en el módulo de aplicación.

Bindings: Para que una página pueda acceder a datos necesita disponer de “variables” que  permitan accedan a dicha información. Esto se soluciona en ADF por medio de bindings (“enlaces”) que pueden ser accedidos por las páginas para obtener información.

 

Bien, veamos un ejemplo de como identificar estos elementos.

 

1. Sobre el proyecto ViewController hagamos clic derecho y elija la opcion Nes.

image

 

2. Elija la opción JSF y pulse OK.

image

 

3. Elijamos los datos de la página tal como se muestra a continuación. Tenga en cuenta los siguientes datos :

Nombre : consultaCliente.jspx

Directory: <RUTA_DEFAULT>/pages.

Los demás valore se dejan por default.

Los conceptos asociados a las páginas JSF los abordaremos con más detalle cuando lleguemos al post asociados a las interfaces de usuarios.

Pulse OK*

image 

 

4. Se generó la página JSF de consulta de Clientes. Bien lo primero que vamos a analizar es el componente DataControl, si se fija existe una region DataControls. Expandalo para conocer nuestro primer tipo de componente denominado Data Control.

 

 image

5. Puede notar que en la sección de DataControls se exponen las vistas que hemos desarrollado en las lecciones anteriores. En este punto es importante recordar que el data control solo expone referencias a las vistas y métodos, no son las implementaciones en si, sino referencias, recuerde que el data control funciona como una interfaz hacia los componentes de lógica de negocio. También,  note que se exponen que los métodos que se implementaron en el anterior post.

image

6. El segundo tipo de compontes se llama bindings y aparecen cuando las paginas tienen acceso a datos.

Como hemos creado una pagina en blanco, vamos a incluirle una consulta de clientes para identificar este tipo de componentes. Lo que hacemos es arrastrar la referencia a la vista ClienteVO1 hacia la página creada. Elijamos la opción Form | ADF Form tal como se muestra a continuación.

image

 

7. En la ventana, se define los datos a mostrar, seleccione “Include Navigation Control”  que permite incluir botones de navegación entre los datos. Pulse OK.

 

image

 

8. Note que se ha creado un formulario que muestran datos de la vista. Sin embargo, debemos recordar que si una pagina expone datos, es porque existen bindings que recuperan esa información. Comprobemos eso, para eso pulse la pestaña Source en la parte inferior de la página.

 

image

 

9. Aparece los tags que hacen referencia a cada uno de los campos agregados. Sin embargo lo que nos interesa es el valor de la propiedad value. Puede por ejemplo ver  que la propiedad value de  clienteId  tiene la siguiente expresión.

value="#{bindings.ClienteId.inputValue}"

 

image

 

Lo que indica eso, es que el valor que muestra el campo es de un binding llamado ClienteId. Pero donde están los bindings?, para eso hagamos clic en la la pestaña inferior denominado Bindings

 

image

 

10. En esta pestaña se muestran los bindigs que tiene la página. Note que existen tantos bindings como campos se muestran en la página. Esto lo ha creado el asistente.

 

image

 

11. Los componentes ClienteId,Nombre e Email son bindigs del tipo “value bindigs” y son los que obtienen datos. Adicionalmente vamos a ver que se han creado 4 botones que permiten el desplazamiento de datos. Estas operaciones son soportadas gracias a los bindings del tipo “Operation Bindigs”. En este caso los bindigs de este tipo son: First,Previous, Next y Last.

Los value bindigs indicados anteriormente, recuperan su información de otro tipo de bindigs del tipo iterador.En este caso el iterador que se utiliza se llaia ClienteVO1Iterator y es como un cursor que recupera la información de la vista.

12. Bien, veamos la página en funcionamiento para comprobar su funcionamiento. Haga clic derecho sobre la página y pulse RUN.

image

 

13. Note que se muestran los datos de los clientes. Esto se produce porque, como hemos visto existen bindings que soportan esta información.

image

 

14. Si pulsamos el botón Next se recorre al siguiente registro. Esto se debe al uso de los operation Bindigs.

image

 

15. Bien, luego de entender como llegan los datos podemos seguir con los siguientes post donde conoceremos el desarrollo  y refinamiento de las páginas.

 

CODIGO FINAL

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