En la imagen siguiente (img. 01) podemos ver el diseño de nuestro formulario para manejar Artículos. Las letras de color azul son anotaciones para indicar nombre de variable del objeto específico, no se incluyen el diseño, es para referencia. Anteriormente ya vimos cómo cambiar nombre de variable de objetos.
(img. 01)
La imagen siguiente vemos las lista de importaciones necesaria. Estas siempre van después del "package". (import)
(import)
En la imagen siguiente (img. 02) se distinguen dos partes:
(img. 02)
En la imagen siguiente (img. 03) podemos ver la lista de “Eventos” que vamos a utilizar para hacer funcionar nuestro formulario. En clase anterior vimos cómo utilizar “Eventos”. Para cada evento se identifican tres partes importantes que tendremos que conocer:
(img. 03)
En la siguiente imagen (img. 04) vemos los métodos que llamamos desde el “Método Constructor” del formulario y la declaración de algunos variables de clase. La ubicación de códigos personalizados ya vimos en clase anteriores.
(img. 04)
A continuación los métodos que utilizaremos para nuestro formulario. Cada uno posee un nombre particular que da una idea de la función que cumple, no hace falta mayor explicación. La ubicación de los métodos y códigos personalizados ya vimos en clase anterior.
public void hibernateSession(){
st = HibernateUtil.getSessionFactory().openSession();
}
public void arranque(){
cargarCombo();
this.id.setEnabled(false);
this.id.setText(null);
this.des.setEnabled(false);
this.des.setText(null);
this.tipo.setSelectedIndex(-1);
this.tipo.setEnabled(false);
this.pco.setText(null);
this.pco.setEnabled(false);
this.pve.setText(null);
this.por.setEnabled(false);
this.por.setText(null);
this.can.setText(null);
this.can.setEnabled(false);
this.guardar.setEnabled(false);
this.guardar.setText("Guardar");
this.editar.setEnabled(false);
this.eliminar.setEnabled(false);
this.jTable1.setEnabled(true);
this.nuevo.setEnabled(true);
tableModel();
cargarTabla();
}
public void tableModel(){
this.jTable1.getColumnModel().getColumn(0).setPreferredWidth(15);
this.jTable1.getColumnModel().getColumn(1).setPreferredWidth(200);
this.jTable1.getColumnModel().getColumn(2).setPreferredWidth(80);
this.jTable1.getColumnModel().getColumn(3).setPreferredWidth(80);
model = (DefaultTableModel)this.jTable1.getModel();
model.setNumRows(0);
}
public void cargarCombo(){
this.tipo.removeAllItems();
List<Tipo> lista = (List<Tipo>)st.createQuery("From Tipo").list();
for(Tipo tipoList : lista){
this.tipo.addItem(tipoList.getDes());
}
}
public void cargarTabla(){
List<Articulo> lista = (List<Articulo>)st.createQuery("From Articulo").list();
for(Articulo articuloList : lista){
model.addRow(new Object[]{
articuloList.getId(),articuloList.getDes(),articuloList.getTipo().getDes(),articuloList.getPve()
});
}
}
public void nuevo(){
this.des.setEnabled(true);
this.des.setText(null);
this.tipo.setSelectedIndex(-1);
this.tipo.setEnabled(true);
this.pco.setText(null);
this.pco.setEnabled(true);
this.pve.setText(null);
this.por.setEnabled(true);
this.por.setText(null);
this.can.setText(null);
this.can.setEnabled(true);
this.guardar.setEnabled(true);
this.id.setText("Auto");
}
public void guardar(){
if(this.des.getText().isEmpty()){
JOptionPane.showMessageDialog(null, "Rellene Descripcion del Artículo.");
}
else{
if(this.tipo.getSelectedIndex()==-1){
JOptionPane.showMessageDialog(null, "Rellene Tipo de Articulo,");
}
else{
if(this.pco.getText().isEmpty()){
JOptionPane.showMessageDialog(null, "Indique el precio de compra.");
}
else{
if(this.por.getText().isEmpty()){
JOptionPane.showMessageDialog(null, "Rellene porcentaje de ganancia.");
}
else{
if(this.pve.getText().isEmpty()){
JOptionPane.showMessageDialog(null, "Rellene precio de venta.");
}
else{
if(this.can.getText().isEmpty()){
JOptionPane.showMessageDialog(null, "Rellene la cantidad.");
}
else{
if(this.guardar.getText().equals("Guardar")){
try {
String desArt = this.des.getText();
Object selectedItem = this.tipo.getSelectedItem();
Tipo retornoTipo = retornoTipo(selectedItem.toString());
int pCompra = 0;
try {
pCompra = Integer.parseInt(this.pco.getText());
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Precio de compra debe ser numérico.");
}
int pVenta = 0;
try {
pVenta = Integer.parseInt(this.pve.getText());
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Precio de venta debe ser numérico.");
}
int porcentaje = 0;
try {
porcentaje = Integer.parseInt(this.por.getText());
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Porcentaje debe ser numérico.");
}
int cantidad = 0;
try {
cantidad = Integer.parseInt(this.can.getText());
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Cantidad debe ser numérico.");
}
st.beginTransaction();
Articulo art = new Articulo();
art.setDes(desArt);
art.setTipo(retornoTipo);
art.setPco(pCompra);
art.setPve(pVenta);
art.setPor(porcentaje);
art.setCan(cantidad);
retornoTipo.getArticulos().add(art);
st.save(art);
st.update(retornoTipo);
st.getTransaction().commit();
JOptionPane.showMessageDialog(null, "Artículo guardado correctamente.");
arranque();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Error guardando");
}
}
else{
String desArt = this.des.getText();
Object selectedItem = this.tipo.getSelectedItem();
Tipo retornoTipo = retornoTipo(selectedItem.toString());
int pCompra = 0;
try {
pCompra = Integer.parseInt(this.pco.getText());
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Precio de compra debe ser numérico.");
}
int pVenta = 0;
try {
pVenta = Integer.parseInt(this.pve.getText());
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Precio de venta debe ser numérico.");
}
int porcentaje = 0;
try {
porcentaje = Integer.parseInt(this.por.getText());
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Porcentaje debe ser numérico.");
}
int cantidad = 0;
try {
cantidad = Integer.parseInt(this.can.getText());
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Cantidad debe ser numérico.");
}
st.beginTransaction();
int parseInt = Integer.parseInt(this.id.getText());
Articulo art =(Articulo) st.load(Articulo.class, parseInt);
art.setDes(desArt);
art.setTipo(retornoTipo);
art.setPco(pCompra);
art.setPve(pVenta);
art.setPor(porcentaje);
art.setCan(cantidad);
retornoTipo.getArticulos().add(art);
st.update(art);
st.update(retornoTipo);
st.getTransaction().commit();
JOptionPane.showMessageDialog(null, "Artículo actualizado correctamente.");
arranque();
}
}
}
}
}
}
}
}
public Tipo retornoTipo(String desT){
Tipo tipRet = null;
String desTipo = desT;
try {
Query query = st.createQuery("From Tipo t Where t. des = ?");
query.setParameter(0, desTipo);
try {
tipRet = (Tipo)query.uniqueResult();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Hay más articulos de tipo: " + desTipo);
}
} catch (Exception e) {
}
return tipRet;
}
public void auxiliarCalculoDos(){
int total = 0;
int pCompra = 0;
int porcent = 0;
if(this.pco.getText().isEmpty()){
JOptionPane.showMessageDialog(null, "No se ha establecido precio de compra.");
this.pco.setRequestFocusEnabled(true);
}
else{
if(!this.por.getText().isEmpty()){
try {
pCompra = Integer.parseInt(this.pco.getText());
} catch (Exception e) {
JOptionPane.showMessageDialog(null,this.pco.getText() + " No es numérico.");
}
try {
porcent = Integer.parseInt(this.por.getText());
} catch (Exception e) {
JOptionPane.showMessageDialog(null,this.por.getText() + " No es numérico.");
}
try {
total = (pCompra + ((pCompra*porcent)/100));
this.pve.setText(String.valueOf(total));
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Error: Datos incorrectos.");
}
}
}
}
public void retornarArticulo(){
if(this.jTable1.isEnabled()){
int selectedRow = this.jTable1.getSelectedRow();
Object valueAt = model.getValueAt(selectedRow, 0);
int idArt = Integer.parseInt(valueAt.toString());
Articulo art = (Articulo)st.load(Articulo.class, idArt);
this.id.setText(String.valueOf(art.getId()));
this.des.setText(art.getDes());
this.tipo.setSelectedItem(art.getTipo().getDes());
this.pco.setText(String.valueOf(art.getPco()));
this.pve.setText(String.valueOf(art.getPve()));
this.por.setText(String.valueOf(art.getPor()));
this.can.setText(String.valueOf(art.getCan()));
this.editar.setEnabled(true);
this.eliminar.setEnabled(true);
this.nuevo.setEnabled(false);
}
}
public void editar(){
this.des.setEnabled(true);
this.tipo.setEnabled(true);
this.pco.setEnabled(true);
this.pve.setEnabled(true);
this.por.setEnabled(true);
this.can.setEnabled(true);
this.guardar.setEnabled(true);
this.guardar.setText("Actualizar");
this.jTable1.setEnabled(false);
this.eliminar.setEnabled(false);
}
public void eliminar(){
int showConfirmDialog = JOptionPane.showConfirmDialog(null, "Eliminación de Registro", "Desea eliminar este registro.", JOptionPane.YES_NO_OPTION);
if(showConfirmDialog == 1){
JOptionPane.showMessageDialog(null, "Registro no eliminado.");
}
else{
st.beginTransaction();
int selectedRow = this.jTable1.getSelectedRow();
Object valueAt = model.getValueAt(selectedRow, 0);
int idArt = Integer.parseInt(valueAt.toString());
Articulo art = (Articulo)st.load(Articulo.class, idArt);
st.delete(art);
st.getTransaction().commit();
JOptionPane.showMessageDialog(null, "Registro eliminado.");
arranque();
}
}
Imagen de formulario en ejecusión.(img. 05)
(img. 05)
Obs.: Resulta difícil explicar todo el proceso y función de cada línea de código por tanto pueden realizar un comentario con sus dudas.
en el tipo de articulo que agrego?
ResponderEliminarMuy bueno todo, seria muy interesante si puedes visualizar en el formulario de artículos la cantidad! Si puedes especificar como. Saludos
ResponderEliminarQue tal, todo es cuestión de agregar una columna más a la tabla, y modificar el metodo cargarTabla() agregarndo articuloList.getCan() en la columna correspondiente. Saludos.
Eliminarme marca Error en el DefaultTable model, aque hace refencia ese objeto?
ResponderEliminarQue tal, es la que maneja la tabla, permite agregar y eliminar objetos. Podrías ver si esta la importación necesaria, se escribe toda junta "DefaultTableModel". Saludos.
EliminarQue tal amigo como estás, tengo 2 consultas:
ResponderEliminarLa primera es que cuando edito y toco el botón "Actualizar", me sale éste error: WARN: [DEPRECATION] Encountered positional parameter near line 1, column 45. Positional parameter are considered deprecated; use named parameters or JPA-style positional parameters instead.
Exception in thread "AWT-EventQueue-0" org.hibernate.TransientObjectException: The given object has a null identifier: app.entities.Articulo
La otra es que a la hora que inserto un registro en artículo, el tipo no se guarda en la tabla como se debe guardar, o sea, no aparece el nombre del tipo, sino que en la tabla m aparece de esta forma: app.entities.Tipo.
Que puedo hacer, te agradezco de antemano. Que tengas buenas noches.
Que tal. Sobre el primer punto, no es un error solo una recomendación por que se usa HQL, no afecta el funcionamiento de la aplicación. El segundo parece indicar que tu id es null "The given object has a null identifier: app.entities.Articulo", esta mal tu autoincremental o algo más. Lo siquiente, cuando se guarda una relación, se guarda el objeto como tal, tienes que acceder a ella utilizando la sintaxis de puntos, por ejemlo "articuloList.getTipo().getDes()" como se muestra al cargar la tabla. Saludos, espero te ayude.
ResponderEliminarEste comentario ha sido eliminado por el autor.
EliminarHola amigo, ya pude arreglar el botón actualizar, ya puedo modificar y guardar los cambios. Pero aun no entiendo porque el tipo no se guarda buen. El problema es este: yo inserto registros, y con el combobox escojo el tipo, después guardo los registros, y automáticamente aparecen el la tabla, pero la columna de Tipo no se guarda como lo seleccione, en la tabla aparece asi: app.entities.Tipo, cuando debería de verse así: Monitores, Techados, y así. ¿Qué puedo hacer?. Gracias de antemano nuevamente. :)
ResponderEliminarEsta bien guardado, solo debes de utilzar sintaxis de puntos para acceder a la información que quieres mostrar "articuloList.getTipo().getDes()". Saludos.
Eliminar