Tuesday, 31 January 2012

Curso ADF 11g - Parte 3

Tema : Personalización de Componentes Entidad.

Si ha culminado con éxito las 2 primeras partes del curso, probablemente se estará  preguntando en que momento se programará. Bien tal como se ha visto en las primeras lecciones prácticamente hemos usado el asistente para generar los componentes. Esos pasos fueron vitales, porque nos brinda el esqueleto de lo que será nuestra aplicación.  Lo que toca ahora, es personalizar los componentes.

Este paso, no sólo implicará programar, sino principalmente tratar de apoyarnos al máximo en las funcionalidades  del framework para  solucionar funcionalidades recurrentes con configuraciones sencillas.  En este post cubriremos las personalizaciones de los componentes Entidad. Posteriores post, mostrarán personalizaciones sobre los View Objects y los módulos de aplicación.

Requerimiento:

  • Oracle Jdeveloper 11g. 11.1.1.3
  • Oracle Database Express 11g
  • Haber culminado la parte 2 del tutorial. Ir al capitulo 2.

Capítulos Anteriores

Parte 1: Creación del Modelo de Datos.

Parte 2: Creación de Componentes de Negocio

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.

 

Generalmente en los proyectos que desarrollo hay requerimientos comunes que generalmente lo soluciono con la herramienta. Estos son :

  • Inicializar los valores de los identificadores únicos. (Primary Key de las tablas). Es decir, inicializar con un correlativo este campo. Para eso, usaremos un objeto sequencial en la base de datos que es la mejor práctica en estos casos.
  • Inicializar campos de fecha. Existen muchas veces campos fecha, en nuestros desarrollos, que los usuarios nos piden que se inicialice, por ejemplo, con la fecha actual. Bueno existe una manera sencilla de hacer esto que lo explicamos en este post.
  • Validaciones.  Nuestra aplicación maneja Movimientos y Detalles. Eso implica que un movimiento podría tener algún detalle. Se imagina un movimiento sin detalle?. Eso implicaría información inconsistente y obviamente debemos evitarlo en nuestra aplicación. Bueno también veamos como hacer esa validación con la herramienta.
  • Nuestra entidad Movimiento (Padre), tiene un atributo total, que debería acumular los subtotal de todos sus detalles. En este post mostraremos como programar esta regla.

Bien vemos como  implementar fácilmente estas reglas.

INICIALIZAR CORRELATIVO

1. Como comentamos al inicio, una de las actividades más comunes en el desarrollo de una aplicación, es inicializar los datos correlativos que están asociados generalmente a la PK de una tabla. En esta caso, la mejor práctica es hacer uso de un objeto sequence de la base de datos, que no asegurará usar un único valor para estos atributos. Bien empecemos creando los objetos sequence en nuestra BD.

Ejecutemos los siguientes comandos en la BD (conectado con el usuarios ventas):

create sequence cliente_seq start with 100;

create sequence producto_seq start with 100;

create sequence movimiento_seq start with 100;

 

image

2. Ahora en la bd crear triggers que actualice la pk de la tabla Cliente;


create or replace trigger insert_cliente_id
  BEFORE INSERT ON cliente
  FOR EACH ROW
DECLARE
    new_id number;
  BEGIN
    SELECT cliente_seq.NextVal
     INTO new_id from Dual;
    :new.cliente_id := new_id;
  END;

 

image

Por favor repita lo mismo para crear los triggers asociados a la tabla Producto y Movimiento

 

3. Bien, regresemos a la aplicación ADF y haga doble clic sobre la entidad Cliente.

imagen1

4. En la parte izquierda se mostrará una pantalla con la configuración asociada a la entidad Cliente. Note que la sección Attributes muestra los atributos de los clientes. Si hacemos doble clic sobre el atributo ClienteId se abrirá otra pantalla que permitirá configurar las propiedades de ese atributo.

image

Existen muchos indicadores en esta pantalla, parece una consola de avión, pero con un poco de calma podemos entender las más  importantes.

Region Attribute.

Type: No es necesario hacer una explicación larga sobre esto, sin embargo es importante destacar que el asistente define el tipo de dato adecuado según el tipo de BD  de la columna asociada.

Value Type y Value: Algunas veces queremos inicializar un atributo con un valor especifico ó en base a una formula. Bien estos campos justamente ayudan a eso. El “Value Type” determina el tipo de inicialización que usaremos, si es “Literal”, esperará un valor fijo en el campo “Value”, por el contrario si seteamos el valor a “Expression”, se esperará una formula (Se puede usar groovy) para asignar un valor.

Persisten: Indica que el atributo es persistente contra la BD, es decir hay una columna que almacenará los valores de ese atributo. La sección inferior “Database Column”, brinda la configuración asociada a esta propiedad.

Mandatory: Significa Obligatorio.

Region Updatable

Acá se determina si se permitirá laa actualización de este campo. Los valores Always y Never son evidentes en su uso. En el caso de While New indicará que ese atributo sólo se actulizará cuando ingresemos un nuevo registro. Es decir no permite actualizarse.

Region Refresh After

Algunas veces los valores de los atributos, se cargarán posteriormente a una acción de la BD. En esa región se indica después de que operación se volverá a actualizar este valor.

 

5. Bien, luego de la explicación teórica, apliquemos lo aprendido. Para asociar el atributo ClienteId con el resultado del triger de BD simplemente cambiemos su propiedad Type por DBSequence. Pulse Apply.

image

Analicemos que ha cambiado con esta configuración.

 

Region Atributte.

Se han desabilitado los campos Persitent  y PrimaryKey. Obviamente al ser campos asociados a un correlativo de BD ambas propiedades se asumen como requeridas para este cambio.

El campo mandatory se ha “ des seleccionado”, porque se hace esto?, bueno se asume que el valor de este atributo provendrá de la BD posterior a la inserción. Es decir el usuario no colocará ningún valor durante el ingreso de datos y en consecuencia la aplicación no debe validar si este campo esta vacío ó requerido.

Region Updatable

La herramienta ha colocado esta propiedad en “While New”, tiene sentido?. Pues si, porque este campo será sólo completado durante la inserción. Es decir no debe ser modificable. Es como si dejáramos modificar una Pk de base de datos.

Region Refresh After.

Se seleccionó Insert. Esto significa que el valor de atributo se actualizará posterior al ingreso de datos. Cuando vamos a crear un nuevo cliente, lo que va a pasar es que vamos a crear una instancia de la entidad, como un objeto, bien esa instancia mediante alguna acción volcará su contenido contra la tabla cliente, despues de insertarse entonces el valor del campo CLIENTE_ID de la tabla será regresado al objeto para actualizar el atributo cliente id de la instancia de la entidad. (Refresh After Insert).

 

Pulse Ok para regresar al editor.

 

6. Para probar este funcionamiento, ejecute el módulo de aplicación. Clic derecho sobre él y RUN.

image

 

7. Elija la Vista ClienteVO y pulse el boton (+)

image

 

8. Complete los datos. Note que el campo ClienteId se ha cargado con un valor temporal (-2) en este ejemplo. Es decir, no es necesario llenarlo.

Pulse el boton Commit image

image

 

9. Notará que una vez que se grabo el registro se cargó el verdadero valor del atributo ClienteId, lo que demuestra que nuestra configuración ha sido correcta.

image

 

Por favor, repita los pasos, desde el punto 3 para inicializar los atributos ProductoId de la entidad Producto y MovimientoId de la entidad Movimiento.  Cuando termine de realizar estos ejercicios puede continuar con el siguientes instrucciones del curso. No continúe si no terminar los ejercicios por que pasos posteriores requerirán que se haya culminado estos ejercicios.

 

ASIGNAR FECHA

10. Nuestra siguiente actividad, consiste en inicializar el atributo Fecha de la entidad movimiento con la fecha actual.

Bien, esta actividad es sencilla. Haga dobhe clic sobre la entidad Movimiento.

 

image

 

11. A continuación, seleccione la categoría Attributes y haga doble clic sobre el atributo Fecha.

image

 

12. La pantalla que se muestra permite configurar las propiedades del atributo Fecha. Tal como se explicó en el paso 4, podemos usar las propiedades “Value Type” y “Value” para definir los valores iniciales que tendrá las instancias de la entidad. En este caso usaremos Groovy, que es un lenguaje de Scripting, y que ADF puede usar para elaborar expresiones que se evalúan en tiempo de ejecución. Puede conocer más del uso de Groovy en ADF en el siguiente enlace.

http://radio-weblogs.com/0118231/2007/05/22.html

13. Entonces, los pasos que haremos será elegir “Expression” en la propiedad  Value Type y en el campo Valor colocará adf.currentDate. Pulse Ok.

image

 

14. Realicé el paso 6, para probar los componentes. Elija ahora la vista MovimientoVO.

image

 

15. Pulse el botón image para agregar un nuevo registro y note que se ha inicializado el campo Fecha con el valor actual.

image

 

VALIDAR MOVIMIENTO

16. En este escenario, lo que tenemos que lograr es evitar data inconsistente entre el movimiento y el detalle. La regla es que debemos evitar que un movimiento se grabe sin detalles. Esta última regla,determina una relación de dependencia entre ambas entidades que se logra por medio de una relación de composición.  Vamos a personalizar a la entidad la relación de Movimiento-Detalle a una de tipo composición. Haga doble clic sobre la Relación DetalleMovimientoFkAssoc

image

17. En el editor, elija la categoría “Relationship” y en la sección Beahivior seleccion la casilla “Composition Association”

image

 

El colocar una relación como composición brinda muchos beneficios, por ejemplo  si se realiza una transacción en la que estén involucradas las entidades movimiento y detalle, primero persistirá los datos del movimiento(padre) y luego de los hijos. Otra ventaja es que abre la posibilidad de utilizar validaciones que involucren ambas entidades. Justamente en esta caso aprovecharemos de esta configuración para validar que los movimientos tengan por lo menos un detalle.

 

18. Ahora haga clic sobre la entidad Movimiento, seleccione la categoría  “Business Rules”. En esta pantalla se puede colocar validaciones de manera declarativa sobre cualquier entidad. Las validaciones declarativas pueden aplicarse a nivel de atributo y entidad. Por ejemplo podría validar que el precio de un producto sea mayor a 0 ó aplicar un expresión con groovy para realizar esta validación.

Si quiere conocer más de este tipo de validaciones puede ir al siguiente enlace.

http://docs.oracle.com/cd/E15586_01/web.1111/b31974/bcvalidation.htm

 

Bien en esta caso hagamos clic  derecho sobre la sección “Entity Validators” y elija la opción New Validators.

 

image

 

19. La siguiente pantalla permite definir la validación que queremos aplicar sobre la entidad.  Las validaciones están compuestas de tres tabs que tienen la siguiente finalidad.

El primero “Rule Definition”, permite definir que regla determina que el dato procesado es Valido.

El segundo “Validation Execution ” determina alguna condición  para aplicar esa regla de validacíon.

El tercero “Failure Handling” ayuda a personalizar el mensaje que queremos lanzar al usuario cuando la validación no ha sido cumplida.

 

Los cambios para la primera pestaña, será : el tipo de regla será Collection y la operación que usaremos será “Count”. Además, el Operator será Greater Than, el  campor Compare With “Literal Value” y el valor colocado en el Literal Value será 0.

Que significa todo esto?. Que se hará una validación del operador count de la relación, es decir del conteo de los detalles. Luego, se espera que el valor obtenido “Sea Mayor que” un valor literal que ingresemos. En este caso 0.

image

 

20. Ahora elija la pestaña “Failure Handling” y coloque el mensaje que se disparará cuando no se cumpla la validación.

 

image

 

21. Pulse Ok, grabe los cambios y ejecutemos el modulo de aplicación, como en el paso 6, para probar este cambio. Haga clic sobre el View Link MovimientoDetalleVL, para ver la un movimiento con sus detalles.

image

22. Ahora para ver el efecto de validación. Pulse el botón image a nivel del movimiento.

 

image

23. El movimiento no tiene detalles, así que  pulsemos el botón Commit para intentar Grabar la transacción. Note que aparecerá el mensaje que se definió previamente y de esta manera se realizó correctamente la validación.

image

 

CALCULO DE UN ATRIBUTO TOTAL EN BASE A DETALLES.

24. Toca ahora realizar el calculo del atributo “Total” de la entidad Movimiento (Padre), en base a la sumatoria de los atributos “Subtotal” de la entidad Detalle (Hijo).  Esta regla es lógica, pues se supone que si usted maneja una factura que puede incluir muchos detalles de venta, esperaría que la sumatoria de todos los detalles (subtotales) se consoliden en un atributo asociado a la entidad Padre (Movimiento), llamada Total.

Si bien existe una relación entre ambas entidades aún será necesario colocar instrucciones que permitan actualizar el campo Total del Padre. Bien en este caso si requeriremos programar, y para eso necesitamos una clase que permita colocar esas reglas. Sin embargo, como habrá notado prácticamente no hemos tenido acceso a clase java alguna que nos permita hacer esa programación. Eso se debe a que el framework por default utiliza descriptores “inicialmente”  asociados a los componentes construidos. Eso lo puede usted comprobar expandiendo el componente Movimiento, por ejemplo, y descubriendo que tiene asociado un archivo XML que justamente representa dicho componente.

image

 

25. Bueno, en nuestra situación necesitaremos programa el componente Movimiento, así que habilitaremos un clase Java asociada a dicho componente. Para eso haga doble clic sobre dicho componente, elija la categoría Java y haga clic sobre la opción “Edit java options”

 

image

 

26. Bien , esta consola ofrece la opción de asociar una clase java a la entidad y personalizar su comportamiento vía código. Seleccione la opción “Generate Entity Object Class” y también la casilla de Accesors.

 

image

 

27. Note que ahora la entidad Movimiento ya no tiene asociado sólo un xml, sino que ahora hay una clase java (MovimientoImpl.java)  asociada que usaremos para modificar su comportamiento. La clase también tiene los métodos geters y setters de la entidad, por lo que podríamos hacer operaciones sobre estos métodos.

 

image

 

28. Haga doble clic sobre la clase MovimientoImpl.java y agreguemos el siguiente método.

 

public void calcularTotal(){

  float totalDetalle=0;
  RowIterator iteDetalle = this.getDetalle();
 
  while(iteDetalle.hasNext())
  {
      Row filaDetalle = iteDetalle.next();
      totalDetalle = totalDetalle + ((Number)filaDetalle.getAttribute("Subtotal")).floatValue(); 
  }
 
  this.setTotal(new Number(totalDetalle));

}

 

Analicemos el código que hemos colocado. Esté método se encuentra en la entidad movimiento y lo que hace es :

Recorrer todos los detalles asociados y  acumular sus subtotales en la variable totalDetalle

float totalDetalle=0;
RowIterator iteDetalle = this.getDetalle();
while(iteDetalle.hasNext())
{
Row filaDetalle = iteDetalle.next();
totalDetalle = totalDetalle + ((Number)filaDetalle.getAttribute("Subtotal")).floatValue();
}

 

Finalmente asignamos el valor calculado en el atributo Total de la entidad Movimiento.

this.setTotal(new Number(totalDetalle));

 

29. Este método permite actualizar el atributo Total del Movimiento. Sin embargo,  esté método no se ejecutará automáticamente, será necesario ubicar alguna acción que provoque este método. Si analizamos bien, esté cálculo se debe realizar cuando se agrega, modifica o elimina un detalle. Veamos como provocamos esto.

Haga doble clic sobre la entidad Detalle, de manera similar al paso 25, para habilitar la creación de clases. Tal como se muestra a continuación.

image

 

Revisemos que significa cada uno de sus checks.

  • Generate Entity Object Class: Esto permite asociar una clase Java a la entidad.

Sobre esta clase se crearán los métodos que se indican a continuación.

  • Accesors: Crea los métodos get y set de cada atributo. Habilítalo.
  • Data Manipulations Method: Crea el método doDML(). Este es un método muy útil que se invoca cada vez que se realiza una operación de INSERT,UPDATE ó DELETE contra la Base de datos.  Justamente en la implementación de este método colocaremos la invocación al método de calculoTotal().Habilítalo

Nota adicional: Nosotros ejecutamos este método cuando pulsamos el botón de guardar cambios en la base de datos (image) desde el módulo de aplicaciones.

  • Create Method. Crea el método Create(), que es un metodo que se dispara cuando se instancia un nuevo registro de la entidad. Es similar a un constructor de la entidad. No lo habilite.

Nota adicional: Nosotros ejecutamos este método cuando pulsamos el botón de Adicionar un nueva Fila (image) desde el módulo de aplicaciones.

  • Remore Method. Crea el método remove() que como su nombre indica cuando se elimina una instancia de la entidad. No lo habilite

Nota adicional: Nosotros ejecutamos este método cuando pulsamos el botón de Eliminar una Fila (image) desde el módulo de aplicaciones.

Pulse Ok y Grabe los cambios.

 

30. Bien, haga doble clic sobre la clase DetalleImpl.java y ubíquese en el método doDML(). Sobre escríbalo de la siguiente manera.

 

protected void doDML(int operation, TransactionEvent e) {
    this.getMovimiento().calcularTotah();
    super.doDML(operation, e);
  
}

 

31. Notemos lo siguiente, el método doDML se ejecuta cada vez que el usuario confirma una acción de agregar modificar o eliminar sobre la entidad detalle. Nosotros hemos incluido la siguiente línea

this.getMovimiento().calcularTotal();

Que lo que hace es calcular los detalles del movimiento asociado y actualizar el atributo total del mismo.

 

image

32. Probemos este último cambio. Ejecute el modulo de aplicación y ubíquese en el viewlink que permite ver los datos del movimiento y detalle,

image

 

33. Agregué un nuevo detalle usando el botón de Agregar Fila sobre los detalles

 

image

 

34. Ingrese valores pertinentes a ese detalle.

 

image

 

35. Finalmente, aplique los cambios de toda la transacción.

 

image

 

36. Finalmente notemos que el valor del total del movimiento se ha actualizado correctamente.

image

 

37. Felicitaciones, ha culminado la personalización de las entidades en su aplicación ADF. Capítulos posteriores permitirán personalizar las vistas y el módulo de aplicación. Si quiere comparar su resultado, con nuestro código puede descargarlo del siguiente enlace.

CODIGO FUENTE.

Monday, 30 January 2012

Paso de Valores entre páginas ADF




Uno de las funcionalidades requeridas en una aplicación WEB es el paso de valores entre las páginas ADF. Existen 2 maneras de realizar esta actividad que vamos a analizar en este post.




1. Uso de expresiones para declarar y usar las variables. Esta es la solución más rápida pero como explicaremos mas adelante la menos recomendable. Veamos un ejemplo rápido.




En la pagina origen creamos una caja de texto en su propiedad value definimos indicamos la variable a nivel de flujo donde se almacenará lo contenido en la caja de texto.




La expresión será así :




#{pageFlowScope.parametro}




Note que la pageFlowScope determina el alcance de la variable y parametro es el nombre de la variable.




image




En la página destino usamos la misma expresión para recuperar su valor. En este caso uso un componente del tipo label para mostrar el valor.




image




Probemos la pagina y veamos que efectivamente se pasa el valor de una página a otra.




image







Al ir a la siguiente página se recupera el valor.




image




Bien aparentemente la solución propuesta es suficiente para solucionar el paso de valores entre páginas, sin embargo hay un inconveniente en esta propuesta. Si por algún motivo la aplicación sufre un error inesperado, por ejemplo una excepción de null pointer, los valores se pierden y si el comportamiento de la aplicación dependía de los valores de estas variables entonces su aplicación empezará a comportarse de manera impredecible.




Entonces, como solucionamos estos?. Bueno existe una segunda manera de lograr el paso de valores, en este caso se utiliza un managed bean para compartir la información. La ventaja de esta técnica es que los valores se mantienen aún cuando se produzca un error no controlado en la aplicación.




Para implementarlo, primero vamos a crear un bean “PasoValor” con un sólo atributo llamado parámetro. Algo como esto.







package parbizu.valores.view;







public class PasoValor {
private String parametro;
public PasoValor() {
super();
}




public void setParametro(String parametro) {
this.parametro = parametro;
}




public String getParametro() {
return parametro;
}
}







Lo declaramos en el adfc-config.xml.




image







Lo aplicamos en nuestras páginas origen y destino solo que la expresión para acceder será.




#{pageFlowScope.pasoValor.parametro}




Note que en este caso, se incluye la referencia al managed bean pasoValor en la expresión.




El código quedaría así en la página origen.




image







En la página de destino terminaría así.




image







Si probamos esto, tendríamos lo siguiente.




image







image







Recomendamos hacer uso de esta segunda técnica para evitar la perdida de valores.




CODIGO EJEMPLO

Saturday, 31 December 2011

Curso ADF 11g - Parte 2

Tema: Creación de Componentes de Negocio.

Como se comento en la primera parte. Las aplicaciones ADF están compuesto de dos proyectos un asociado al modelo y otra a la parte WEB. Lo que desarrollaremos en este capitulo es lo asociado a la parte de modelo.

Requerimiento:

  • Oracle Jdeveloper 11g. 11.1.1.3
  • Oracle Database Express 11g
  • Haber culminado la parte 1 del tutorial. Ir al capitulo 1

1. Conceptos Básicos. La existencia de componentes de negocio se ha vuelto común en cualquier framework moderno. ADF cuenta por ello con un framework denominado ADF Business Components cuya arquitectura esta compuesta principalmente de tres tipos de componentes.

Entity Objects: Representan al modelo de datos en la capa de negocio. Entre sus características podemos mencionar:

    •Brindan la capacidad del mapeo O/R

    •Alojan las reglas de negocio y las validaciones de dato

    •Añaden funcionalidades de caching

    •Permite representar una tabla como un Entity Object

View Object : Representa a un grupo de datos (colección) que se pudo haber generado en base a las entidades ó a un query de base de datos. Sus características son :

    •Se puede basar en uno ó mas EO para mostrar un grupo de datos a los clientes de las aplicaciones

    •Genera un sentencia SQL que representa el grupo de datos obtenidos

    •Presenta la información de la capa de Business Service

    •Cuenta con capacidades de ordenar y filtrar la información seleccionada

Application Module : Define el facade de la aplicación. Es decir el componente que aloja las reglas de negocio en el framework.

    •Manejan las transacciones

    •Agrupa a los componentes que son expuestos al resto de capas de la aplicación

    •Implementa las reglas de negocio que tendrá la aplicación y que usará los View Objects para extraer la información.

    Gráficamente podríamos definir la arquitectura de la siguiente manera

image

En la figura se muestra como sería la distribución de componentes. Este escenario serviría para un sistema de matriculas. Note que el modelo de datos son representados como entidades y generalmente mapearían  a las tablas de base de datos.

Los View Objects (de color rojo) están asociados a los grupos de datos (cursores, colecciones) que se usarán los métodos de negocio que se implementarán en el Modulo de aplicaciones. En esta caso tenemos una vista que recuperará información de los alumnos matriculados por curso. Obviamente las entidades involucradas serán la entidad Alumnos y Cursos. Por otro lado, tenemos otra vista “Empresas Activas” que ofrecerá todas empresas activas, las cuales se podrían interpretar por un indicar de actividad cuando se defina la consulta.

EL último elemento a desarrollar será el módulo de aplicaciones. Este componente define la reglas de negocio de la aplicaciones. Si hiciéramos un paralelo con componentes en la base de datos, el módulo de aplicaciones sería los store procedures.

En el caso del sistema de matriculas, el modulo de aplicaciones implementaría los métodos de empezarProcesoMatricula() ó registrarMatricula().

Ahora, luego de conocer los principios de ADF Business Components desarrollemos un ejercicio práctico al respecto.

El proceso de creación de componentes, deberá cubrir lo siguientes pasos :

  • Mapear componentes de negocio en base a modelo de datos.  En este paso se crearán entidades, View Objects y el módulo de aplicación. Este paso es muy sencillo, y prácticamente lo realiza la herramienta.
  • Personalizar los componentes . En esta etapa si es necesario adaptar lo que el framework te ofrece a tus necesidades.  Recuerde que el framework reduce las líneas de código que debemos programar, pero nunca lo elimina. Este paso es un buen ejemplo de eso.

Desarrollemos los pasos indicados anteriores

MAPEO DE COMPONENTES.

1. Haciendo clic derecho sobre el proyecto Modelo,  elija la opción New.

image

 

2.A continuación, aparecerá la galeria de componentes. Esta galeria ofrece la relación de componentes que se pueden incluir en la aplicación. Al elegir la categoría ADF Business Components, podremos incluir los Business Componentes que describimos al inicio de este post. Para empezar crearemos las entidades, para esta eso elija la opción Entity Object y haga OK

image 

 

3. La Siguiente pantalla indicará que usará la conexión Ventas que creamos en la primera parte del curso.

image

 

4. A continuación aparecerá  el asistente para crear la entidad. Asignemos los siguientes valores :

Package : com.ventas.model.entities (simplemente estamos definiendo un paquete donde tendremos las entidades llamado entities)

Name: Cliente (Nombre de la entidad, no tiene que coincidir con el nombre de la tabla asociada)

Scheme Object: Asignemos sobre este campos la tabla Cliente. Use el botón browse para que el asistente ubique la tabla. Pulse Next.

 

image

 

5. Mantenga los valores por default en el resto de pasos. Para eso simplemente pulse Next hasta el paso 6.

6. La última pantalla brinda un resumen de lo que la herramienta va a construir. Pulse Finish para culminar la creación del componente.

 

image 

 

7. Repita los pasos 4,5 y  6 para crear las entidades Producto, Movimiento y Detalle en base a las tablas de nuestro modelo.

8. Note que se han creado unos componentes en rojo, denominados Asociaciones. Las asociaciones permiten relacionar entidades para poder acceder a su información.

image

9 Para poder entenderlo imagine como diseñaría las clases Cliente y Movimiento. En ese escenario, probablemente usted tendría una clase Cliente y un atributo del tipo Colección que agrupe a los movimientos asociados a ese cliente. Bien, en este framework, se modela de manera distinta, en vez de definir una collection de movimientos relacionadas a la entidad cliente, lo que se hace es crear una asociación  entre ambas entidades. Obviamente lo que ha hecho el asistente es tomar las foreing keys de la base de datos y en base a eso crear las asociaciones. La pregunta obvia es como se define la cardinalidad de ambas entidades, pues para eso simplemente haga doble clic sobre cualquiera de las asociaciones, elija la categoria RelationShip y pulsando el botón editar  verá las entidades involucradas en la relación y la cardinalidad, en este caso 1 a *

image

 

10 .A continuación crearemos las vistas. En este caso, las vistas dependerán de las entidades, aunque las vistas podrían no depender de una entidad sino directamente en base a una consulta SQL.

Bien para crear una vista puede realizar un procedimiento similar a lo mostrado en el caso anterior, eligiendo el componente View Objet en vez de Enttity Object ó como haremos a continuación haciendo clic derecho sobre una de las entidades, por ejemplo Cliente, y eligiendo la opción New Default View Object

image

 

9. Cambie el paquete destino, por queries y defina el nombre con el postfijo VO, por ejemplo  ClienteVO. Pulse Ok

image

 

10. Repita el procedimiento para crear las Vistas Producto VO, MovimientoVO y DetalleVO .

11. Usted debería tener los siguientes componentes, al culminar el último paso.

image

 

12. Así como las entidades se relacionan para permitir el acceso de datos, los view objects también tienen se pueden relacionar, por medio de un componente llamado view link. Su utilidad?, pues la utilidad es sincronizar datos, imagínese que planeamos construir una consulta, que cada vez que se navegue por un dato del movimiento, automáticamente se muestre los detalles del movimiento elegido. Para lograr eso, es probable que usted podría planear en “programar” para esa sincronización. Bien, el framework evita eso, permitiendo que definiendo esta relación, automáticamente los datos de dos vistas se sincronizan. Es decir si el usuario se ubica en el movimiento 545, entonces los detalles se filtran para mostrar los detalles correspondientes al movimiento 545. Bien para crear la relación, simplemente repita el paso 1 y elija la opción View link.

image

 

13. Cambie, el paquete destino por “com.ventas.model.queries” y defina un nombre para este tipo de componente por : MovimientoDetalleVL.

image

 

14. La siguiente pantalla permite definir la vista involucradas en el view Link. En este caso, definimos el atributo de la  vista origen “MovimientoVO.MovimientoId” (Será el padre) y la vista destino (DetalleVO.MovimientoId). Pulse Add para agregar la relación.

image

Noté que esta relación es muy similar a la de una asociación de entidades, pero no se confunda. Mientras la asociación entre entidades sirva para un acceso de datos entre entidades, por ejemplo se podría “personalizar el código” para que desde el movimiento se acceda a todos sus detalles para por ejemplo, calcular el total de detalles . Mientras que cuando usamos los viewLink lo que logramos es sincronizar datos “sin necesidad de personalizar código alguno” y que es muy útil para mostrar resultados anidados en la pantalla.

15. Pulse Next y luego Finish para culminar la creación del viewLink. Usted debería tener una imagen como la siguiente :

image

 

16. Ahora, procederemos a crear le módulo de aplicaciones. Repita los pasos 1 y 2 para mostrar la galería de componentes y elegir la opción Application Module.

image

 

17. Cambie le nombre del paquete por com.ventas.model.applications y el nombre del applications module por VentasAM. Pulse Next.

image

 

18. En la siguiente pantalla se define las vistas que serán expuestas por la aplicación que vamos a desarrollar.Este punto es importante destacarlo para comprender este tipo de componentes. Cuando construimos un modulo de aplicación tenemos que definir que vistas (View Object) serán usadas y expuestas hacia la capa WEB. Como explicamos en la parte introductoria, el módulo de aplicaciones concentrará la lógica de negocio de la aplicación y obviamente para poder implementar estas reglas, es necesario acceder a datos. Justamente estos datos son proveídos por los view objects, y este paso, es para que el modo de aplicación “vea” las vistas que necesita.

Si hacemos un analogía, es como si usted construyera un store procedures (Application Module) y declarará el uso de cursores creados previamente.

19.  En este caso, exponemos las vistas Cliente, Producto y Detalle. Para eso selecciónelas y use los botones de desplazamiento para agregarlas.

image

 

20.  Bien la vista que nos faltaría añadir sería la de movimiento. En este punto es importante recordar lo que hicimos en el paso 12 para crear el ViewLink entre Movimiento y Detalle. Note que se creo una relación entre las vistas para lograr sincronizar los datos. Bien, esta “jerarquia” tiene que ser expuesta para poder ser utilizada posteriormente. Entonces, para esto primero elija la vista movimiento y desplazela a la izquierda.

image

 

21. Ahora lo que hay que hacer es pasar la vista de detalle hacia la derecho, para eso en la region de la izquerda seleccione la vista detalle y en la región de la derecha seleccione la vista MovimientoVO, agregada previamente, luego pulse el boton de desplazamiento. Usted debería tener una imagen similar a lo mostrado a continuación. Pulse Finish para culminar la construcción del módulo de aplicaciones.

image

 

22. Bien todo lo construido debería tener la siguiente imagen.

image

 

23. Ok, para culminar la parte de mapeo vamos a usar una de las funcionalidades que ofrece el framework que es la capacidad de visualizar los datos una vez construido la capa de modelo. Que significa eso, pues que usted puede inspeccionar datos, probar métodos y actualizar información directamente desde el modelo, sin necesidad de crear una interfaz de usuario como una página jsf. Esto es muy útil, porque ayuda a hacer debug y probar la capa de modelo antes de iniciar el desarrollo del  la capa WEB, y de esa manera miminizar los errores en la aplicación.

24. Bien, para lograr esto simplemente haga clic derecho sobre el módulo de aplicaciones y eliga la opción Run.

image

 

25. Haga doble clic sobre la vista ClienteVO y use las flechas de desplazamiento para navegar entre los datos de esa vista.

image

 

26. Finalmente si hace doble clic sobre el viewLink  MovimientoDetalleVL1, vera la relación entre la vista movimiento y detalle. Si usted se desplaza entre los datos del movimiento, notará que automaticamente se refrescan los datos del detalle. Que es el efecto que queriamos lograr.

image

 

27. Si llegó hasta aquí, felicitaciones ya su aplicación va tomando forma y estamos seguros que esta listo para las siguientes entradas del curso. Si no llegó y tiene dudas, puede descargar el código del proyecto para que revise la solución.

 

CODIGO FUENTE

Curso ADF 11g - Parte 1

Tema : Creación de Modelo de Datos





Este es el primer capitulo de nuestro curso de ADF versión 11g. Dado que este es un framework que ofrece muchas funcionalidades en cuanto al manejo de datos, primero debemos crear nuestro modelo de datos.





Para los ejercicios que trabajaremos durante el resto de capitulos usaremos un esquema denominado ventas que dispondrá de las clásicas tablas de facturación: Cliente, Producto, Movimiento y Detalle.





Requerimientos.









  • Jdeveloper 11.1.1.3.0



  • Oracle Database Express Edition 11g,




1. Entonces, primer paso crear su esquema ventas y correr en ese esquema los scripts que adjunto.





Script de Estructuras.





Script de Datos.





2. Conceptos Básicos del proyecto a desarrollar. Antes de empezar a desarrollar la aplicación, es importante que usted entienda como estructura las aplicaciones ADF y Jdeveloper.





Para empezar existe el concepto de Application que es básicamente el que contiene ,valga la redundancia, toda la aplicación. Técnicamente hablando esto se plasma en un archivo *.jws que se creará dentro de la carpeta que usted defina durante su creación.





Existirá siempre un application en su desarrollo ADF e incluirán, generalmente, 2 proyectos. Model y ViewController. Recordemos que ADF es un framework basado en el patrón MVC y en consecuencia tendrá un proyecto para albergar los componentes que implementan el negocio y otro donde residirán los componentes que implementan la parte WEB.





Una mayor explicación sobre las capas de la arquitectura ADF las puede encontrar en el siguiente link.





Arquitectura ADF





El proyecto que tendrá los componentes de la parte de negocio se llamará Model y el de los componentes de la aplicación WEB será viewController . Este gráfico le ayudará a tener una mejor comprensión al respecto





image









3. Bien, luego de conocer la arquitectura ADF y de crear su esquema en la BD, procederemos a crear la aplicación. Ejecute el Jdeveloper 11g, y use la opción File New del menú, para lanzar el asistente de creación de aplicaciones.









4. En la primera pantalla se define los datos básicos de la aplicación. Es importante destacar en esta pantalla, que Jdeveloper 11g, es la herramienta clave de la plataforma fusion. En consecuencia ofrece plantillas para desarrollar sobre las diversas tecnologías de la plataforma como Oracle WebCenter, ADF, SOA, etc. Por eso en la sección de Application Template, se lista todas las plantillas. En este caso elegiremos Fusion Web Application que es la asociada a las aplicaciones que incluyen ADF. Pulse Next.





image





5. La siguiente pantalla define el nombre del proyecto de la capa de modelo. Note que se definen en la región de Selected las tecnologías usadas en esta capa. Deje los valores por default y pulse Next





image





6. La siguiente pantalla simplemente define el lugar físico donde se guardará el código.Pulse Next





image





7. Al igual que en el caso del proyecto Model, en este paso se define el proyecto ViewController, acepte este paso y lo siguientes para culminar el desarrollo de la aplicación.





image









8. Finalmente, usted debería tener algo similar a lo mostrado a continuación.





image





9. Analizaremos en próximos capítulos como trabajar con cada uno de los proyectos, pero para culminar esta primera parte asegurémonos de asociar la aplicación que hemos desarrollado con el schema “Ventas” . Para eso elija del menú del Jdeveloper la opción View Database Database Navigator.





image





10. Se debe mostrar todos las aplicaciones que usted ha desarrollado. En este caso haga clic derecho sobre la aplicación de Ventas y elija la opción New Connection. Complete los datos según su conexion y pulse Test Connection para comprobar





image









11. Si sale Success!, felicitaciones ya tiene su primera aplicación ADF lista para ser construida.





Descargar Código Finalizado