/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Calculos_automaticos;

import static Filtros.Graficos_analisis_personalizados.tbl_person;
import static arql2020.ARQL2020.WHERE;
//import arql2020.DT_sintalon;
import clases.InteraccionesBD;
import clases.conexion;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JTree;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;

/**
 *
 * @author chuen
 */
public class CalculosBD {




public String getCount(String Tabla, String Where){
    
    String result = "";
    ResultSet rs = null; 
         
        
         try {
            conexion c = new conexion();
            c.getConexion();
            String consulta = "SELECT COUNT (*) FROM "+Tabla + " " + Where;
             rs = c.consulta(consulta);
             
            if(rs.next()){
              result = String.valueOf(rs.getInt(1));
             
            }       
        
        c.closeconnection();
        
        
        } catch (SQLException ex) {
            Logger.getLogger(CalculosBD.class.getName()).log(Level.SEVERE, null, ex);
        }
         
            
             return result;
}    

public float porcentajeDOSVALORES (String valor_averiguar, String valor_complementario){
    float valorcompf = Float.parseFloat(valor_complementario);
    float valorf = Float.parseFloat(valor_averiguar);
    float totalf = valorcompf+valorf;
    float resultadof = 0;
    
    
    resultadof = valorf*100/totalf;
    
    
    return resultadof;
}
public float porcentajeCIENPORCIENTO (String valor_averiguar, String cien){
    DecimalFormat formato1 = new DecimalFormat("#.00");
    
    String val_aver = valor_averiguar.replace(",", ".");
    String val_cien = cien.replace(",", ".");
    System.out.println("val aver:" + val_aver +" val cien:"+val_cien); 
    float totalf =0 ;
    
    float valorf= 0;

    totalf = Float.parseFloat(val_cien);
    valorf = Float.parseFloat(val_aver);
        
   

    float resultadof = (float) 0.0;
    String a = "0";
    
    resultadof = (float) valorf*100/totalf;
    
  


  
a= formato1.format(resultadof);
a = a.replace(",", ".");
resultadof = Float.parseFloat(a);
    
    return resultadof;
}

public void cargarArbolCriterioDTf(JTree tree, String tabla, String criterio, String nombredelid_F, String nombredelid, String rotulo_F,String rotulo, String prefijo, String WHERE, String etiqueta){
        
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();        
DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();

MutableTreeNode hoja;
DefaultMutableTreeNode leaf = new DefaultMutableTreeNode(criterio);


ResultSet rs = null; 
        
         try {
            conexion c = new conexion();
            c.getConexion();
            
             rs = c.consulta("SELECT "+nombredelid_F+","+ rotulo_F+ " FROM " +tabla + " " + WHERE);

            while(rs.next()){
                
                hoja = new DefaultMutableTreeNode(prefijo+"-"+rs.getInt(nombredelid)+"/"+rs.getString(rotulo));
                leaf.add(hoja);
                root.add(leaf);

            }       
        
        c.closeconnection();
        
        
        } catch (SQLException ex) {
            Logger.getLogger(InteraccionesBD.class.getName()).log(Level.SEVERE, null, ex);
        }
         
         root.setUserObject(etiqueta);
         
model.reload();




int j = tree.getRowCount();
       int i = 0;
       while(i < j) {
           tree.expandRow(i);
           i += 1;
           j = tree.getRowCount();
       }
       

        
    }
    public void cargarArbolCriterioFORMATIZADOSf(JTree tree, String tabla, String criterio, String nombredelid_F,String nombredelid, String rotulo_F,String rotulo, String prefijo, String WHERE, String etiqueta){
        

//////////////////segmental estandar//////////////////////////////////////        
int [][] segmental ;
int longitud=0;
int aux = 0;
ResultSet rs = null; 
        
         try {
            conexion c = new conexion();
            c.getConexion();
            
             rs = c.consulta("SELECT COUNT(*) FROM SEGMENTAL_ESTANDAR2");

            if(rs.next()){
               longitud= rs.getInt("1");
           }       
        
        c.closeconnection();
 } catch (SQLException ex) {
            Logger.getLogger(InteraccionesBD.class.getName()).log(Level.SEVERE, null, ex);
        }
segmental = new int[longitud][2];

         try {
            conexion c = new conexion();
            c.getConexion();
            
             rs = c.consulta("SELECT ID_ESTANDAR, ID_FORMATIZADOS FROM SEGMENTAL_ESTANDAR2");

            while(rs.next()){
               segmental[aux][0]= rs.getInt("ID_ESTANDAR");
               segmental[aux][1]= rs.getInt("ID_FORMATIZADOS");
               aux=aux+1;
           }       
        
        c.closeconnection();
 } catch (SQLException ex) {
            Logger.getLogger(InteraccionesBD.class.getName()).log(Level.SEVERE, null, ex);
        }
//////////////////puntas//////////////////////////////////////        
int [][] puntas ;
int longitud2=0;
int aux2 = 0;
ResultSet rs2 = null; 
        
         try {
            conexion c = new conexion();
            c.getConexion();
            
             rs2 = c.consulta("SELECT COUNT(*) FROM PUNTAS_DE_PROYECTIL2");

            if(rs2.next()){
               longitud2= rs2.getInt("1");
           }       
        
        c.closeconnection();
 } catch (SQLException ex) {
            Logger.getLogger(InteraccionesBD.class.getName()).log(Level.SEVERE, null, ex);
        }
puntas = new int[longitud2][2];

         try {
            conexion c = new conexion();
            c.getConexion();
            
             rs2 = c.consulta("SELECT ID_PUNTAS, ID_FORMATIZADOS FROM PUNTAS_DE_PROYECTIL2");

            while(rs2.next()){
               puntas[aux2][0]= rs2.getInt("ID_PUNTAS");
               puntas[aux2][1]= rs2.getInt("ID_FORMATIZADOS");
               aux2=aux2+1;
           }       
        
        c.closeconnection();
 } catch (SQLException ex) {
            Logger.getLogger(InteraccionesBD.class.getName()).log(Level.SEVERE, null, ex);
        }

////////////////////////nucleos
Object [][] nucleos ;
int longitud3=0;
int aux3 = 0;
ResultSet rs3 = null; 
        
         try {
            conexion c = new conexion();
            c.getConexion();
            
             rs3 = c.consulta("SELECT COUNT(*) FROM NUCLEOS");

            if(rs3.next()){
               longitud3= rs3.getInt("1");
           }       
        
        c.closeconnection();
 } catch (SQLException ex) {
            Logger.getLogger(InteraccionesBD.class.getName()).log(Level.SEVERE, null, ex);
        }
nucleos = new Object[longitud3][3];

         try {
            conexion c = new conexion();
            c.getConexion();
            
             rs3 = c.consulta("SELECT ID_NUCLEOS, ID_FORMATIZADOS, N_PLAT FROM NUCLEOS");

            while(rs3.next()){
               nucleos[aux3][0]= rs3.getInt("ID_NUCLEOS");
               nucleos[aux3][1]= rs3.getInt("ID_FORMATIZADOS");
               nucleos[aux3][2]= rs3.getString("N_PLAT");
               aux3=aux3+1;
           }       
        
        c.closeconnection();
 } catch (SQLException ex) {
            Logger.getLogger(InteraccionesBD.class.getName()).log(Level.SEVERE, null, ex);
        }



        
        
        
        
        
        
        
        
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();        
DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();

MutableTreeNode hoja;
DefaultMutableTreeNode leafCriterio = new DefaultMutableTreeNode(criterio);


 rs = null; 
        
         try {
            conexion c = new conexion();
            c.getConexion();
            
             rs = c.consulta("SELECT "+nombredelid_F+","+ rotulo_F+ " FROM " +tabla + " " + WHERE);

            while(rs.next()){
                
            
                DefaultMutableTreeNode leaf = new DefaultMutableTreeNode(rs.getInt(nombredelid));
                hoja = new DefaultMutableTreeNode(prefijo+"-"+rs.getInt(nombredelid)+"/"+rs.getString(rotulo));
                leaf.add(hoja);
                for (int i = 0; i < segmental.length; i++) {
                    if(rs.getInt(nombredelid)==segmental[i][1]){
                    hoja = new DefaultMutableTreeNode("Seg"+"-"+segmental[i][0]+"/Pieza-"+segmental[i][1]);
                    leaf.add(hoja);
                    
                    }
                      }
                for (int i = 0; i < puntas.length; i++) {
                    if(rs.getInt(nombredelid)==puntas[i][1]){
                    hoja = new DefaultMutableTreeNode("PP"+"-"+puntas[i][0]+"/Pieza-"+puntas[i][1]);
                    leaf.add(hoja);
                    }
                      }
                leafCriterio.add(leaf);
//                root.add(leafCriterio);

                   
                for (int i = 0; i < nucleos.length; i++) {
                    if(rs.getInt(nombredelid)==Integer.parseInt(String.valueOf(nucleos[i][1]))){
                    hoja = new DefaultMutableTreeNode("Nu"+"-"+nucleos[i][0]+"/Pieza-"+nucleos[i][1]+"/Plat-"+nucleos[i][2]);
                    leaf.add(hoja);
                    }
                      }
                leafCriterio.add(leaf);
                root.add(leafCriterio);

            }       
        
        c.closeconnection();
        
        
        } catch (SQLException ex) {
            Logger.getLogger(InteraccionesBD.class.getName()).log(Level.SEVERE, null, ex);
        }
         
         root.setUserObject(etiqueta);
         
model.reload();




int j = tree.getRowCount();
       int i = 0;
       while(i < j) {
           tree.expandRow(i);
           i += 1;
           j = tree.getRowCount();
       }
       

        
    }

public void sumartotalesfila(DefaultTableModel dm){
    int filas = dm.getRowCount();
    int cols = dm.getColumnCount();
    Object [] suma = new Object[cols];
    int aux = 0;
    suma[0]="Total";
    
    for (int i = 1; i < suma.length; i++) {
        suma[i]=0;
    }
    for (int i = 1; i < cols; i++) {
        for (int j = 0; j < filas; j++) {
            int aux1= Integer.parseInt(dm.getValueAt(j, i).toString());
            int aux2=Integer.parseInt(suma[i].toString());
            suma[i]=aux1+aux2;
            
                    }
    }
    dm.addRow(suma);
    

}
public void sumartotalesfilaFLOAT(DefaultTableModel dm){
    int filas = dm.getRowCount();
    int cols = dm.getColumnCount();
    Object [] suma = new Object[cols];
    int aux = 0;
    suma[0]="Total";
    
    for (int i = 1; i < suma.length; i++) {
        suma[i]=0;
    }
    for (int i = 1; i < cols; i++) {
        for (int j = 0; j < filas; j++) {
            float aux1= Float.parseFloat(dm.getValueAt(j, i).toString());
            float aux2=Float.parseFloat(suma[i].toString());
            suma[i]=aux1+aux2;
                    }
    }
    dm.addRow(suma);
    

}
public void porcentajesfilainferior(DefaultTableModel dm){
  int cols = dm.getColumnCount();
            for (int i = 1; i < cols-1; i++) {
            String valor = dm.getValueAt(dm.getRowCount()-1,i).toString();
            String ciensinsplit = dm.getValueAt(dm.getRowCount()-1, dm.getColumnCount()-1).toString();
            String[]split = ciensinsplit.split("-");
            float porcentaje = porcentajeCIENPORCIENTO(valor, split[1]);
            String nuevovalor ="n-"+valor+"-("+String.valueOf(porcentaje)+"%)";
            dm.setValueAt(nuevovalor, dm.getRowCount()-1,i);
            
    }
    }
public void porcentajesfilainferiorFLOAT(DefaultTableModel dm){
  int cols = dm.getColumnCount();
            for (int i = 1; i < cols-1; i++) {
            String valor = dm.getValueAt(dm.getRowCount()-1,i).toString();
            String ciensinsplit = dm.getValueAt(dm.getRowCount()-1, dm.getColumnCount()-1).toString();
            String[]split = ciensinsplit.split("-");
            float porcentaje = porcentajeCIENPORCIENTO(valor, split[1]);
            String nuevovalor ="g-"+valor+"-("+String.valueOf(porcentaje)+"%)";
            dm.setValueAt(nuevovalor, dm.getRowCount()-1,i);
            
    }
}  
public void sumartotalescolumna(DefaultTableModel dm){
    int filas = dm.getRowCount();
    int cols = dm.getColumnCount();
    Object suma = new Object();

    suma=0;
    

        for (int j = 0; j < filas; j++) {
            for (int i = 1; i < cols; i++) {
               
            int aux1= Integer.parseInt(dm.getValueAt(j, i).toString());
            int aux2=Integer.parseInt(suma.toString());
            suma=aux1+aux2;
        }
                dm.setValueAt(suma, j, dm.getColumnCount()-1);
                suma=0;
        }
        
        for (int i = 0; i < filas; i++) {
                
            String valor = dm.getValueAt(i, dm.getColumnCount()-1).toString();
            String cien = dm.getValueAt(dm.getRowCount()-1, dm.getColumnCount()-1).toString();
            float porcentaje = porcentajeCIENPORCIENTO(valor, cien);
            String nuevovalor = "n-"+valor+"-("+String.valueOf(porcentaje)+"%)";
            dm.setValueAt(nuevovalor, i, dm.getColumnCount()-1);
            
    }
}
public void sumartotalescolumnaFLOAT(DefaultTableModel dm){
    int filas = dm.getRowCount();
    int cols = dm.getColumnCount();
    Object suma = new Object();

    suma=0;
    

        for (int j = 0; j < filas; j++) {
            for (int i = 1; i < cols; i++) {
               
            float aux1= Float.parseFloat(dm.getValueAt(j, i).toString());
            float aux2=Float.parseFloat(suma.toString());
            suma=aux1+aux2;
        }
                dm.setValueAt(suma, j, dm.getColumnCount()-1);
                suma=0;
        }
        
        for (int i = 0; i < filas; i++) {
                
            String valor = dm.getValueAt(i, dm.getColumnCount()-1).toString();
            String cien = dm.getValueAt(dm.getRowCount()-1, dm.getColumnCount()-1).toString();
            float porcentaje = porcentajeCIENPORCIENTO(valor, cien);
            String nuevovalor = "g-"+valor+"-("+String.valueOf(porcentaje)+"%)";
            dm.setValueAt(nuevovalor, i, dm.getColumnCount()-1);
            
    }
}

public void cargarmp(JComboBox mp){
mp.removeAllItems();
mp.addItem("Seleccione materia prima");
    try {
            conexion c = new conexion();
            c.getConexion();
            
            
            
            ResultSet rs = c.consulta("SELECT DISTINCT NOMBRE_MP, CODIGO_NUM FROM MP ORDER BY CODIGO_NUM");
            
            while(rs.next()){
               mp.addItem(rs.getString("NOMBRE_MP")); 
            }       
        
        c.closeconnection();
        } catch (SQLException ex) {
            Logger.getLogger(CalculosBD.class.getName()).log(Level.SEVERE, null, ex);
        }
         
        
   
 
}
public void cargarmpformdistinct(JComboBox mp, String where){
       if(WHERE.equals("")){
            JOptionPane.showMessageDialog(null, "Seleccione previamente una muestra");
        }else{
    
    mp.removeAllItems();
mp.addItem("Materias primas presentes en la muestra");
    try {
            conexion c = new conexion();
            c.getConexion();
            
            
            
            ResultSet rs = c.consulta("SELECT DISTINCT f.MP FROM FORMATIZADOS f "+where);
            
            while(rs.next()){
               mp.addItem(rs.getString("MP")); 
            }       
        
        c.closeconnection();
        } catch (SQLException ex) {
            Logger.getLogger(CalculosBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        }
         
        
   
 
}
public void cargarFAMILIASdistinct(JComboBox familia,JComboBox mp, String where){
 
    ArrayList<String> familiaslista = new ArrayList<>();
    
    if((WHERE.equals(""))||(mp.getSelectedIndex()==0)){
            JOptionPane.showMessageDialog(null, "Seleccione previamente una muestra y una materia prima");
        }else{
    
    familia.removeAllItems();
familia.addItem("Familias presentes en la muestra");

//agrega segmentales
    try {
            conexion c = new conexion();
            c.getConexion();
            
              String consulta0= "SELECT s.FAMILIA FROM FORMATIZADOS f \n" +
"INNER JOIN\n" +
"SEGMENTAL_ESTANDAR2 s\n" +
"ON f.ID_FORMATIZADOS = s.ID_FORMATIZADOS "+ where + " AND (f.MP='"+mp.getSelectedItem().toString()+"')";
            
            ResultSet rs = c.consulta(consulta0);
            
            while(rs.next()){
               familiaslista.add(rs.getString("FAMILIA")); 
            }       
        
        c.closeconnection();
        } catch (SQLException ex) {
            Logger.getLogger(CalculosBD.class.getName()).log(Level.SEVERE, null, ex);
        }
   //agrega puntas de proyectil
    try {
            conexion c = new conexion();
            c.getConexion();
            
              String consulta1= "SELECT f.MP FROM FORMATIZADOS f \n" +
"INNER JOIN\n" +
"PUNTAS_DE_PROYECTIL2 s\n" +
"ON f.ID_FORMATIZADOS = s.ID_FORMATIZADOS "+ where + " AND (f.MP='"+mp.getSelectedItem().toString()+"')";
            
            ResultSet rs = c.consulta(consulta1);
            
            if(rs.next()){
               familiaslista.add("E"); 
            }       
        
        c.closeconnection();
        } catch (SQLException ex) {
            Logger.getLogger(CalculosBD.class.getName()).log(Level.SEVERE, null, ex);
        }
//agrega nucleos        
    try {
            conexion c = new conexion();
            c.getConexion();
            
              String consulta2= "SELECT f.MP FROM FORMATIZADOS f \n" +
"INNER JOIN\n" +
"NUCLEOS s\n" +
"ON f.ID_FORMATIZADOS = s.ID_FORMATIZADOS "+ where + " AND (f.MP='"+mp.getSelectedItem().toString()+"')";
            
            ResultSet rs = c.consulta(consulta2);
            
            if(rs.next()){
               familiaslista.add("G"); 
            }       
        
        c.closeconnection();
        } catch (SQLException ex) {
            Logger.getLogger(CalculosBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        }
        
Set<String> hashSet = new HashSet<String>(familiaslista);
        familiaslista.clear();
        familiaslista.addAll(hashSet);     
       
        for (int i = 0; i < familiaslista.size(); i++) {
        familia.addItem(familiaslista.get(i));
        
    }
   
 
}
public void cargarmpFORM_DT(JComboBox cbx_mp, String WHERE){
cbx_mp.removeAllItems();
cbx_mp.addItem("Materias primas presentes en la muestra");
InteraccionesBD interac = new InteraccionesBD();

String [] mpform = interac.selectDisctintf("f.MP", "MP", "FORMATIZADOS f" ,WHERE);
String [] mpdtCON = interac.selectDisctintf("f.MP", "MP", "DT_CONTALON2 f" ,WHERE);
String [] mpdtSIN = interac.selectDisctintf("f.MP", "MP", "DT_SINTALON2 f" ,WHERE);


ArrayList <String> mp = new ArrayList<>();

    for (int i = 0; i < mpform.length; i++) {
        mp.add(mpform[i]);
//        System.out.println("MP FORM:" +mpform[i]);
    }
    for (int i = 0; i < mpdtCON.length; i++) {
        mp.add(mpdtCON[i]);
//        System.out.println("DT CON:" +mpdtCON[i]);
    }
    for (int i = 0; i < mpdtSIN.length; i++) {
        mp.add(mpdtSIN[i]);
//        System.out.println("DT siN:" +mpdtSIN[i]);
    }

Set<String> hashSet = new HashSet<String>(mp);
        mp.clear();
        mp.addAll(hashSet);
 
        for (int i = 0; i < mp.size(); i++) {
            cbx_mp.addItem(mp.get(i));
        }
        
    }

public String obteneridutiles (String where, String MP){
    ArrayList<Integer> idutiles = new ArrayList<>();
    String ids="";
//    
//    
//    ResultSet rs = null; 
//    
////////////////////////////////////SELECCIONA ID PARA UTILES    
//ArrayList <String[]> utiles = new ArrayList<>();
//
//
//
//        
//         try {
//            conexion c = new conexion();
//            c.getConexion();
//            
//             rs = c.consulta("SELECT DISTINCT(f.ID_FORMATIZADOS) FROM FORMATIZADOS f "+
//                      "INNER JOIN \n" +
//"SEGMENTAL_ESTANDAR2 n \n" +
//"ON f.ID_FORMATIZADOS = n.ID_FORMATIZADOS " +
//        where + " AND (f.MP='"+MP+"')   ");
//         
//             
//               while(rs.next()){
//               idutiles.add(rs.getInt("ID_FORMATIZADOS"));
//               
//           }       
//        
//        c.closeconnection();
// } catch (SQLException ex) {
//            Logger.getLogger(InteraccionesBD.class.getName()).log(Level.SEVERE, null, ex);
//        }
//         try {
//            conexion c = new conexion();
//            c.getConexion();
//            
//             rs = c.consulta("SELECT DISTINCT(f.ID_FORMATIZADOS) FROM FORMATIZADOS f "+
//                      "INNER JOIN \n" +
//"PUNTAS_DE_PROYECTIL2 n \n" +
//"ON f.ID_FORMATIZADOS = n.ID_FORMATIZADOS " +
//        where + " AND (f.MP='"+MP+"')  ");
//         
//             
//               while(rs.next()){
//                                 
//               idutiles.add(rs.getInt("ID_FORMATIZADOS"));
//               
//           }       
//        
//        c.closeconnection();
// } catch (SQLException ex) {
//            Logger.getLogger(InteraccionesBD.class.getName()).log(Level.SEVERE, null, ex);
//        }
// 
//         Set<Integer> hashSet = new HashSet<Integer>(idutiles);
//        idutiles.clear();
//        idutiles.addAll(hashSet);
// 
//
//
//
//if(idutiles.size()==1){
//    ids=" AND ( f.ID_FORMATIZADOS="+idutiles.get(0) + ") ";
//}else{
//    
//        for (int i = 0; i < idutiles.size(); i++) {
//        if(i==0){
//            ids= " AND ( f.ID_FORMATIZADOS="+idutiles.get(i) + " ";
//        }else{
//            if(i==idutiles.size()-1){
//                ids = ids + " OR f.ID_FORMATIZADOS="+idutiles.get(i)+")";
//            }else{
//                ids = ids + " OR f.ID_FORMATIZADOS="+idutiles.get(i);
//            }
//        }
//            
//              
//    }
//    
//    
//    
//    
//    
//}
    

            ids = " AND (f.CLASE_ARTEF IN"
                    + ""
                    + "( 'AF-Artefacto formatizado', " +
                    
            "'ARC-Artefacto con rastros complementarios'," +
                    
            "'NdRC-Nódulo con rastros complementarios' ," +

            "'NdT-Nódulos transportados'   ))   ";

            


        

    return ids;
}

public void INTEGRAR_RESULTADOS_TABLA(JTable tbl){
   
            DefaultTableModel dm2 = (DefaultTableModel) tbl.getModel();
            sumartotalesfila(dm2);
            sumartotalescolumna(dm2);
            porcentajesfilainferior(dm2);
            
}
public void LIMPIARTABLA(JTable tbl){

    DefaultTableModel dm = (DefaultTableModel) tbl.getModel();
    int rowCount = dm.getRowCount();
    for (int i = rowCount - 1; i >= 0; i--) {
                dm.removeRow(i);
            }

}

public void TABLA_FRECUENCIAS_DOS_VALORES(String columna0nombre, JTable tbl_datos, JTable tabla_a_llenar){
 
    
//calcular cantidad de filas (es decir, la variedad de la columna 0)

        ArrayList<String> columna0 = new ArrayList<>();
        for (int i = 0; i < tbl_datos.getRowCount(); i++) {
            columna0.add(String.valueOf(tbl_datos.getValueAt(i, 0)));
        }

        Set<String> hashSet = new HashSet<>(columna0);
        columna0.clear();
        columna0.addAll(hashSet);

        int cantidadfilas = columna0.size();
//        System.out.println("cantidad de filas: " + cantidadfilas);
        
//calcular cantidad de columnas (esto es, variedad horizontal mas col0

        ArrayList<String> otrascolumnas = new ArrayList<>();
        for (int i = 0; i < tbl_datos.getRowCount(); i++) {
            otrascolumnas.add(String.valueOf(tbl_datos.getValueAt(i, 1)));
        }

        Set<String> hashSet2 = new HashSet<>(otrascolumnas);
        otrascolumnas.clear();
        otrascolumnas.addAll(hashSet2);

        int cantidadcols = otrascolumnas.size()+1;
//        System.out.println("cantidad de columnas: " + cantidadcols);


        
//declarar datos y headers
Object [][] data = new String[cantidadfilas][cantidadcols];
Object [] headers = new String[cantidadcols];

headers[0]= columna0nombre;

//setea el nombre de las columnas
        for (int i = 1; i < cantidadcols; i++) {
            headers[i]=otrascolumnas.get(i-1);
//            System.out.println("headers: " + headers[i]);
        }
//setea la primera columna con datos
                for (int i = 0; i < columna0.size(); i++) {
            data[i][0]=columna0.get(i);
        }
        


//setea todo a cero
        for (int i = 0; i < columna0.size(); i++) {
            data[i][0]=columna0.get(i);
        }
               
 
//calculo las combinaciones posibles        
String filas_[] = new String[cantidadfilas];
String columnas_[] = new String[otrascolumnas.size()];
 
        for (int i = 0; i < cantidadfilas; i++) {
            filas_[i]= String.valueOf(columna0.get(i));
        }
 
        for (int i = 0; i < otrascolumnas.size(); i++) {
            columnas_[i]= String.valueOf(otrascolumnas.get(i));
        }
 
//AAA. calculo las combinaciones posibles 
String combinaciones[][] = new String[filas_.length][columnas_.length];

        for (int i = 0; i < filas_.length; i++) {
            for (int j = 0; j < columnas_.length; j++) {
                combinaciones[i][j]=filas_[i]+"/"+columnas_[j];
//                System.out.println("AAAA. combinaciones[i][j]"+ combinaciones[i][j]);
                
            }
        }

//calculo cantidad de repeticiones
int cantcombinaciones = (cantidadcols-1)*cantidadfilas;
String valorestabla="";
//armo una matriz para que guarde los resultados y la seteo a cero


int conteos[][] = new int[filas_.length][columnas_.length];

        for (int i = 0; i < filas_.length; i++) {
            for (int j = 0; j < columnas_.length; j++) {
                conteos[i][j]=0;
               }
        }

        for (int i = 0; i < tbl_datos.getRowCount(); i++) {
                for (int k = 0; k < combinaciones.length; k++) {
                    for (int l = 0; l < combinaciones[k].length; l++) {
                        valorestabla=String.valueOf(tbl_datos.getValueAt(i, 0))+"/"+String.valueOf(tbl_datos.getValueAt(i, 1));
//                        System.out.println("ccc.valores tabla: " + valorestabla);
                        if(valorestabla.equals(combinaciones[k][l])){
//                            System.out.println("valorestabla:" +valorestabla + "//coinciden con combinacion: "+combinaciones[k][l]);
                            conteos[k][l]=conteos[k][l]+1;
                        }
                    
                }
                
            }
        }
//////bbb
           for (int i = 0; i < cantidadfilas; i++) {
               for (int j = 1; j < cantidadcols; j++) {
                   data[i][j]=String.valueOf(conteos[i][j-1]);
//                   System.out.println("bbb.data " + data[i][j]);
                           
               }
        }



  DefaultTableModel dtmbi = new DefaultTableModel(data,
headers);
  
  dtmbi.addColumn("Total");
  
    for (int i = 0; i < dtmbi.getRowCount(); i++) {
        
        dtmbi.setValueAt("0", i, dtmbi.getColumnCount()-1);
        
    }
  
  tabla_a_llenar.setModel(dtmbi);
    INTEGRAR_RESULTADOS_TABLA(tabla_a_llenar);
    
    
}

}
