007 - Aplicación de Stock con Java. Hibernate – MySQL – JPA. Formulario referencial ArticuloApp.

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:

  • 1) nos indica los nombres de variables para los objetos que hemos agregado al formulario. Solo cambiamos las que tendremos que llamar en nuestros métodos.
  • 2) Lugar en la codificaremos nuestros métodos. En clase anterior vimos los lugares en las que ubicamos nuestros códigos personales.

    (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:

  • 1) Nombre de variable del objeto al que está vinculado el “Evento”, (img. 01) nos indica los nombre de variables que le dimos a cada objeto, por lo tantos ya sabemos desde donde se llama el “Evento”.
  • 2) Tipo de “Evento” que utilizamos para enlazar con el objeto. En este caso vemos que es un “ActionPerformed” la cual normalmente se utiliza con “Botones”.
  • 3) Ubicación de los códigos personalizados que aremos que se ejecuten al iniciarse el “Evento” generado por el objeto en particular.

    (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.


    Código Java
    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.


  • 10 comentarios :

    1. Muy bueno todo, seria muy interesante si puedes visualizar en el formulario de artículos la cantidad! Si puedes especificar como. Saludos

      ResponderEliminar
      Respuestas
      1. Que 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.

        Eliminar
    2. me marca Error en el DefaultTable model, aque hace refencia ese objeto?

      ResponderEliminar
      Respuestas
      1. Que 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.

        Eliminar
    3. Que tal amigo como estás, tengo 2 consultas:
      La 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.

      ResponderEliminar
    4. 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.

      ResponderEliminar
      Respuestas
      1. Este comentario ha sido eliminado por el autor.

        Eliminar
    5. Hola 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. :)

      ResponderEliminar
      Respuestas
      1. Esta bien guardado, solo debes de utilzar sintaxis de puntos para acceder a la información que quieres mostrar "articuloList.getTipo().getDes()". Saludos.

        Eliminar