Creación de Componentes de Negocio Si no culmino los capítulos previos y desea iniciar desde este capítulo, puede descargar el próximo código para continuar el curso. Código anterior Generalmente en los programas 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 fundamento de datos que es la mejor práctica en estos casos. Inicializar campos de fecha. Existen muchas veces campos fecha, en vuestros desarrollos, que los usuarios nos piden que se inicialice, por ejemplo, con la fecha actual. Bueno tiene lugar una forma sencilla de realizar esto que lo explicamos en este post. Vuestra 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. 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 afiliados generalmente a la PK de una tabla. En esta caso, la mejor práctica es realizar uso de un objeto sequence de la fundamento de datos, que no asegurará usar un único valor para estos atributos. Bien empecemos formando los objetos sequence en vuestra BD. Ejecutemos los próximos 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; 2. Ahora en la bd crear triggers que actualice la pk de la tabla Cliente; create or replace trigger insert_cliente_id DECLARE Por favor repita lo mismo para crear los triggers afiliados a la tabla Resultado y Movimiento 3. Bien, regresemos a la aplicación ADF y haga doble clic sobre la entidad Cliente. 4. En la fracción izquierda se mostrará una pantalla con la configuración asociada a la entidad Cliente. Note que la sección Attributes presenta 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. Region Attribute. Value Type y Value: Algunas veces deseamos inicializar un atributo con un valor especifico ó en fundamento a una formula. Bien estos temas justamente ayudan a eso. El ?Value Type? decide el tipo de inicialización que usaremos, si es ?Literal?, esperará un valor fijo en el tema ?Value?, por el opuesto 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: Implica Obligatorio. Region Updatable Acá se decide 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 faculta 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, despues de la aclaración teórica, apliquemos lo aprendido. Para asociar el atributo ClienteId con el fruto del triger de BD simplemente cambiemos su propiedad Type por DBSequence. Pulse Apply. Analicemos que ha cambiado con esta configuración. Region Atributte. El tema 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 mientras el ingreso de datos y en consecuencia la aplicación no debe cerciorar si este tema esta vacío ó requerido. Region Updatable La dispositivo ha colocado esta propiedad en ?While New?, tiene sentido?. Pues si, porque este tema será sólo completado mientras la inserción. Es decir no debe ser modificable. Es como si dejáramos adaptar una Pk de fundamento de datos. Region Refresh After. Se seleccionó Insert. Esto implica 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 cierta acción volcará su contenido contra la tabla cliente, luego de insertarse entonces el valor del tema 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 volver al editor. 6. Para probar este funcionamiento, ejecute el módulo de aplicación. Clic derecho sobre él y RUN. 7. Elija la Vista ClienteVO y pulse el boton (+) 8. Complete los datos. Note que el tema ClienteId se ha cargado con un valor temporal (-2) en este ejemplo. Es decir, no es indispensable llenarlo. Pulse el boton Commit 9. Notará que una vez que se grabo el registro se cargó el verdadero valor del atributo ClienteId, lo que demuestra que vuestra configuración ha sido correcta. ASIGNAR FECHA 10. Vuestra próximo 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. 11. A continuación, seleccione la categoría Attributes y haga doble clic sobre el atributo Fecha. 12. La pantalla que se presenta faculta 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 próximo enlace. 14. Realicé el paso 6, para probar los componentes. Elija ahora la vista MovimientoVO. 15. Pulse el botón para añadir un nuevo registro y note que se ha inicializado el tema Fecha con el valor actual. VALIDAR MOVIMIENTO 17. En el editor, elija la categoría ?Relationship? y en la sección Beahivior seleccion la casilla ?Composition Association? Si desea conocer más de este tipo de validaciones puede ir al próximo enlace. El primero ?Rule Definition?, faculta definir que norma decide que el dato procesado es Valido. El tercero ?Failure Handling? ayuda a personalizar el mensaje que deseamos arrojar al usuario cuando la validación no ha sido cumplida. Que implica todo esto?. Que se hará una validación del operador count de la relación, es decir del conteo de los detalles. Luego, se aguarda que el valor obtenido ?Sea Mayor que? un valor literal que ingresemos. En este caso 0. 20. Ahora elija la pestaña ?Failure Handling? y coloque el mensaje que se disparará cuando no se cumpla la validación. 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. 22. Ahora para ver el resultado de validación. Pulse el botón a nivel del movimiento. CALCULO DE UN ATRIBUTO TOTAL EN BASE A DETALLES. 25. Bueno, en vuestra situación necesitaremos proyecto 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 alternativa ?Edit java options? 26. Bien , esta consola proporciona la alternativa de asociar una clase java a la entidad y personalizar su comportamiento camino código. Seleccione la alternativa ?Generate Entity Object Class? y también la casilla de Accesors. 28. Haga doble clic sobre la clase MovimientoImpl.java y agreguemos el próximo método. public void calcularTotal(){ Analicemos el código que hemos colocado. Esté método se descubre en la entidad movimiento y lo que hace es : 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)); Haga doble clic sobre la entidad Detalle, de forma parecida al paso 25, para habilitar la creación de clases. Tal como se presenta a continuación. Revisemos que implica cada uno de sus checks. Generate Entity Object Class: Esto faculta 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 Habilítalo Nota adicional: Nosotros ejecutamos este método cuando pulsamos el botón de guardar cambios en la fundamento de datos ( ) 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 parecida 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 ( ) 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 ( ) 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 próximo manera. protected void doDML(int operation, TransactionEvent e) { 31. Notemos lo próximo, el método doDML se ejecuta cada vez que el usuario confirma una acción de añadir adaptar o descartar sobre la entidad detalle. Nosotros hemos incluido la próximo línea this.getMovimiento().calcularTotal(); Que lo que hace es calcular los detalles del movimiento vinculado y actualizar el atributo total del mismo. 32. Probemos este último cambio. Ejecute el modulo de aplicación y ubíquese en el viewlink que faculta ver los datos del movimiento y detalle, 33. Agregué un nuevo detalle usando el botón de Agregar Fila sobre los detalles 34. Ingrese valores pertinentes a ese detalle. 35. Finalmente, aplique los cambios de toda la transacción. 36. Finalmente notemos que el valor del total del movimiento se ha actualizado correctamente. 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 desea comparar su resultado, con vuestro código puede descargarlo del próximo enlace.