lde BORARRADOR GUIA DE PROGRAMACION EN JAVA - AVANCES Pasos a seguir Lo primero que tenemos que hacer una vez instalado el IDE Netbeans, en mi caso estoy usando la version 6.9, es crear un nuevo proyecto, para ello nos vamos en Archivo => Proyecto Nuevo
Esta opcin nos lleva a la ventana de Proyecto Nuevo donde elegimos la opcin Java = > Aplicacin Java, clic en el botn Siguiente.
Este botn nos lleva a la ventana de Nueva Aplicacin Java que tiene dos pasos: Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 2
1- Seleccionar el proyecto: Aqu asignamos el nombre del proyecto, en nuestro caso systok pero ustedes pueden aprovechar y poner el nombre de su proyecto. 2- Muy importante, se recomienda crear antes una carpeta en el disco C, en este caso lo llame systock, entonces en Ubicacin de proyecto elegimos el botn Examinar y buscamos esa carpeta creada, tambin dejamos desmarcado las check box Crear clase principal y Configurar como proyecto principal, luego clic en el botn Terminar.
Esto nos lleva a la ventana principal del proyecto donde podemos ver el nuevo proyecto creado. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 3
Podemos ver los archivos creados en la carpeta systock
El siguiente paso es crear nuestra ventana principal, para eso nos posicionamos sobre el nombre del proyecto clic derecho y elegimos Nuevo (New) = > Otro (Other) Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 4
Ahora seleccionamos en Categoras la carpeta Swing GUI Forms y en Tipos de Archivos la opcin Formulario Jframe, presionamos el botn Siguiente.
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 5
Ahora asignamos un nombre a nuestra clase y elegimos el botn Terminar.
Vista de la nueva ventana creada.
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 6
A continuacin en esta ventana vamos a crear los mens y los botones de nuestra aplicacin. Lo primero que hay que seleccionar para crear un men es elegir en la paleta Mens Swing la opcin Barra de Men (JMenuBar ) Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 7
Vista del men agregado Vista de aadir un nuevo men.
Ahora vamos a Editar nuestros mens con los siguientes nombres: Registros Consultas Reportes Utilitarios Salir Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 8
Para ello nos posicionamos sobre el men en nuestro caso File y damos clic derecho sobre el men y elegimos la opcin Editar texto.
Vista de los menus agregados
Ahora vamos a agregar los items de Men, para ello damos clic sobre el Men y elegimos la opcin Aadir de paleta = > Elemento de men (Jmenu Item). Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 9
Vita del Jmenu Item agregado
Vista del Jmenu Item agregado en el modulo Inspector. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 10
Ahora vamos a editar este men Item y le vamos a poner el nombre de Cliente, esto lo podemos hacer haciendo doble clic sobre el nombre del JmenuIten o en Propiedades = > text.
Ahora vamos a agregar ms MenuItems a nuestro men: Ciudades Barrio Direccin Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 11
Funcionarios Cargo Proveedores Stock. Salir Ahora podemos ver como quedara nuestro men.
Ahora creamos una carpeta dentro del proyecto donde vamos a guardar todas las imgenes que vamos a utilizar en nuestro proyecto. Siguiente paso vamos a personalizar nuestro Men, lo primero que vamos a hacer es cambiar el nombre de los mens y de los mens Items, para ello damos clic derecho sobre el nombre del men y elegimos la opcin Cambiar nombre de variable. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 12
Cambiamos el nombre por ejemplo menu_registros.
Luego cambiamos los restantes por: menu_consultas, menu_utilitarios, menu_salir. Lo mismo hacemos para todos los menuItem miten_clientes, miten_ciudades, miten_barrios, miten_direccion, miten_cargo, miten_funcionarios , miten_proveedores, miten_stock, miten_salir
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 13
Ahora siguiendo con los mens vamos a personalizar los y le agregamos algunos iconos a cada men, pero antes creamos una carpeta llamada imagen dentro del directorio del proyecto, esta carpeta debe tener todos los grficos que usaremos en nuestro proyecto. Ahora seleccionamos el men y nos vamos a las propiedades del men. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 14
Seleccionamos la opcin Icon, esto nos lleva a la ventana de miten_clientes, seleccionamos el radio botn Imagen externa y luego seleccionamos el archivo guardado en la carpeta imagen, en nuestro caso el archivo clientes.png
De esa manera podemos observar el icono que agregamos. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 15
Ahora vamos a agregarle a nuestro sistema unos accesos directos para acceder a los mens ms rpidamente, para ello seleccionamos el men correspondiente y nos vamos a sus propiedades y en la propiedad mnemonic ponemos los atajos correspondientes, para Registros por ejemplo podramos usar R.
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 16
Y as cambiamos los dems mens, n para consultas, r para Repostes, U para utilitarios y S para salir. Hacemos una pre visualizacin de la ventana y presionando la tecla Alt se pueden observar los atajos.
Ahora repetimos los mismos pasos pero esta vez con los mens Items, por ejemplo C para clientes, en Ciudades i, en Barrio B, en Direccin D, en Cargo o, en Funcionarios F, en Proveedores P, en Stock k y en Salir s.
Otra forma de crear accedo directo a los Items de Men es utilizando Atajos, para poder conseguir esto tenemos que utilizar la opcin accelerator que se encuentra en la ventana de Propiedades. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 17
Vamos a agregar un Atajo por ejemplo Ctrl+D.
Ahora damos clic en el Botn Aceptar. Luego ejecutamos muestra venta para observar los cambios. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 18
Tambin puedo eliminar un menuItem, en nuestro ejemplo eliminaremos el menuItem Stock, para ello nos posicionamos sobre l y elegimos la opcin Suprimir.
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 19
Tambin puedo agregar un men dentro del men Registro, para ello me posiciono sobre el men Registro, clic derecho sobre ella y elijo la opcin Aadir de paleta => Men.
Vista del nuevo men insertado.
Ahora vamos a cambiarle el nombre nuevamente y lo llamaremos Stock, tambin cambiamos el nombre de la variable por menu_stock, ahora visualizamos los cambios. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 20
Ahora agregamos dentro de este men Stock otros menuItems, y eso lo conseguimos de la misma manera que vimos en la parte de Mens. Estos serian los pasos a seguir: Nos posicionamos sobre el Men Stock, clic derecho y elegimos la opcin Aadir de paleta = > Elemento de Men. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 21
Editamos su nombre por Implantacin, tambin le agregamos todos los atajos vistos anteriormente. Luego agregamos dos elementos de men, Entrada de Stock y Salida.
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 22
Ahora vamos a ordenar nuestro men, aremos que el Men salir quede como la ltima opcin, para ello nos posicionamos sobre el men Salir, clic derecho y elegimos la opcin Desplazar hacia abajo, si queremos conseguir que suba asa arriba deberamos elegir la opcin Desplazar hacia arriba.
Ahora vamos a insertar separadores dentro de nuestro men, para ello nos vamos en el bloque Inspector, nos posicionamos sobre el men Registros, clic derecho sobre el men y elegimos la opcin Aadir de paleta = > Separador. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 23
De esa manera conseguimos insertar un separador dentro del men.
Ahora veamos como se ve el separador dentro del Inspector. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 24
Ahora movemos de lugar porque nos coloco el separador en la ltima parte debajo de Salir y yo lo quiero colocar encima por ejemplo, para ello nos posicionamos sobre el separador, damos clic derecho y elegimos la opcin Desplazar hacia arriba.
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 25
Vista del nuevo separador desplazado.
Ahora colocamos tres separadores ms para agrupar de cierta manera nuestros Mens.
Ahora vamos a personalizar un poco nuestra ventana principal, para ello nos vamos en la Paleta, en Conectores Swing elegimos la opcin Panel, que luego lo arrastramos sobre nuestra ventana, luego en sus propiedades cambiamos el color de fondo para poder manejarlo mejor, para ello en Propiedades cambio el background del Panel. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 26
Solo a modo de ejemplo vamos a insertar un Botn que lo llamaremos cliente, para ello nos vamos en Paleta = > Controles Swing y elegimos la opcin Botn.
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 27
Editamos el texto del botn y lo llamaremos Cliente, tambin cambiamos el nombre del botn por btn_cliente.
Ahora para asignar grficos al botn seguimos los mismos pasos que vimos con los Mens, nos vamos en Propiedades = > Icon y seleccionamos el grafico.
Ahora vamos a agregar una imagen de fondo, esta imagen podra ser la de la empresa a quien le estn diseando el software del trabajo practico, para ello insertamos de Paleta => Controles Swing una etiqueta Label, borramos el texto y seguimos los mismos pasos vistos anteriormente para agregar un grafico. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 28
Ahora solo nos queda compilar nuestro proyecto para ver que todo marcha bien, para ello nos posicionamos sobre el nombre del archivo, clic derecho y elegimos compilar o presionamos F9. Ahora vamos a cambiar el tamao de la ventana principal, para ello hacemos clic en la ventana y en Propiedades = > Cdigo cambiamos la opcin Normas sobre el tamao de los formularios en Generar cdigo para cambiar el tamao.
Con esta opcin nos abre la posibilidad de modificar el tamao, eso lo modificamos en Tamao del formulario. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 29
Ahora vamos a agregarle u titulo a nuestra ventana principal, para ello nos vamos en Propiedades = > title y ponemos el titulo por ejemplo Prototipo Sistema de Control de Stock .
Ahora podemos visualizar los cambios. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 30
Ahora vamos a crear tres paquetes, uno llamado utilitarios, el otro llamado registros y el otro llamado reportes, y para conseguir eso nos posicionamos sobre el nombre del proyecto, clic derecho y elegimos la opcin Nuevo = > Paquete Java.
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 31
Esto nos lleva a la ventana Nuevo paquete Java donde ponemos el nombre del Paquete y elegimos el botn Terminar.
Vista del nuevo paquete creado
Ahora vamos a trabajar un poco con Orientacin a Objetos y vamos a crear una clase Fecha que lo vamos a poder utilizar desde cualquier parte del proyecto, con eso nos evitamos la redundancia de cdigo, entonces antes de crear la nueva clase vamos a agregar a nuestra ventana principal el componente Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 32
etiqueta (Label), editamos el texto de la etiqueta a Fecha.:,, cambiamos el nombre por lbl_data y es este componente es el que va a recibir la fecha actual del sistema, tambin crearemos otra etiqueta llamada hora.
Ahora vamos a crear una nueva clase utilizando el paquete utilitarios, esta clase es la que va a tener toda la codificacin para manejar las fechas, para crear una nueva clase nos posicionamos sobre el paquete utilitarios, clic derecho y elegimos la opcin Nuevo = > Otro = > Archivo Java vacio Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 33
Pulsamos el botn Siguiente .
Pulsamos terminar y nos aparece el editor de NetBeans totalmente vacio. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 34
Luego le agregamos los siguientes cdigos a nuestro archivo vacio. package utilitarios; import java.util.Date; import java.text.SimpleDateFormat; public class data { //creamos 4 variables, tienen que ser pblicas para poder utilizar desde la VP public String mes, dia, anho, dia_semana, hora; SimpleDateFormat formatoHora = new SimpleDateFormat("HH:mm:ss");
public void leer_hora() { Date horaActual = new Date(); hora = formatoHora.format(horaActual); } public void el_dato() //metodo para leer el dato { Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 35
Date dato = new Date(); //creamos un objeto de tipo Fecha // mes = ""+ dato.getMonth();//varia de 0 y el "" convierte a String dia = ""+ dato.getDate(); anho = ""+ (1900+ dato.getYear());//agrega 112 por ser 2012 // dia_semana = ""+ dato.getDay();//retorna el dia de la semana de 0-6 //voy a dar formato al la fecha switch(dato.getMonth()) //0 a 11 { case 0: mes = "enero"; break; case 1: mes = "febrero"; break; case 2: mes = "marzo"; break; case 3: mes = "abril"; break; case 4: mes = "mayo"; break; case 5: mes = "junio"; break; case 6: mes = "julio"; break; case 7: mes = "agosto"; break; case 8: mes = "septiembre"; break; case 9: mes = "octubre"; break; case 10: mes = "noviembre"; break; case 11: mes = "diciembre"; break; } switch(dato.getDay()) { case 0: dia_semana = "domingo"; break; Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 36
case 1: dia_semana = "lunes"; break; case 2: dia_semana = "martes"; break; case 3: dia_semana = "mircoles"; break; case 4: dia_semana = "jueves"; break; case 5: dia_semana = "viernes"; break; case 6: dia_semana = "sbado"; break; } } } Ahora nos vamos a la ventana principal y all instanciamos e inicializamos nuestra clase data, tambin hacemos que nos muestre la fecha en la etiqueta Fecha.:, tambin hacemos que nos muestre la hora.
Obs: Solo se agregan los cdigos que estn en ROJO, los dems cdigos que podemos observar corresponde al cdigo generado por el IDE. import javax.swing.*; import utilitarios.*; import registro.*; public class Ventanaprincipal extends javax.swing.JFrame { Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 37
/** Creates new form Ventanaprincipal */ data mostrar_datos; public Ventanaprincipal() { initComponents(); mostrar_datos = new data(); mostrar_datos.el_dato();//primero tengo que ejecutar este metodo para despus ejecutar el resto lbl_data.setText("Hoy es "+mostrar_datos.dia_semana+ " "+mostrar_datos.dia+" de "+mostrar_datos.mes+" del ao "+mostrar_datos.anho); }
Como se darn cuenta, la hora aparece pero no lo actualiza, para conseguir que se actualice vamos a agregar a nuestro proyecto un componente llamado TimerBeans, este componente timer beans que nos sirve para ejecutar procesos en paralelo. Primero hay que descargar el componente TimerBeans.jar y guardarlo en la carpeta donde esta nuestro Java en C:\Archivos de programa\Java\jdk1.6.0_01\jre\lib\ext y pegar all el archivo. Luego tenemos que instalarlo dentro de la paleta, para ello nos vamos en Herramientas = > Paleta => Componente Swing/AWT . Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 38
Seleccionamos el botn Aadir de archivo JAR
Buscamos el archivo en :\Archivos de programa\Java\jdk1.6.0_01\jre\lib\ext Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 39
Presionar el botn Siguiente, vemos la ventana de Instalar componentes para paleta, seleccionamos el componente TimerBean y presionamos el Botn Siguiente.
Esto nos lleva a la ventana donde tenemos que elegir la carpeta donde quedara el componente, lo vamos a colocar en la categora Beans personalizados y presionamos el botn Terminar. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 40
Vista del nuevo componente agregado.
Presionamos el botn Cerrar y vemos como quedo la paleta Beans personalizados. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 41
Ahora vamos a hacer que actualice la hora de la ventana principal y para eso vamos a usar el componente Timer, para ello lo seleccionamos y lo arrastramos para colocarlos encima de la ventana principal.
Este componente agregado a la ventana principal no es visible sobre ella pero podemos encontrarlo en Inspector = > Otros componentes. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 42
Y para ejecutar el timer cada 1 segundo debemos agregarle cdigo al timer, para ello nos posicionamos sobre el Timer, clic derecho y elegimos la opcin Eventos = > Timer => onTime.
Ahora agregamos el cdigo correspondiente dentro del mtodo y lo ponemos en dentro del mtodo de la ventana principal el cdigo timer1.start(). Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 43
El cdigo que aparece abajo es lo que tenemos que colocar dentro del mtodo. mostrar_datos.leer_hora(); lbl_hora.setText("Hora actual: "+mostrar_datos.hora); Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 44
Ahora veamos cmo podemos hacer para salir del programa presionando el men Salir, para ellos nos posicionamos sobre el men, clic derecho y elegimos la opcin Eventos = > Mouse = > mouseClicked.
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 45
Esto nos lleva al editor donde ponemos el cdigo System.exit(0);, con esto podemos salir del programa, este mismo cdigo se aplicara en el caso que tuvisemos un Botn Salir.
Ahora siguiendo con nuestros ejemplos vamos a trabajar con la apariencia de nuestro proyecto, con el Look and Feel de la aplicacin, para ello creamos un metodo lookandfeel y a este mtodo vamos a agregarle el siguiente cdigo al nuestra ventana principal. Pero primero definimos la variable set_look tipo String
Luego creamos nuestro mtodo dentro de la Ventanaprincipal llamado lookandfeel() Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 46
Este es el cdigo del mtodos lookandfeel(). public void lookandfeel() { try { //La variable set look tiene que estar definida arriba como una variable String UIManager.setLookAndFeel(set_look); SwingUtilities.updateComponentTreeUI(this); } catch (Exception error) { JOptionPane.showMessageDialog(null, error); } }
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 47
Una vez creado el mtodo pasamos al siguiente paso que es agregar los cdigos que faltan dentro de la Ventana Principal. Primero declaramos nuestra variable y le asignamos un valor String set_look = "com.sun.java.swing.plaf.metal.MetalLookAndFeel";
Para poder llamar a esas apariencias, vamos a crear cuatro men tem en el men Utilitarios que llamaremos Look And Feel Windows, Look And Feel Liquid, Look And Feel Metal y Look And Feel - Nimbus
Ahora vamos a codificar cada uno de ellos, para eso colocamos el cursor sobre el Men, clic derecho y elegimos Eventos = > Action => actionPerformed Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 48
Estos Cdigos que aparecen en ROJO son los que tenemos que usar dentro del actionPerformed de cada Item de Men. Windows Liquid set_look = "com.birosoft.liquid.LiquidLookAndFeel"; lookandfeel(); Metal set_look = "javax.swing.plaf.metal.MetalLookAndFeel"; lookandfeel(); Nimbus set_look = "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"; lookandfeel(); Esto nos debera dar un error en dos de nuestras llamadas porque todava no importamos los componentes liquidlnf.jar y gtkswing.jar, al importarlos no nos debera dar ese error, para salvar este error nos vamos a biblioteca y all Agregamos el archivo JAR. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 49
Primero tenemos que agregar cada uno de los jar gtkswing,liquidlnf, etc. Ahora podemos ver los JAR agregados a nuestra biblioteca.
Luego ejecutamos nuestra ventana y all deberamos elegir en el men las diferentes opciones.
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 50
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 51
Programacin de las ventanas Vamos a continuar con la programacin de nuestro Sistema de Ventas, para ello vamos a comenzar creando un paquete al que llamaremos py.com.systven.bean, en ella vamos a guardar todas nuestras clases beans, como sabemos las clases Beans son clases persistentes o sea que vamos a tener que guardar los datos manipulados en ella, para crear un nuevo paquete nos posicionamos sobre la opcin Paquetes de fuentes clic derecho Nuevo => Paquete Java.
Vista de la creacin de nuevo Paquete Ahora le asignamos su nombre py.com.systven.bean, luego presionamos el botn Terminar.
Vista del Paso 2 de la creacin de Paquete java Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 52
Lo primero que tenemos que hacer es crear una conexin con nuestra Base de datos, para ello nos vamos en la pestaa Servicios y en Prestaciones encontramos Bases de datos, la seleccionamos, hacemos clic derecho y elegimos la opcin Nueva conexin de base de datos.
Vista de la prestacin Nueve conexin de Base de Datos. Luego en la ventana Nueva Conexin de Base de datos completamos los datos de la conexin, lo primero que definimos es el Nombre del controlador que para nuestro ejemplo es MySQL, luego el servidor que es localhost, continuamos con el puerto que para el MySQL es 3306, tambin completamos el nombre de la Base de Datos, para este ejemplo se llama sistvent, tambin completamos el Nombre de usuario y la Contrasea que para nuestro ejemplo est vaca (Obs: si definieron un usuario y contrasea diferente compltenla con esos datos)
Vista de la ventana Nueva conexin de base de Datos. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 53
Luego podemos observar que ya aparece en Prestaciones nuestra nueva conexin.
Vista de la nueva conexin creada. Ahora que ya tenemos nuestra conexin vamos a crear nuestro primer AMB, el que vamos a crear es de Unidad de Productos, para eso vamos a trabajar con la tabla unidad_prod del lado del servidor. Y como vamos a hacer eso?? Para ello nos vamos a posicionar sobre nuestro paquete view, damos clic derecho, elegimos la opcin Nuevo => Otro.
Vista de los pasos a seguir para la creacin de un formula de Ejemplo Maestro/Detalle. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 54
Esta accin nos lleva a la ventana Archivo Nuevo en Categoras elegimos Formularios de Interfaz grfica y en Tipos de Archivos elegimos la opcin Formulario de ejemplo maestro/detalle, hacemos clic en el botn Siguiente.
Vista del paso 1 para la creacin del formulario. En el paso 2 tenemos que asignar un nombre a nuestra clase, para nuestro ejemplo lo vamos a llamar UnidadProductoView, hacemos clic en el botn Siguiente.
Vista del paso 2 para la creacin del nuevo formulario. Luego en el paso 3 elegimos la conexin que nosotros queremos utilizar, para nuestro ejemplo vamos a usar la que definimos anteriormente.
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 55
Vista del paso 3 Tabla maestro. Tambin en esta ventana tenemos que definir qu tabla vamos a usar que para nuestro ejemplo es unidad_prod, una vez definida esta tabla podemos observar toda informacin sobre la Tabla maestro, o sea todos los datos que nos van a mostrar en la parte de arriba, esto ser una grilla, para java esto sera una JTable. Presionamos el botn Siguiente.
Vista del paso 3 Tabla Maestro. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 56
Para este ejemplo nosotros vamos a utilizar en el detalle campos de texto, o sea va a ser la misma tabla arriba y la mista tabla abajo, solo que en la cabecera vamos a tener los datos en un JTable y en el detalle campos de texto (TextField). Luego hacemos clic en el botn Terminar.
Vista del paso 4 Opciones de detalle. Vamos a esperar un rato para ver como Netbeans va a organizar los datos que est creando.
Vista de la creacin del formulario. Y ahora?? Bingo ya tenemos nuestra ventana UnidadProductoView creada. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 57
Vista de la nueva ventana UnidadProductoView. Netbeans creo por nosotros un formulario, en la cabecera un JTable donde podemos observar el cdigo y la descripcin de la unidad.
Vista del JTable creado. Tambin podemos observar en el detalle dos campos de textos con sus respectivas etiquetas Cod Unidad y Desc Unidad. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 58
Vista de las etiquetas y campos de textos creados. Ahora veamos cuales son los archivos que nos cre Netbeans? Este formulario que estamos observando corresponde al archivo UnidadProductoView.java y tambin nos cre otro archivo llamado UnidadProd.java, vamos a conversar dentro un rato sobre este archivo.
Vista de los archivo UnidadProductoView.java y UnidadProd.java. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 59
Tambin nos cre otro paquete llamado META-INF y dentro de ese paquete nos cre el archivo llamado persistence.xml, vamos a conversar dentro un rato sobre este archivo.
Vista del paquete META-INF junto con el archivo persistence.xml Ahora si nosotros nos vamos a la pestaa Inspector vamos a poder ver todos los componentes que contiene nuestra ventana.
Vista de los componentes creado por Netbeans. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 60
En el grafico por ejemplo podemos observar como Netbeans nos asign un nombre a nuestro JTextField, de la misma forma para las etiquetas y botones. En la opcin Otros componentes podemos observar que Netbeans esta utilizando un EntityManager, una Query y una List, tambin vamos a conversar un poco mas tarde sobre estos componentes.
Vista de los componentes creados dentro de Otros componentes. Ahora vamos a abrir nuestra Ventana Principal que lo tenemos en nuestro paquete de vistas (view).
Vista del men Unidad Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 61
Y aqu en Unidad nosotros vamos a agregar un evento, para ello la seleccionamos, hacemos clic derecho y elegimos las opciones Eventos => Action => actionPerformed.
Vista del nuevo evento a agregar. Y es en este punto donde nosotros vamos a agregarle un evento para nuestro men item Unidad.
Vista del mtodo vaco creado. Nuestro evento tiene que hacer lo siguiente, llamar al main a la ventana UnidadProductoView y pasarle unos argumentos, entonces nosotros vamos a llamar a nuestro mtodo main directamente aqu. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 62
Vista del cdigo agregado dentro del evento Ahora que es lo que tiene que hacer el mtodo main en nuestro UnidadProductoView.java?? Para ello nos vamos a UnidadProductoView.java y en la fuente vamos a tener que agregar algunos cdigos, el mtodo main se encuentra al final.
Vista del mtodo main. Vemos que esta instanciando a nuestro JFrame, luego esta colocando una instancia de UnidadProductoView dentro del Frame, si nosotros observamos en el Inspector vemos que UnidadProductoView es un JPanel, entonces el coloca este JFrame dentro del Frame, luego Netbeans asigna una operacin de EXIT_ON_CLOSE al frame, esa parte lo vamos a comentar, luego coloca un .pack y por ultimo lo hace visible. Ahora nuevamente dentro del actionPerformed vamos a llamar a nuestro main y le vamos a pasar dentro de ella el ttulo que va a tener nuestra ventana, lo vamos a pasar en el main como un parmetro. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 63
Vista de los nuevos cdigos agregados. Luego nos vamos nuevamente al mtodo main y agregamos una lnea de cdigo mas.
Vista del nuevo cdigo agregado Esto nos va a dar un pequeo error y vemos que para que esta clase pueda ser acezada de forma interna frame.setTitle(args[0]);
Vista del tipo de error a corregir. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 64
Entonces ese parmetro tiene que ser de tipo final, lo cambiamos y ahora vemos que ya no nos ese inconveniente.
Vista del error corregido Ahora vamos a cambiar de lugar el archivo UnidadProd.java, para ello seleccionamos el archivo UnidadProd.java, lo arrastramos y soltamos sobre el paquete py.com.systvent.bean.
Vista del archivo a ser cambiado. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 65
Esta accin hace que aparezca la ventana Mover clase, luego simplemente elegimos la opcin Reestructurar para que Netbeans haga los imports necesarios y sobrescriba los cdigos.
Vista de la ventana Mover clase. Luego Netbeans se toma unos segundos para terminar con la reestructuracin.
Vista de la venta Mover clase en el momento de la reestructuracin. Ahora podemos observar dentro de nuestro paquete py.com.systvent.bean el archivo UnidadProd.java reestructurado. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 66
Vista de archivo dentro del paquete py.com.systvent.bean Una vez que ya cambiamos de lugar nuestro archivo lo vamos a ejecutar nuestra Ventana Principal para ver cmo est quedando, para ello nos posicionamos sobre ella, hacemos clic derecho y elegimos la opcin Ejecutar archivo.
Vista de la accin Ejecutar archivo. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 67
Vista de la ventana de Sistemas Ventas Luego nos vamos al men Unidad para llamar a la ventana Registro de Unidad.
Vista del men Unidad. Ahora ya tenemos lista nuestra ventana Registro de Unidad de Producto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 68
Vista de la ventana Unidad de Producto. Ahora vamos a agregar un nuevo registro para ello hacemos clic en el botn New.
Vista del nuevo campo disponible. Con esta accin tenemos los campos de textos disponibles, ac tenemos que tener cuidado por el cdigo de la unidad porque esta en Autoincremento, eso lo podemos ver si miramos la estructura de nuestra tabla en la Base de Datos. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 69
Vista del valor Autoincremento del lado de la Base de Datos. Entonces por el momento lo vamos a dejar en blanco el Cdigo y completamos la Descripcin de la unidad, para la descripcin vamos a colocar Lts (Litros).
Vista de la nueva descripcin agregada. Observemos que al escribir en el campo de texto ya aparece en la lista de la cabecera, luego hacemos clic en el botn Save, ahora nos vamos a la Base de Batos para ver si realmente guardo nuestro registro. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 70
Vista del nuevo registro agregado. Vemos que nuestros datos fueron persistidos dentro de la Base de datos. Tambin podemos observar estos datos desde Netbeans para ello nos vamos a Prestaciones, elegimos el nombre de la base de datos que para nuestro ejemplo es sistvent, luego el nombre de nuestra tabla unidad_prod, hacemos clic derecho sobre ella y elegimos la opcin Mostrar datos.
Vista de las tablas desde Netbeans. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 71
Vista del nuevo registro agregado desde Netbeans. Ahora vamos a tratar de seguir la lgica que Netbeans utilizo para generar todos estos cdigos. En primer lugar Java tiene una API llamada Java Persistence API que es conocido como JPA, Netbeans utiliza esta API conjuntamente con un Framework SWING para que los datos guardados dentro de la Base de Datos estn sincronizados o mapeados con los elementos de SWING y que elementos son esos??
Vista de las Propiedades de SWING Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 72
Son todos los elementos que observamos dentro de la paleta de Propiedades. Pero como es que Netbeans hace eso?? Esta ventana UnidadProductoView tiene una JTable, los JTextField y los botones. Veamos las Propiedades de cada uno de ellos.
Vista de las propiedades de JTAble. Si nosotros nos vamos en la pestaa Enlace tambin conocido como Binding, observamos que nuestra JTable esta vinculada a una lista (list).
Vista de la pestaa Enlace. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 73
En la pestaa Eventos ella no aparece ningn evento por el momento.
Vista de la pestaa Eventos. Y en la pestaa Cdigo el nombre de la variable es masterTable y no se observa ninguna generacin de cdigo importante aqu, la parte interesante es que nuestra JTable esta vinculada con una lista (list).
Vista de la pestaa cdigo. Ahora si hacemos clic en nuestro JTextfield en sus Propiedades vamos a poder observar que tiene un enlace a un Elemento de masterTable, ese elemento es nuestro JTable de la cabecera, tambin podemos observar que tiene una opcin enabled, esto nos indica que esta habilitada cuando un elemento del JTable de la cabecera es seleccionado. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 74
Vista de la pestaa Enlace En la pestaa Eventos no se observan eventos importantes.
Vista de la pestaa Eventos. En la pestaa Cdigo tampoco vemos que tenga un cdigo importante generado, podemos observar que tiene una Serializacion para pasar los datos a la Base de Datos, el Nombre de la variable y el tipo de Modificador de la variable es privada. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 75
Vista de la pestaa Cdigo. Ahora miremos que tenemos en las Propiedades de nuestros botones, comenzamos con el botn New. En la pestaa Eventos podemos observar que tenemos un evento del tipo actionPerformed.
Vista de la pestaa Eventos. En la pestaa Enlace observamos que no tiene enlace por el momento. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 76
Vista de la pestaa Enlace. En Propiedades observamos que son las propiedades comunes a un botn.
Vista de la pestaa Propiedades. En la pestaa Cdigo observamos el Nombre de la variable, el tipo de Modificador de variable, el Cdigo generado, etc. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 77
Vista de la pestaa Cdigo. Ahora pasamos al botn Delete en la pestaa enlace observamos que tiene un enabled, que pone disponible la fila seleccionada en el JTable.
Vista de la propiedad Enlace del botn Delete Tambin podemos observar que tiene un evento asociado a ella llamado deleteButtonActionPerformed.
Vista de la propiedad Eventos del botn Delete. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 78
En la pestaa Cdigo tiene los mismos valores que el observado en el botn New.
Vista de las propiedades de la pestaa Cdigo del botn Delete. Los mismos valores podemos observar para los botones Refrech y Save, ambos tienen eventos. Ahora cmo es que los datos aparecen aqu en la cabecera del JTable y en los TextField?? En primer lugar si nosotros nos vamos en la pestaa Inspector podemos observar los tres componentes que contiene la opcin Otros Componentes.
Vista de los componentes desde el Inspector. Tambin esos mismos componentes aparecen aqu en nuestra paleta de Propiedades, en el enlace Persistencia de Java (JavaPersistence), all nosotros tenemos un Administrador de entidades, tambin tenemos una Consulta y tambin tenemos un Resultado de una consulta. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 79
Vista de los componentes desde la paleta. Veamos que son cada uno de estos componentes. El Administrador de entidades es nuestra entityManager y que es lo que hace??
Vista del componente entityManager. Nuestra entityManager ella va a estar enlazado a una Unidad de Persistencia, en este caso est siendo llamada sistventPU (PU PersistenceUnit).
Vista de las propiedades del entityManager. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 80
Pero donde esta esa unidad de Persistencia que vemos all?? Esa Unidad de persistencia la vamos a encontrar dentro del paquete META_INF y dentro de ella el archivo persistence .xml.
Vista del archivo persistence.xml dentro del paquete META-INF. Veamos ahora sus Propiedades, observamos que tiene como nombre persistence y que su extensin es xml.
Vista de las propiedades del archivo persistence.xml Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 81
Le damos doble clic y nos lleva directo a la ventana de Diseo.
Vista Diseo del archivo persistence.xml. Al elegir la pestaa Operador XML nos lleva directamente a la fuente, aqu podemos observar que la unidad de persistencia (persistence-unit) es sistventPU, entonces lo que tenemos aqu es un archivo de persistencia que controla esa persistencia con la Base de Datos o sea es nuestro archivo de mapeamiento, el tipo de transaccin es local, Netbeans esta usando como proveedor de persistencia toplink, eso es lo que nos muestra nuestro provider que va a implementar JPA, aqu estamos teniendo una visin general, el otro proveedor que utiliza JPA que ya vimos en la clase pasada es Hibernate, existen otros pero en este caso nosotros estamos utilizando toplink de Oracle.
Vista Operador xml del archivo persistence.xml. Vemos tambin que el crea una clase de persistencia que es la clase UnidadProd, al rato vamos a abrir esa clase y veremos que tiene dentro de ella, luego tenemos las propiedades de conexin que son el usuario, la contrasea, la url y el driver que estamos utilizando, para nuestro ejemplo es mysql. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 82
Vista de las propiedades del archivo persistence.xml. Bien vimos que tiene ese archivo persistence-unit explorando el cdigo xml. Ahora enlazado a esa entityManager nosotros tenemos una Query, tambin ahora ya sabemos que esa entityManager esta enlazado directamente a nuestra Entity o Entidad. Esa entidad es un EnterpriceJavaBeans o sea nuestro archivo UnidadProd.java que es una JB (JavaBeans).
Vista del archivo UnidadProd.java Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 83
Ahora veamos que contiene nuestro JavaBeans. Podemos observar que es un bens normal pero con algunas anotaciones muy interesantes como @Entity, @Table, @NamedQueries, etc.
Vista de las anotaciones que contiene el archivo UnidadProd.java La anotation @Entity nos esta informando que los que tenemos aqu es una entidad que esta vinculada a una Base de Datos. El anotation @Table nos indica el nombre de la tabla y el esquema que tiene que utilizar, en este caso nosotros no definimos ningn esquema para nuestra Base de Datos. Tambin tenemos un anotations @NamedQueries que lo que hace es traernos una serie de consultas, podemos observar en el select que no esta utilizando el SQL normal que solemos usar sino que esta usando un SQL propio del JPA y lo que esta haciendo all es una consulta para cada campo de la tabla unidad_prod. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 84
Vista de la consultas dentro de los @NamedQuery. Despus vemos que comienza all con la definicin de la clase UnidadProd que implementa Serializable. Tambin observamos la anotacin @Id que nos indica que es la clave primaria, en este caso la clave primaria es CodUnidad, este el nombre que le asigna Java y del lado de la base de datos observamos que el nombre del campo es cod_unidad. Tambin observamos que Netbeans declara aqu todos los atributos de forma privada respetando as el principio de encapsulamiento y despus observamos que Netbeans fue declarando los mtodos gets y los sets, todos ellos con visibilidad pblica.
Vista de los atributos y mtodos creados. Entonces despus de esto nosotros sabemos que tenemos una query y que esa query en sus propiedades ella tiene una consulta SELECT u FROM UnidadProd u, tambin observamos que est vinculada a nuestro entityManager que est apuntando directamente a nuestro Bean y que este Bean esta a la vez vinculado o mapeado con una tabla del lado de la Base de Datos. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 85
Vista de las propiedades del componente query. En la pestaa Eventos no observamos nada interesante y en el de Cdigo tampoco, por lo tanto nuestra query va a estar ejecutando una consulta travs de aquel bean solo que esa consulta no puede venir directamente para nuestra Cabecera JTable ni para nuestro detalle JTextField y entonces que es lo que sucede ac?? Esta consulta ella genera directamente una lista y dicha lista es observada dentro del Query.
Vista del componente List dentro del Inspector. Veamos las Propiedades que contiene nuestra lista: En la pestaa Cdigo podemos observar que ella crea aqu una lista. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 86
Vista de las Propiedades del componente list. Y esta lista es la que va a estar vinculada a nuestro query, tambin esa lista va a estar marcada como Observable o sea nuestra lista ser observable, eso significa que todos los cambios que realicemos en nuestra query va a tener influencia en la lista, entonces si hacemos cambios del lado de la Base de Datos esos cambios van a ser visible en nuestro JTable, porque?? Porque si nos fijamos en las propiedades de nuestro JTable ella esta vinculada a nuestra lista
Vista de la ventana masterTable Pestaa Enlace. Resumiendo ahora ya sabemos que necesitamos de un Bean marcado con la anotacin @Entity y ese bean va a estar mapeado a una de mis tablas del lado de la BD y todo este cdigo Netbeans nos genero, luego observamos que necesitamos de los tres componentes vistos anteriormente para poder persistir los datos, nuestro entityManager va a estar enlazado a una Unidad de persistencia que es un archivo Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 87
xml, despus nos creo nuestro Formulario grafico con todas las vinculaciones vistas anteriormente, siendo que entityManager apunta a una query que a la vez apunta a una consulta y la lista que apunta para el query, la JTable apunta a esa lista y los JTextField apuntan a una de las columnas de nuestro JTable. Ahora continuando con el diseo de nuestra ventana nosotros no queremos que aparezca ese cdigo all ya que es generado, entonces vamos a sacar eso de ah siguiendo los siguientes pasos: Seleccionamos nuestra JTable, hacemos clic derecho y elegimos las opciones Enlazar => elements.
Vista de los pasos a seguir Esto nos lleva a la ventana Enlace masterTable.elements donde pasamos la opcin codUnidad del lado de Disponible, luego hacemos clic en el botn Aceptar.
Vista de la ventana Enlace masterTable.elements. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 88
Ahora nos vamos en nuestra ventana UnidadProductoView y all eliminamos la etiqueta Cod Unidad y el campo de texto que corresponde al Cdigo de Unidad.
Vista de la etiqueta y campo de texto a eliminar. Ahora podemos observar los cambios realizados a nuestra ventana.
Vista de la Ventana UnidadProductoView. Como podemos realizar de forma manual nuestro AMB sin usar la opcin Formulario de Ejemplo Maestro / Detalle?? Ahora vamos a ver cmo podemos hacer nuestro registro de una forma manual, entonces no vamos a usar esa opcin formulario Maestro / Detalle, entonces lo primero que vamos a hacer es crear nuestro Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 89
archivo bean, para nuestro ejemplo vamos a tomar la tabla departamento, para ello seguimos los siguientes pasos: Nos posicionamos sobre el paquete py.com.systvent.bean, hacemos clic derecho Nuevo => Otro.
Vista de los pasos a seguir para crear un archivo bean. Esta accin nos lleva a la ventana Archivo donde en Categoras elegimos Persistence y en Tipo de Archivos elegimos la opcin Clases entidad a partir de bases de datos.
Vista Paso 1 para la creacin de una Clase entidad a partir de bases de datos. Hacemos clic en el botn Siguiente, esta accin nos lleva a la ventana Nuevo Clases entidad a partir de bases de datos, donde tenemos que elegir en Tablas disponibles la tabla a partir de la cual vamos a generar nuestro archivo, para nuestro ejemplo elegimos departamento, luego hacemos clic en el botn Agregar. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 90
Vista paso 2 Tablas de bases de datos. Ahora podemos observar que departamentos ya se encuentra del lado de Tablas seleccionadas, pulsamos el botn Siguiente.
Vista del paso 2 de la creacion de una Nueva Clase entidad a partir de una base de datos. En el paso 3 podemos observar que Netbeans va a generar el nombre de la clase aqu que ser Departamento y tambin que nos va a generar las anotaciones para los campos persistentes, ahora hacemos clic en el botn Siguiente. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 91
Vista del paso 3 Clases entidad Esta accin nos lleva al paso 4 donde aparecen las diferentes Opciones de mapeo que podemos elegir, finalmente hacemos clic en el botn Terminar.
Vista del paso 4 Opciones de mapeo. Ahora podemos observar nuestra clase entidad creada con todas las anotaciones y mtodos que vamos a necesitar. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 92
Vista del cdigo generado del archivo Departamento.java Muy bien ahora que creamos nuestra clase bean pero nos falta crear nuestra clase visual, entonces vamos a continuar con eso, como ya se comento anteriormente el tipo de formulario que estamos utilizando es JFrame, entonces vamos a crear uno ahora para ello seguimos los siguientes pasos: Nos posicionamos sobre nuestro paquete py.com.systvent.view, hacemos clic derecho sobre ella y elegimos las opciones Nuevo => Formulario JFrame.
Vista de los pasos a seguir para la creacin de un formulario Jframe. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 93
Vamos a darle un nombre a nuestro formulario, en nuestro ejemplo lo vamos a llamar DepartamentoView, luego le damos clic en Terminar.
Vista del paso 2 Nombre y ubicacin. Ahora ya podemos observar nuestro nuevo formulario JFrame creado.
Vista del nuevo formulario creado. Ahora vamos a comenzar insertando una Lista dentro de nuestro formulario, para ello nos vamos a nuestra Paleta y en Contenedores Swing elegimos Tabla. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 94
Vista del componente Tabla dentro de la Paleta. Lo nico que tenemos que hacer ac es seleccionar la tabla y colocarlo sobre nuestro formulario.
Vista de la nueva tabla agregada. Luego vamos a tener que agregar a nuestra ventana una etiqueta, un campo de texto y 4 botones. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 95
Vista de los componentes agregados Ahora lo que vamos a hacer es cambiar los nombres a los botones, asignar los nombres a las variables de los botones por ejemplo btn_Nuevo, btn_Eliminar, etc.
Vista de los cambios a los nombre de botones Ahora nos falta adicionar nuestra Persistencia de Java entonces vamos a comenzar agregando nuestro Administrador de entidades que ser nuestro entityManager, la seleccionamos y luego la soltamos sobre nuestra ventana DepartamentoView.java. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 96
Vista del componente Administrador de entidades agregado. En el siguiente paso agregamos nuestra Consulta, para ello la seleccionamos y luego la soltamos sobre nuestra ventana DepartamentoView.java.
Vista del componente Consulta agregado. Por ltimo agregamos nuestro Resultado de la consulta, para ello seguimos los mismos pasos vistos anteriormente, la seleccionamos para despus soltarla sobre la ventana DepartamentoView.java. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 97
Vista del componente Resultado de la consulta agregado Ahora veamos en el Inspector los componentes que agregamos a nuestro formulario.
Vista de los componentes agregados. Ahora vamos a comenzar a configurar los componentes agregados, primero vamos a configurar nuestro entityManager y esa configuracin lo vamos a hacer en sus Propiedades. En la ventana de Propiedades podemos observar que ella esta apuntando a sistventPU y el tipo de flushMode esta en Predeterminado. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 98
Vista de las propiedades del entityManager. En las pestaas Enlace y Eventos no tiene nada y Cdigo cambiamos el nombre a entityManager.
Vista de las Propiedades de la pestaa Cdigo del entityManager. Ahora vamos a configurar nuestra Query, para ello nos vamos en sus Propiedades, agregamos una consulta SELECT d FROM Departamento d, notemos que en este punto agregamos el nombre de nuestro Bean y no el nombre de la tabla que est del lado de la Base de Datos, nos aseguramos que la opcin entityManager apunte al entityManager que agregamos anteriormente. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 99
Vista de las Propiedades del componente query. En la pestaa Cdigo cambiamos el nombre de la variable por query.
Vista de las Propiedades de del query en la pestaa Cdigo. Ahora vamos a configurar nuestra lista y para ello seguimos los mismos pasos vistos anteriormente, en la pestaa Propiedades hacemos que apunte a query y marcamos para que sea observable. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 100
Vista de la ventana list1 Propierties. En Eventos no tenemos nada y en la pestaa Cdigo cambiamos el Nombre de la variable a list, pero tambin ac en Parmetro de tipo tenemos que agregar el Bean con el cual vamos a estar trabajando, que en este caso es <py.com.systven.bean.Departamento>.
Vista de las Propiedades de la pestaa Cdigo. Muy bien entonces de esta manera ya configuramos nuestros componentes de persistencia, ahora vamos a seguir configurando los otros Componentes Visuales. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 101
Vamos a comenzar con nuestra tabla, la seleccionamos y luego hacemos los cambios en sus propiedades, el primer cambio que vamos a hacer es agregarle un enlace a nuestra lista, para ello en la pestaa Enlace en la opcin elements hay que indicarle donde se encuentra nuestra lista para ello hacemos clic en el selector.
Vista de la propiedad elements de la pestaa Enlace. Esto nos lleva a la ventana de Enlace donde tenemos que Enlazar la fuente y la expresin.
Vista de la ventana Enlace. Luego desplegamos las opciones de Enlazado de fuente y elegimos la opcin list, ahora hacemos clic en el botn Aceptar. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 102
Vista de la opcin List dentro de la ventana Enlace. Luego en Seleccionado aparecen los dos atributos pero para nuestro ejemplo solo necesitamos el atributo nombreDepartamento.
Vista de los campos seleccionados. Entonces vamos a pasar el atributo codDepartamento del lado de Disponible, luego hacemos clic en el botn Aceptar. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 103
Vista de los elementos Disponible y Seleccionado. Ahora podemos observar nuestra ventana con tabla enlazada a nuestra lista de Departamentos.
Vista de los cambios ocurridos en la ventana DepartamentoView. Ahora el otro cambio que tenemos que hacer es en la pestaa Cdigo, en Nombre de la variable vamos a cambiar el nombre Jtable1 por masterTable. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 104
Vista del Nombre de variable Table1
Vista del cambio de Nombre de variable a masterTable. Ahora vamos a pasar a configurar las propiedades de nuestro JTextField, entonces seleccionamos nuestro JTextField le damos clic derecho Enlazar => text. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 105
Vista del JTextField a enlazar. Nosotros sabemos que nuestro JTextField tiene que estar vinculado a nuestro masterTable y el Enlazado de expresin en ${selectedElement.nombreDepartamento}
Vista de la ventana Enlace JTextField. En la pestaa Avanzado marcamos la opcin Valor de fuente ilegible y dejamos las opciones por defecto, luego elegimos el botn Aceptar.
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 106
Vista de la pestaa Avanzado de la ventana JTextField1. Ahora el otro cambio que tenemos que en las Propiedades dentro de la pestaa Enlace, en enabled tenemos que agregar algunas opciones.
Vista de la pestaa Enlace Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 107
En la pestaa Enlace la opcin Enlazado de fuente tiene que apuntar a nuestra masterTable y Enlazado de expresin a ${selectedElement != null}, o sea cuando el elemento seleccionado sea distinto de nulo, en la pestaa avanzado no tocamos nada y por ultimo hacemos clic en el botn Aceptar.
Vista de la ventana Enlace. Ahora siguiendo con la configuracin en la pestaa Cdigo cambiamos el Nombre de la variable por nombreDepartamentoField.
Vista de las Propiedades de la pestaa Cdigo. Muy bien con esto terminamos la configuracin de estos componentes visuales ahora vamos a configurar cada uno nuestros botones. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 108
Vista de la ventana DepartamentoView. Lo primero que vamos a hacer es modificar las Propiedades de nuestro botn Eliminar, para ello nuevamente nos vamos en sus Propiedades y en la pestaa Enlace escribimos el siguiente cdigo en la opcin enabled masterTable[${selectedElement != null}].
Vista del cdigo agregado en la propiedad enabled de la pestaa Eventos. Luego vamos a agregarle a cada uno de nuestros botones los eventos correspondientes, comencemos con el botn Nuevo, para ello seguimos los siguientes pasos: Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 109
Nos posicionamos sobre nuestro botn Nuevo, hacemos clic derecho Eventos => Action => actionPerformed.
Vista de los pasos a seguir para agregar un nuevo evento. Ahora podemos observar la vista del evento actionPerformed del botn Nuevo.
Vista del evento actionPerformed agregado. A este evento le tenemos que agregarle los siguientes cdigos: Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 110
py.com.systven.bean.Departamento d = new py.com.systven.bean.Departamento(); entityManager.persist(d); list.add(d); int row = list.size()-1; masterTable.setRowSelectionInterval(row, row); masterTable.scrollRectToVisible(masterTable.getCellRect(row, 0, true));
Vista del cdigo agregado. Ahora vamos a continuar con el cdigo del botn Eliminar, para ello seguimos los mismos pasos vistos anteriormente, nos posicionamos sobre nuestro botn Eliminar, hacemos clic derecho y elegimos las opciones Eventos => Action => actionPerformed.
Vista de los pasos a seguir para agregar un nuevo evento. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 111
Ahora podemos observar la estructura del nuevo evento agregado.
Vista del nuevo evento agregado Ahora le agregamos los siguientes cdigos a nuestro evento int[] selected = masterTable.getSelectedRows(); List<py.com.systven.bean.Departamento> toRemove = new ArrayList<py.com.systven.bean.Departamento>(selected.length); for (int idx=0; idx<selected.length; idx++) { py.com.systven.bean.Departamento d = list.get(masterTable.convertRowIndexToModel(selected[idx])); toRemove.add(d); entityManager.remove(d); } list.removeAll(toRemove);
Vista los cdigos agregados dentro del evento. Como vemos nos da un error, eso es porque no importamos las bibliotecas que permiten manipular nuestro ArrayList y nuestro List, para corregir eso hacemos clic derecho sobre nuestro editor y elegimos la opcin Reparar importaciones. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 112
Vista de la opcin Reparar importaciones. En la ventana Reparar todos los imports podemos observar las importaciones que nos faltan y hacemos clic en el botn OK.
Vista de la ventana Repara todos los imports. Ahora en la fuente podemos observar todos los imports que hizo Netbeans .
Vista de los paquetes importados Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 113
Vista del cdigo sin el error anterior. Ahora vemos que ya desaparecieron los errores de importacin Ahora vamos a agregar los eventos del botn Actualizar, tambin seguimos los mismos pasos vistos anteriormente.
Vista de los pasos a seguir para crear un nuevo evento.
Vista de la estructura del evento creado. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 114
Luego agregamos los siguientes cdigos a nuestro evento. entityManager.getTransaction().rollback(); entityManager.getTransaction().begin(); java.util.Collection data = query.getResultList(); for (Object entity : data) { entityManager.refresh(entity); } list.clear(); list.addAll(data);
Vista de los cdigos agregados. Ahora vamos a programar nuestro botn Guardar siguiendo siempre los mismos pasos vistos anteriormente con los otros botones.
Vista de los pasos a seguir para agregar un nuevo evento. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 115
Vista del nuevo evento agregado al botn Guardar. Ahora a nuestro evento le agregamos las siguientes lneas de cdigo: try { entityManager.getTransaction().commit(); entityManager.getTransaction().begin(); } catch (RollbackException rex) { rex.printStackTrace(); entityManager.getTransaction().begin(); List<py.com.systven.bean.Departamento> merged = new ArrayList<py.com.systven.bean.Departamento>(list.size()); for (py.com.systven.bean.Departamento d : list) { merged.add(entityManager.merge(d)); } list.clear(); list.addAll(merged); }
Vista de los nuevos cdigos agregados. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 116
Como podemos observar nos da un pequeo error y es porque nos faltan algunas bibliotecas, entonces vamos a importarlas, para ello hacemos clic derecho sobre la fuente y elegimos la opcin Reparar importaciones.
Vista de la opcin Reparar importaciones.
Vista de las bibliotecas importadas. Muy bien ahora nos falta agregar algunos cdigos en el constructor de nuestra ventana DepartamentoView.
Vista del mtodo constructor de la ventana DepartamentoView. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 117
Ahora le agregamos los siguientes cdigos : if (!Beans.isDesignTime()) { entityManager.getTransaction().begin(); }
Vista de los nuevos cdigos agregados. Reparamos las importaciones que nos faltan para salvar este error.
Vista de la opcin Reparar importaciones. Ahora podemos observar las importaciones de las bibliotecas que Netbeans hizo para nosotros.
Vista de las bibliotecas importadas. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 118
Muy bien ahora nos vamos a nuestra Ventana Principal y ah vamos a configurar nuestro men Departamento siguiendo los mismos pasos vistos anteriormente.
Vista de los mens de la Ventana Principal.
Vista de los pasos a seguir para agregar un evento al tem de men Departamento. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 119
Ahora agregamos los siguientes cdigos dentro del evento agregado. String args[] = new String[1]; args[0] = "Registro de Departamento"; DepartamentoView.main(args);
Vista de los cdigos agregados. Ahora vamos a agregar algunos cdigos al mtodo main de nuestra ventana DepartamentoView, vamos a agregar los siguientes cdigos, tambin no hay que olvidar que en mtodo main el tipo de parmetro que le pasamos debe ser final. DepartamentoView d = new DepartamentoView(); d.setVisible(true); d.setTitle(args[0]);
Vista de los cdigos agregados dentro del mtodo main. Bueno ahora solo nos queda probar si est funcionando como queremos, para ello nos vamos a la Ventana principal y de ah vamos a llamar a nuestra ventana de Departamento. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 120
Vista la opcin Ejecutar archivo. En la Ventana Principal elegimos el tem de men Departamento.
Vista del tem de men Departamento. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 121
Esta accin nos lleva a la ventana de Registro de Departamento.
Vista de la ventana Registro de Departamento. Ahora vamos a presionar el botn Nuevo, luego cargamos los datos
Vista del dato agregado dentro del campo de texto. Ahora vamos a nuestra Base de Datos para ver si nos guardo nuestro nombre de Departamento
Vista del registro agregado dentro de la Base de Datos. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 122
Vemos que nos guardo nuestro nuevo registro con el cdigo autogenerado. Ahora si observamos nuestro detalle notamos que Ventas no aparece en la cabecera (JTable) le falta esta funcionalidad, entonces esa parte de la funcionalidad queda como tarea para ustedes, al final nuestra ventana debera verse de esta manera.
Vista de la ventana Registro de Departamento con todas sus funcionalidades.
Programacion paso a paso de la ventana Cliente
Ahora vamos a continuar con nuestro ABM, el siguiente ejemplo es un poco mas complejo que lo visto anteriormente, ahora vamos a crear el formulario para Registro de clientes, para ello vamos a seguir los siguientes pasos: Nos posicionamos sobre el paquete py.com.systvent.view, hacemos clic derecho sobre ella y elegimos las opciones Nuevo => Formulario de ejemplo maestro/detalle. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 123
Vista de los pasos a seguir para crear un nuevo formulario Ejemplo maestro/detalle. Esta accin nos lleva al paso 2 de la ventana de Nuevo Formulario maestro/detalle donde tenemos que agregar el nombre de nuestra ventana, para nuestro ejemplo lo vamos a llamar ClienteView, hacemos clic en el botn Siguiente..
Vista del paso 2 de la ventana Nuevo Formulario maestro/detalle. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 124
Recordemos que es nuestro cdigo del lado de la Base de Datos es autonumerico as que no vamos a necesitar del cdigo del cliente, entonces en el paso 3 Tabla maestro elegimos la Tabla de la Base de datos y el campo cod_cli lo pasamos del lado de Columnas disponibles, luego hacemos clic en el botn Siguiente.
Paso 3 de la ventana Nuevo Formulario maestro/detalle Tabla maestro En este punto 4 no vamos a usar en el detalle Cuadros de textos sino que vamos a usar otra tabla, por eso seleccionamos la opcin cliente_direccion, tampoco en este punto queremos que aparezca el cdigo de la direccin ya que es autonumerico, entonces pasamos el campo cod_direccion del lado de Columnas disponibles, por ultimo hacemos clic en el botn Terminar.
Vista del paso 4 Opciones de detalle. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 125
Esta accin puede durar algunos segundos porque Netbeans nos esta creando todos los cdigos que vamos a necesitar.
Vista de la creacin del Formulario Maestro/Detalle. Tambin en nuestro proyecto observemos que Netbeans nos creo dos archivos Beans que son Cliente.java y ClienteDireccion, vamos a pasar estos archivos al paquete beans, para ello los seleccionamos y lo arrastramos sobre el nombre del paquete.
Vista de los archivos beans generados. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 126
Esta accin hace que aparezca la ventana Mover Clases, hacemos clic en el botn Reestructurar para que Netbeans nos reestructure todos los cambios necesarios.
Vista de los archivos a ser reestructurados. Ahora vamos a observar que ya tenemos nuestros archivos bean justo donde queremos en nuestro paquete py.com.systvent.bean.
Vista de los archivos dentro del paquete py.com.systvent.bean. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 127
Ahora vamos a nuestra Ventana Principal y vamos a llamar desde all a la nueva ventana creada
Vista del nuevo evento a agregar al men tem Cliente. Ahora dentro del evento agregamos los siguientes cdigos: String args[] = new String[1];//creamos un vectorcito aqu de una sola posicin; args[0] = "Registro de Clientes";//es este el parmetro que le pasamos a nuestro mtodo main ClienteView.main(args);
Vista de los cdigos agregados. Ahora nos vamos a la ventana ClienteView y modificamos el cdigo del mtodo main, ponemos que el tipo de parmetro a recibir ser final y asignamos el titulo a la ventana frame.setTitle(args[0]);. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 128
Vista de los cdigos agregados dentro del mtodo main. Ahora solo nos queda probar nuestra ventana, para ello nos vamos a la Ventana principal y desde all vamos a llamar a nuestra ventana de Clientes.
Vista del men tem Cliente de la Ventana principal. Esta accin nos lleva a la ventana Registro de Clientes, donde presionamos el botn New y agregamos los datos de un nuevo registro para nuestro Cliente y tambin agregamos los datos de sus direcciones, luego presionamos el botn Save. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 129
Vista de la ventana Registro cliente con los nuevos registros agregados. Ahora vamos a comprobar si realmente nos guardo nuestro nuevo registro dentro de la Base de Datos, para ello nos vamos nuestra tabla cliente.
Vista del registro agregado en la tabla cliente. Tambin observamos los datos en nuestra tabla cliente_direecion. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 130
Vista del registro agregado dentro de la tabla cliente_direccion. Ahora vamos a cambiar de lugar la forma de visualizacin de los elementos en nuestro JTable, para ello seguimos los siguientes pasos: Seleccionamos el JTable, hacemos clic derecho sobre ella y elegimos la opcin Contenido de la tabla.
Vista de los pasos a seguir para visualizar el Contenido de la tabla Esta accin nos lleva a la ventana de Personalizar dialogo donde podemos cambiar el ttulo, el ancho, si la columna puede ser redimensionable, etc. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 131
Vista de la ventana Personalizar dialogo. Tambin podemos cambiar de posicin los campos, luego presionamos el botn Cerrar.
Vista de los cambios realizados Hacemos lo mismo para el Detalle siguiendo los mismos pasos vistos anteriormente. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 132
Vista de los cambios agregados dentro de los JTables. Ahora para mejorar un poco el aspecto de nuestras ventanas vamos a agregarle unos paneles, para ello seguimos los siguientes pasos, nos posicionamos sobre nuestro JTable, hacemos clic derecho sobre ella y elegimos las opciones Incluir en => Panel.
Vista de los pasos para agregar un nuevo Panel a la ventana. Seguimos los mismos pasos para nuestro detalle, primero la seleccionamos y luego hacemos clic derecho sobre ella y elegimos las opciones Incluir en = >Panel. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 133
Vista de los pasos para agregar un nuevo Panel a la ventana. Tambin vamos a agregar nuestros botones dentro de un Panel, siempre siguiendo los mismos pasos vistos anteriormente.
Vista de los pasos para agregar botones dentro de un Panel. Ahora para tener un mejor control de la distribucin de nuestros componentes visuales, para ello hacemos clic sobre nuestra ventana y elegimos las opciones Activar gestor de distribucin => Diseo Absoluto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 134
Vista de los pasos a seguir para activar un Gestor de distribucin Ahora vamos a agregarles colores de fondo a nuestros paneles y observamos los cambios.
Vista de ventana con los paneles agregados. Luego siguiendo con nuestros Panel vamos a sus propiedades y elegimos un borde, para nuestro ejemplo elegimos la opcin Borde con titulo y en Titulo agregamos Datos de Cliente. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 135
Vista de las propiedades del JPanel1 Seguimos los mismos pasos para nuestro Panel del detalle, para nuestro ejemplo lo vamos a llamar Direcciones de Cliente.
Vista de las propiedades del JPanel2 Ahora podemos observar los cambios realizados a nuestra ventana Registro de Clientes. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 136
Vista de los cambios agregados. Ahora agregamos un nuevo botn al que llamaremos Editar Cliente, tambin renombramos los botones de la cabecera New por Ingresar cliente, Delete por Eliminar Cliente, tambin renombramos los botones del detalle, el botn New por Ingresar Direccin, el botn Delete por Eliminar Direccin, el botn Refresh por Cancelar Actualizacin y el botn Save por Guardar Datos.
Vista de la ventana ClienteView con la edicin de sus botones. Ahora vamos a crear una nueva ventana Jdialog, para ello seguimos los siguientes pasos, nos posicionamos sobre nuestro paquete py.com.systvent.view, hacemos clic derecho Nuevo => Otro. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 137
Vista de los pasos a seguir para la creacin de una ventana Jdialog Esta accin nos lleva al paso 1 de la Ventana Archivo Nuevo donde tenemos que Escoger el tipo de archivo, para ello en Categoras elegimos Formularios de Interfaz grafica y en Tipos de Archivos elegimos Formulario JDialog, luego hacemos clic en el botn Siguiente.
Vista del paso 1 de la ventana Archivo nuevo. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 138
Esta accin nos lleva al paso 2 de la creacin de nuestra ventana Nuevo JDialog Form donde tenemos que asignarle un nombre, para nuestro ejemplo lo vamos a llamar ClienteEditView, luego hacemos clic en el botn Terminar.
Vista del paso 2 Nombre y ubicacin de la nueva ventana JDialog. Ahora podemos observar la nueva ventana JDialog creada.
Vista de la nueva ventana JDialog Ahora nosotros debemos colocar cada una de las columnas que se encuentran en la cabecera dentro del JDialog, para nuestro ejemplo solo vamos a seleccionar el Nombre, Profesin, Empresa, Tel. Empresa, RUC y Referencia, el resto de las columnas queda como tarea para que ustedes lo agreguen, entonces vamos a agregar seis campos de textos, seis etiquetas y dos botones Confirmar y Cancelar a nuestra nueva ventana. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 139
Vista de los componentes agregados a nuestra ventana JDialog. Ahora vamos a asignarle un Nombre de variable a cada uno de nuestros componentes, por ejemplo para el campo de texto Profesin lo vamos a llamar profesionTF, a Nombre le vamos a llamar nombreTF y as renombramos todos los componentes.
Vista de las propiedades del JTextField al cual se ha cambiado el nombre de variable. Ahora vamos a vincular cada campo de texto de la ventana con su correspondiente dentro de la cabecera de la ventana Registro de Clientes, para nuestro ejemplo solo vamos a tomar estos seis campos que se ven en la ventana y el resto pasa como tarea para ustedes. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 140
Ahora cmo es que vamos a vincular estos campos? Podramos intentar haciendo clic derecho sobre el campo de texto probando con la opcin Enlazar = > text
Vista de la opcin Enlazar => text Con esta accin podemos observar que no conseguimos obtener estos valores que esta en la cabecera de otra ventana ClienteView.
Vista de los enlaces disponibles para el campo de texto nombreTF. Entonces qu podemos hacer ac?? Lo que podemos hacer en este caso es crear una Propiedad dentro de nuestra ventana ClienteEditView.java y agregar esa funcionalidad dentro de ella, veamos cmo podemos hacer eso. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 141
Para agregar un propiedad son posicionamos en la fuente de nuestra ventana ClienteEditView, hacemos clic derecho sobre ella y elegimos la opcin Insertar Cdigo.
Vista de los pasos a seguir para agregar una Propiedad Lo que queremos ac es agregar una Propiedad, entonces elegimos de entre todas las propiedades desplegadas la opcin Agregar Propiedad, observemos que con esta accin tambin podemos agregar mtodos gets y sets, delegar mtodos, etc.
Vista de la opcin Agregar Propiedad Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 142
Ahora tenemos que definir cual ser el nombre de esa propiedad para nuestro ejemplo ser registroActual, tambin tenemos que definir el tipo, para ello hacemos clic en Examinar y all elegimos que ser del tipo cliente.
Vista de la ventana Encontrar tipo Seleccionamos las siguientes opciones, que sea protegida (protected), que nos Cree los mtodos get y set y que nos Genere soporte para cambio de propiedad. Entonces Netbeans nos va a crear un registroActual, va a tener un get y set de tipo Cliente y tambin una propiedad de cambios.
Vista de las propiedades a agregar Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 143
Esto es necesario para que nosotros podamos actualizar los datos de nuestra edicin con los datos de la lnea actual del JTable del formulario ClienteView.java. Entonces el prximo paso es hacer una modificacin en el mtodo set que creamos. public void setRegistroActual(Cliente registroActual) { Cliente oldRecord = this.registroActual; this.registroActual = registroActual; propertyChangeSupport.firePropertyChange("registroActual", oldRecord, registroActual); } Entonces con esto actualizamos ac el valor anterior para el valor actual.
Vista de los cdigos agregados dentro del mtodo set. Ahora vamos a modificar el actionPerformed del botn Ingresar cliente, para ello seguimos pasos ya conocidos por nosotros, nos posicionamos sobre ella, hacemos clic derecho Eventos => Action => actionPerformed.
Vista de los pasos a seguir para crear un nuevo evento Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 144
JFrame frame = new JFrame(); ClienteEditView ce= new ClienteEditView(frame,false); ce.setVisible(true); py.com.systven.bean.Cliente C = new py.com.systven.bean.Cliente(); entityManager.persist(C); list.add(C); int row = list.size()-1; masterTable.setRowSelectionInterval(row, row); masterTable.scrollRectToVisible(masterTable.getCellRect(row, 0, true));
Vista de las tres lneas de cdigo agregado Ahora vamos a ejecutar nuestra Ventana Principal y desde all vamos a seleccionar nuestro tem de men Cliente, una vez dentro de la ventana presionamos el botn Ingresar Cliente, esta accin llama a la ventana JDialog llamado Datos del Cliente.
Vista de la ventana Datos del cliente Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 145
Ahora podemos observar que al cargar datos dentro los campos no se reflejan esos datos dentro de la cabecera del JTable, entonces para conseguir eso vamos a vincular los datos de nuestro campo texto con el masterTable, para ello seguimos los mismos pasos de siempre nos posicionamos sobre el campo de texto, hacemos clic derecho Enlazar => text.
Vista de los pasos a seguir para enlazar un texto Esta accin nos lleva a la ventana Enlace nombreTF donde en la pestaa Enlace nos aseguramos que el Enlazado de la fuente este en Form y que el Enlazado de la expresin este en registroActual.nomCliente.
Vista de las opciones a seleccionar dentro de la ventana Enlace nombreTF Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 146
Luego nos aseguramos de repetir los mismos pasos para los otros campos faltantes. Ahora como nosotros vinculamos todos los edit, al vincular los datos estos son observables desde cualquier punto del programa, esta funcionalidad se encuentra dentro del cdigo que muestra la figura.
Vista de la lista vinculada y observable. Ahora vamos a repetir los mismos pasos vistos anteriormente, nos vamos a nuestra Ventana Principal, desde all llamamos a nuestra ventana Registro de Cliente, luego presionamos el botn Ingresar Cliente, esta accin llama a la ventana Datos del Cliente, agregamos los datos dentro de los campos de texto y podemos observar que ya estn vinculados con la JTable de la ventana Registro de Clientes.
Vista de las ventanas Registro de Clientes y Datos de Cliente vinculadas. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 147
Ahora vamos a codificar nuestro botn Confirmar, la verdad en este punto es que al confirmar se tiene que comportar de la misma manera que nuestro botn Guardar Datos de la ventana Registro de Clientes y si presionamos el botn Cancelar lo que estamos haciendo es lo mismo que la accin del botn Cancelar las Actualizaciones, entonces esas acciones ya estn en esos botones. Entonces como es que vamos a hacer eso all?? Vamos a tener que crear una nueva Propiedad que nos va a retornar un valor booleano all para nuestra ventana Registro de Clientes, entonces nos vamos a la fuente de nuestra ventana ClienteEditView y agregamos nuestra Propiedad, para ello hacemos clic derecho en la fuente y elegimos la opcin Insertar cdigo.
Vista de los pasos a seguir para agregar una Propiedad Esta accin nos muestra las opciones a elegir, pero lo que nosotros necesitamos es Agregar una propiedad entonces seleccionamos esa opcin.
Vista de la propiedad a agregar. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 148
Para nuestro ejemplo lo vamos a llamar a nuestra propiedad con el nombre de confirmarCliente y ella va a ser del tipo boolean.
Vista de las opciones a agregar y seleccionar dentro de la ventana Agregar propiedad. Ahora podemos observar dentro de la fuente de nuestra ventana ClienteEditView la propiedad que acabamos de crear.
Vista de la nueva propiedad agregada. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 149
Como podemos observar dentro de la fuente Netbeans nos creo un mtodo booleano isConfirmarCliente y otro mtodo setConfirmaCliente al que mas tarde vamos a agregar las funcionalidades que le faltan. Ahora nos vamos a los eventos de nuestro botn Confirmar y all vamos a agregar un nuevo manejador llamado guardarNuevoCliente, para ello nos vamos a las propiedades de nuestro botn Confirmar y en el actionPerformed seleccionamos el editor personalizado, esta accin nos lleva a la ventana Manejadores para actionPerformed donde presionamos el botn Agregar, esta accin nos muestra la ventana Agregar manejador donde tenemos que agregar un Nombre del nuevo manejador al que llamaremos guardarNuevoCliente, hacemos clic en el botn Aceptar.
Vista de las ventanas y de los pasos a seguir para agregar un manejador. Ahora ya podemos observar dentro de la ventana Manejadores para actionPerformed el nuevo manejador que agregamos. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 150
Vista de la ventana Manejadores para actionPerformed con el manejador agregado Presionamos nuevamente el botn Aceptar, luego podemos observar en la fuente de nuestra ventana ClienteEditView el nuevo mtodo agregado.
Vista del mtodo agregado. Dentro de este mtodo vamos a agregar los siguientes cdigos : setConfirmarCliente(true); setVisible(false); Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 151
Vista de las dos lneas de cdigo agregada. Ahora vamos a agregar otro manipulador para nuestro botn Cancelar, para ello seguimos los mismos pasos vistos anteriormente para el botn Confirmar, nos vamos en sus Propiedades y en la pestaa Enlace en actionPerformed agregamos un nuevo manejador.
Vista de la ventana Manejadores para actionPerformed. Presionamos el botn Agregar, esto nos lleva a la ventana Agregar manejador donde le damos el nombre de cancelarNuevoCliente. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 152
Vista de la ventana Agregar manejador. Hacemos clic en el botn Aceptar, esta accin nos lleva nuevamente a la ventana Manejadores para actionPerformed donde ya podemos observar el manejador que acabamos de agregar.
Vista de la ventana Manejadores para actionPerformed Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 153
Presionamos el botn Aceptar y ahora vemos el nuevo mtodo creado.
Vista del nuevo mtodo creado El cdigo que vamos a utilizar es muy similar al de guardarNuevoCliente, la nica diferencia es que en setConfirmarCliente() el parmetro es false, entonces agregamos esas dos lneas de cdigo. setConfirmarCliente(false); setVisible(false);
Vista de las dos lneas de cdigo agregadas Ahora para que podamos conseguir la funcionalidad que estamos buscando tenemos que modificar nuestro cdigo del botn Ingresar Cliente de nuestra ventana ClienteView. ClienteEditView ce= new ClienteEditView(null,true); ce.setRegistroActual(C);// ce.setVisible(true); if (ce.isConfirmarCliente()){ saveButton.doClick();// }else {//sino refreshButton.doClick } Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 154
Vista de los cdigos agregados y modificados. Ahora vamos a probar a ver si esta funcionamos como queremos, para ello nos vamos a nuestra Ventana Principal y desde all vamos a seleccin nuestro tem de men Cliente.
Vista del tem de men Cliente dentro de la Ventana Principal. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 155
Esta accin nos lleva a la ventana Registro de Cliente donde presionamos el botn Ingresar Cliente, luego completamos todos los campos de esta ventana Datos de Cliente.
Vista de las ventanas Registro de cliente y Datos del cliente. Presionamos el botn Confirmar y observamos los datos dentro de nuestra JTable dentro de nuestra ventana Registro Cliente.
Vista de los datos agregados dentro de la ventana Registro de Cliente. Ahora nos vamos del lado de la Base de datos para ver si realmente fue guardado los datos de nuestro cliente. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 156
Vista de los datos guardados dentro de la tabla cliente. OK ahora vamos a agregarle funcionalidad a nuestro botn Editar Cliente, para ello vamos a seguir los siguiente pasos, nos posicionamos sobre el botn Editar Cliente, hacemos clic derecho sobre ella y elegimos Eventos => Action => actionPerformed.
Vista de los pasos a seguir para agregar un evento al botn Editar Cliente. Esta accin nos lleva a la fuente de nuestra ventana ClienteView donde podemos observar el nuevo evento agregado.
Vista de evento agregado dentro de la fuente de la ventana ClienteView.java Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 157
Luego a este evento le agregamos las siguientes lneas de cdigo: ClienteEditView ce= new ClienteEditView(null,true); ce.setRegistroActual(list.get(masterTable.getSelectedRow ce.setVisible(true); if (ce.isConfirmarCliente()){ saveButton.doClick(); }else { refreshButton.doClick(); }
Vista de las lneas de cdigo agregadas. Ahora vamos a comprobar si funciona como queremos, para ello nos vamos a la Ventana Principal y all elegimos nuevamente el tem de men Cliente.
Vista de la Ventana Principal Sistema de Ventas. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 158
Esta accin nos lleva a la ventana de Registro de clientes, luego seleccionamos un cliente de la lista presionamos el botn Editar Cliente donde editamos los datos de nuestro cliente.
Vista de las ventanas Registro de Clientes y Datos del Cliente. Presionamos el botn Confirmar y observamos en la ventana Registro de Clientes los cambios realizados.
Vista de la ventana Registro de Clientes con los cambios realizados Ahora veamos los cambios que hicimos desde Netbeans, para ello nos vamos en Prestaciones, y seleccionamos la tabla clientes, hacemos clic derecho sobre ella y elegimos la opcin Mostrar datos. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 159
Vista de las tablas desde Netbeans Esta accin nos muestra los datos actualizados que tenemos guardados en nuestra tabla clientes.
Vista de los datos guardados en la tabla cliente
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 160
Programacion paso a paso de la ventana Movimiento Presupuesto de Ventas.
Muy bien vamos ahora continuar con el modulo de Movimientos, en nuestro ejemplo vamos a implementar el Movimiento Presupuesto de Venta, entonces para seguir con nuestro ejemplo vamos a seguir los pasos vistos anteriormente, nos posicionamos sobre el paquete py.com.systvent.view hacemos clic derecho sobre ella y elegimos Nuevo=> Formulario de ejemplo maestro/detalle.
Vista de las opciones para la creacin de un formulario Maestro/Detalle. Esta accin nos lleva a la ventana Nuevo Formulario Maestro / Detalle, en este punto vamos a tratar de utilizar siempre los recursos del propio Netbeans, entonces le damos un nombre para nuestro ejemplo lo llamaremos MovimientoPresupuestoVenta, luego presionamos el botn Siguiente. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 161
Vista del paso 2 de la ventana Nuevo Formulario maestro/detalle Luego en el paso 3 Tabla maestro establecemos la conexin con nuestra Base de Datos sistevent y seleccionamos nuestra tabla maestra que para nuestro ejemplo es cab_presupuesto, presionamos el botn Siguiente.
Vista del paso 3 de la ventana Nuevo Formulario maestro/detalle Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 162
Esto nos lleva al paso 4 Opciones de detalle donde tenemos que seleccionar la tabla detalle, como podemos observar esta tabla apunta a det_presupuesto, luego presionamos el botn Terminar.
Vista del paso 4 de la ventana Nuevo Formulario maestro/detalle Esta accin nos muestra que se est creando el formulario Maestro/Detalle con todos sus componentes visuales.
Vista de la creacin del Nuevo Formulario maestro/detalle Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 163
Entonces en este punto Netbeans nos crea un formulario, podemos observar en la cabecera del Presupuesto que tiene un cdigo, ese cdigo es autoincremento, tiene un cdigo de cliente, un cdigo de funcionario, fecha del presupuesto y el valor del presupuesto. En el Detalle vamos a tener el cdigo del presupuesto y el cdigo del producto, los dos cdigos van a ser nuestra clave primaria.
Vista de la nueva ventana MovimientoPresupuestoVenta Ahora el siguiente paso a seguir es poner en las Propiedades de JTable de la cabecera la opcin autoResizeMode en OFF, esto nos va a permitir visualizar el scroll en la cabecera. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 164
Vista del JTable con los cambios realizados. Luego vamos a incluir en un Panel nuestra JTable de la cabecera, nuestro detalle y nuestros botones, para ello seguimos los siguientes pasos: Seleccionamos nuestra JTable, hacemos clic derecho sobre ella y elegimos la opcin Incluir en => Panel, hacemos lo mismo para el detalle.
Vista de los pasos a seguir para agregar un JTable a un Panel. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 165
Para incluir nuestros botones dentro de Panel seguimos los siguientes pasos: Seleccionamos todos los botones, hacemos clic derecho sobre ella y elegimos la opcin Incluir en => Panel.
Vista de los pasos a seguir para agregar botones a un Panel. Luego ordenamos nuestros paneles para darle un mejor diseo a nuestro formulario, para nuestro ejemplo usaremos este diseo.
Vista del diseo propuesto para la ventana MovimientoPresupuestoVenta. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 166
Aqu vamos a cambiar el nombre de los botones y vamos a cambiar el nombre del botn New de la cabecera por Nuevo Presupuesto, luego vamos a eliminar el botn Delete de la cabecera, renombramos el botn New del detalle por Agregar Item, tambin renombramos el botn Delete del detalle por Eliminar, hacemos lo mismo con el botn Save lo cambiamos por Guardar y por ultimo tambin ponemos Activar Gestin de Distribucin de nuestra ventana en Diseo Absoluto.
Vista de los cambios de nombres en los botones. Luego hacemos que los botones tengan el mismo ancho, para ello modificamos uno de los botones con el ancho que queremos, luego seleccionamos los dems botones le hacemos clic derecho y elegimos la opcin Mismo tamao = > Mismo Ancho.
Vista de los pasos a seguir para agregar un mismo ancho a los botones. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 167
Y tambin que tengan el mismo alto, para ello modificamos uno de los botones con el alto que queremos, luego seleccionamos los dems botones, le hacemos clic derecho y elegimos la opcin Mismo tamao = > Misma Altura.
Vista de los pasos a seguir para agregar un mismo alto a los botones. Ahora podemos observar que todos nuestros botones tienen el mismo ancho y tambin que tienen el mismo alto.
Vista de los botones con los cambios realizados. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 168
Ahora nos vamos a nuestra pestaa Proyectos y observamos que all Netbeans nos creo tres archivos beans llamados CabPresupuesto.java, DetPresupuesto.java y DetPresupuestoPK.java.
Vista de los archivos beans creados dentro del paquete view. Vamos a cambiar de ubicacin estos archivos, lo vamos a pasar al paquete py.com.systvent.bean, para ello simplemente los seleccionamos y lo arrastramos sobre el nombre del paquete, lo soltamos y esa accin hace que aparezca la ventana Mover clases, seleccionamos el botn Reestructurar para que nos haga todos los cambios necesarios en e l cdigo. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 169
Vista de los archivos a ser reestructurados. Ahora ya podemos observar los tres archivos que cambiamos de ubicacin.
Vista de los archivos reestructurados dentro del paquete bean. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 170
Algo que todava no conversamos pero que es muy importante es que no hay que olvidar cambiar el cdigo de cada uno de nuestros archivos bean, en cada uno de nuestros archivos existe un mtodo llamado String toString, estos cambios ahora lo haremos para el archivo CabPresupuesto, luego en DetPresupuesto, DetPresupuestoPK y en los dems archivos beans generados queda a cargo de ustedes cambiar esta parte del cdigo. Entonces en el mtodo toString cambiamos el view por bean, entonces el cdigo "py.com.sysvent.view.CabPresupuesto[codPresupuesto=" + codPresupuesto + "]" cambiamos por "py.com.sysvent.bean.CabPresupuesto[codPresupuesto=" + codPresupuesto + "]".
Vista del mtodo toString a ser cambiado. Ahora nuestro cdigo debera quedar como se muestra en el grfico.
Vista del mtodo toString con el cambio realizado. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 171
Ahora nos vamos al men de nuestra ventana principal y vamos a llamar desde all a nuestra ventana de Presupuesto de Ventas, para ello nos posicionamos sobre el tem de men Presupuesto, hacemos clic derecho sobre ella y elegimos Eventos => Action => actionPerformed.
Vista de los pasos a seguir para agregar un evento a un tem de men. Esto nos lleva al evento private void jmi_presupuestoActionPerformed donde agregamos estas tres lneas de cdigo: String args[] = new String [1]; args[0] = "Movimiento - Registro de Presupuesto"; MovimientoPresupuestoVenta.main(args); Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 172
Vista de los cdigos agregados dentro del evento. Ahora nos vamos al main de nuestra ventana MovimientoPresupuestoVenta, aqu en el main colocamos que ser de tipo final, comentamos la lnea de cdigo donde aparece el EXIT_ON_CLOSE, esto es para que al cerrar nuestra ventana no nos cierre nuestra aplicacin, y le pasamos al frame el ttulo que definimos en el evento anterior.
Vista de los cdigos agregados dentro de main de la ventana MovimientoPresupuestoVenta. Muy bien en este punto ya lo podemos ejecutar para observar como est quedando nuestra ventana Movimiento Registro de Presupuesto, para ello ejecutamos nuestra aplicacin y nos vamos al men Movimientos y all elegimos el tem de men Presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 173
Vista del tem de men Presupuesto. Esta accin llama a la ventana Movimiento Registro de Presupuesto.
Vista de la ventana Movimiento Registro de Presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 174
Ahora vamos a intentar cargar un nuevo presupuesto, para ello presionamos el botn Nuevo Presupuesto, ac solo vamos a cargar el Valor del Presupuesto y el cdigo del cliente, el cdigo del presupuesto es autoincremento por eso lo dejamos as, ahora presionamos el botn Guardar.
Vista de la ventana Movimiento Registro de Presupuesto con los datos agregados en la cabecera. Ahora nos vamos a nuestra base de datos y all observamos los datos guardados en la tabla cab_presupuesto.
Vista de los datos guardados en la tabla cab_presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 175
Por el momento vamos bien entonces vamos a colocar nuestro registro de detalle aqu, para ello presionamos el botn Agregar Item y completamos los datos del detalle, ponemos en Cantidad de Presupuesto 1, en Valor Unitario 100 y en Valor total 100, luego presionamos el botn Guardar.
Vista de los datos cargados a la ventana Movimiento Registro de Presupuesto. Y esta accin nos muestra que hubo una excepcin al tratar de guardar los datos del detalle.
Vista de la excepcin lanzada en la pestaa Salida. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 176
La excepcin que nos muestra es la siguiente jdbc4.MySQLIntegrityConstraintViolationException:, ella nos indica que la columna cod_presupuesto no debe ser nula, tampoco puede ser nula el cdigo del producto, tambin podemos observar que JPA trato de ejecutar un Insert y que fue en ese insert donde apareci esa excepcin.
Vista de la excepcion lanzada en la pestaa Salida. Este Insert intenta ingresar los siguientes valores 100, 100, null, 1, null, null, estos dos nulos corresponden al cdigo del presupuesto (cod_presupuesto)y al cdigo del producto (cod_producto).
Vista de la excepcion lanzada en la pestaa Salida. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 177
Ahora si nosotros observamos nuestra tabla det_ presupuesto nos damos cuesta que el cdigo del presupuesto y el cdigo del producto (cod_producto) no aceptan nulos, y ambas claves forman nuestra clave primaria.
Vista de las claves primarias de la tabla det_presupuesto. Ahora si nos vamos nuevamente a nuestra ventana de Movimiento - Registro de Presupuesto podemos observar que en el detalle Netbeans no nos coloco el Cdigo del Presupuesto ni el Cdigo de Producto, entonces nosotros de alguna manera tenemos que conseguir esa funcionalidad.
Vista de la ventana Movimiento Registro de Presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 178
Ahora en este punto lo primero que tenemos que tratar de entender que es lo que Netbeans hizo con nuestras clases, entonces lo primero que vamos a hacer es ir a nuestro paquete py.com.systvent.bean y all encontramos los archivos beans CabPresupuesto, DetPresupuesto y DetPresupuestoPK.
Vista de los archivos bean dentro del paquete py.com.systven.bean. El primer archivo bean que vamos a mirar es CabPresupuesto, aqu podemos observar que Netbeans nos cre un anotation @GeneratedValue, esta anotacin que hace que se cree el cdigo auto numrico del lado de la Base de Datos, tambin podemos observar que esta haciendo en mapeamiento con nuestra tabla cab_presupuesto, nada nuevo comparado con lo que ya hemos visto antes. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 179
Vista de las anotaciones dentro del archivo CabPresupuesto. Ahora nos vamos a nuestro archivo DetPresupuesto, ella tiene tambin un mapeamiento, observamos que ella tiene una anotation @EmbeddedId que es de tipo DetPresupuestoPK, y que significa eso??
Vista de las anotaciones dentro del archivo DetPresupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 180
Cuando nosotros tenemos una clave primaria compuesta la especificacin JPA ella en este punto crea otra clase, esta clase DetPresupuestoPK debe ser creada para poder implementar esa clave primaria compuesta.
Vista del archivo DetPresupuestoPK. Por eso esta clase DetPresupuestoPK implementa nuestra clave compuesta con esos dos campos que son cod_presupuesto y cod_producto.
Vista de las anotaciones dentro del archivo DetPresupuestoPK. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 181
Entonces esto es lo que hace JPA para implementar estas clases. Ahora vamos a hacer un Debug sobre el cdigo del botn Agregar Item para tratar de entender que es lo que est pasando en este punto, para ello nos posicionamos sobre ella, presionamos clic derecho y elegimos las opciones Eventos => Action => actionPerformed.
Vista de los pasos a seguir para agregar un evento al botn Agregar Item. Esto nos lleva a la fuente donde se encuentra el evento, all vamos a colocar en este punto un BreakPoint o un Punto de interrupcin de lnea, para poner ese punto lo nico que hacemos es hacer clic sobre la lnea 230 y esa accin hace que se marque con un icono cuadrado de color rosa, con esto marcamos esa lnea de cdigo para poder recorrerlo paso a paso. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 182
Vista del Punto de interrupcin dentro evento newDetail.
Existen varias formas de hacer el debug, una de ellas es presionar el icono Debug Main Project, la otra es haciendo clic derecho sobre la fuente y elegimos la opcin Debug File, all lo que tenemos que hacer es depurar nuestra ventana de MovimientoPresupuestoVenta. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 183
Vista de los pasos a seguir para comenzar a debugar el evento newDetail. Esto llama a la ventana de Presupuesto de venta donde tenemos que seleccionar nuestro presupuesto y luego presionamos el botn Agregar Item, es en este momento cuando se activa nuestro Break Point, luego en la parte de abajo en la pestaa Variables es donde podemos hacer nuestro seguimiento y tambin podemos observar que nos marc en color verde la lnea de cdigo que habamos marcado con el BreakPoint.
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 184
Vista de las variables en memoria dentro de la pestaa Variables. En este punto vamos a recorrer lnea por lnea para ver cules son los valores que estn tomando nuestras variables, para ello vamos a presionar F8 o tambin podemos presionar el icono que muestra en la figura, existen otras opciones para recorrer dentro de los mtodos que son llamados pero eso no lo vamos a mirar por el momento que es utilizando F8. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 185
Vista de los valores de las variables en memoria dentro de la pestaa Variables. Podemos observar en la pestaa Variables todos los objetos que en este momento estn en memoria, ahora al presionar F8 podemos observar que el valor de esa variable Index es 0. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 186
Vista del valor de la variable index. Y eso porque??, porque el ahora esta en la primera lnea de la cabecera o sea en esta en la primera lnea de nuestro MasterTable. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 187
Vista del valor de la variable index. Luego vemos en la segunda lnea que Netbens va a instanciar es CabPresupuesto o sea un objeto de tipo CabPresupuesto y Netbeans va a hacer que este CabPresupuesto sea un objeto que esta en la lnea seleccionada (Index), en la lnea cero que es nuestro caso, donde el index es cero, y es lo mismo que va a pasar, damos F8 y observamos que se cre el Objeto c.
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 188
Vista del valor de la variable index. Presionamos nuevamente F8 y observamos el valor del objeto ds que en realidad es una coleccin de objetos. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 189
Vista de la referencia del valor en memoria del objeto c. All observamos los valores que tenemos en memoria con ese objeto c, presionamos el icono + para observar sus valores. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 190
Vista del valor del cdigo del presupuesto. Ahora podemos observar que el codPresupuesto de nuestro presupuesto es 1, que es de tipo entero, tambin podemos observar que el cdigo del cliente y del funcionario son nulos. Ahora vamos a instanciar un objeto de tipo DetPresupuesto para ello nuevamente presionamos F8, observemos que DetPresupuesto es un atributo de CabPresupuesto, ahora nosotros instanciamos ese objeto c apuntando para el get del DetPresupuestoList () OK. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 191
Vista del valor del tamao de la coleccin ds. Y es en ese punto de la condicional IF donde Netbeans va a preguntar, si ese objeto ds que nosotros acabamos de instanciar es nulo, presionamos nuevamente F8. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 192
Vista del valor del tamao de la coleccin ds. Como nosotros podemos observar all no es nulo, entonces pasa en la lnea e DetPresupuesto d para instanciar un nico bean, fjense que all nosotros tenemos una lista (List). Es una lista que cabe dentro de varios DetPresupuesto y aqu en la lnea verde vamos a instanciar un nico DetPresupuesto, fjense que en la lista tenemos una tablita de DetPresupuesto y aqu apenas un nico registro y lo vamos a instanciar ahora con F8. Instanciamos ese d que es nuestro DetPresupuesto, como vemos si desplegamos el valor del objeto d observamos que todos sus campos estn en nulos.
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 193
Vista de la referencia en memoria del objeto d y del valor de detPresupuestoPK. Ac lo importante es observar es que detPresupuestoPK es equivalente a dos campos de nuestra tabla que son cod_presupuesto y cod_producto. Damos F8 y JPA va a Persistir el objeto d y luego en la prxima lnea de cdigo va a setar en el objeto d CabPresupuesto con el objeto c (d.setCabPresupuesto(c);) Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 194
Vista de la referencia en memoria del objeto d Observemos que c es un objeto de tipo CabPresupuesto, y luego observamos que ese atributo d de DetPresupuesto que apunta a CabPresupuesto.
Vista de la referencia en memoria del objeto d. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 195
Y ese es el atributo que vamos a setar ahora con el objeto c, ahora vamos a presionar nuevamente F8 y ya fue setado.
Vista de la referencia en memoria del atributo cabPresupuesto. Este objeto d es lo mismo que este objeto c ahora y tienen los mismos valores, este objeto c contiene atributos, este detPresupuestoList tiene varios objetos c o apunta a varios de ellos en la lista. Vamos a continuar ahora para ver que es lo que va a pasar presionando F8. Vamos a adicionar ahora dentro de nuestro objeto ds, que es nuestra coleccin que apunta a DetPresupuestoList, entonces nosotros vamos a almacenar en ella el bean que acabamos de setar. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 196
Vista de la referencia en memoria del objeto ds. En este punto es como si estamos agregando un registro en una tabla, damos F8 y vamos a limpiar la seleccin del masterTable. Ah todo tranquilo no apareci ningn problema, presionamos F8 pegamos un interval del lado del masterTable. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 197
Vista de las refererencias en memoria de todas las variables. Presionamos nuevamente F8,la variable row ahora toma el valor de cero, all es el tamao de ds menos 1 (int row = ds.size()-1;), Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 198
Vista de la referencia en memoria del objeto ds. Damos F8 y ahora vamos a setar la tabla de detalle que en este caso va a ser cero, es cero porque ser el primer registro del JTable del detalle, presionamos F8 nuevamente y hasta ah no hay problema alguno. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 199
Vista de la pestaa Variables sin ningn valor en la memoria. Entonces vemos que el botn Nuevo Presupuesto por el momento no tiene ningn problema, todo esto para descubrir que el problema no esta en el botn Nuevo Presupuesto. Entonces si el problema no esta en el botn Nuevo Presupuesto donde es que esta el problema?? El problema va a estar posiblemente en el botn Guardar. Entonces vamos a debugar este botn, para ello seguimos los siguientes pasos: Nos posicionamos sobre el botn Guardar, hacemos clic derecho sobre ella y elegimos las opciones Eventos => Action => actionPerformed.
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 200
Vista de los pasos a seguir para agregar un evento al botn Guardar. Vamos a seguir el rastro a este botn, le vamos a poner un BreakPoint a este commit, para ello hacemos clic sobre la lnea 271 y ahora aparece el BreakPoint marcando esa lnea de color rosa.
Vista de los pasos a seguir para agregar un BreakPoint. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 201
Entonces vamos a hacer correr nuevamente nuestro debug, para ello hacemos clic en icono Debug Main Project.
Vista de los pasos a seguir para comenzar en Debug. Esta accin hace que aparezca nuestra ventana Sistema de Ventas, luego nos vamos a nuestro men Movimiento y dentro de ella elegimos el tem de men Presupuesto.
Vista de los pasos a seguir para seleccionar el tem de men Presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 202
Esta accin nos lleva a la ventana Movimiento Registro de Presupuesto.
Vista de la ventana Movimiento Registro de Presupuesto. Seleccionamos la lnea del presupuesto que guardamos anteriormente, luego presionamos el botn Agregar Item, completamos los datos del detalle, en Cantidad de Presupuesto ponemos 1, en Valor Unitario ponemos 100 y en Valor Total asignamos 100.
Vista de los pasos a seguir para Agregar un Item. Y por ltimo presionamos el botn Guardar. Vamos nuevamente en el cdigo, en la parte de abajo en la pestaa Variables en this podemos observar todos los objetos que pertenecen a la ventana y que ya estn en este momento en memoria. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 203
Vista de las variables en memoria. Entonces vamos a dar en este punto F8 para que el realice el commit y ah podemos observar que el entityManager .getTransaction.commit automticamente pasa al catch para ejecutar el RollbackExcepcion y el va a imprimir printStackTrace. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 204
Vista de la referencias en memoria de las variables this, evt y rex. Le damos F8 y en la pestaa salida si nos fijamos nos da un problema y cual fue?? El esta pasando un cdigo de presupuesto y un cdigo de producto nulos.
Vista de la excepcin lanzada en la pestaa sysvent(debug). Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 205
Todo esto que hicimos fue para darnos cuenta que el problema aparece a presionar el botn Guardar, pero como ya vimos el botn Agregar Item el no presenta problemas pero la solucin que vamos a usar va a partir de desde all. Nosotros tenemos que informar que el Cdigo del Producto y el Cdigo del Presupuesto de la cabecera son claves primarias, de alguna manera tenemos que informar eso para nuestra tabla y como es que podemos conseguir eso?? Bueno para nosotros poder entender vamos a tener que debugarlo nuevamente, observemos que es el botn nuevoDetalle (newDetail).
Vista del evento del botn newDetail. Marcamos con el Break Point y hacemos correr nuestro Debug nuevamente presionando el icono Debug Main Project. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 206
Vista del icono Debug Main Project. Esta accin hace que se ejecute la ventana principal Sistema de Ventas, en ella nos vamos al men Movimiento y all elegimos el tem de men Presupuesto.
Vista de los pasos a seguir para ejecutar el tem de men Presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 207
Ahora en la ventana Movimiento Registro de Presupuesto seleccionamos el presupuesto que tenemos en la cabecera y luego presionamos el botn Agregar Item.
Vista de la ventana Movimiento Registro de Presupuesto. Esto hace que se active nuestro BreakPoint y nos lleva a la fuente nuevamente, ahora presionamos F8 para comenzar a debugar.
Vista de las variables en memorias mostradas en la pestaa Variables. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 208
Vamos a colocar un Nuevo Item abajo y Netbeans comenz a Debugar, lo importante es observar que es lo que pasa ac en este punto d.setCabPresupuesto(c).
Vista del objeto d en memoria. Ah tenemos la variable d, luego en el setCabPresupuesto(c) nos damos cuenta que el objeto d tiene un atributo del Tipo detPresupuestoPK y que tiene un valor null. Entonces nosotros tenemos que encontrar una forma de informar a JPA que estas son las dos claves primarias, cdigos de producto y el cdigo de la venta en el detalle. Entonces observemos como es que podemos conseguir eso ahora, antes de Persistir el objeto d vamos a crear una variable DetPresupuestoPK para instanciar el objeto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 209
Vista de la nueva lnea de cdigo agregada el evento.
DetPresupuestoPK dpk = new DetPresupuestoPK(); Ahora agregamos los siguientes cdigos: dpk.setCodProducto("1111222222");//este codigo debe existir en la tabla producto de la BD dpk.setCodPresupuesto(c.getCodPresupuesto()); d.setDetPresupuestoPK(dpk); Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 210
Vista de las nuevas lneas de cdigo agregadas el evento. Entonces vamos a apuntar el atributo DetPresupuestoPK que la verdad representa esos dos campos dpk CodPresupuesto y CodProducto, donde ya se atribuye los dos campos que nosotros queremos. Ahora vamos a debugar nuevamente para ver pasa con estos cambios, lo marcamos nuevamente, luego presionamos el icono Debug Main Project . Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 211
Vista de los pasos a seguir para agregar un BreakPoint. Nuevamente nos lleva a la ventana Sistema de Ventas donde seleccionamos el men Movimiento y dentro de ella el tem de men Presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 212
Vista de los pasos a seguir para ejecutar el tem de men Presupuesto. Esto nos lleva a la ventana Movimiento Registro de Presupuesto, donde seleccionamos el presupuesto de la cabecera y presionamos el botn Agregar Item.
Vista de la ventana Movimiento Registro de Presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 213
Presionamos F8, y podemos observar los valores de las variables, en c podemos observar que el cdigo de presupuesto (codPresupuesto) esta en 1.
Vista del objeto c en la pestaa Variables. Seguimos presionando F8, podemos observar que dpk ya tiene una referencia, tambin podemos observar que el cdigo del presupuesto y que el cdigo del producto ya tienen sus valores. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 214
Vista de los valores de los atributos codPresupuesto y codProducto en la pestaa Variables. Seguimos presionando F8, F8 . Hasta que aparezca la opcin de agregar valores al detalle, completamos los datos y presionamos el botn Guardar.
Vista de la ventana Movimiento Registro de Presupuesto con todos los datos cargados. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 215
Veremos que no aparecen las excepciones que aparecieron anteriormente en la pestaa sistvent(run).
Vista de la pestaa sysvent (run). Ahora si nos vamos a nuestra Base de Datos podemos observar que en la tabla cab_presupuesto nos guardo nuestros datos. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 216
Vista del registro guardado en la tabla cab_presupuesto.
Y si nos vamos a nuestra Base de Datos podemos observar que en la tabla det_presupuesto tambin nos guard nuestros datos.
Vista los pasos a seguir para Mostrar los datos de la clase det_presupuesto. Ahora vamos a hacer lo siguiente, vamos a tratar de agregar un nuevo presupuesto, para ello ejecutamos nuevamente nuestro programa, esto nos lleva nuevamente a la ventana Sistema de Ventas. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 217
Vista de la ventana Sistema de Ventas. Nos vamos al men Movimiento y dentro de ella elegimos el tem de men Presupuesto, ahora dentro de nuestra ventana Movimiento Registro de Presupuesto presionamos el botn Nuevo Presupuesto, completamos los datos de la cabecera.
Vista de la ventana Movimiento Registro de Presupuesto. Ahora presionamos el botn Agregar Item, luego seguimos con el debug presionando F8, en este punto podemos observar que el valor de d en codPresupuesto esta nulo. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 218
Vista del valor del atributo codPresupuesto en la pestaa Variables. Seguimos presionando F8, en este punto podemos observar que el codPresupuesto esta en 0. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 219
Vista del valor del atributo codPresupuesto en la pestaa Variables. Seguimos presionando F8 y en la pestaa systvent debug podemos apreciar que aparece un nullPointerExcepction. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 220
Vista de la Excepcin lanzada en la pestaa sysvent (debug). Ella nos esta informando que el cdigo en nuestra CabPresupuesto esta en null, nosotros estamos intentando atribuir un valor nulo a un atributo en este caso es dpk.setCodPresupuesto(c.getCodPresupuesto()); Entonces qu es lo que vamos a hacer aqu?? Para resolver ese problema nosotros tenemos que hacer una modificacin a nuestro cdigo, nos damos cuenta que aqu el cdigo no es de forma automtica, cuando el graba en la Base de Datos el graba de forma automtica y en ese momento de la grabacin el cdigo es retornado, solo que en este momento nosotros no grabamos nada en la Base de Datos, entonces vamos a hacer lo siguiente Vamos a pegar una parte del cdigo del botn Guardar y lo vamos a commitar en esa transaccin nueva y eso tiene que ser antes de comenzar todo el proceso de Agregar Item, entonces ahora agregamos estas dos lineas de codigo: Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 221
Vista de las lneas de cdigos agregadas al evento newDetail. Entonces cuando hacemos clic en el botn Agregar Item, JPA va a commitar la transaccin, recupera el cdigo del presupuesto, luego inicia una nueva transaccin y comienza a ejecutar los datos del detalle. Ahora vamos a ejecutarlo directamente, para ello en la ventana Sistema de Ventas elegimos el men Movimiento y dentro de ella el tem de men Presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 222
Vista de los pasos a seguir para ejecutar el tem de men Presupuesto. Esta accin nos lleva a la ventana Movimiento Registro de Presupuesto donde presionamos el botn Nuevo Presupuesto, luego completamos los datos en la cabecera.
Vista de la ventana Movimiento Registro de Presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 223
Ahora presionamos el botn Agregar item y luego completamos los datos en el detalle.
Vista de la ventana Movimiento Registro de Presupuesto con los datos asignados. Presionamos el botn Guardar, observamos que en la pestaa systvent_1 no aparece ninguna excepcin.
Vista de la pestaa sysvent (run). Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 224
Ahora nos vamos a mirar nuestras tablas del lado de la Base de Datos para ver si los datos que agregamos fueron grabados, comenzamos primero con nuestra tabla cab_presupuesto.
Vista de los datos almacenados en la tabla cab_presupuesto. Ahora observamos nuestra tabla det_presupuesto.
Vista de los datos almacenados en la tabla det_presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 225
Podemos observar que los datos fueron almacenados sin ningn problema. Muy bien ahora vamos a buscar la forma de hacer aparecer el cdigo del producto en la parte de abajo en el detalle, la manera que esta mostrando no es la correcta, para conseguir eso seguimos los pasos conocidos anteriormente, nos posicionamos sobre la tabla del detalle, hacemos clic derecho sobre ella y elegimos la opcin Contenido de tabla.
Vista de los pasos a seguir para acceder al Contenido de la tabla. Nos vamos a la pestaa Columnas, all vamos a insertar una nueva columna, para ello presionamos el botn Insertar, esto hace que aparezca una nueva fila para insertar la nueva columna. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 226
Vista de las columnas dentro de la ventana Personalizar Dialogo. En la nueva fila completamos el titulo con Cdigo, luego en la lista desplegable Expresin buscamos dentro de la carpeta DetPresupuestoPK el cdigo del producto (codProducto).
Vista de los pasos a seguir para agregar un Titulo y una Expresin dentro de la ventana Personalizar Dialogo. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 227
En esta ventana Personalizar Dialogo podemos controlar que las columnas puedan ser editables y redimensionarles, tambin podemos cambiar el ancho.
Vista de las opciones Editables y Redimensionables. Podemos observar que el cdigo del producto agregado es de tipo String, luego presionamos el botn Cerrar.
Vista del tipo String asignado a la columna Codigo. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 228
Ahora vamos a hacer correr nuevamente nuestro programa, en la ventana Sistema de Ventas elegimos el men Movimientos y dentro de ella el tem de men Presupuesto.
Vista de los pasos a seguir para ejecutar el tem de men Presupuesto. Como podemos observar ya aparece el cdigo del producto que agregamos en el detalle.
Vista de la ventana Movimiento Registro de Presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 229
Por el momento tenemos todo funcionando pero necesitamos hacer algunos cambios para mejorar la visualizacin de nuestra pantalla, esta parte de la cabecera nosotros no lo vamos a usar con una JTable sino que lo vamos a usar con campos de textos o JtextFields, entonces lo primero que vamos a hacer es asignar un ttulo a nuestro panel, para ello nos vamos en sus propiedades y all hacemos los cambios, en border elegimos la opcin Borde con ttulo y le agregamos el Titulo de Cabecera.
Vista de los pasos a seguir para agregar un Titulo a un jPanel de la Cabecera. Luego vamos a cambiar el ttulo en el detalle, para ello nos vamos nuevamente en sus Propiedades, en border elegimos nuevamente la opcin Borde con Titulo y agregamos el Titulo al que llamaremos Detalle de Presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 230
Vista de los pasos a seguir para agregar un Titulo a un jPanel al Detalle. Ahora ya podemos observar los cambios realizados a nuestra ventana MovimientoPresupuestoVenta.
Vista de los cambios realizados al Panel. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 231
Entonces no vamos a usar este JTable de la cabecera pero ella nos va a ser muy til entonces no lo vamos a eliminar porque ella tiene todos los recursos del Binding o vinculacin encima de este JTable, porque si lo eliminamos tenemos que empezar a vincular nuevamente todos los componentes y eso significa mucho trabajo, entonces la mejor idea es ocultarlo para aprovechar esos recursos, entonces vamos a continuar con la parte visual para ello agregamos seis campos de textos, una lista desplegable con sus respectivas etiquetas.
Vista de los campos de textos, etiquetas y listas desplegables. Aqu en el nombre del cliente ella no debera de ser editable entonces nos vamos en sus propiedades y desmarcamos la opcin enabled.
Vista de los pasos a seguir para deshabilitar un campo de texto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 232
Tambin vamos deshabilitar el campo Total General y vamos a indicarle que el foco no pase por ese campo para ello nos vamos a sus propiedades y desmarcamos enabled y focusable.
Vista de los pasos a seguir para deshabilitar un campo de texto. Ahora vamos a vincular cada componente a nuestra masterTable para ello seguimos los siguientes pasos, nos posicionamos sobre el campo de texto del codigo, la seleccionamos y hacemos clic derecho sobre ella, luego elegimos las opciones Enlazar => text.
Vista de los pasos a seguir para enlazar un campo de texto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 233
Esto nos lleva a la ventana Enlace donde en la lista desplegable Enlazado de fuente tenemos que seleccionar nuestro masterTable y en Enlazado de expresin tenemos que enlazar a la selectedElement.codPresupuesto, luego hacemos clic en el botn Aceptar.
Vista de la ventana Enlace. Seguimos los mismos pasos para nuestro cliente, nos posicionamos sobre el campo de texto del cliente, la seleccionamos y hacemos clic derecho sobre ella, luego elegimos las opciones Enlazar => text. Esto nos lleva a la ventana Enlace donde en la lista desplegable Enlazado de fuente tenemos que seleccionar nuestro masterTable y en Enlazado de expresin tenemos que enlazar a la selectedElement.codCliente.
Vista de la ventana Enlace. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 234
Ahora antes de continuar con nuestra lista desplegable vamos a tener que hacer algunos cambios en el bean de CabPresupuesto, primero vamos a comentar nuestro cdigo de coduncionario, luego agregamos las siguientes lneas de cdigo: @JoinColumn(name = "cod_funcionario", referencedColumnName ="cod_funcionario" ) @ManyToOne //con esta anotacin estoy diciendo que tengo muchos Presupuestos para este funcionario
Vista de los cambios realizados al codigo del archivo CabPresupuesto. Ahora en este punto nos damos cuenta que vamos a necesitar del bean del funcionario, todava no lo hemos creado as que vamos a aprovechar y lo creamos ahora, para ello seguimos los mismos pasos vistos anteriormente, nos posicionamos sobre el paquete py.com.systvent.view, la seleccionamos y luego hacemos clic derecho sobre ella, luego elegimos las opciones Nuevo => Formulario de ejemplo maestro/detalle. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 235
Vista de los pasos a seguir para agregar un formulario maestro/detalle. Esta accin nos lleva a la ventana Nuevo Formulario maestro/detalle, en Nombre de la clase para nuestro ejemplo vamos lo vamos a llamar FuncionarioView, presionamos el botn Siguiente.
Vista del paso 2 Nombre y ubicacin de la ventana Nuevo Formulario maestro/detalle. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 236
Luego definimos la conexin y seleccionamos la tabla maestro que para nuestro ejemplo ser funcionario, en el paso 4 en Opciones de detalle elegimos la opcin Cuadros de texto y pasamos del codigo del funcionario (cod_funcionario) del lado de Campos disponibles, luego presionamos el botn Terminar.
Vista del paso 2 Opciones de detalle de la ventana Nuevo Formulario maestro/detalle. Esta accin nos muestra que se esta creando un formulario Maestro/Detalle junto con todos sus componentes.
Vista de la creacin del Formulario maestro/detalle. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 237
Ahora ya podemos observar el formulario creado al que ya le cambiamos por el momento las etiquetas.
Vista del nuevo formulario FuncionarioView. OK ahora que ya tenemos creado el bean del funcionario en el paquete py.com.systvent.view y lo vamos a pasar al paquete py.com.systvent.bean, para ello seleccionamos el archivo Funcionario.java, lo arrastramos y lo soltamos sobre el nombre del paquete.
Vista del archivo Funcionario.java a ser cambiado de paquete. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 238
Esta accin hace que aparezca la ventana Mover clase donde seleccionamos el botn Reestructurar.
Vista de la ventana Mover clase para Reestructurar un archivo. Ahora vamos a llamar a nuestro funcionario desde la Ventana Principal para ello nos vamos a nuestro men Registros y dentro de ella seleccionamos el tem de men Funcionario, luego hacemos clic derecho sobre ella y elegimos las opciones Eventos => Action => actionPerformed.
Vista de los pasos a seguir para agregar un evento al tem de men Funcionarios. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 239
Esta nos lleva al evento jmi_funcionario donde pegamos estas tres lneas de cdigos: String args[] = new String [1]; args[0] = "Registro de Funcionarios"; FuncionarioView.main(args);
Vista de las lneas de codigo agregadas al evento. Luego nos vamos al main de la ventana FuncionarioView donde comentamos la lnea de codigo y agregamos el titulo de la ventana.
Vista de las lneas de codigo agregadas al main de la ventana FuncionarioView. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 240
Ahora vamos a agregar un registro de funcionario para ello hacemos correr nuestra aplicacin, luego elegimos el men Registros y dentro de ella al tem de men Funcionarios.
Vista de los pasos a seguir para ejecutar el tem de men Funcionarios. Esta accin llama a la ventana Registro de Funcionarios donde completamos los datos del funcionario que necesitamos guardar, luego presionamos el botn Guardar.
Vista de la ventana Registro de Funcionarios. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 241
Ahora observemos los datos desde la Base de Datos y efectivamente ya tenemos all los datos que acabamos de completar.
Vista de los datos almacenados en la tabla funcionario. Ahora nos vamos nuevamente al bean del codigo de DetPresupuesto y completamos los cdigos que faltan. private Funcionario codFuncionario;
Vista de las lneas agregadas al codigo del archivo CabPresupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 242
Luego reparamos las importaciones, ahora nos vamos a comentar los mtodos gets y sets de funcionario, luego sobrescribimos esos mtodos. public Funcionario getCodFuncionario() { return codFuncionario; } public void setCodFuncionario(Funcionario codFuncionario) { Funcionario oldCodFuncionario = this.codFuncionario; this.codFuncionario = codFuncionario; changeSupport.firePropertyChange("codFuncionario", oldCodFuncionario, codFuncionario); }
Vista de las lneas agregadas al codigo del archivo CabPresupuesto.
Ahora nos vamos nuevamente para nuestra ventana de Presupuesto, seleccin la lista desplegable del Funcionario, hacemos clic derecho sobre ella y elegimos las opciones Enlazar => elements. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 243
Vista de las lneas agregadas al codigo del archivo CabPresupuesto. Esta accin nos lleva a la ventana Enlace donde seleccionamos el botn Importar datos del formulario, esta accin hace que aparezca la ventana Importar datos al formulario donde tenemos que definir la Conexin con la Base de datos y la Tabla de base de datos que para este caso sera Funcionario.
Vista de la ventana Importar datos del formulario. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 244
Presionamos el botn Aceptar y en este punto Netbeans nos crea una lista de funcionarios al que llama funcionarioList, luego presionamos el botn Aceptar.
Vista de la ventana Enlace del JComboBox. Ahora tenemos que vincular nuestra lista desplegable con el Item seleccionado, para ello lo seleccionamos nuevamente, hacemos clic derecho sobre ella y elegimos las opciones Enlazar => selectedItem.
Vista de los pasos a seguir para enlazar un campo de texto a un elemento seleccionado. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 245
Esta nos lleva a la ventana Enlace donde en la opcin Enlazado de fuente elegimos masterTable y en Enlazado de expresin apuntamos a nuestro codFuncionario, luego presionamos el botn Aceptar.
Vista de la ventana Enlace. Ahora continuando con nuestros enlaces hacemos lo mismo hacemos con la fecha, para ello seleccionamos el campo de texto Fecha, hacemos clic derecho sobre ella y elegimos las opciones Enlazar => text.
Vista de los pasos a seguir para enlazar un campo de texto a un texto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 246
Esto nos lleva a la ventana de Enlace donde en Enlazado de fuente seleccionamos masterTable y en Enlazado de la expresin seleccionamos la fecha (fchPresCab), luego presionamos el botn Aceptar.
Vista de la ventana Enlace. Por ltimo vamos a enlazar nuestro campo de texto Total General para ello lo seleccionamos, hacemos clic derecho sobre ella y elegimos nuevamente Enlazar => text.
Vista de los pasos a seguir para enlazar un campo de texto a un texto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 247
En la ventana Enlace seleccionamos nuevamente masterTable en Enlazado de fuente y en Enlazado de expresin elegimos el valor del presupuesto (vlrPresuCab), luego presionamos el botn Aceptar.
Vista de la ventana Enlace. Ahora ya tenemos todos los campos vinculados entonces vamos a ejecutar nuestro proyecto, para ello nos vamos a nuestro men Movimiento y dentro de ella elegimos el tem de men Presupuesto.
Vista de los pasos a seguir para ejecutar el tem de men Presupuesto Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 248
Esto nos lleva a la ventana Movimiento Registro de Presupuesto.
Vista de la ventana Movimiento Registro de Presupuesto. Observamos que en Funcionario no nos trae ningn valor en nuestra lista desplegable, luego presionamos el botn Nuevo Presupuesto y en la cabecera completamos los datos del presupuesto, luego presionamos el botn Agregar Item para completar los datos del detalle, ahora a presionar el botn Guardar observamos que nos lanza una Excepcin. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 249
Vista de la excepcin lanzada en la pestaa sysvent (run). All podemos observar que nos da un ClassCastException eso es porque estamos vinculando un text a una fecha, pero tambin podemos observar en la cabecera que el codigo ya fue asignado y es 3, para ver los datos en la Base de Datos, comenzamos con la tabla cab_presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 250
Vista de los datos almacenados en la tabla cab_presupuesto. Luego observamos los datos guardados en la tabla det_presupuesto..
Vista de los datos almacenados en la tabla det_presupuesto. Por el momento esta guardando los datos dentro de la base de datos, ahora vamos a hacer que aparezcan los datos del funcionario dentro de la Lista Desplegable. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 251
Esta lista de funcionario no se esta renderizando aqu correctamente, porque aparece el camino completo, que es lo que est pasando ac??
Vista de los datos mostrados en la lista desplegable Funcionario. Eso pasa porque no se esta renderizando correctamente, para ello vamos a crear un renderer, entonces vamos a crear un nuevo paquete al que llamaremos py.com.systvent.renderizar.
Vista de los pasos a seguir para agregar un nuevo paquete. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 252
En la ventana Nuevo Paquete Java completamos el nombre del paquete y presionamos el botn Terminar.
Vista del paso 2 Nombre y ubicacin de la ventana Nuevo Paquete Java. Luego dentro de este paquete vamos a crear un nuevo archivo java ello nos posicionamos sobre el nombre del paquete, hacemos clic derecho sobre ella y elegimos las opciones Nuevo => Clase Java.
Vista de los pasos a seguir para agregar una nueva Clase Java. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 253
A esta clase lo vamos a llamar FuncionarioListRenderizar, completamos el nombre de la clase y presionamos el botn Terminar.
Vista del paso 2 Nombre y ubicacin de la ventana Nuevo Clase Java. Luego agregamos las siguientes lneas de codigo dentro de nuestra clase: public class FuncionarioListRenderizar extends DefaultListCellRenderer{ @Override public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (value instanceof Funcionario) //Si el valor es una instancia de Funcionario { Funcionario f = (Funcionario) value;//asigno el valor del funcionario setText(f.getNombreFuncionario());//asignamos en nuestro caso el valor de la descripcin de la unidad } return this; } }
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 254
No debemos olvidar en importar todos paquetes que hacen falta, esa opcin ya la hemos visto como podemos conseguirla.
Vista del nuevo archivo creado dentro del paquete py.com.systvent.renderizar. Despus de crear el archivo lo selecciono luego lo arrastramos y lo lanzamos fuera del form en la parte blanca no sobre el formulario (esto es muy importante) y as lo usamos como un bean. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 255
Vista de los pasos a seguir para utilizar el archivo creado como un bean . Ahora podemos observar en el Inspector el nuevo componente bean agregado.
Vista del nuevo bean agregado dentro del Inspector. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 256
Ahora el siguiente paso a seguir es renderizar esta lista desplegable con el archivo que acabamos de crear, para ello nos vamos en las propiedades de la lista desplegable Funcionario, all vamos a encontrar la propiedad renderer donde seleccionamos nuestro funcionarioListRenderizar1.
Vista de la propiedad renderer del JComboBox. Luego tenemos que realizar un cambio en nuestro JTable de la cabecera para ello lo seleccionamos, hacemos clic derecho sobre ella y elegimos la opcin Contenido de la tabla. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 257
Vista de los pasos seguir para acceder al Contenido de la tabla. En la columna Funcionario hacemos que apunte a ${codFuncionario.nombreFuncionario}, y all debemos de asegurarnos que el Tipo sea String.
Vista de las columnas de la ventana Personalizar Dialogo. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 258
Ahora ejecutamos nuevamente nuestra aplicacin para ver cmo van los cambios para ello en la ventana Sistema de Ventas elegimos el men Movimiento y dentro de ella el tem de men Presupuesto.
Vista de los pasos a seguir para ejecutar el tem de men Presupuesto. Esta accin nos lleva a la ventana Movimiento Registro de Presupuesto donde ya podemos observar el nombre del funcionario dentro de nuestra lista desplegable.
Vista de la ventana Movimiento Registro de Presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 259
Ahora vamos a tratar la excepcin que nos dio con nuestra fecha, vamos a agregar desde la Paleta un componente del tipo Cuadro Formateado.
Vista de los pasos a seguir para agregar un componente Cuadro formateado. Ahora eliminamos el campo de texto que tenamos en la fecha y colocamos en su lugar nuestro Cuadro formateado, ahora vamos a enlazarlo para ello lo seleccionamos y elegimos las opciones Enlazar => value.
Vista de los pasos a seguir para enlazar un Cuadro formateado a un valor. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 260
Esta accin hace que aparezca la ventana Enlace donde seleccionamos en Enlazado de fuente nuestro masterTable y en Enlazado de expresin nuestra fecha de presupuesto (fchPresCab), luego presionamos el botn Aceptar.
Vista de la ventana Enlace. Ahora ya podemos observar en la pestaa Enlace el valor del enlace.
Vista de la propiedad value del cuadro formateado. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 261
Ahora vamos a probar si nos da la excepcin, para ello vamos a ejecutar nuevamente nuestro programa, para ello en la ventana Sistema de Ventas elegimos el men Movimiento y dentro de ella el tem de men Presupuesto.
Vista de los pasos a seguir para ejecutar el tem de men Presupuesto. En la ventana Movimiento Registro de Presupuesto presionamos el botn Nuevo Presupuesto y en la cabecera completamos los datos.
Vista de la ventana Movimiento Registro de Presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 262
Luego presionamos el botn Agregar Item donde completamos todos los datos en el detalle, luego presionamos el botn Guardar.
Vista de la ventana Movimiento Registro de Presupuesto con todos los datos cargados. Ahora nos vamos del lado de Base de Datos y observamos los datos guardados en la tabla cab_presupuesto donde podemos observar que la fecha ya fue almacenada.
Vista de los datos almacenados en la tabla cab_presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 263
Luego observamos los datos guardados en la tabla det_presupuesto donde podemos observar que los datos fueron almacenados sin ningn inconveniente.
Vista de los datos almacenados en la tabla det_presupuesto. Ahora vamos a hacer lo siguiente, al hacer clic en el botn Nuevo Presupuesto el foco tiene que aparecer en el Codigo del Cliente y que tambin deshabilite el codigo del Presupuesto. Entonces primero vamos a ver como se llama nuestro campo de texto para despus utilizarlo en el codigo del botn Nuevo Presupuesto, para ello nos posicionamos sobre el campo de texto del Cliente hacemos clic derecho sobre ella y elegimos la opcin Cambiar nombre de la variable. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 264
Vista de los pasos a seguir para Cambiar el nombre a una variable. Para nuestro ejemplo lo vamos a llamar tfCliente, presionamos el botn Aceptar.
Vista de la ventana Cambiar de nombre. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 265
Seguimos los mismos pasos para cambiar el nombre de nuestra variable para el codigo del presupuesto, para nuestro ejemplo lo vamos a llamar tfCodCabecera, luego presionamos el botn Aceptar.
Vista de la ventana Cambiar de nombre. Una vez que ya cambiamos el nombre a nuestras variables vamos a agregarle esta funcionalidad a nuestro evento, para ello nos posicionamos sobre nuestro botn Nuevo Presupuesto, hacemos clic derecho sobre ella y elegimos las opciones Eventos => Action => actionPerformed, esta accin nos lleva a la fuente del evento. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 266
Vista de los pasos a seguir para agregar un evento al botn Nuevo Presupuesto. Ahora en el codigo agregamos estas dos lneas de codigo, la primera lnea hace que el foco se ubique en el codigo del cliente y la segunda lnea hace que el codigo del presupuesto este deshabilitado. tfCliente.requestFocus(); tfCodCabecera.setEnabled(false);
Vista de las dos lneas de cdigos agregadas al evento del botn Nuevo Presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 267
Vamos a comprobar si esto esta funcionando para ello ejecutamos nuevamente nuestra aplicacin, en el men Movimientos elegimos el tem de men Presupuesto.
Vista de los pasos a seguir para ejecutar el tem de men Presupuesto. Ahora al presionar el botn Nuevo Presupuesto podemos notar que el codigo ya esta deshabilitado y que el foco se encuentra en el codigo del cliente
Vista de la ventana Movimiento Registro de Presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 268
Genial vamos bien!!! ahora que ya tenemos prcticamente todo funcionando en la cabecera vamos a hacer que nuestro JTable no sea visible, recuerden que necesitamos de ella porque esta vinculada a todos los componentes, entonces para esconderla vamos a seguir los siguientes pasos: Seleccionamos nuestra JTable y luego en los puntos que aparecen en la esquina lo reducimos con el mouse hasta que no sea visible.
Vista de los pasos a seguir para ocultar una JTable. Ahora nuestra JTable ya no esta visible y podemos acomodar nuestros otros componentes de la cabera como se observa en el grafico.
Vista de la ventana MovimientoPresupuestoVenta con los nuevos cambios. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 269
Ahora vamos a continuar con la funcionalidad de nuestra ventana, ahora la idea es que cuando se introduzca el codigo del cliente te traiga el nombre del cliente en pantalla, pero como es que podemos conseguir eso?? Para ello vamos a colocar el codigo en el focusLost y dentro de ese focusLost tenemos que primero pegar el nombre del cliente y para ello vamos a usar el Bean de cliente, dentro de este Bean vamos a encontrar una anotacin llamada @NamedQuery, dentro del bean vamos a encontrar varios @NamedQuery al que le podemos pasar un parmetro pero el query que vamos a usar nosotros es SELECT c FROM Cliente c WHERE c.codCliente = :codCliente.
Vista de los NamedQuery definidos en dentro del codigo del archivo Cliente.java. Pero antes de introducir el codigo tenemos que crear una consulta al que llamaremos clienteQuery, para crear esta consulta debemos seguir los siguientes pasos: Primero elegimos una consulta y la agregamos a nuestra ventana, esta opcin ya la vimos anteriormente. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 270
Vista de la Consulta agregada a la ventana MovimientoPresupuestoVenta. Ahora nos vamos al Inspector y en las propiedades de nuestro query en la pestaa Codigo le cambiamos el nombre por clienteQuery.
Vista del Nombre de variable dentro de las propiedades del query1. Luego nos vamos en la pestaa Propiedades y hacemos que apunte al entityManager y en query le pasamos el query del cliente que es SELECT c FROM Cliente c, luego presionamos el botn Cerrar. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 271
Vista de las propiedades del query dentro de la ventana clienteQuery. Ahora nos vamos nuevamente a nuestro cdigo fuente del evento FocusLost del campo de texto tfCliente y agregamos estas lineas de codigo: clienteQuery = entityManager.createNamedQuery("Cliente.findByCodCliente");//aqui pasamos como parmetro el nombre del Query que esta en el Bean clienteQuery.setParameter("codCliente", Integer.parseInt(tfCliente.getText())); //le pasamos el parmetro, en el bean el nombre de parmetro se llama codCliente List<Cliente> dato = clienteQuery.getResultList();//Ac estamos usando un recurso llamado generic, definimos una lista de clientes tfNombreCli.setText(dato.get(0).getNomCliente());
Vista de las lineas de codigo agregadas al evento FocusLost del campo de texto tfCliente.
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 272
Ahora vamos a probar si lo que hicimos est funcionando, para ello vamos ejecutar nuestro programa, en la ventana Sistema de Ventas nos vamos al men Movimiento y dentro de ella elegimos el tem de men Presupuesto.
Vista de los pasos a seguir para ejecutar el tem de men Presupuesto. Ahora estamos nuevamente en nuestra ventana Movimiento Registro de presupuesto, en Cliente agregamos el cdigo del cliente y al perder el foco observamos que ya aparece el nombre de nuestro cliente. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 273
Vista de la ventana Movimiento Registro de Presupuesto. Podemos observar que todo marcha sper bien, pero que pasa si colocamos por ejemplo una m en lugar de un numero?? Veamos que sucede, para ello vamos a ejecutar nuevamente nuestro sistema, repetimos los pasos vistos anteriormente y en la ventana Movimiento Registro de Presupuesto escribimos la letra m.
Vista de la ventana Movimiento Registro de Presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 274
Entonces en este punto nos damos cuenta que nos esta mostrando una excepcin del tipo NumberFormatException. Entonces en este punto es recomendable saber cules son los tipos de excepciones que pueden ocurrir y atacarlos uno por uno de la mas especifica a la mas genrica, entonces vamos a agregarle un try y un catch para tratar esta excepcin, entonces nuestro cdigo ahora quedara de esta manera.
private void tfClienteFocusLost(java.awt.event.FocusEvent evt) { // ...... try{ clienteQuery = entityManager.createNamedQuery("Cliente.findByCodCliente");//aqui pasamos como parmetro el nombre del Query que esta en el Bean clienteQuery.setParameter("codCliente", Integer.parseInt(tfCliente.getText())); //le pasamos el parmetro, en el bean el nombre de parmetro se llama codCliente List<Cliente> dato = clienteQuery.getResultList();//Ac estamos usando un recurso llamado generic, definimos una lista de clientes tfNombreCli.setText(dato.get(0).getNomCliente());//tfNombreCli es el campo de texto donde tiene que aparecer el nombre } catch(Exception e) { JOptionPane.showMessageDialog(null, "Ocurri un error"); e.printStackTrace(); } }
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 275
Vista de la modificacion al codigo del evento FocusLost del campo de texto tfCliente.
Ahora vamos a correr nuevamente nuestro sistema siguiendo los mismos pasos vistos anteriormente, y al introducir la letra m el sistema ya nos muestra el mensaje que ocurri un error.
Vista del mensaje de error lanzado en la ventana Movimiento Registro de Presupuesto. El otro tipo de error que nos puede dar aqu es cuando no exista el cdigo del cliente que le estamos pasando, esa excepcin seria del tipo ArrayIndexOutOfBoundsException. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 276
Vista de la excepcin lanzada en la pestaa sysvent (run). En este punto podemos observar que no existe un cliente con ese cdigo (12), entonces esto queda como tarea para ustedes el poder tratar esta excepcin. Ahora vamos a crear nuestra ventana de bsqueda de productos, la idea aqu es crear nuestra ventana y al presionar el botn Agregar tem llamar a esa ventana, buscamos los datos del producto y al cerrar esa ventana que esos datos se inserten en el detalle con todos los datos del producto. Entonces para este ejemplo vamos a crear primero un paquete al que llamaremos py.com.systvent.busqueda y luego dentro de este paquete vamos a crear nuestra ventana JDialog, para ello nos posicionamos sobre el nombre de nuestro paquete, hacemos clic derecho sobre ella y elegimos las opciones Nuevo => Formulario JDialog. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 277
Vista de los pasos a seguir para crear un Formulario JDialog. En la ventana Nuevo Formulario JDialog le damos el nombre a nuestra ventana, para nuestro ejemplo lo vamos a llamar BuscarProducto.
Vista del paso 2 Nombre y ubicacin de la ventana Nuevo Formulario JDialog. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 278
Ahora podemos observar nuestra ventana, vamos a poner el gestor de distribucin en Diseo Absoluto y luego le vamos a agregar una tabla.
Vista de la ventana JDialog con la Tabla agregada. Luego le agregamos una etiqueta, un campo de texto y un botn a nuestra ventana.
Vista de la ventana Buscar Producto con los objetos agregados. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 279
Ahora vamos a enlazar los elementos con la tabla para ello seleccionamos nuestra tabla, hacemos clic derecho sobre ella y elegimos las opciones Enlazar => elements.
Vista de los pasos a seguir para enlazar una Tabla a sus elementos. Elegimos el botn Importar datos al formulario, seleccionamos la Conexin con la base de datos y la Tabla de la base de datos que nuestro caso es producto, en este momento el automticamente el est creando un EntityManager, un JQuery y una lista (list), luego hacemos clic en el botn Aceptar. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 280
Vista de la ventana Importar datos al formulario. Nuevamente en la ventana Enlace jTable1 dejamos todo como esta y damos clic en el botn Aceptar.
Vista de la ventana Enlace con el Enlazado de fuente definido. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 281
Cambiamos en sus propiedades del JTable la opcin el autoResizeMode a OFF.
Vista de las propiedades de la Tabla dentro de la ventana jTable1. Ahora lo que tenemos que hacer es que esa Tabla apunte a un bean en la memoria, que en este caso sera el bean de MovimmientoPresupuestoVenta, en este punto nosotros vamos a usar el mismo bean y la misma direccin de memoria. Ahora nos vamos al Inspector, seleccionamos nuestro productoList y en sus Propiedades seleccionamos Observable porque l esta apuntando a ese productoQuery.
Vista de las propiedades del componente productoList. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 282
En las propiedades en de la pestaa Codigo nos aseguramos que este apuntando al bean del producto.
Vista de las propiedades del componente productoList. Ahora nos vamos al productoQuery y simplemente nos aseguramos que todo all este bien, no cambiamos nada en sus propiedades.
Vista de las propiedades del componente productoQuery. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 283
Luego vamos a las propiedades del entityManager, all en la pestaa Cdigo en Nombre de la variable lo vamos a cambiar por entityManager, en la figura muestra el Nombre de la variable antes del cambio.
Vista de las propiedades del componente sistventPUEntityManager antes del cambio de Nombre de Variable. Ahora podemos apreciar el grafico el cambio que realizamos.
Vista de las propiedades del componente entityManager despus del cambio de Nombre de Variable. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 284
Ahora vamos a implementar una bsqueda de productos, para ello creamos un nuevo paquete al que llamaremos py.com.systvent.convertir.
Vista del paso 2 Nombre y ubicacin para la creacin del nuevo paquete. Ahora dentro de este paquete vamos a agregar un archivo que nos va a ayudar para realizar un filtro en nuestra bsqueda, para ello nos posicionamos sobre nuestro paquete hacemos clic derecho sobre ella y elegimos las siguientes opciones Nuevo => Clase Java.
Vista de los pasos a seguir para la creacin de un nuevo Paquete Java. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 285
Esta accin nos lleva a la ventana de creacin de nuevo Clase Java donde le asignamos el nombre de OrdFilaConvString, luego dentro de este archivo pegamos los siguientes cdigos: package py.com.systvent.convertir; import javax.swing.JTable; import javax.swing.RowFilter; import javax.swing.table.TableRowSorter; import org.jdesktop.beansbinding.Converter; /** * * @author Miguel Recalde */ public class OrdFilaConvString extends Converter{ private JTable table; public JTable getTable() { return table; } public void setTable(JTable table) { this.table = table; } @Override public Object convertReverse(Object mask) { TableRowSorter sorter = new TableRowSorter(table.getModel()); //El siguiente cdigo hace que el filtro sea case sensitive y si queremos //que sea case sensitive, solo hay que descomentar las lneas //sorter.setRowFilter(RowFilter.regexFilter(".*" + mask + ".*")); String m = mask.toString(); StringBuilder sb = new StringBuilder(); for (int i = 0; i< m.length();i++) Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 286
{ char c = m.charAt(i); sb.append('[').append(Character.toLowerCase(c)).append(Character.toUpperCase(c)).append(']'); } sorter.setRowFilter(RowFilter.regexFilter(".*" + sb + ".*")); return sorter; } @Override public Object convertForward(Object value) { throw new UnsupportedOperationException("No encontrado."); } }
Vista de los cdigos del archivo OrdFilaConvString. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 287
Ahora vamos lanzar nuestro converter sobre la JDialog y lo vamos a usar como un Bean, para ello seleccionamos nuestro archivo OrdFilaConvString, lo arrastramos y lo soltamos sobre nuestra ventana JDialog.
Vista del archivo OrdFilaConvString a ser usado como un bean.
Ahora si nos vamos al Inspector lo vamos a poder visualizar, ahora en sus Propiedades lo tenemos que vincular con nuestra Table1, luego presionamos el botn Cerrar. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 288
Vista de la vinculacin entre el archivo ordFilaConvString1 con la jTable1. Ahora tenemos que enlazar nuestro campo texto para ello lo seleccionamos, hacemos clic derecho sobre ella y elegimos las opciones Enlazar => text.
Vista de la ventana Movimiento Registro de Presupuesto. Ahora en la ventana Enlace en Enlazado de la fuente lo vinculamos con el JTable1 y en Enlazado de expresin seleccionamos la expresin que es rowSorter. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 289
Vista de la ventana Enlace del jTextField1. Luego en la pestaa Avanzado de la ventana Enlace en la opcin Convertidor tenemos que apuntar a nuestro archivo bean ordFilaConvString1 con esto nos aseguramos que al introducir una letra, numero, etc., ella har la bsqueda de las coincidencias y luego lo va a ordenar y filtrar dentro de la tabla, presionamos el botn Aceptar.
Vista de la pestaa Avanzado de la ventana Enlace del jTextField1. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 290
Muy bien ahora que ya tenemos creada nuestra ventana de bsqueda recordamos nuevamente cual es la idea en este punto, nosotros al presionar el botn Agregar Item ella tiene que llamar a nuestra ventana de bsqueda, luego en la ventana tenemos que buscar el Producto, lo seleccionamos y luego lo importamos, al presionar el botn Importar ella debe cerrarse y enviar los datos del producto al detalle. Ahora el cdigo del botn Agregar Item lo podemos hacer es pasarle el bean que tambin va a ser usado por la ventana de bsqueda ya que ambos van a estar apuntando a la misma direccin de memoria. Para ello nos vamos a la ventana MovimientoPresupuestoVenta y en la fuente aremos los cambios necesarios, veamos los cambios pasos a paso, primero comentamos la lnea donde se asigna el codigo del producto, luego agregamos estas tres lneas de codigo. BuscarProducto bp = new BuscarProducto(null,true); bp.recibeObjeto(d);//antes de hacer visible le paso en recibeObjeto() el valor de d bp.setVisible(true);
Vista de los cdigos agregados al evento newDetail de la ventana MovimientoPresupuestoVenta. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 291
Como podemos observar en la lnea 342 declaramos un mtodo llamado recibeObjeto al cual le pasamos como parmetro el objeto d que nos est dando un error, eso es porque todava no definimos ese mtodos en la ventana BuscarProducto pero lo vamos a hacer ahora. Entonces nos vamos a la ventana BuscarProducto y aqu vamos a crear una variable privada del tipo DetPresupuesto, esto nos va a pedir reparar la importacin porque DetPresupuesto se encuentra en otro paquete, a importarlo desaparece ese error. Luego vamos a crear un mtodo Set al que llamaremos recibeObjeto, en este caso va a recibir un Objeto de tipo DetPresupuesto, el mtodo es de tipo void porque no va a retornar nada. private DetPresupuesto d;//se hace el import necesario public void recibeObjeto(DetPresupuesto d)//este mtodo recibe un objeto de tipo DetPresupuesto, este mtodo lo puedo sobrecargar cuando quiera usar esta ventana con otro formulario y java no tendr problema alguno { this.d = d;//en este punto tanto MovimientoPresupuestoVenta como BuscarProducto estn apuntando al mismo d de la memoria }
Vista del mtodo agregado a la fuente de la ventana BuscarProducto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 292
Ahora vamos a cambiar algunos campos de lugar para poder visualizar los datos de una forma mas ordenada en nuestra ventana de bsqueda para ello nos vamos el modo diseo, nos posicionamos sobre nuestra Tabla, hacemos clic derecho y elegimos la opcin Contenido de la tabla.
Vista de los pasos a seguir para acceder al Contenido de la tabla. Esta accin nos lleva a la ventana de Personalizar cdigo donde podemos cambiar la posicin del Ttulo, su Expresin, el tamao, etc.
Vista de la ventana Personalizar Dialogo. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 293
Al presionar el botn Cerrar ya podemos apreciar los cambios que hicimos a nuestra ventana.
Vista de la ventana Productos con los cambios realizados. Antes de continuar vamos a cambiarle el nombre a nuestro JTable, para ello lo seleccionamos, hacemos clic derecho sobre ella y elegimos la opcin Cambiar nombre de variable.
Vista de los pasos a seguir para cambiar el nombre a una variable. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 294
Luego aparece la ventana Cambiar de nombre donde cambiamos el nombre de nuestra variable por jtProducto.
Vista de la ventana Cambiar de nombre con el Nuevo nombre asignado. Ahora vamos a agregarle un evento a nuestro botn Importar, para ello nos posicionamos sobre ella, hacemos clic derecho y elegimos las opciones Eventos => Action => actionPerformed.
Vista de los pasos a seguir para agregar un evento al botn Importar. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 295
Dentro de este evento vamos a agregarle las siguientes lneas de cdigos: this.d.setVlrUnitPresuDet((Double)jtProducto.getValueAt(jtProducto.getSelectedRow() ,2));//el 2 corresponde al campo 2 de la linea seleccionada que Precio de Venta this.d.getDetPresupuestoPK().setCodProducto((String)jtProducto.getValueAt(jtProducto.getSelectedRow() ,0)); this.dispose();//una vez asignado los valores tenemos que cerrar el formulario
Vista de los cdigos agregados al evento de botn Importar. Ahora nos vamos a la fuente de nuestro MovimientoPresupuestoVenta y alli hacemos el siguiente cambio de cdigo, vamos a cambiar de posicion d.setCabPresupuesto(c);, esta lnea de cdigo tenemos usarlo antes de persistir nuestro objeto d.
Vista de la lnea de cdigo antes de cambiar de posicin. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 296
Vista de la lnea de cdigo despus de cambiar de posicin. Ahora vamos a probar nuestro avance para comprobar que todo marcha como queremos para ello hacemos correr nuestra aplicacin.
Vista de l os pasos a seguir para ejecutar el tem de men Presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 297
Presionamos el botn Nuevo Presupuesto y completamos los datos de la cabecera, luego presionamos el botn Agregar Item.
Vista de la ventana Movimiento Registro de Presupuesto. Al presionar el botn Agregar Item ella llama a la ventana Buscar Productos, dentro de la lista seleccionamos uno por ejemplo Memoria Ram, luego presionamos el botn Importar.
Vista de la ventana Buscar Producto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 298
Ahora podemos observar que se cerr la ventana Buscar Productos y que nuestro producto seleccionado ya aparecen en el detalle de la ventana Movimiento Registro de Presupuesto, luego presionamos el botn Guardar.
Vista de la ventana Movimiento Registro de Presupuesto con el producto importado. No nos lanzo ninguna excepcin asi que ahora nos vamos a nuestra Base de Datos para comprobar que los datos ya fueron guardados, comenzamos con nuestra tabla cab_presupuesto.
Vista de los datos almacenados en la tabla cab_presupuesto. Ahora comprobamos los datos de nuestra tabla det_presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 299
Vista de los datos almacenados en la tabla det_presupuesto. Ok por el momento vamos bien ya nos trae el cdigo del producto y su precio de venta ahora lo que tenemos que conseguir es traer esa descripcin de producto en el detalle, asignarle una cantidad y que nos calcule nuestro Valor Total y nuestro Total General. Vamos a comenzar por la descripcin del producto en el archivo bean DetPresupuesto, para eso vamos a hacer lo siguiente, nos vamos a DetPresupuesto y vamos a crear una nueva propiedad aqu.
Vista del archivo bean DetPresupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 300
Esa propiedad va a ser del tipo private y lo llamaremos descripcionProducto. Como la tabla no tiene descripcin del producto nosotros creamos ese campo all, con la anotation @Transient le decimos a JPA que no va a persistir ese campo, tambin tenemos que crear los gets y sets para esta nueva propiedad, entonces dentro del bean agregamos estas lneas de cdigo: @Transient //tengo una anotacion llamada @Trasient, esto informa que la propiedad no es persistente, esto significa que la descripcion del producto no sera persistente //nueva propiedad agregada private String descripcionProducto;//JPA va a pedir agregar un get y un set y tambien va a querer persistir en una BD, pero la anotacion @Transient le indica que eso no es necesario public void setDescripcionProducto(String d) { this.descripcionProducto = d; } public String getDescripcionProducto() { return this.descripcionProducto; }
Vista de las lineas de codigos agregadas al archivo bean DetPresupuesto.
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 301
Entonces lo que hicimos ac es agregar una descripcin del producto al detalle de la venta ya que no tenemos esa descripcin all, luego con la anotacin @Transient le indicamos que ella no va a ser guardada en la Base de Datos. Para poder traer esos valores de la ventana de busqueda a mi detalle yo tengo que usar un query, ese query lo vamos a encontrar en el archivo bean Producto.java Producto.findAll", query = "SELECT p FROM Producto p"
Vista de los @NamedQuery definidos en el archivo bean Producto. Esta parte es muy parecida a lo que hicimos con cliente en el archivo MovimientoPresupuesto.java en el evento focusLost. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 302
Vista de las lneas de cdigos a copiar del evento tfClienteFocusLost. Para conseguir esta funcionalidad nos vamos a la Paleta y en Persistencia de Java elegimos la opcin Consulta, la seleccionamos y luego la arrastramos sobre nuestra ventana MovimientoPresupuestoVenta
Vista de la consulta agregada a la ventana MovimientoPresupuestoJava Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 303
Ahora nos vamos al Inspector y el nombre de esa consulta es query1 y vamos ahora en sus propiedades, en entityManager le asignamos entityManager y en query SELECT p FROM PRODUCTO p.
Vista de los cambios a realizar en las Propiedades de componente query1 dentro de la ventana query1. Tambin en la pestaa Cdigo vamos a cambiar el nombre de variable por productoQuery.
Vista de los cambios a realizar en las Propiedades de componente query1 dentro de la ventana query1. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 304
Hecho esto nosotros nos vamos al cdigo del MovimientoPresupuestoVenta en el lostFocus, copiamos ese ese cdigo para despus pegar los y hacerle los cambios necesarios.
Vista de las lneas de cdigos a copiar del evento tfClienteFocusLost. Y lo pegamos en el evento newDetail antes de persistir nuestro entityManager.
Vista de las lneas de cdigos a copiados dentro del evento del botn newDetail. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 305
Y ahora hacemos los cambios necesarios en el cdigo, al final estas serian las lneas de cdigos agregadas productoQuery = entityManager.createNamedQuery("Producto.findByCodProducto"); productoQuery.setParameter("codProducto", d.getDetPresupuestoPK().getCodProducto()); List<Producto> dato = productoQuery.getResultList();//Esta lista solo va a retornar un producto d.setDescripcionProducto(dato.get(0).getDescProducto());
Vista de las lneas de cdigos modificados dentro del evento.
Bien una vez que tengamos todos listo lo que tenemos que hacer es volver al diseo, seleccionamos la tabla, hacemos clic derecho sobre ella y elegimos el Contenido de la tabla. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 306
Vista de los pasos a seguir para agregar Contenido de la tabla. Ahora en la pestaa Columnas vamos a insertar la Descripcin del Producto, para ello presionamos el botn Insertar, esto hace que aparezca una nueva fila al que le agregamos la descripcin, para ello en Titulo agregamos Descripcin del Producto y en Expresin seleccionamos descripcionProducto.
Vista de la nueva columna agregada dentro de la ventana Personalizar Dialogo. Ahora vamos a subir esta descripcin debajo del cdigo del producto, tambin le vamos a asigna un ancho de 150. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 307
Vista de los cambios agregados a la ventana Personalizar Dialogo. Ahora vamos a comprobar que todo marcha segn queremos, para ello vamos a ejecutar nuestra aplicacin para ello seguimos los mismos pasos de siempre.
Vista de los pasos a seguir para ejecutar el tem de men Presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 308
En la ventana Movimiento Registro de Presupuesto presionamos el botn Nuevo Presupuesto donde agregamos los valores en la cabecera, luego presionamos el botn Agregar Item.
Vista de la ventana Movimiento Registro de Presupuesto. Ahora ya podemos observar nuestra ventana Buscar Productos con la lista de productos que tenemos guardados en nuestra Base de Datos.
Vista de la ventana Buscar Productos. Vamos a probar si funciona nuestro filtro para ello escribimos las letras mo en el campo de texto y podemos observar que nos filtra dos filas cuyos nombre de productos coinciden con este filtro. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 309
Vista de la ventana Buscar Productos utilizando el filtro de bsqueda con las letras mo. Al presionar el botn Importar de la ventana Buscar Producto ella se cierra y podemos observar en la ventana Movimiento Registro de Presupuesto que ya tenemos importado el producto que seleccionamos.
Vista de la ventana Movimiento Registro de Presupuesto con los datos importados en el detalle. Presionamos nuevamente el botn Agregar Item y nuevamente escribimos las letras te en el campo de texto y podemos observar que nos filtra una fila cuyos nombre de productos coincide con este filtro.
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 310
Vista de la ventana Buscar Productos utilizando el filtro de bsqueda con las letras te. Nuevamente presionamos el botn Importar y ahora ya podemos observar nuevamente el producto importado en el detalle.
Vista de la ventana Movimiento Registro de Presupuesto con los datos importados en el detalle. Ahora nos vamos nuevamente a nuestra Base de Datos para comprobar que los datos que ingresamos se estn guardando, comenzamos primero con la tabla cab_presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 311
Vista de los datos almacenados en la tabla cab_presupuesto. Ahora nos vamos a comprobar en la tabla det_presupuesto, como podemos observar en las dos tablas aparecen los datos con los que estuvimos trabajando.
Vista de los nuevos datos almacenados en la tabla det_presupuesto. Ahora lo que vamos a hacer es lo siguiente, permitir que el cliente introduzca la cantidad y el que calcule su valor. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 312
Luego vamos a agregar un nuevo botn y vamos a hacer algunos cambios con respecto a la ubicacin de los botones, a este botn lo vamos a llamar Calcular Totales, este botn va a tener un mtodo que haga el clculo, este botn se puede programar para que al presionar F5 por ejemplo ya nos haga el clculo.
Vista de los pasos a seguir para agregar un nuevo botn. Entonces cuando el usuario haga clic en este botn, l tiene que hacer el clculo del valor de los productos por la cantidad, despus el va a colocar el total de la lnea y colocarlo en el Total General, eso es lo que el mtodo necesita hacer, para agregar un evento a nuestro botn Calcular Totales la seleccionamos, hacemos clic derecho sobre ella y elegimos las opciones Eventos => Action => actionPerformed. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 313
Vista de los pasos a seguir para agregar un evento a un botn. Para conseguir esta funcionalidad nosotros tenemos que recorrer todas las filas que se encuentran en nuestro Detalle, entonces vamos a recorrer la lista de ese JTable que est vinculada, vamos a hacer algo muy parecido a lo que hicimos con el botn Agregar Item.
Vista del nuevo evento agregado.
Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 314
Ahora le agregamos estas lneas de cdigo: for ( DetPresupuesto detPresu: ds)// for each, aca el va a pegar todos esos objetos dentro de la coleccin { if(detPresu.getCantPresuDet()== null)//si la cantidad es nula entonces le asigno a cantidad el valor de 1 { detPresu.setCantPresuDet(1);//cantidad es igual a 1 } //Ahora voy a insertar el valor total de DetPresupuesto detPresu.setVlrTotalPresuDet(detPresu.getVlrUnitPresuDet() * detPresu.getCantPresuDet());//Valor total = precio unitario * cantidad valorTotal = valorTotal + detPresu.getVlrTotalPresuDet();//Valor = valor total + total detalle de cada linea } //Aca el total general es igual a valor total tfTotalGral.setText(String.valueOf(valorTotal));//tfTotalGral es el nombre de la variable Total General de la cabecera
Vista de los cdigos agregados al evento del botn Calcular Totales. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 315
OK ahora vamos a probar nuestra aplicacin para comprobar que todo funciona como queremos
Vista de los pasos a seguir para ejecutar el tem de men Presupuesto. En la ventana Movimiento Registro de Presupuesto presionamos el botn Nuevo Presupuesto luego completamos los datos de la cabecera, ahora presionamos el botn Agregar Item esto llama a la ventana Buscar Productos donde seleccionamos el producto de la lista y luego presionamos el botn Importar. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 316
Vista de la ventana Buscar Productos. En el grafico podemos observar que los dos primeros productos tienen asignados sus respectivas cantidades pero el tercer producto no lo tiene, vamos a presionar ahora el botn Calcular Totales y veamos que pasa??
Vista de la ventana Movimiento Registro de Presupuesto donde la Cantidad del producto mouse esta vaco. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 317
Podemos observar que asigna la cantidad 1 y que ya nos calcul el Valor Total de cada lnea y tambin que ya nos calcul el Total General de la cabecera.
Vista de la ventana Movimiento Registro de Presupuesto donde la Cantidad del producto mouse ya no est vaco. Ahora vamos a presionar el botn Guardar, luego nos vamos a nuestra tabla de la Base de Datos para comprobar que se haya guardado nuestros datos.
Vista de los datos almacenados en la tabla cab_presupuesto. Ingeniera del Software II Gua de Programacin Miguel Angel Recalde. Pgina 318
Vista de los datos almacenados en la tabla det_presupuesto.