lunes, 3 de octubre de 2016

005  Llenado de Tables con Base de Datos  
Ing. Honoria Reyes Macedo

INTRODUCCION: En esta práctica se usa el manejo de OBJETOS  para llenar un ArrayList que utilizara el jTable.

La realación que existe entre la tabla materia y califica es de uno a varios. Ya que por cada materia existiran varias calificaciones. Para resolver esta situación se crea la clase MateriaVo con un ArrayList que se llena con cada objeto de la table CalificaVo.(Ver anexo II)

   Para llevar a cabo esta practica 
   a) Es necesario tener las dos clases creadas en la practica anterior 004 :   
           MateriaVo.java y CalificaVo.java  
          

            ACCIONES DEL PROGRAMA

              



ACTIVIDADES:
1.- CREAR UNA INTERFAZ
    Crear un JFrame Form   “ConsultaCalificaFrm.java”  con los componentes:
Las librerias:

import images.ImagenPanel;
import javax.swing.ImageIcon;
import java.awt.event.*;
import java.awt.*;

import javax.swing.*;
import java.util.ArrayList;

los controles:


jBtnSalir
jTblMate_Calif     (Nombre de un JTable)

                Nota: Observar que el constructor de MateriaDAO y CalificaDAO obtiene la conexión a la
                           base de datos al ejecutar el método getConexion()

                  Ejemplo


                 public class CalificaDAO
                        JDBConexion ObjConecta = new JDBConexion();
                        Connection miConexion=null;   // Canal de conexion
                        ResultSet miTabla=null;   //Guarda informacin de las columnas(campos)
                        Statement miInstruccion=null;               //Ejecuta sentencias SQL sin parmetros
                        PreparedStatement  miInstruccionPrep=null;  /                            
                        int miResultado;

                         public CalificaDAO() {
                                 try{
                                       miConexion=ObjConecta.getConexion();
                                 }catch(Exception ex){
                                       JOptionPane.showMessageDialog(null,"No se conecto a la Base de Datos: "
                                         + ex.getMessage(),"ERROR DE CONEXION",
                                          JOptionPane.ERROR_MESSAGE);
                                 }
                 } 


2) Agregar una variable arreglo en la clase  MateriaVo.java
    private ArrayList<CalificaVo> calificaciones = new ArrayList<CalificaVo>();
 
    Agregar su GET y su SET

    public void setCalificaciones(CalificaVo cal){ this.calificaciones.add(cal); }

    public ArrayList<CalificaVo> getCalificaciones(){  return calificaciones;   }



3) Llenar la tabla que muestra las calificaciones:
   - Hacer una consulta con las dos tablas: Materia y califica y guardar los resultados en un arrayList para llenar la tabla

Cada fila del ArrayList sera un objeto de materia(Recuerda que por cada materia hay tres calificaciones)


 SOLUCION:  En la clase  ConsultaCalificaFrm.java
         a)  Declarar un modelo para la tabla
                        DefaultTableModel dtm = new DefaultTableModel();
                       CalificaDAO ObjMat= new CalificaDAO();
         b)  En la propiedad model  de la tabla  "jTblMate_Calif", agregar:  dtm (Para NetBenas)

               El programa automaticamente asignara:  
                       jTblMate_Calif.setModel(dtm);  (Agregar manualmente si no es en NetBeans)





3.1)      El Llenado de un ArrayList en la clase CalificaDAO.java

                  Agregar la librería ArrayList
Nota: Se muestran dos posibles soluciones para el llenado del ArrayList

  SOLUCION1:
  public ArrayList<MateriaVo> ConsultaMateCalif(){

      int mateUno;
      ResultSet miTabla2=null;
      MateriaVo mate;
      CalificaVo cali;
      ArrayList<MateriaVo>  ArrayMate = new ArrayList<MateriaVo>();
      try{
      String BuscaMate ="select ca.cvepersona, ma.clavemate, ma.nombremateria,ca.clavecalifica, "
              + " ca.descripcion,ca.calificacion,ca.fechacalif, ca.status from materia ma,"
              + " califica ca where ca.clavemate=ma.clavemate and ca.status=1 "
              + " order by ca.cvepersona, ma.clavemate";
      miInstruccionPrep=miConexion.prepareStatement(BuscaMate);
      miTabla=miInstruccionPrep.executeQuery();
      mateUno=0;
      mate=new MateriaVo();

      while(miTabla.next()){
          if (mateUno!=0 && (mateUno!=miTabla.getInt(2))){
                ArrayMate.add(mate);
                mate=new MateriaVo();
          }                   
          if (mateUno!=miTabla.getInt(2)){                       
            mate.setClavemate(miTabla.getInt(2));
            mate.setNombremateria(miTabla.getString(3));       
          }             
          cali=new CalificaVo();
          cali.setCvePersona(miTabla.getInt(1));
          cali.setClaveCalifica(miTabla.getInt(4));
          cali.setDescripcion(miTabla.getString(5));
          cali.setCalificacion(miTabla.getDouble(6));
          cali.setFecha_Calif(miTabla.getString(7));
          cali.setStatus(miTabla.getInt(8));
          mate.setCalificaciones(cali);
          mateUno= miTabla.getInt(2);
      }
      ArrayMate.add(mate);
    
      }catch(Exception ex){
        JOptionPane.showMessageDialog(null,"ERROR: " + ex.getMessage(),"ERROR DE BUSQUEDA",JOptionPane.ERROR_MESSAGE);
      }
      return ArrayMate;
     }

   *****************      **********************

  SOLUCION2:

  public ArrayList<MateriaVo> ConsMateCalif(){
      ResultSet miTabla2=null;
      MateriaVo mate;
      CalificaVo cali;
      ArrayList<MateriaVo>  ArrayMate = new ArrayList<MateriaVo>();
      try{
      String BuscaMate ="select distinct(clavemate),nombremateria, status  from materia";
      miInstruccionPrep=miConexion.prepareStatement(BuscaMate);
      miTabla=miInstruccionPrep.executeQuery();
      while(miTabla.next()){
          mate=new MateriaVo();
          mate.setClaveMate(miTabla.getInt(1));
          mate.setNombreMateria(miTabla.getString(2));
          mate.setStatus(Boolean.parseBoolean(String.valueOf(miTabla.getInt(3))));
          String BuscaCali= "select clavecalifica, descripcion, calificacion, fecha_calif,status from califica where clavemate=" + mate.getClaveMate();
          miInstruccionPrep=miConexion.prepareStatement(BuscaCali);
          miTabla2=miInstruccionPrep.executeQuery();


          while(miTabla2.next()){
            cali=new CalificaVo();
            cali.setClaveCalifica(miTabla2.getInt(1));
            cali.setDescripcion(miTabla2.getString(2));
            cali.setCalificacion(miTabla2.getDouble(3));
            cali.setFecha_Calif(miTabla2.getString(4));
            cali.setStatus(miTabla2.getInt(5));
            mate.setCalificaciones(cali);           
          }
          ArrayMate.add(mate);
      }
          
      }catch(SQLException ex){
        JOptionPane.showMessageDialog(null,"ERROR: " + ex.getMessage(),"ERROR DE BUSQUEDA2",JOptionPane.ERROR_MESSAGE);
      }
      return ArrayMate;
  }

              ****************   ************

3.2)      En la clase de la interfaz “ConsultaCalificaFrm.java” crear un metodo para llenar el  jTable. Utilizar el ArrayList creado en el paso 1: (Se utiliza tambien el metodo TitulosModelo() para poner encabezados  )

  public void TitulosModelo(){
               //Agregar Titulos
       dtm.addColumn("CvePersona");
       dtm.addColumn("CveMateria");
       dtm.addColumn("Materia");
       dtm.addColumn("CveCalifica");
       dtm.addColumn("Descripción");
       dtm.addColumn("Calificación");
       dtm.addColumn("Fecha"); 
    }

    public void llenaCalificaciones(){
       int CalificaTamanio;
       Object[] arrayCal = new Object[7];
       ArrayList<MateriaVo> ListMateria= ObjMat.ConsultaMateCalif();
   
       TitulosModelo();
       CalificaTamanio=ListMateria.size();
       int x=0;
          //Recorre primero las materias       
        for(MateriaVo  Obj:ListMateria){
            ArrayList<CalificaVo>  misCalif= Obj.getCalificaciones();
            for(CalificaVo  Ob:misCalif){ 
                x=0;
                arrayCal[x]=Ob.getCvePersona();
                x+=1;
                arrayCal[x]=Obj.getClavemate();
                x+=1;
                arrayCal[x]=Obj.getNombremateria();
                x+=1;
                arrayCal[x]=Ob.getClaveCalifica();             
                x+=1;
                arrayCal[x]=Ob.getDescripcion();
                x+=1;
                arrayCal[x]=Ob.getCalificacion();
                x+=1;
                arrayCal[x]=Ob.getFecha_Calif(); 
                dtm.addRow(arrayCal);
            }         
        }
    }

  


3)      Ejecutar el metodo llenaCalificaciones() desde el constructor de la clase ConsultaCalificaFrm.java


Compilar y Ejecutar


4)      Agregar un evento "MouseClicked" a la Tabla jTblMate_Calif de la clase ConsultaCalificaFrm.java
        4.1 Agregar una etiqueta al formulario
         private javax.swing.JLabel jlSeleccion;
         jlSeleccion = new javax.swing.JLabel();
        jlSeleccion.setText("INFORMACION");
        jp.add(jlSeleccion);
        jlSeleccion.setBounds(60, 20, 680, 30);

        4.2 Crear la clase anonima de jTblMate_Calif  dentro del metodo initComponents()

           jTblMate_Calif.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jTblMate_CalifMouseClicked(evt);
            }
        });
     4.3 Agregar el metodo que se ejecuta desde la clase anonima

    private void jTblMate_CalifMouseClicked(java.awt.event.MouseEvent evt) {                                         
        DefaultTableModel modelotabla=(DefaultTableModel) jTblMate_Calif.getModel();
        int filaselec= this.jTblMate_Calif.getSelectedRow();
        String Datos=(String)(modelotabla.getValueAt(filaselec, 0)+ "  "+ modelotabla.getValueAt(filaselec, 1)+"  "+ modelotabla.getValueAt(filaselec, 4));
        jlSeleccion.setText(Datos);       
    }


 Compilar y Ejecutar

**********************************************************************
****************************  ANEXO  I********************************
CONECTAR MOTORES DE BASES DE DATOS AL PROYECTO

Para conectarse a MySql,  SQLServer u Oracle :

I)  CONECTAR A Mysql
1.1 Bajar y  el driver mysql-connector-java-5.3.38-bin.jar y configurarlo en NetBeans
Crear la carpeta lib dentro del proyecto y pegar el archivo
1.2  Agregar el archivo a las librerías del proyecto desde Project Settings
                                    -  Presionar New + Add Archive  + <Enter>
- Seleccionar el archivo que se guardo en la carpeta lib  + <Open>
- Ponerle un nombre:   MySql Connector  + <OK>
-    Escoger el driver  + <OK>
         Agregar la ruta del Driver en el ClassPath de windows 

         
        1.3 En el archivo de Conexion.java verificar

import javax.swing.*;
import java.sql.*;

public class Conexion {   
    private Connection con = null;   
    public Connection getConexion() throws SQLException{
//                **********Conexion a MySQL    **************
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost/calificaciones";       
String user = "root";  
String password="Mysql";
                            

try{
    Class.forName(driver);
    con = DriverManager.getConnection(url,user,password);
}catch(ClassNotFoundException ex){
    JOptionPane.showMessageDialog(null,"No se encontro el driver jdbc instalado en el sistema!\n\n"+ex.getMessage(),"Error de conexion",JOptionPane.ERROR_MESSAGE);    }
    return con;
}
}
 

II) CONECTAR A  SqlServer

            2.1.- Bajar  el driver sqljdbc.jar y configurarlo en NetBeans
             - En las librerias del proyecto en NetBeans: Libraries + Add JAR/Folder
 - En databases + Driver + new Driver + Add + Buscar el driver
                                               Para probar :  usar la coneccion en el mismo driver
·         El host lo encuentras desde la ventana command con hostname
·         Puerto por defecto es: 1433;
    2.2.- En la clase Conexion.java cambiar los siguientes valores de acuerdo a la base de datos


import javax.swing.*;
import java.sql.*;

public class Conexion {   
    private Connection con = null;   
    public Connection getConexion() throws SQLException{
//                **********Conexion a SqlServer    **************
       String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
       String url= "jdbc:sqlserver://DESKTOP-CHPM3KJ\\SQLEXPRESS:1433 /materiauvm";                    
       String user = "sa";  
       String password=" ";       

try{
    Class.forName(driver);
    con = DriverManager.getConnection(url,user,password);
}catch(ClassNotFoundException ex){
    JOptionPane.showMessageDialog(null,"No se encontro el driver jdbc instalado en el sistema!\n\n"+ex.getMessage(),"Error de conexion",JOptionPane.ERROR_MESSAGE);    }
    return con;
}
}
                         

    2.3.- En caso de no conectarse: Verificar que en SQL Server tenga:
propiedades + conexiones + permitir conexiones remotas.
                y en seguridad + Modo de Autenticación de windows y SQL Server
y reiniciar el servicio con mouse derecho
Verificar que en Seguridad + usuario: activar conceder y habilitado
en conexión a BD e    inicio de sesion respectivamente

III) CONECTAR A Oracle

    3.1.- Cargar la libreria de Oracle:
          ojdbc

    3.2.- En la clase Conexion.java cambiar los siguientes valores de acuerdo a la base de datos

import javax.swing.*;
import java.sql.*;

public class Conexion {   
    private Connection con = null;   
    public Connection getConexion() throws SQLException{

 //                **********Conexion a Oracle **************
String driver = "oracle.jdbc.driver.OracleDriver";               
String url = "jdbc:oracle:thin:@192.168.7.127:1521:oracledb";    //oracledb es mi base de datos
String user = "progvisual";        
String password="TICuarto";
    
               
try{
    Class.forName(driver);
    con = DriverManager.getConnection(url,user,password);
}catch(ClassNotFoundException ex){
    JOptionPane.showMessageDialog(null,"No se encontro el driver jdbc instalado en el sistema!\n\n"+ex.getMessage(),"Error de conexion",JOptionPane.ERROR_MESSAGE);    }
    return con;
}
}



**********************************************************************
****************************  ANEXO  II *******************************
CLASES DE LAS ENTIDADES Vo(Value Object)



**********************************************************************
******************* ANEXO III ****************************************






----------------------------000------000-------------------------------------------------------
--------------------------------------------------------------------------------------------------


No hay comentarios.:

Publicar un comentario