Introducción al Curso

1

Java SE Avanzado: Programación Modular y Persistencia con JDBC

Clases avanzadas

2

Clases Abstractas y Polimorfismo en Java: Avances y Aplicaciones

3

Reducción de Código con Clases Abstractas en Java

4

Sobrescritura de métodos en clases derivadas en Java

5

Polimorfismo y Abstracción en Clases Java

JavaDocs

6

Generación de Documentación Java con Javadocs

7

Documentación en Java: Uso de Etiquetas y Comentarios HTML

8

Documentación de librería Report en Java SE

9

Documentación de Clases Heredadas en Java

10

Generación de Documentación JavaDoc en HTML

Clases Anidadas

11

Clases Anidadas en Java: Conceptos y Aplicaciones Prácticas

12

Clase Song como clase interna en Album en Java

13

Implementación de Clases Anidadas en Java: Ejemplo Práctico con Page y Book

14

Simulación de Lectura con Clases Anidadas en Java

15

Uso de Enumerations en Programación

Interfaces Avanzadas

16

Interfaces Avanzadas en Java: Métodos Default y Private

17

Creación de Interfaces DAO en Java para Gestión de Bases de Datos

18

Encapsulación y Abstracción en Diseño de APIs

19

Diferencias entre Clases Abstractas e Interfaces en Programación

20

Herencia y métodos en interfaces de Java 8 y 9

Colecciones Avanzadas

21

Implementaciones y uso de Map en Java

Excepciones

22

Manejo de Excepciones en Java: Errores Checked y Unchecked

23

Manejo de Excepciones en Java: Try-Catch y Try-With-Resources

JDBC

24

Conexión a Bases de Datos con JDBC en Java

25

Uso de PreparedStatement para consultas con filtros en JDBC

26

Configuración de phpMyAdmin y XAMPP para Bases de Datos

27

Conexión a MySQL usando Java JDBC: Configuración y Prácticas

28

Conexión y Lectura de Datos con JDBC en Java

29

Persistencia de Datos en Aplicaciones de Películas

30

Inserción y Visualización de Películas Vistas en Base de Datos SQL

31

Generación de Reportes Diarios con Fechas en Java

Lambdas

32

Modificación de tablas y manejo de fechas en MySQL

33

Interfaces Funcionales en Java: Conceptos y Ejemplos Prácticos

34

Programación Funcional: Paradigmas y Lambdas en Java

35

Lambdas en Java: Sintaxis y Aplicaciones Prácticas

36

Elementos clickeables en interfaz gráfica

37

Declaración de Lambdas y Recursividad en Java

38

Streams y Filters en Java para Optimizar Colecciones

39

Uso de Lambdas y Predicados en Streams Java

Fin del Curso

40

Programación Avanzada en Java: Clases e Interfaces

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso Avanzado de Java SE

Curso Avanzado de Java SE

Anahí Salgado Díaz de la Vega

Anahí Salgado Díaz de la Vega

Generación de Reportes Diarios con Fechas en Java

31/40
Recursos

¿Cómo generar un reporte diario con persistencia en Java?

¡Bienvenido a una emocionante oportunidad para pulir tus habilidades en Java! En nuestra clase anterior, vimos cómo generar un reporte del histórico de nuestras visualizaciones utilizando la persistencia con la tabla viewit. Ahora, te invitamos a asumir el reto de crear un reporte del día o de una fecha específica. Este ejercicio te permitirá comprender mejor cómo capturar y manejar datos de tiempo en una base de datos y procesarlos usando Java.

¿Cuál es el objetivo del reto?

El objetivo es modificar y mejorar el proceso actual de generación de reportes para incluir la opción de filtrar por fecha específica. Este reporte reflejará cuántas películas, libros, series o capítulos viste en un día determinado. Esto no solo requiere almacenar la fecha exacta de la visualización, sino también el tiempo específico en términos de hora y minutos.

¿Qué se necesita modificar en la tabla 'viewit'?

Para lograrlo, es esencial añadir un nuevo campo en tu tabla viewit. Este campo debe registrar la fecha y la hora exacta en la que se marca un elemento como visto. Asegúrate de almacenar no solo el día, sino también la hora y los minutos para obtener un reporte preciso.

¿Cómo implementar el filtro de fecha en Java?

En la interfaz movie.dao, necesitarás crear un nuevo método. Este método debe ser capaz de recibir un filtro de fecha y ejecutar un query select que integre el filtro según la fecha deseada.

Aquí tienes un breve ejemplo de cómo podría verse el código en Java para manejar este filtro:

public List<Visualizacion> obtenerReportesPorFecha(Date fecha) {
    String query = "SELECT * FROM viewit WHERE fecha_visualizacion = ?";
    // Aquí, 'fecha_visualizacion' es el nuevo campo añadido que registra la fecha y hora de visualización
    try (PreparedStatement stmt = conexion.prepareStatement(query)) {
        stmt.setDate(1, new java.sql.Date(fecha.getTime()));
        ResultSet rs = stmt.executeQuery();
        //Proceso del resultado
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

¿Dónde buscar ayuda y compartir aprendizajes?

A lo largo de este reto, podrías encontrar ciertas dificultades. No dudes en participar en nuestro foro de discusiones para hacer preguntas o buscar orientación. Asimismo, cuando completes este reto, te animamos a que compartas tu enfoque y el proceso de aprendizaje a través de nuestra sección de tutoriales. Ahí, podrás explicar cómo manejar las fechas en bases de datos, específicamente utilizando Java, y relatar los conocimientos adquiridos durante tu trayecto.

Sigue explorando y expandiendo tus habilidades en Java. Con cada reto y aprendizaje, te estás preparando para enfrentar desafíos más complejos con confianza. ¿Listo para el reto? ¡Manos a la obra!

Aportes 19

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Dejo mi solucion:

  1. Modificacion de la tabla viewed para incorporar el campo fechahora. Es aconsejable evitar usar nombres reservados como datetime, timestamp, son propios de las Bases de datos, y pueden causar problemas
    He creado de tipo DATETIME y he puesto not null y que se le asigne un valor por defecto de fecha actual, con esto no es necesario cambiar el insert de viewed en el codigo
ALTER TABLE `viewed` ADD `fecha_viewed` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER `id_user`;
  1. En la clase DataBase se ha agregado la constante de acuerdo al nombre del campo en mi caso:
public static final String TVIEWED_FECHAVIEWED 	= "fecha_viewed";
  1. En la clase MovieDAO he sobrecargado el metodo read para pasar una fecha, notar que se requiere los vistos de una fecha por eso funciona una consulta directa con JOIN, solo se mostraran los libros vistos de acuerdo a la fecha:
default ArrayList<Movie> read(Date date) {
		ArrayList<Movie> movies = new ArrayList<Movie>();
		java.sql.Date dt = new java.sql.Date(date.getTime());
		/*SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		String dateString = df.format(date);*/
		try (Connection connection = connecToDB()) {
			String query = "SELECT * FROM " + TMOVIE + " INNER JOIN " + TVIEWED +
					" ON (" + TMOVIE + "." + TMOVIE_ID + " = " + TVIEWED + "." + TVIEWED_IDELEMENT + ")" +
					" WHERE " + TVIEWED + "."  + TVIEWED_IDMATERIAL + " = ? " +
				    " AND "+ TVIEWED + "." + TVIEWED_IDUSUARIO + " = ?" +
				    " AND DATE(" + TVIEWED + "." + TVIEWED_FECHAVIEWED + ") = ?";
			
			PreparedStatement preparedStatement = connection.prepareStatement(query);
			preparedStatement.setInt(1, ID_TMATERIALS[0]);			
			preparedStatement.setInt(2, TUSER_IDUSUARIO);
			preparedStatement.setDate(3, dt);
			ResultSet rs = preparedStatement.executeQuery();

			while (rs.next()) {
				Movie movie = new Movie(rs.getString(TMOVIE_TITLE), rs.getString(TMOVIE_GENRE),
						rs.getString(TMOVIE_CREATOR), rs.getInt(TMOVIE_DURATION), rs.getShort(TMOVIE_YEAR));

				movie.setId(rs.getInt(TMOVIE_ID));
				movie.setViewed(true);
				movies.add(movie);
			}

		} catch (SQLException e) {
			// TODO: handle exception
		}
		return movies;
	}```

Hay que notar algunas cosas: 
 - Es aconsejable anidar en el query los valores de  parametros, si no mas bien hacerlo como lo hace ann mediante "?"  para evitar SQLInjection 
INCORRECTO

TVIEWED + “.” + TVIEWED_IDUSUARIO + " = " + TUSER_IDUSUARIO

CORRECTO

TVIEWED + “.” + TVIEWED_IDUSUARIO + " = ?"
preparedStatement.setInt(1, TUSER_IDUSUARIO);

 - Otra cosa en el codigo manejamos por Date pero es de tipo java.util.Date pero el JDBC usa el tipo java.sql.Date que no es lo mismo por lo cual se procede a realizar la conversion.

java.sql.Date dt = new java.sql.Date(date.getTime());
Para usar el parametro asi
preparedStatement.setDate(3, dt);

- Y una tercera ya no es necesario poner el siguiente codigo

movie.setViewed(getMovieViewed(preparedStatement, connection, rs.getInt(TMOVIE_ID)));

Como se pide solo los vistos, siempre sera true

movie.setViewed(true);


4. En la clase Movie se ha sobrecargado el metodo para pasar el filtro de fecha

public static ArrayList<Movie> makeMoviesList(Date date) {
Movie movie = new Movie();
return movie.read(date);
}

5. En la clase Main se ha llamado al metodo anterior para consultar las peliculas de acuerdo al filtro
movies = Movie.makeMoviesList(date);


Quedando de esta manera

public static void makeReport(Date date) {
SimpleDateFormat df = new SimpleDateFormat(“yyyy-MM-dd-h-m-s-S”);
String dateString = df.format(date);
Report report = new Report();

	report.setNameFile("reporte" + dateString);
	report.setExtension("txt");
	report.setTitle(":: VISTOS ::");

	SimpleDateFormat dfNameDays = new SimpleDateFormat("E,dd MMM Y");
	dateString = dfNameDays.format(date);
	String contentReport = "Date: " + dateString + "\n\n\n";
	
	movies = Movie.makeMoviesList(date);

	for (Movie movie : movies) {
		if (movie.getIsViewed()) {
			contentReport += movie.toString() + "\n";

		}
	}

	for (Serie serie : series) {
		ArrayList<Chapter> chapters = serie.getChapters();
		for (Chapter chapter : chapters) {
			if (chapter.getIsViewed()) {
				contentReport += chapter.toString() + "\n";

			}
		}
	}

	for (Book book : books) {
		if (book.getIsReaded()) {
			contentReport += book.toString() + "\n";

		}
	}
	report.setContent(contentReport);
	report.makeReport();

	System.out.println("Reporte Generado");
	System.out.println();
}```

Con esto logramos imprimir el reporte de las peliculas vistas de hoy

Listo 😃

  1. Primero creamos la nueva columna en la tabla viewed:

    ALTER TABLE AmazonViewer.viewed ADD viewed_date DATETIME;

  2. Modificamos la clase utilitaria AmazonUtil y agregamos un método nuevo que nos formatee la fecha actual:

    public static String getCurrentDate() {
    Date date = new Date();
    SimpleDateFormat format = new SimpleDateFormat(“yyyy-MM-dd 00:00:00.0”);
    String dateString = format.format(date);
    return dateString;
    }

  3. Modificamos en el metodo setMoviedViewed el query para agregar la fecha:

    String query = “INSERT INTO " + TVIEWED + " (” + TVIEWED_ID_MATERIAL + “,” + TVIEWED_ID_ELEMENT + “,”
    + TVIEWED_ID_USER + “,” + TVIEWED_DATE + “)” + " VALUES(" + ID_MATERIALS[0] + “,” + movie.getId()
    + “,” + TUSER_IDEUSUARIO + “,”"+AmazonUtil.getCurrentDate() + “”)";

  4. Agrego dos metodos nuevos a la interfaz MovieDAO para buscar por fecha actual

     private boolean getMovieViewedByDay(PreparedStatement preparedStatement, Connection connection, int id_movie) {
     boolean viewed = false;
     String query = "SELECT * FROM " + TVIEWED + " WHERE " + TVIEWED_ID_MATERIAL + "= ?" + " AND "
     		+ TVIEWED_ID_ELEMENT + "= ?" + " AND " + TVIEWED_ID_USER + "= ?" +" AND " + TVIEWED_DATE +"=\""+AmazonUtil.getCurrentDate()+"\"";
     ResultSet rs = null;
     try {
     	preparedStatement = connection.prepareStatement(query);
     	preparedStatement.setInt(1, ID_MATERIALS[0]);
     	preparedStatement.setInt(2, id_movie);
     	preparedStatement.setInt(3, TUSER_IDEUSUARIO);
     	System.out.println(query);
     	rs = preparedStatement.executeQuery();
     	viewed = rs.next();
     } catch (Exception e) {
     	// TODO: handle exception
     }
    
     return viewed;
    

    }

    default ArrayList<Movie> readByDay() {
    ArrayList<Movie> movies = new ArrayList<>();
    try (Connection connection = connectToDB()) {
    String query = "SELECT * FROM " + TMOVIE;
    PreparedStatement preparedStatement = connection.prepareStatement(query);
    ResultSet rs = preparedStatement.executeQuery();
    while (rs.next()) {
    Movie movie = new Movie(rs.getString(TMOVIE_TITLE), rs.getString(TMOVIE_GENRE),
    rs.getString(TMOVIE_CREATOR), Integer.valueOf(rs.getString(TMOVIE_DURATION)),
    Short.valueOf(rs.getString(TMOVIE_YEAR)));
    movie.setId(Integer.valueOf(rs.getString(TMOVIE_ID)));
    movie.setViewed(
    getMovieViewedByDay(preparedStatement, connection, Integer.valueOf(rs.getString(TMOVIE_ID))));
    movies.add(movie);
    }
    } catch (SQLException e) {
    // TODO: handle exception
    }
    return movies;
    }

  5. Agregamos metodo a la clase Movie para listar las pelicualas vistas solo del día

    public static ArrayList<Movie> makeMoviesListByDay() {
    Movie movie = new Movie();
    return movie.readByDay();
    }

  6. Modifico el metodo MakeReport(Date date) en la clase Main para pintar solo las diarias

    ArrayList<Movie> moviesDay = Movie.makeMoviesListByDay();
    for (Movie movie : moviesDay) {
    if (movie.getIsViewed()) {
    contentReport += movie.toString() + “\n”;

     	}
     }

Adjunto las imágenes del código insertado o modificado





yo tambien ya lo termine, aunque le añadi ciertas cosas mas, en vez de trabajar con datetime, trabaje con timestamps, tiene algunas caracteristicas bien utiles, ademas no quise hacer JOINS (puede que me falte el cursito de fundamentos de BD), en vez hice un foreach anidado que simplifica el trabajo de buscar por fecha, mas info en la repo:
amazonviewer

Hola!
Escribí un tutorial explicando cómo resolver este reto y por qué se resuelve de esa manera! 😄
Espero que les guste.

Excelente reto!

Yo simplemente desde el myphpadmin coloqué que capturará el dato de la fecha apenas se introdujera la tupla, esta bien hecho?

Hice una sobrecarga de los metodos para generar el reporte y se modificó el metodo de setMovieViewed para que incluyera el momento en que se visualizó.

default Movie setMovieViewed(Movie movie) {
		Date dateNow = new Date();
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:m:ss");
		String dateString = df.format(dateNow);
		
		
		
		try (Connection connection = connectToDB()){
			Statement statement = connection.createStatement();
			String query = "INSERT INTO "+TVIEWED+
					" ("+TVIEWED_ID_MATERIAL+", "+TVIEWED_ID_ELEMENT+", "+TVIEWED_ID_USER+", "+TVIEWED_DATEVIEWED+") "+
					"VALUES ("+ID_MATERIALS[0]+", "+movie.getId()+", "+TUSER_ID_USUARIO+", '"+dateString+"')";
			
			if (statement.executeUpdate(query)>0) {
				System.out.println("Se marcó en Visto");
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return movie;		
	}

public static void makeReport(Date date) {
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-h-m-s-S");
		String dateString = df.format(date);
		Report report = new Report();

		report.setNameFile("reporte" + dateString);
		report.setExtension("txt");
		report.setTitle(":: VISTOS ::");

		SimpleDateFormat dfNameDays = new SimpleDateFormat("E, W MMM Y");
		dateString = dfNameDays.format(date);
		String contentReport = "Date: " + dateString + "\n\n\n";

		movies=Movie.makeMoviesList(date);
		
		
		for (Movie movie : movies) {
			if (movie.getIsViewed()) {
				contentReport += movie.toString() + "\n";
			}
		}

		for (Serie serie : series) {
			ArrayList<Chapter> chapters = serie.getChapters();
			for (Chapter chapter : chapters) {
				if (chapter.getIsViewed()) {
					contentReport += chapter.toString() + "\n";

				}
			}
		}

		for (Book book : books) {
			if (book.getIsReaded()) {
				contentReport += book.toString() + "\n";

			}
		}
		report.setContent(contentReport);
		report.makeReport();

		System.out.println("Reporte Generado");
		System.out.println();
	}

public static ArrayList<Movie> makeMoviesList(Date today) {
		Movie movie = new Movie();
		return movie.read(today);
	}

default ArrayList<Movie> read(Date today){	
		ArrayList<Movie> movies =  new ArrayList<>();
		try (Connection connection = connectToDB()){
			SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
			String dateString = df.format(today);
			
			String query = "SELECT M.* FROM movie M JOIN viewed V ON M.id=V.id_element WHERE DATE(V.dateViewed)=DATE('"+dateString+"');";			
			PreparedStatement preparedStatement = connection.prepareStatement(query);			
			ResultSet rs = preparedStatement.executeQuery();
			
			while (rs.next()) {
				Movie movie = new Movie(
						rs.getString(TMOVIE_TITLE),
						rs.getString(TMOVIE_GENRE),
						rs.getString(TMOVIE_CREATOR),
						Integer.parseInt(rs.getString(TMOVIE_DURATION)),
						Short.valueOf(rs.getString(TMOVIE_YEAR)));
				
				movie.setID(Integer.parseInt(rs.getString(TMOVIE_ID)));
				movie.setViewed(getMovieViewed(
						preparedStatement,
						connection,
						Integer.parseInt(rs.getString(TMOVIE_ID))));
				movies.add(movie);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return movies;
	}

Yo utilicé la fecha con el siguiente formato “yyy-MM-dd”, para que el reporte salgan las peliculas que se vierón en el día actual:
-Modifique la tabla viewed de la siguiente manera:
ALTER TABLE viewed CHANGE date_actual date_actual DATE NULL DEFAULT NULL;

-La interfaz MovieDao la dejé de la sigueinte manera

package com.lsc.amazonviewer.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import static com.lsc.amazonviewer.db.DataBase.*;

import com.lsc.amazonviewer.db.IDBConnection;
import com.lsc.amazonviewer.model.Movie;



public interface MovieDao extends IDBConnection {

	
	default Movie setMovieViewed(Movie movie) {
		Date date = new Date();
		SimpleDateFormat df = new SimpleDateFormat("yyy-MM-dd");
		String dateString = df.format(date);
		try(Connection connection = connectTODB()){
		//	Statement statement= connection.createStatement();
			String query = "INSERT INTO " + TVIEWED +
					"("+ TVIEWED_IDMATERIAL+", "+TVIEWED_IDELEMENT+", "+TVIEWED_IDUSUARIO+", "+TVIEWED_DATE+")"+
					"VALUES(?, ?, ?, ?)";
			PreparedStatement pst = (PreparedStatement) connection.prepareStatement(query);
			pst.setInt(1, ID_TMATERIALS[0]);
			pst.setInt(2, movie.getId());
			pst.setInt(3, TUSER_IDUSUARIO);
			pst.setString(4, dateString);
			
			pst.execute();

			
		}catch (SQLException e) {
			e.printStackTrace();
		}
		return movie;

	}
	
	default ArrayList<Movie>read(){
		ArrayList<Movie>movies = new ArrayList();
		try(Connection connection = connectTODB()){
			String query = "SELECT * FROM " +  TMOVIE;			
			PreparedStatement preparedStatement = connection.prepareStatement(query); 
			ResultSet rs = preparedStatement.executeQuery(); 
			
			while (rs.next()){
				Movie movie = new Movie(
						rs.getString(TMOVIE_TITLE), 
						rs.getString(TMOVIE_GENRE), 
						rs.getString(TMOVIE_CREATOR), 
						Integer.valueOf(rs.getString(TMOVIE_DURATION)), 
						Short.valueOf(rs.getString(TMOVIE_YEAR)));
				
				movie.setId(Integer.valueOf(rs.getString(TMOVIE_ID)));
				movie.setViewed(getMovieViewed(preparedStatement, 
						connection, 
						Integer.valueOf(rs.getString(TMOVIE_ID))));
				movies.add(movie);
			}
		}catch (SQLException e) {
			// TODO: handle exception
		}
		return movies;
	}
	
	private boolean getMovieViewed(PreparedStatement preparedStatement, Connection connection, int id_movie) {
		boolean viewed = false;
		String query = "Select *from " + TVIEWED +
				" WHERE " + TVIEWED_IDMATERIAL + "= ?"  +
				" AND " + TVIEWED_IDELEMENT + "= ?" +
				" AND " + TVIEWED_IDUSUARIO + "= ?";
		
		ResultSet rs = null;
		try {
			preparedStatement = connection.prepareStatement(query);
			preparedStatement.setInt(1, ID_TMATERIALS[0]);
			preparedStatement.setInt(2, id_movie);
			preparedStatement.setInt(3, TUSER_IDUSUARIO);
			
			rs = preparedStatement.executeQuery();
			//si hay un datoo el valor a devolver será true
			viewed = rs.next();
		}catch (Exception e) {
			e.printStackTrace();
		}
		
		return viewed;
	}
	
	default boolean getViewDate(Date date, int idMovie) {
		SimpleDateFormat df = new SimpleDateFormat("yyy-MM-dd");
		String dateString = df.format(date);
		boolean viewDate = false;
			String query = "Select " + TVIEWED_DATE + " FROM " + TVIEWED +
					" Where " + TVIEWED_DATE + "= ?" +
					" And " + TVIEWED_IDELEMENT + "=?";			
			ResultSet rs = null;
			try(Connection connection = connectTODB()) {				
				PreparedStatement pst = (PreparedStatement) connection.prepareStatement(query);
				pst.setString(1, dateString);
				pst.setInt(2, idMovie);
				
				rs = pst.executeQuery();
				viewDate = rs.next();
			}catch (SQLException e) {
				// TODO: handle exception
			}										
		return viewDate;
	}
	
}

La clase Main en el método public static void makeReport(Date date) quedó de la siguiente manera

public static void makeReport(Date date) {
		SimpleDateFormat df = new SimpleDateFormat("yyy-MM-dd-h-m-s-S");
		String dateString = df.format(date);
		Report report = new Report();

		report.setNameFile("reporte" + dateString);
		report.setTitle("::VISTOS::");
		report.setExtention("txt");
		String ContentReport = "";
		for (Movie movie : movies) {
			if (movie.getIsViewed()) {
				if	(movie.getViewDate(date, movie.getId())) {
				ContentReport += movie.toString() + "\n";
			}
		  }
		}

		for (Books books2 : books) {
			if (books2.getReaded()) {
				ContentReport += books2.toString() + "\n";
			}
		}

		for (Serie serie : series) {
			ArrayList<Chapter> chapters = serie.getChapter();
			for (Chapter chapter : chapters) {
				if (chapter.getIsViewed()) {
					ContentReport += chapter.toString() + "\n";
				}
			}
		}
		report.setContent(ContentReport);
		report.makeReport();
		System.out.println("Reporte generado");
		System.out.println("");
	}

Muy buena explicación de base de datos en java.

ann nos pide agregar la fecha y hora y minuto, (me sobra el segundo), usando phpmyadmin directamente en la tabla viewed utilicé :
ALTER TABLE viewed ADD timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER id_user;

  • "ALTER TABLE viewed " modifica la tabla viewed
  • ADD timestamp NOT NULL : añadiéndole el campo timestamp y haciéndolo no nulo (que no queda en blanco) :
  • " DEFAULT CURRENT_TIMESTAMP " es el valor por defecto que se añadirá cuando se inserte o cree una línea nueva a viewed. Algo anexo a esto es que también se puede indicar al motor de db que sustituya el valor cuando se modifique esa línea pero eso haría que cambiara la fecha de viewed.

Reto cumplido !!!

RETO.png

Hola a todos
hago recuento del codigo que utilice para el reto:

  1. utilice función de fecha para utilizar armar fecha actual…
public interface MovieDAO extends IDBConnnect {
	
	default  String  fechaToday() {
		
		 Date date = new Date();
		 DateFormat  formatDate  = new SimpleDateFormat("yyyy-MM-dd");
		 String fechaRegistro = formatDate.format(date);
		 //System.out.println("fecha registro: " + fechaRegistro);
		
		return  fechaRegistro;
		
	}
  1. se añade el parametro de insercion de fecha en SetMovieViewed
default Movie setMovieViewed(Movie movie){

	 try(Connection connection = connectToDB()) {
		 
		 Statement statement  = connection.createStatement();
		 String query = "INSERT INTO " + TVIEWED +
				 "("+ TVIEWED_ID_MATERIAL + ", " + TVIEWED_ID_ELEMENT +
				 ", " + TVIEWED_ID_USER + ", " + TVIEWED_DATE_VIEWED + ")" + "VALUES("+ TMATERIAL_ID[0] +
				 ", " +  movie.getId() + ", " + TUSER_ID + ", '" + fechaToday() + "')";
		 
		// System.out.println("fecha registro: " + query.toString());
		 
	if (statement.executeUpdate(query) > 0) {
		
		System.out.println("se marco  en visto ");
		
	}
  1. se añade tambien parametro de fecha con el llamado de funcion de fecha desde la funcion read() para que sea enviado desde setViewed();
 default ArrayList<Movie>  read(){
	 ArrayList<Movie> movies = new ArrayList<Movie>();
	 
	 try(Connection  connection = connectToDB()){
		 String query = "SELECT * FROM " + TMOVIE;
		 PreparedStatement preparedstatement = connection.prepareStatement(query);
		 ResultSet rs = preparedstatement.executeQuery();
		 while (rs.next()) {
			 
			 
			Movie movie = new Movie(
					rs.getString(TMOVIE_TITLE),
					rs.getString(TMOVIE_GENRE),
					rs.getString(TMOVIE_CREATOR),
					Integer.valueOf(rs.getString(TMOVIE_DURATION)),
					Short.valueOf(rs.getString(TMOVIE_YEAR)));
			movie.setId(Integer.valueOf(rs.getString(TMOVIE_ID)));
			movie.setViewed(getMovieViewed(preparedstatement, connection, Integer.valueOf(rs.getString(TMOVIE_ID)), fechaToday()));
			movies.add(movie);
			
		}


  1. Se añade el parametro de fecha en la funcion getMovieViewed para la consulta de las movies vistas desde la fecha armada
private boolean getMovieViewed(PreparedStatement preparedstatement, Connection connection, int id_movie, String dateToday) {

	 boolean viewed = false;
	 
	 String query = "SELECT * FROM " + TVIEWED +
			 " WHERE " + TVIEWED_ID_MATERIAL + "= ?" + 
			 " AND " + TVIEWED_ID_ELEMENT + "= ?" +
			 " AND " + TVIEWED_ID_USER + "= ?" +
	 		 " AND " + TVIEWED_DATE_VIEWED + "= ?";
	 	
	 
	 ResultSet rs = null;
	 
	 try {
		 
		 preparedstatement = connection.prepareStatement(query);
		 preparedstatement.setInt(1, TMATERIAL_ID[0]);
		 preparedstatement.setInt(2, id_movie);
		 preparedstatement.setInt(3, TUSER_ID);
		 preparedstatement.setString(4, dateToday);
		 
		 
		 rs = preparedstatement.executeQuery();
		 viewed = rs.next();

5.habilíto la fincion “makeReport(Date date)” con el parametro de fecha para hacer reporte de Movies viewed por fecha actual.

public static void makeReport(Date date) {
	SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-h-m-s-S");
	String dateString = df.format(date);
	Report report = new Report();
	
	report.setNameFile("reporte" + dateString);
	report.setExtension("txt");
	report.setTitle(":: VISTOS ::");
	
	
	SimpleDateFormat dfNameDays = new SimpleDateFormat("E, W MMM Y");
	dateString = dfNameDays.format(date);
	String contentReport = "Date: " + dateString + "\n\n\n";
	
	for (Movie movie : movies) {
		if (movie.getIsViewed()) {
			contentReport += movie.toString() + "\n";
			
		}
	}


Genial.

Primero, se agregó la columna date_added a la tabla viewed de tipo datetime.
Y se modifica lo siguiente:

DataBase.java (se agrega nueva constante para la columna)

public static final String TVIEWED_DATEADDED	= "date_added";	

MovieDAO.java (se sobrecarga el método read enviado parámetro de fecha)

default ArrayList<Movie> read(Date date) {
	ArrayList<Movie> movies = new ArrayList();
	String dateFormat = new SimpleDateFormat("yyyy-MM-dd").format(date);
	try (Connection connection = connectToDB()){
		String query = "SELECT * FROM " + TVIEWED + " A " +
				" INNER JOIN  " + TMOVIE + " B ON a."+TVIEWED_IDELEMENT+" = b.id " +
				" WHERE a." + TVIEWED_IDMATERIAL +" = ?" +
				" AND "+ TVIEWED_IDUSUARIO + " = ?" +
				" AND DATE(a."+TVIEWED_DATEADDED+") = '" + dateFormat + "';";

		PreparedStatement preparedStatement = connection.prepareStatement(query);
		preparedStatement.setInt(1, ID_TMATERIALS[0]);
		preparedStatement.setInt(2, TUSER_IDUSUARIO);
		
		ResultSet rs = preparedStatement.executeQuery();			
		
		while (rs.next()) {
			Movie movie = new Movie(
					rs.getString(TMOVIE_TITLE), 
					rs.getString(TMOVIE_GENRE),
					rs.getString(TMOVIE_CREATOR),
					Integer.valueOf(rs.getString(TMOVIE_DURATION)),
					Short.valueOf(rs.getString(TMOVIE_YEAR))
					);
			movie.setId(Integer.valueOf(rs.getString(TMOVIE_ID)));
			movie.setViewed(true);
			movies.add(movie);
		}
		
	} catch (Exception e) {
		// TODO: handle exception
	}
	return movies;
}	

Movie.java (se crea nuevo método para devolver lista de movies vistos)

public static ArrayList<Movie> makeViewedMoviesList(Date date) {
	
	Movie movie = new Movie();
			
	return movie.read(date);
}

Main.java (se modifica para agregar llamado al nuevo método makeViewedMoviesList)

public static void makeReport(Date date)  {
	SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-h-m-s-S");
	String dateString = df.format(date);
	Report report = new Report();
	
	report.setNameFile("reporte" + dateString);
	report.setExtension("txt");
	report.setTitle(":: VISTOS ::");
	
	
	SimpleDateFormat dfNameDays = new SimpleDateFormat("E, W MMM Y");
	dateString = dfNameDays.format(date);
	String contentReport = "Date: " + dateString + "\n\n\n";
	
	ArrayList<Movie> moviesViewed= new ArrayList<>();
	moviesViewed = Movie.makeViewedMoviesList(date);
	
	for (Movie movie : moviesViewed) {
		contentReport += movie.toString() + "\n";
		
	}
	...
	report.setContent(contentReport);
	report.makeReport();
	
	System.out.println("Reporte Generado");
	System.out.println();	
	
}

buen curso reto cumplido