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.


  • 5 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