Saltar la navegación

15.- Ejercicios resueltos Operaciones en Hibernate.

DAM_AD_03_R_030

Altas, bajas , modificaciones y consultas sencillas en hibernate.

En los ejercicios se utilizarán las tablas creadas en la unidad 2, y cuyo modelo se muestra en el ejercicio DAM_AD_03_R_010. La base de datos va a ser prueba de MySQL.

Se trata de realizar altas, bajas y modificaciones en la tabla ARTICULOS creada en la unidad anterior.

Se muestra el siguiente menú:

	..............................................................
	. INSERT - UPDATE - DELETE de artículos en pruebas de MySQL...
	..............................................................
		.  1 Insertar un artículo. 
		.  2 Modificar el stock de un artículo.  
		.  3 Borrar un artículo. 
		.  4 Visualizar la tabla articulos. 
		.  5 Visualizar el detalle de las compras de los artículo. 
		.  0 SALIR.
	.................................................................

	Elige operación.

Para insertar un artículo, leeremos los datos de teclado y una vez validados se creará un objeto de la clase Articulos, se asignarán los datos tecleados y se grabarán en la BD, para ello se abre una transacción Transaction tx =session.beginTransaction();  se graba el objeto session.save(artinue);  y luego se valida tx.commit(); Se captura la excepción ConstraintViolationException para controlar si no se puede insertar si el artículo ya existe, o si las claves ajenas no existe.

 try
 {     Transaction tx =session.beginTransaction();
	Articulos artinue = new Articulos();
	artinue.setCodarticulo(codarticulo);
	artinue.setDenominacion(denominacion);
	artinue.setPrecio(precio);
	artinue.setStock(stock);
	artinue.setZona(zona);
	artinue.setProveedores(prove);
	session.save(artinue);
	tx.commit();
	System.out.println("<<<<ARTÍCULO INSERTADO CORRECTAMENTE>>>>>");	
	System.out.println("--------------------------------------------------------------------");
} catch (ConstraintViolationException e){
              System.out.println ("-------------------------------------");
	      System.out.println ("Código de error: " + e.getErrorCode());
System.out.println ("Mensaje de error: " + e.getMessage()); System.out.println ("-------------------------------------"); }

Antes de insertar el artículo se comprueba si existe en la BD. Se utiliza el método  get() , de la clase Session, Si el objeto no existe en la BD el método devuelve null.

do{
  try {
	System.out.print("Teclea el número de artículo: "); 
	codarticulo=teclado.nextShort(); 
        teclado.nextLine();
	artic = (Articulos) session.get(Articulos.class, codarticulo);	
	if (!(artic==null) )			
	   System.out.println(">>>El CODIGO DE ARTÍCULO YAAA EXISTE: "+ 
		                     codarticulo + ", teclea de nuevo."); 	
	else break; 
  } catch (InputMismatchException e) {
        System.out.println(">>>El CODIGO DE artículo DEBE SER NUMÉRICO SHORT. "); 
        teclado.nextLine();
     } 	
 }while (true);

Como el artículo tiene un objeto Proveedores que es el que lo suministra, para asignar el objeto primero lo hemos de localizar en la BD, y guardarlo. Utilizamos el método   get() , de la clase Session, a continuación se muestra el código que localiza el proveedor, si no existe el método devolverá null:

 do{
     try {  // se lee el proveedor
	  System.out.print("Teclea el número de proveedor: "); 
	  codigo_prov=teclado.nextShort(); 
	  teclado.nextLine();
	  prove = (Proveedores) session.get(Proveedores.class, codigo_prov);	
	  if (prove==null) 			
		   System.out.println(">>>El CODIGO DE PROVEEDOR NOOO EXISTE: "+ 
				   codigo_prov + ", teclea de nuevo."); 	
		else break; 
 	 } catch (InputMismatchException e) {
        System.out.println(">>>El CODIGO DE PROVEEDOR DEBE SER NUMÉRICO SHORT. "); 
        teclado.nextLine();
     } 	
  }while (true);


El método modificar pedirá de teclado el código de artículo a modificar, se comprueba si existe, con el método get(), si existe el método devuelve el objeto. Se teclea la cantidad a añadir al stock, y una vez que los datos se han validado, se abre una nueva transacción, se asignan los nuevos valores al objeto, se guarda el objeto con los cambios y se valida la transacción:

	Transaction tx =session.beginTransaction();
	short stockant = artic.getStock();
	artic.setStock((short) (stockant + stock));
	session.save(artic);
	tx.commit();
        System.out.println("<<<<ARTÍCULO ACTUALIZADO.>>>>>");

El método borrar es muy similar al modificar, pedirá de teclado el código de artículo a borrar, se comprueba si existe, con el método get(), si existe el método devuelve el objeto. Y se borra. Se captura la excepción ConstraintViolationException para controlar si no se puede borrar porque tuviera registros relacionados.

try
{
Transaction tx =session.beginTransaction(); session.delete(artic); tx.commit(); System.out.println("<<<<ARTÍCULO BORRADO.>>>>>"); System.out.println("--------------------------------------------------------------------"); } catch (ConstraintViolationException e){ System.out.println ("-------------------------------------"); System.out.println ("Código de error: " + e.getErrorCode()); System.out.println ("Mensaje de error: " + e.getMessage()); System.out.println ("-------------------------------------"); }

El ejercicio añade dos métodos de visualización, uno para ver los datos del artículo y su proveedor, la visualización ha de ser la siguiente:

------------------------------------------------------------------------------------------------------------------
COD ARTI     DENOMINACION             PRECIO      STOCK     ZONA     COD PROV     NOMBRE PROV         LOCALIDAD   
-------- -------------------------- ------------ ------- ----------- -------- -------------------- ---------------
1        Pala Padel                   88,00 	    800      Centro 	   10 Almacenes Talavera   TALAVERA       
2        Portátil Acer               588,00 	     34      Centro 	   20 Distribuidor MSI     MADRID         
3        Calendario Gregoriano        50,00 	    700       Oeste 	   10 Almacenes Talavera   TALAVERA       
4        Tablet SamSung              200,00 	     54         Sur 	   40 EL CORTE CHINO       AVILA          
5        Portatil MAC                158,60 	    610      Centro 	   10 Almacenes Talavera   TALAVERA       
6        Bolsa Padel                  28,50 	    610      Centro 	   10 Almacenes Talavera   TALAVERA       
7        Bolsa Portatil               56,40 	    140       Oeste 	   30 HIPER CASH           TOLEDO         
8        Lapiceros                     5,50 	     50         Sur 	   30 HIPER CASH           TOLEDO         
9        Ratón Optico                 15,50 	    700       Oeste 	   10 Almacenes Talavera   TALAVERA       
10       Equipo Música               130,60 	     54         Sur 	   40 EL CORTE CHINO       AVILA          
11       Estufa de cristal            50,70 	    755       Oeste 	   10 Almacenes Talavera   TALAVERA       
12       TV 20 pulgadas              150,90 	     50         Sur 	   30 HIPER CASH           TOLEDO             
-------- -------------------------- ------------ ------- ----------- -------- -------------------- ---------------

Y otro para visualizar el detalle de las compras de cada artículo. El segundo informe será similar a este:

------------------------------------------------------------------------------------------------------------------
COD ARTI     DENOMINACION             PRECIO      STOCK     ZONA     COD PROV     NOMBRE PROV         LOCALIDAD   
-------- -------------------------- ------------ ------- ----------- -------- -------------------- ---------------
1        Pala Padel                   88,00 	    800      Centro 	   10 Almacenes Talavera   TALAVERA       
Número de compras del artículo: 4
		------ -------- -------- ------------- ----------------------
		NumCom Unidades  Importe  Fecha comp   Nombre Cliente 
		------ -------- -------- ----------- ----------------------
		5      5         440,00   2014-12-17 Alicia Ramos             
		6      5         440,00   2014-01-10 Pedro Iglesias           
		1      5         440,00   2014-10-10 Juan García              
		2      5         440,00   2014-11-10 Juan García              
-------- -------------------------- ------------ ------- ----------- -------- -------------------- ---------------
2        Portátil Acer               588,00 	     34      Centro 	   20 Distribuidor MSI     MADRID         
Número de compras del artículo: 4
		------ -------- -------- ------------- ----------------------
		NumCom Unidades  Importe  Fecha comp   Nombre Cliente 
		------ -------- -------- ----------- ----------------------
		6      10       5880,00   2014-01-10 Pedro Iglesias           
		5      10       5880,00   2014-12-17 Alicia Ramos             
		1      4        2352,00   2014-10-10 Juan García              
		2      10       5880,00   2014-11-10 Juan García              
-------- -------------------------- ------------ ------- ----------- -------- -------------------- ---------------
3        Calendario Gregoriano        50,00 	    700       Oeste 	   10 Almacenes Talavera   TALAVERA       
Número de compras del artículo: 1
		------ -------- -------- ------------- ----------------------
		NumCom Unidades  Importe  Fecha comp   Nombre Cliente 
		------ -------- -------- ----------- ----------------------
		1      10        500,00   2014-10-10 Juan García              
-------- -------------------------- ------------ ------- ----------- -------- -------------------- ---------------

Las clases IteratorList y Set se utilizarán para recorrer los valores de las consultas y los set de registros. Se deben importar de java.util.

Una consulta devuelve los datos en una lista (List), para recorrer los registros utilizamos una lista de objetos.

En el primer informe la consulta que se ejecuta es  "from Articulos", se muestra el código a continuación. La consulta se carga en una lista de artículos. Para cargar los datos del proveedor vamos navegando por el objeto proveedor del artículo correspondiente: 

System.out.println("------------------------------------------------------------------------------------------------------------------");
System.out.println("COD ARTI     DENOMINACION             PRECIO      STOCK     ZONA     COD PROV     NOMBRE PROV         LOCALIDAD   ");
System.out.println("-------- -------------------------- ------------ ------- ----------- -------- -------------------- ---------------");	   
String patron="%-8d %-26s %7.2f \t%7d %11s \t%5d %-20s %-15s";
String cadena ="";

Articulos arti = new Articulos(); 			
Query q = session.createQuery("from Articulos");
List <Articulos> lista = q.list();
for(int i=0;i<lista.size();i++)
{
	arti = lista.get(i); 
	cadena = String.format(patron, arti.getCodarticulo(),  arti.getDenominacion(), arti.getPrecio(),
	arti.getStock(), arti.getZona(), arti.getProveedores().getCodigoProv(), 
	arti.getProveedores().getNombre(), arti.getProveedores().getLocalidad());
	System.out.println(cadena);	   
}
System.out.println("-------- -------------------------- ------------ ------- ----------- -------- -------------------- ---------------");	   

volveralmenu();	

En la segunda visualización se mostrará el detalle de las compras que se han realizado para cada artículo que tiene compras. La única consulta que hacemos es esta:

        Query q = session.createQuery("from Articulos a order by a.codarticulo");

y para cada objeto artículos es necesario cargar su set de detallecomprases, para obtener el detalle de las compras de ese artículo:

         Set<Detallecompras> listacompras = arti.getDetallecomprases();

Para recorrer el Set utilizaremos la clase Iterator. 

 Iterator <Detallecompras> it = listacompras.iterator();

 Detallecompras det = new Detallecompras();

 while(it.hasNext()) {

det=it.next();
// proceso de los datos

 } // fin while

Desde el detalle de la compra detallecomprases podremos navegar a la fecha de la compra y al cliente que realiza la compra de ese artículo en esa fecha.

System.out.println("------------------------------------------------------------------------------------------------------------------");
System.out.println("COD ARTI     DENOMINACION             PRECIO      STOCK     ZONA     COD PROV     NOMBRE PROV         LOCALIDAD   ");
System.out.println("-------- -------------------------- ------------ ------- ----------- -------- -------------------- ---------------");	   
String patron="%-8d %-26s %7.2f \t%7d %11s \t%5d %-20s %-15s";
String cadena ="";
String patron2="%-6d %-8d %7.2f %12s %-25s";

Articulos arti = new Articulos(); 			
Query q = session.createQuery("from Articulos a order by a.codarticulo");
List <Articulos> lista = q.list();
for(int i=0;i<lista.size();i++)
{
    arti = lista.get(i); 
    cadena = String.format(patron, arti.getCodarticulo(),  arti.getDenominacion(), arti.getPrecio(),
    		arti.getStock(), arti.getZona(), arti.getProveedores().getCodigoProv(), 
    		arti.getProveedores().getNombre(), arti.getProveedores().getLocalidad());
    System.out.println(cadena);	   
    // cargamos las compras de ese artículo
    Set<Detallecompras> listacompras = arti.getDetallecomprases();
    //obtenemos las compras
    Iterator <Detallecompras> it = listacompras.iterator();
    System.out.println("Número de compras del artículo: "+listacompras.size() );	
    if (listacompras.size()!=0)
    {   System.out.println("\t\t------ -------- -------- ------------- ----------------------");
	System.out.println("\t\tNumCom Unidades  Importe  Fecha comp   Nombre Cliente ");
	System.out.println("\t\t------ -------- -------- ----------- ----------------------");
	Detallecompras det = new Detallecompras();
	while(it.hasNext()) {
		det=it.next();
		cadena = String.format(patron2,det.getId().getNumcompra(), det.getUnidades(),
		det.getUnidades() * arti.getPrecio(), det.getCompras().getFechacompra(),
		det.getCompras().getClientes().getNombre());
	        System.out.println("\t\t" + cadena);	   
	 } // fin while detallecomprases
	}// fin if listacompras.size() 	    
    System.out.println("-------- -------------------------- ------------ ------- ----------- -------- -------------------- ---------------");	   
} // fin while articulos

volveralmenu();	

DAM_AD_03_R_040

Consultas más complejas con HIBERNATE

En este ejercicio se van a realizar resúmenes con todos los datos de las tablas que se están utilizando a lo largo de la unidad. Estos resúmenes se obtendrán realizando consultas más complejas a la base de datos. Hasta ahora las consultas devolvían objetos asociados a alguna de las clases mapeadas. En estas nuevas consultas se devuelven listas de objetos, cada elemento de la lista será una fila de la consulta. A su vez cada elemento de la lista contendrá un array de objetos correspondiente a las columnas de la consulta.

Por ejemplo esta consulta devuelve los datos del proveedor y el número de artículos que suministra.

Query q = session.createQuery("select p.codigoProv, p.nombre, p.localidad , "
+ " count(a.codarticulo) from Proveedores p join p.articuloses a "
+ " group by p.codigoProv, p.nombre, p.localidad ");

Los datos se recuperan en una lista de objetos.

List<Object[]> listaprove = q.list();

Y cada elemento de la lista es a su vez un array de objetos, tantos como columnas devuelva la select.

long sumaartic = 0;
for (int i = 0; i < listaprove.size(); i++)

    Object res[] = listaprove.get(i); 
    cadena = String.format(patron, res[0], res[1], res[2], res[3]);
    System.out.println(cadena);
    sumaartic = sumaartic + (long)res[3];
}

En el ejercicio se muestra el siguiente menú:

	..............................................................
	. Resúmenes. Consultas más complejas. BD prueba de MySQL ..
	..............................................................
		.  1 Resumen de artículos. 
		.  2 Resumen de clientes.  
		.  3 Resumen de proveedores. 
		.  4 Detalle de las compras de los clientes. 
		.  0 SALIR.
	.................................................................

	Elige operación.	

El resumen de ARTÍCULOS muestra el siguiente resultado

--------------------------------------------------------------------------------------------------------------
                           RESUMEN DATOS DE ARTICULOS 
--------------------------------------------------------------------------------------------------------------
COD ARTI     DENOMINACION            PRECIO   STOCK  SUM UNIDAVEND  TOTALIMPORTE NUM_COMP NOMBRE PROVEEDOR
-------- -------------------------- -------- ------- -------------- ------------ -------- --------------------
1        Pala Padel                   88,00     800 	     20 	 1760,00        4 Almacenes Talavera  
2        Portátil Acer               588,00      34 	     34 	19992,00        4 Distribuidor MSI    
3        Calendario Gregoriano        50,00     744 	     10 	  500,00        1 Almacenes Talavera  
4        Tablet SamSung              200,00      54 	      5 	 1000,00        1 EL CORTE CHINO      
5        Portatil MAC                158,60     610 	     15 	 2379,00        2 Almacenes Talavera  
6        Bolsa Padel                  28,50     610 	     13 	  370,50        4 Almacenes Talavera  
7        Bolsa Portatil               56,40     140 	     22 	 1240,80        4 HIPER CASH          
8        Lapiceros                     5,50      50 	      7 	   38,50        1 HIPER CASH          
9        Ratón Optico                 15,50     700 	      0 	    0,00        0 Almacenes Talavera  
10       Equipo Música               130,60      54 	      7 	  914,20        1 EL CORTE CHINO      
11       Estufa de cristal            50,70     755 	      0 	    0,00        0 Almacenes Talavera  
12       TV 20 pulgadas              150,90      50 	      0 	    0,00        0 HIPER CASH          
-------- -------------------------- -------- ------- -------------- ------------ -------- --------------------
         TOTALES                               4601 	    133 	28195,00
-------- -------------------------- -------- ------- -------------- ------------ -------- --------------------
Número de artículos:  12      
Media de unidades por artículo:  11,00  
Media de importe por artículo:  2349,58 
Media de stock :   383,42 
Artículos con más unidades (máximo = 34): 
	Cod articulo: 2, Denominación: Portátil Acer 
Artículos con más importe (máximo = 19992,00): 
	Cod articulo: 2, Denominación: Portátil Acer 
Artículos con más compras (máximo = 4): 
	Cod articulo: 1, Denominación: Pala Padel 
	Cod articulo: 2, Denominación: Portátil Acer 
	Cod articulo: 6, Denominación: Bolsa Padel 
	Cod articulo: 7, Denominación: Bolsa Portatil 
--------------------------------------------------------------------------------------------------------------
Pulsa una tecla para volver. 

La consulta para obtener los artículos es la siguiente:

Query q = session.createQuery("select a.codarticulo , a.denominacion , a.precio , a.stock , " +

" coalesce(sum(det.unidades), 0) , coalesce(a.precio * sum(det.unidades),0) , " + 
" count(distinct det.compras.numcompra) , a.proveedores.nombre " +
" from Articulos a left join a.detallecomprases det " +
" group by a.codarticulo , a.denominacion, a.stock, a.precio, a.proveedores.nombre " +
" order by a.codarticulo");

El número de artículos lo obtenemos con el tamaño de la lista de objetos donde se almacenan los datos de la consulta.

La media de unidades y la media de importe se obtienen sumando las unidades y los importes de los artículos y dividiendo por el número de ellos.

Para calcular la media de stock se realiza una consulta que devuelva un único resultado, es decir un solo valor.

Double mediastc = (Double) session.createQuery(
"select avg(a.stock) from Articulos a").uniqueResult();

Para calcular los máximos: en el bucle del  tratamiento de artículos se va preguntando por las unidades vendidas de cada artículo, por los importes y por las compras, con el fin de obtener los valores máximos. Una vez que se termina el bucle se realizan consultas de unidades, de importes y de compras para que devuelva los artículos con esos valores máximos. Las consultas son las siguientes:

// Artículos con más unidades vendidas
q = session.createQuery("select a.codarticulo , a.denominacion "+
   " from Articulos a join a.detallecomprases det " +
   " group by a.codarticulo " +
   " having sum(det.unidades)= " + maxuni );
List<Object[]> armaxunida = q.list(); 
System.out.printf("Artículos con más unidades (máximo = %d): \n",maxuni );
for (int i = 0; i < armaxunida.size(); i++)
{
   Object res[] = armaxunida.get(i); 
   System.out.printf("\tCod articulo: %d, Denominación: %s \n", res[0], res[1]); 
}

// Artículo o artículos con más importe
q = session.createQuery("select a.codarticulo , a.denominacion "+
   " from Articulos a join a.detallecomprases det " +
   " group by a.codarticulo, a.precio " +
   " having (a.precio * sum(det.unidades)) = " + maximpor );
List<Object[]> armaximp = q.list(); 
System.out.printf("Artículos con más importe (máximo = %.2f): \n",maximpor );
for (int i = 0; i < armaximp.size(); i++)
{
   Object res[] = armaximp.get(i); 
   System.out.printf("\tCod articulo: %d, Denominación: %s \n", res[0], res[1]); 
}

// Artículos con más compras
q = session.createQuery("select a.codarticulo , a.denominacion "+
   " from Articulos a join a.detallecomprases det " +
   " group by a.codarticulo, a.precio " +
   " having count(distinct det.compras.numcompra) = " + maxnumcompra );
List<Object[]> armaxcomp = q.list(); 
System.out.printf("Artículos con más compras (máximo = %d): \n",maxnumcompra );
for (int i = 0; i < armaxcomp.size(); i++)
{
   Object res[] = armaxcomp.get(i); 
   System.out.printf("\tCod articulo: %d, Denominación: %s \n", res[0], res[1]); 
}

El resumen de CLIENTES muestra el siguiente resultado

-------------------------------------------------------------------------
                     RESUMEN DATOS DE CLIENTES 
-------------------------------------------------------------------------
COD CLI  NOMBRE                LOCALIDAD        NUM_COMPRAS TOTALIMPORTE
-------- --------------------- ---------------- ----------- -------------
1        Juan García           TALAVERA               2 	10035,30 
2        Alicia Ramos          TALAVERA               3 	11416,40 
3        Pedro Iglesias        TOLEDO                 1 	 6743,30 
4        Alejandro Spart       AVILA                  0 	    0,00 
-------- --------------------- ---------------- ----------- -------------
         TOTALES                                      6 	28195,00 
-------- --------------------- ---------------- ----------- -------------
Número de clientes:  4       
Media de compras por clientes:  1,50    
Media de importe por clientes:  7048,75 
Clientes con máximo de compras (máximo=3): 
	Cod Cliente: 2, Nombre: Alicia Ramos 
Clientes con importe máximo (máximo=11416,40): 
	Cod Cliente: 2, Nombre: Alicia Ramos 
-------- --------------------- ---------------- ----------- -------------
Pulsa una tecla para volver. 

Para el tratamiento de los clientes se crea una consulta que nos devuelva los objetos cliente, y para cada objeto cliente se calcula el número de compras y el total importe.

Consulta clientes:

Query q = session.createQuery("from Clientes");

Para cada cliente realizamos una consulta que devuelva el número de compras, un uniqueresult. 

cli = (Clientes) lista.get(i); 
Long numc = (Long) session.createQuery(
       "select count(*) from Compras c where c.clientes.codigoCli = "+ cli.getCodigoCli() ).uniqueResult();

Y otra consulta que devuelva el total importe del cliente. Se utiliza la función coalesce para que devuelva un 0 a los clientes que no tienen compras, que salga 0 en lugar de espacios en blanco o null:

Query consu = session.createQuery(
    " select coalesce(sum( det.articulos.precio * det.unidades),0) " + 
    " from Compras co join co.detallecomprases det " + 
    " where co.clientes.codigoCli = ?");
consu.setShort(0,cli.getCodigoCli());
Double imp = (Double) consu.uniqueResult();

Los cálculos de las líneas de pie son los siguientes:

El número de clientes se obtiene con el tamaño de  la lista.

Para obtener la media de compras y de importe, se realizan dos consultas una que devuelva el número de compras, y otra la suma de importes. Y luego se calcula la media dividiendo por el número de clientes:

    Long numco = (Long) session.createQuery("select count(*) from Compras").uniqueResult();
    Double suma = (Double) session.createQuery(
      " select coalesce(sum( det.articulos.precio * det.unidades),0) " + 
      " from Compras co join co.detallecomprases det " ).uniqueResult();

// número de clientes
System.out.printf("Número de clientes: %-7d \n", lista.size()); 
// media de compras por cliente
float mediacomp = (float) (numco)/(lista.size());
System.out.printf("Media de compras por clientes: %-7.2f \n", mediacomp); 
// media de importe por cliente
float mediaimp = (suma.floatValue())/(lista.size());
System.out.printf("Media de importe por clientes: %-7.2f \n", mediaimp);

Para calcular los máximos procedemos como en el caso anterior, en el bucle de clientes se va preguntando por el máximo de compras y de importe, y se van guardando en una variable. Cuando termina el bucle de clientes se realiza una consulta para cada caso, por si hay varios clientes que tienen esos valores máximos. Las consultas son las siguientes:

// Clientes con más compra
q = session.createQuery(" select co.clientes.codigoCli, co.clientes.nombre, " +
   " count(*) from Compras co " + 
   " group by co.clientes.codigoCli, co.clientes.nombre " +
   " having count(*) = " + maxcom );
List<Object[]> climacommax = q.list(); 
System.out.printf("Clientes con máximo de compras (máximo=%.0f): \n",maxcom );
for (int i = 0; i < climacommax.size(); i++)
{
   Object res[] = climacommax.get(i); 
   System.out.printf("\tCod Cliente: %d, Nombre: %s \n", res[0], res[1]); 
}
// Clientes con mas importe
q = session.createQuery("select co.clientes.codigoCli, co.clientes.nombre, "+
   " sum( det.articulos.precio * det.unidades) "+
   " from Compras co join co.detallecomprases det "+
   " group by co.clientes.codigoCli,co.clientes.nombre "+
   " having sum( det.articulos.precio * det.unidades) = " + maximp );
List<Object[]> climaximp = q.list(); 
System.out.printf("Clientes con importe máximo (máximo=%7.2f): \n",maximp );
for (int i = 0; i < climaximp.size(); i++)
{
   Object res[] = climaximp.get(i); 
   System.out.printf("\tCod Cliente: %d, Nombre: %s \n", res[0], res[1]); 
}

El resumen de PROVEEDORES muestra el siguiente resultado:

-----------------------------------------------------
              RESUMEN DE PROVEEDORES 
--------------------------------------------------------
COD PROV  NOMBRE                LOCALIDAD       NUM_ART 
-------- --------------------- ---------------- --------
10       Almacenes Talavera    TALAVERA             6 
20       Distribuidor MSI      MADRID               1 
30       HIPER CASH            TOLEDO               3 
40       EL CORTE CHINO        AVILA                2 
-------- --------------------- ---------------- ---------------
Número de proveedores 4: 
Media de artículos por proveedor: 3,00 
Proveedores que suministran más artículos (máximo = 6): 
	Cod proveedor: 10, Nombre: Almacenes Talavera 
-------- --------------------- ---------------- ---------------
Pulsa una tecla para volver. 

En este informe se procede como en los anteriores.

La consulta para los proveedores es la siguiente:

Query q = session.createQuery("select p.codigoProv, p.nombre, p.localidad , "
    + " count(a.codarticulo) from Proveedores p join p.articuloses a "
    + " group by p.codigoProv, p.nombre, p.localidad ");

En el tratamiento del proveedor vamos preguntando por el máximo de número de artículos, y cuando termina el bucle de proveedores calculamos la consulta para el proveedor con más artículos::

// Proveedor con más artículos
q = session.createQuery("select p.codigoProv, p.nombre, count(a.codarticulo) " +
    " from Proveedores p join p.articuloses a "
  + " group by p.codigoProv, p.nombre, p.localidad having "
  + " count(a.codarticulo) = " + maximo);
List<Object[]> provmaxartis = q.list();
System.out.printf("Proveedores que suministran más artículos (máximo = %d): \n",maximo );
for (int i = 0; i < provmaxartis.size(); i++)
{
   Object res[] = provmaxartis.get(i);
   System.out.printf("\tCod proveedor: %d, Nombre: %s \n", res[0], res[1]);
}

El resumen del DETALLE DE LAS COMPRAS DE CLIENTES, nos muestra un listado con los datos de los clientes, las compras que tiene y el detalle de cada una de las compras.

La consulta para los clientes es la siguiente:

Query q = session.createQuery("from Clientes");

Cada cliente tiene un set de Compras, se utilizará un Iterator para extraer los datos de las compras del cliente:

Set<Compras> listacompras = cli.getComprases();
//obtenemos las compras
Iterator <Compras> itcompras = listacompras.iterator();

Y cada compra tiene un set de detalle-compras, igualmente se utilizará un Iterator para recorrer y visualizar los detalles de las compras.

Set<Detallecompras> listadetalle = comp.getDetallecomprases();
//obtenemos los detalle de la compra
Iterator <Detallecompras> itdetalle = listadetalle.iterator();

El informe se muestra a continuación:

-------------------------------------------------------------------------
              DETALLE DE LAS COMPRAS DE LOS CLIENTES 
-------------------------------------------------------------------------
COD CLI: 1,  NOMBRE: Juan García, LOCALIDAD: TALAVERA 
Número de compras del cliente: 2
   ------ --------------------- ---------------- ------
	NumCom: 1,  Fecha compra: 2014-10-10 
	---------------------------------------
	Número de artículos de la compra: 3
	COD     UNIDADES     PVP       IMPORTE 
	---------------------------------------
	3     	   10       50,00       500,00 
	1     	    5       88,00       440,00 
	2     	    4      588,00      2352,00 
	---------------------------------------
	TOTALES:  19    	       3292,00 
   ------ --------------------- ---------------- ------
	NumCom: 2,  Fecha compra: 2014-11-10 
	---------------------------------------
	Número de artículos de la compra: 4
	COD     UNIDADES     PVP       IMPORTE 
	---------------------------------------
	1     	    5       88,00       440,00 
	6     	    1       28,50        28,50 
	7     	    7       56,40       394,80 
	2     	   10      588,00      5880,00 
	---------------------------------------
	TOTALES:  23    	       6743,30 
-------- --------------------- ---------------- -----------
COD CLI: 2,  NOMBRE: Alicia Ramos, LOCALIDAD: TALAVERA 
Número de compras del cliente: 3
   ------ --------------------- ---------------- ------
	NumCom: 5,  Fecha compra: 2014-12-17 
	---------------------------------------
	Número de artículos de la compra: 2
	COD     UNIDADES     PVP       IMPORTE 
	---------------------------------------
	1     	    5       88,00       440,00 
	2     	   10      588,00      5880,00 
	---------------------------------------
	TOTALES:  15    	       6320,00 

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Para los clientes sin compra se visualizará una línea indicando que el cliente no tiene compras. Por ejemplo el cliente 4 no tiene compras:

-------- --------------------- ---------------- -----------
COD CLI: 3,  NOMBRE: Pedro Iglesias, LOCALIDAD: TOLEDO 
Número de compras del cliente: 1
   ------ --------------------- ---------------- ------
	NumCom: 6,  Fecha compra: 2014-01-10 
	---------------------------------------
	Número de artículos de la compra: 4
	COD     UNIDADES     PVP       IMPORTE 
	---------------------------------------
	6     	    1       28,50        28,50 
	2     	   10      588,00      5880,00 
	7     	    7       56,40       394,80 
	1     	    5       88,00       440,00 
	---------------------------------------
	TOTALES:  23    	       6743,30 
-------- --------------------- ---------------- -----------
COD CLI: 4,  NOMBRE: Alejandro Spart, LOCALIDAD: AVILA 
Número de compras del cliente: 0
 <<<<<<<<<CLIENTE SIN COMPRA >>>>>>> 
-------- --------------------- ---------------- -----------
-------- --------------------- ---------------- -----------
Pulsa una tecla para volver. 

Descarga los proyectos

Descarga los proyectos de las actividades 30 y 40.

Haz clic para descargar los proyectos.

Obra publicada con Licencia de Documentación Libre de GNU (GNU Free Documentation License) (Versión local)