Documente Academic
Documente Profesional
Documente Cultură
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:
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.
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)
Ahora seleccionamos en Categoras la carpeta Swing GUI Forms y en Tipos de Archivos la opcin
Formulario Jframe, presionamos el botn Siguiente.
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 )
Registros
Consultas
Reportes
Utilitarios
Salir
Para ello nos posicionamos sobre el men en nuestro caso File y damos clic derecho sobre el men y
elegimos la opcin Editar texto.
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).
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.
Ciudades
Barrio
Direccin
Funcionarios
Cargo
Proveedores
Stock.
Salir
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.
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.
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
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.
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.
Tambin puedo eliminar un menuItem, en nuestro ejemplo eliminaremos el menuItem Stock, para ello
nos posicionamos sobre l y elegimos la opcin Suprimir.
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.
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.
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.
Editamos su nombre por Implantacin, tambin le agregamos todos los atajos vistos anteriormente.
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.
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.
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.
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.
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.
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.
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 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.
Esto nos lleva a la ventana Nuevo paquete Java donde ponemos el nombre del Paquete y elegimos el
botn Terminar.
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
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
package utilitarios;
import java.util.Date;
import java.text.SimpleDateFormat;
//creamos 4 variables, tienen que ser pblicas para poder utilizar desde la VP
hora = formatoHora.format(horaActual);
switch(dato.getMonth()) //0 a 11
switch(dato.getDay())
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.*;
data mostrar_datos;
public Ventanaprincipal() {
initComponents();
mostrar_datos.el_dato();//primero tengo que ejecutar este metodo para despus ejecutar el resto
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 .
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.
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.
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().
El cdigo que aparece abajo es lo que tenemos que colocar dentro del mtodo.
mostrar_datos.leer_hora();
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.
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
try
//La variable set look tiene que estar definida arriba como una variable String
UIManager.setLookAndFeel(set_look);
SwingUtilities.updateComponentTreeUI(this);
JOptionPane.showMessageDialog(null, error);
Una vez creado el mtodo pasamos al siguiente paso que es agregar los cdigos que faltan dentro de la
Ventana Principal.
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
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.
Miguel Angel Recalde. Pgina 48
Ingeniera del Software II Gua de Programacin
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.
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.
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)
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.
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.
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.
Luego en el paso 3 elegimos la conexin que nosotros queremos utilizar, para nuestro ejemplo vamos a
usar la que definimos anteriormente.
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.
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).
Vamos a esperar un rato para ver como Netbeans va a organizar los datos que est creando.
Netbeans creo por nosotros un formulario, en la cabecera un JTable donde podemos observar el cdigo
y la descripcin de la unidad.
Tambin podemos observar en el detalle dos campos de textos con sus respectivas etiquetas Cod Unidad
y Desc Unidad.
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.
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.
Ahora si nosotros nos vamos a la pestaa Inspector vamos a poder ver todos los componentes que
contiene nuestra ventana.
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.
Ahora vamos a abrir nuestra Ventana Principal que lo tenemos en nuestro paquete de vistas (view).
Y aqu en Unidad nosotros vamos a agregar un evento, para ello la seleccionamos, hacemos clic derecho
y elegimos las opciones Eventos => Action => actionPerformed.
Y es en este punto donde nosotros vamos a agregarle un evento para nuestro men item Unidad.
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.
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.
Luego nos vamos nuevamente al mtodo main y agregamos una lnea de cdigo mas.
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]);
Entonces ese parmetro tiene que ser de tipo final, lo cambiamos y ahora vemos que ya no nos ese
inconveniente.
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.
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.
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.
Luego nos vamos al men Unidad para llamar a la ventana Registro de Unidad.
Ahora vamos a agregar un nuevo registro para ello hacemos clic en el botn New.
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.
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.
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.
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??
Si nosotros nos vamos en la pestaa Enlace tambin conocido como Binding, observamos que nuestra
JTable esta vinculada a una lista (list).
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.
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.
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.
Ahora pasamos al botn Delete en la pestaa enlace observamos que tiene un enabled, que pone
disponible la fila seleccionada en el JTable.
Tambin podemos observar que tiene un evento asociado a ella llamado deleteButtonActionPerformed.
En la pestaa Cdigo tiene los mismos valores que el observado en el botn New.
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.
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.
Nuestra entityManager ella va a estar enlazado a una Unidad de Persistencia, en este caso est siendo
llamada sistventPU (PU PersistenceUnit).
Esa Unidad de persistencia la vamos a encontrar dentro del paquete META_INF y dentro de ella el
archivo persistence .xml.
Veamos ahora sus Propiedades, observamos que tiene como nombre persistence y que su extensin es
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.
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.
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.
Podemos observar que es un bens normal pero con algunas anotaciones muy interesantes como
@Entity, @Table, @NamedQueries, etc.
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.
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.
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.
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.
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
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
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.
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.
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.
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.
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.
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.
Esta accin nos lleva al paso 4 donde aparecen las diferentes Opciones de mapeo que podemos elegir,
finalmente hacemos clic en el botn Terminar.
Ahora podemos observar nuestra clase entidad creada con todas las anotaciones y mtodos que vamos a
necesitar.
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.
Ahora vamos a comenzar insertando una Lista dentro de nuestro formulario, para ello nos vamos a
nuestra Paleta y en Contenedores Swing elegimos Tabla.
Lo nico que tenemos que hacer ac es seleccionar la tabla y colocarlo sobre nuestro formulario.
Luego vamos a tener que agregar a nuestra ventana una etiqueta, un campo de texto y 4 botones.
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.
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.
En el siguiente paso agregamos nuestra Consulta, para ello la seleccionamos y luego la soltamos sobre
nuestra ventana DepartamentoView.java.
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.
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.
Miguel Angel Recalde. Pgina 97
Ingeniera del Software II Gua de Programacin
En las pestaas Enlace y Eventos no tiene nada y Cdigo cambiamos el nombre a 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.
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.
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>.
Muy bien entonces de esta manera ya configuramos nuestros componentes de persistencia, ahora
vamos a seguir configurando los otros Componentes Visuales.
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.
Esto nos lleva a la ventana de Enlace donde tenemos que Enlazar la fuente y la expresin.
Luego desplegamos las opciones de Enlazado de fuente y elegimos la opcin list, ahora hacemos clic en
el botn Aceptar.
Luego en Seleccionado aparecen los dos atributos pero para nuestro ejemplo solo necesitamos el
atributo nombreDepartamento.
Entonces vamos a pasar el atributo codDepartamento del lado de Disponible, luego hacemos clic en el
botn Aceptar.
Ahora podemos observar nuestra ventana con tabla enlazada a nuestra lista de Departamentos.
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.
Ahora vamos a pasar a configurar las propiedades de nuestro JTextField, entonces seleccionamos
nuestro JTextField le damos clic derecho Enlazar => text.
Nosotros sabemos que nuestro JTextField tiene que estar vinculado a nuestro masterTable y el Enlazado
de expresin en ${selectedElement.nombreDepartamento}
En la pestaa Avanzado marcamos la opcin Valor de fuente ilegible y dejamos las opciones por
defecto, luego elegimos el botn Aceptar.
Ahora el otro cambio que tenemos que en las Propiedades dentro de la pestaa Enlace, en enabled
tenemos que agregar algunas opciones.
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.
Ahora siguiendo con la configuracin en la pestaa Cdigo cambiamos el Nombre de la variable por
nombreDepartamentoField.
Muy bien con esto terminamos la configuracin de estos componentes visuales ahora vamos a
configurar cada uno nuestros botones.
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}].
Luego vamos a agregarle a cada uno de nuestros botones los eventos correspondientes, comencemos
con el botn Nuevo, para ello seguimos los siguientes pasos:
Miguel Angel Recalde. Pgina 108
Ingeniera del Software II Gua de Programacin
Nos posicionamos sobre nuestro botn Nuevo, hacemos clic derecho Eventos => Action =>
actionPerformed.
Ahora podemos observar la vista del evento actionPerformed del botn Nuevo.
entityManager.persist(d);
list.add(d);
masterTable.setRowSelectionInterval(row, row);
masterTable.scrollRectToVisible(masterTable.getCellRect(row, 0, true));
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.
py.com.systven.bean.Departamento d = list.get(masterTable.convertRowIndexToModel(selected[idx]));
toRemove.add(d);
entityManager.remove(d);
list.removeAll(toRemove);
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.
En la ventana Reparar todos los imports podemos observar las importaciones que nos faltan y hacemos
clic en el botn OK.
Ahora en la fuente podemos observar todos los imports que hizo Netbeans .
Ahora vamos a agregar los eventos del botn Actualizar, tambin seguimos los mismos pasos vistos
anteriormente.
entityManager.getTransaction().rollback();
entityManager.getTransaction().begin();
entityManager.refresh(entity);
list.clear();
list.addAll(data);
Ahora vamos a programar nuestro botn Guardar siguiendo siempre los mismos pasos vistos
anteriormente con los otros botones.
try {
entityManager.getTransaction().commit();
entityManager.getTransaction().begin();
rex.printStackTrace();
entityManager.getTransaction().begin();
merged.add(entityManager.merge(d));
list.clear();
list.addAll(merged);
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.
Muy bien ahora nos falta agregar algunos cdigos en el constructor de nuestra ventana
DepartamentoView.
if (!Beans.isDesignTime()) {
entityManager.getTransaction().begin();
Reparamos las importaciones que nos faltan para salvar este error.
Ahora podemos observar las importaciones de las bibliotecas que Netbeans hizo para nosotros.
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 pasos a seguir para agregar un evento al tem de men Departamento.
DepartamentoView.main(args);
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.
d.setVisible(true);
d.setTitle(args[0]);
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.
Ahora vamos a nuestra Base de Datos para ver si nos guardo nuestro nombre de Departamento
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.
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.
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..
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.
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.
Esta accin puede durar algunos segundos porque Netbeans nos esta creando todos los cdigos que
vamos a necesitar.
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.
Esta accin hace que aparezca la ventana Mover Clases, hacemos clic en el botn Reestructurar para
que Netbeans nos reestructure todos los cambios necesarios.
Ahora vamos a observar que ya tenemos nuestros archivos bean justo donde queremos en nuestro
paquete py.com.systvent.bean.
Ahora vamos a nuestra Ventana Principal y vamos a llamar desde all a la nueva ventana creada
args[0] = "Registro de Clientes";//es este el parmetro que le pasamos a nuestro mtodo main
ClienteView.main(args);
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]);.
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.
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.
Ahora vamos a comprobar si realmente nos guardo nuestro nuevo registro dentro de la Base de Datos,
para ello nos vamos nuestra tabla cliente.
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.
Esta accin nos lleva a la ventana de Personalizar dialogo donde podemos cambiar el ttulo, el ancho, si
la columna puede ser redimensionable, etc.
Tambin podemos cambiar de posicin los campos, luego presionamos el botn Cerrar.
Hacemos lo mismo para el Detalle siguiendo los mismos pasos vistos anteriormente.
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.
Seguimos los mismos pasos para nuestro detalle, primero la seleccionamos y luego hacemos clic derecho
sobre ella y elegimos las opciones Incluir en = >Panel.
Tambin vamos a agregar nuestros botones dentro de un Panel, siempre siguiendo los mismos pasos
vistos anteriormente.
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.
Ahora vamos a agregarles colores de fondo a nuestros paneles y observamos los cambios.
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.
Miguel Angel Recalde. Pgina 134
Ingeniera del Software II Gua de Programacin
Seguimos los mismos pasos para nuestro Panel del detalle, para nuestro ejemplo lo vamos a llamar
Direcciones de Cliente.
Ahora podemos observar los cambios realizados a nuestra ventana Registro de Clientes.
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.
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.
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.
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.
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.
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.
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.
Con esta accin podemos observar que no conseguimos obtener estos valores que esta en la cabecera
de otra ventana ClienteView.
Para agregar un propiedad son posicionamos en la fuente de nuestra ventana ClienteEditView, hacemos
clic derecho sobre ella y elegimos la opcin Insertar Cdigo.
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.
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.
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.
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.
this.registroActual = registroActual;
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.
ce.setVisible(true);
entityManager.persist(C);
list.add(C);
masterTable.setRowSelectionInterval(row, row);
masterTable.scrollRectToVisible(masterTable.getCellRect(row, 0, true));
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.
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.
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.
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.
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.
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.
Esta accin nos muestra las opciones a elegir, pero lo que nosotros necesitamos es Agregar una
propiedad entonces seleccionamos esa opcin.
Para nuestro ejemplo lo vamos a llamar a nuestra propiedad con el nombre de confirmarCliente y ella va
a ser del tipo boolean.
Ahora podemos observar dentro de la fuente de nuestra ventana ClienteEditView la propiedad que
acabamos de crear.
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.
Presionamos nuevamente el botn Aceptar, luego podemos observar en la fuente de nuestra ventana
ClienteEditView el nuevo mtodo agregado.
setConfirmarCliente(true);
setVisible(false);
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.
Presionamos el botn Agregar, esto nos lleva a la ventana Agregar manejador donde le damos el
nombre de cancelarNuevoCliente.
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.
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);
Ahora para que podamos conseguir la funcionalidad que estamos buscando tenemos que modificar
nuestro cdigo del botn Ingresar Cliente de nuestra ventana ClienteView.
ce.setRegistroActual(C);//
ce.setVisible(true);
if (ce.isConfirmarCliente()){
saveButton.doClick();//
}else {//sino
refreshButton.doClick }
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.
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.
Presionamos el botn Confirmar y observamos los datos dentro de nuestra JTable dentro de nuestra
ventana Registro Cliente.
Ahora nos vamos del lado de la Base de datos para ver si realmente fue guardado los datos de nuestro
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.
ce.setVisible(true);
if (ce.isConfirmarCliente()){
saveButton.doClick();
}else {
refreshButton.doClick();
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.
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.
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.
Esta accin nos muestra los datos actualizados que tenemos guardados en nuestra tabla clientes.
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.
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.
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.
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.
Esta accin nos muestra que se est creando el formulario Maestro/Detalle con todos sus
componentes visuales.
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.
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.
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.
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.
Luego ordenamos nuestros paneles para darle un mejor diseo a nuestro formulario, para
nuestro ejemplo usaremos este diseo.
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.
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.
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.
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.
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.
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.
Esto nos lleva al evento private void jmi_presupuestoActionPerformed donde agregamos estas
tres lneas de cdigo:
String args[] = new String [1];
MovimientoPresupuestoVenta.main(args);
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.
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.
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.
Y esta accin nos muestra que hubo una excepcin al tratar de guardar los datos del detalle.
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).
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.
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.
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.
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??
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.
Por eso esta clase DetPresupuestoPK implementa nuestra clave compuesta con esos dos
campos que son cod_presupuesto y cod_producto.
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.
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.
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.
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.
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.
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.
All observamos los valores que tenemos en memoria con ese objeto c, presionamos el icono +
para observar sus valores.
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.
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.
Observemos que c es un objeto de tipo CabPresupuesto, y luego observamos que ese atributo d
de DetPresupuesto que apunta a CabPresupuesto.
Y ese es el atributo que vamos a setar ahora con el objeto c, ahora vamos a presionar
nuevamente F8 y ya fue setado.
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.
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.
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;),
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.
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 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.
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.
Entonces vamos a hacer correr nuevamente nuestro debug, para ello hacemos clic en icono
Debug Main Project.
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.
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.
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.
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).
Marcamos con el Break Point y hacemos correr nuestro Debug nuevamente presionando el
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.
Esto hace que se active nuestro BreakPoint y nos lleva a la fuente nuevamente, ahora
presionamos F8 para comenzar a debugar.
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.
dpk.setCodPresupuesto(c.getCodPresupuesto());
d.setDetPresupuestoPK(dpk);
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 .
Presionamos F8, y podemos observar los valores de las variables, en c podemos observar que el
cdigo de presupuesto (codPresupuesto) esta en 1.
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.
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.
Ahora si nos vamos a nuestra Base de Datos podemos observar que en la tabla
cab_presupuesto nos guardo nuestros datos.
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.
Miguel Angel Recalde. Pgina 216
Ingeniera del Software II Gua de Programacin
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.
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.
Seguimos presionando F8, en este punto podemos observar que el codPresupuesto esta en 0.
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:
entityManager.getTransaction().begin();
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.
Esta accin nos lleva a la ventana Movimiento Registro de Presupuesto donde presionamos el
botn Nuevo Presupuesto, luego completamos los datos en la cabecera.
Ahora presionamos el botn Agregar item y luego completamos los datos en el detalle.
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.
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.
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.
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.
En esta ventana Personalizar Dialogo podemos controlar que las columnas puedan ser editables
y redimensionarles, tambin podemos cambiar el ancho.
Podemos observar que el cdigo del producto agregado es de tipo String, luego presionamos el
botn Cerrar.
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.
Como podemos observar ya aparece el cdigo del producto que agregamos en el detalle.
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.
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.
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.
Aqu en el nombre del cliente ella no debera de ser editable entonces nos vamos en sus
propiedades y desmarcamos la opcin enabled.
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.
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.
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.
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.
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
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.
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.
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.
Esta accin nos muestra que se esta creando un formulario Maestro/Detalle junto con todos
sus componentes.
Ahora ya podemos observar el formulario creado al que ya le cambiamos por el momento las
etiquetas.
Esta accin hace que aparezca la ventana Mover clase donde seleccionamos el botn
Reestructurar.
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.
Esta nos lleva al evento jmi_funcionario donde pegamos estas tres lneas de cdigos:
String args[] = new String [1];
FuncionarioView.main(args);
Luego nos vamos al main de la ventana FuncionarioView donde comentamos la lnea de codigo
y agregamos el titulo de la ventana.
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.
Esta accin llama a la ventana Registro de Funcionarios donde completamos los datos del
funcionario que necesitamos guardar, luego presionamos el botn Guardar.
Ahora observemos los datos desde la Base de Datos y efectivamente ya tenemos all los datos
que acabamos de completar.
Ahora nos vamos nuevamente al bean del codigo de DetPresupuesto y completamos los
cdigos que faltan.
private Funcionario codFuncionario;
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;
this.codFuncionario = codFuncionario;
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.
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.
Presionamos el botn Aceptar y en este punto Netbeans nos crea una lista de funcionarios al
que llama funcionarioList, luego presionamos el botn Aceptar.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Esta lista de funcionario no se esta renderizando aqu correctamente, porque aparece el camino
completo, que es lo que est pasando ac??
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.
En la ventana Nuevo Paquete Java completamos el nombre del paquete y presionamos el botn
Terminar.
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.
@Override
JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
return this;
No debemos olvidar en importar todos paquetes que hacen falta, esa opcin ya la hemos visto
como podemos conseguirla.
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.
Vista de los pasos a seguir para utilizar el archivo creado como un bean .
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.
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.
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.
Esta accin nos lleva a la ventana Movimiento Registro de Presupuesto donde ya podemos
observar el nombre del funcionario dentro de nuestra lista desplegable.
Ahora vamos a tratar la excepcin que nos dio con nuestra fecha, vamos a agregar desde la
Paleta un componente del tipo 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.
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.
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.
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.
Luego observamos los datos guardados en la tabla det_presupuesto donde podemos observar
que los datos fueron almacenados sin ningn inconveniente.
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.
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.
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.
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.
Vamos a comprobar si esto esta funcionando para ello ejecutamos nuevamente nuestra
aplicacin, en el men Movimientos elegimos 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
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.
Ahora nuestra JTable ya no esta visible y podemos acomodar nuestros otros componentes de la
cabera como se observa en el grafico.
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.
Ahora nos vamos al Inspector y en las propiedades de nuestro query en la pestaa Codigo le
cambiamos el nombre por 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
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.
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.
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.
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.
// ......
try{
List<Cliente> dato = clienteQuery.getResultList();//Ac estamos usando un recurso llamado generic, definimos una lista de clientes
catch(Exception e)
e.printStackTrace();
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.
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.
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.
En la ventana Nuevo Formulario JDialog le damos el nombre a nuestra ventana, para nuestro
ejemplo lo vamos a llamar BuscarProducto.
Ahora podemos observar nuestra ventana, vamos a poner el gestor de distribucin en Diseo
Absoluto y luego le vamos a agregar una tabla.
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.
Nuevamente en la ventana Enlace jTable1 dejamos todo como esta y damos clic en el botn
Aceptar.
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.
En las propiedades en de la pestaa Codigo nos aseguramos que este apuntando al bean del
producto.
Ahora nos vamos al productoQuery y simplemente nos aseguramos que todo all este bien, no
cambiamos nada en sus propiedades.
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.
Vista de las propiedades del componente entityManager despus del cambio de Nombre de Variable.
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.
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;
/**
*/
return table;
this.table = table;
@Override
//El siguiente cdigo hace que el filtro sea case sensitive y si queremos //que sea case sensitive, solo hay que descomentar las lneas
String m = mask.toString();
char c = m.charAt(i);
sb.append('[').append(Character.toLowerCase(c)).append(Character.toUpperCase(c)).append(']');
sorter.setRowFilter(RowFilter.regexFilter(".*" + sb + ".*"));
return sorter;
@Override
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.
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.
Ahora tenemos que enlazar nuestro campo texto para ello lo seleccionamos, hacemos clic
derecho sobre ella y elegimos las opciones Enlazar => text.
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.
bp.setVisible(true);
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
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.
Esta accin nos lleva a la ventana de Personalizar cdigo donde podemos cambiar la posicin
del Ttulo, su Expresin, el tamao, etc.
Al presionar el botn Cerrar ya podemos apreciar los cambios que hicimos a nuestra ventana.
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.
Luego aparece la ventana Cambiar de nombre donde cambiamos el nombre de nuestra variable
por jtProducto.
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.
this.d.getDetPresupuestoPK().setCodProducto((String)jtProducto.getValueAt(jtProducto.getSelectedRow() ,0));
Ahora vamos a probar nuestro avance para comprobar que todo marcha como queremos para
ello hacemos correr nuestra aplicacin.
Presionamos el botn Nuevo Presupuesto y completamos los datos de la cabecera, luego presionamos el
botn Agregar Item.
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.
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.
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.
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.
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
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
this.descripcionProducto = d;
return this.descripcionProducto;
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"
Esta parte es muy parecida a lo que hicimos con cliente en el archivo MovimientoPresupuesto.java en el
evento focusLost.
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
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.
Vista de los cambios a realizar en las Propiedades de componente query1 dentro de la ventana query1.
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 copiados dentro del evento del botn newDetail.
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());
d.setDescripcionProducto(dato.get(0).getDescProducto());
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.
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.
Ahora vamos a subir esta descripcin debajo del cdigo del producto, tambin le vamos a asigna un
ancho de 150.
Miguel Angel Recalde. Pgina 306
Ingeniera del Software II Gua de Programacin
Ahora vamos a comprobar que todo marcha segn queremos, para ello vamos a ejecutar nuestra
aplicacin para ello seguimos los mismos pasos de siempre.
Ahora ya podemos observar nuestra ventana Buscar Productos con la lista de productos que tenemos
guardados en nuestra Base de Datos.
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.
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.
Vista de la ventana Buscar Productos utilizando el filtro de bsqueda con las letras te.
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.
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.
Ahora lo que vamos a hacer es lo siguiente, permitir que el cliente introduzca la cantidad y el que calcule
su valor.
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.
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.
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.
for ( DetPresupuesto detPresu: ds)// for each, aca el va a pegar todos esos objetos dentro de la coleccin
detPresu.setCantPresuDet(1);//cantidad es igual a 1
OK ahora vamos a probar nuestra aplicacin para comprobar que todo funciona como queremos
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.
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.