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

Reto: Reporte por fecha

31/40
Recursos

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