Seth Karim Luis Martínez
César David Ramírez Dimaté
Si definiste el campo con datetime en mysql, puedes haer la consulta del día con DATE(v.datetime) = '2018-06-30'.
¿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!
Los pasos para resolver el desafío serían los siguientes:
Modificar la tabla añadiendo el campo de fecha:
ALTER TABLE `platzi_java_se`.`viewed` ADD COLUMN `datetime` DATETIME NOT NULL AFTER `id_user`;
Realizar la consulta en base de datos:
SELECT * FROM platzi_java_se.movie AS m INNER JOIN platzi_java_se.viewed AS v ON m.id = v.id_element WHERE v.id_material = 1 AND v.id_user = 2 AND DATE(v.`datetime`) = '2018-06-30';
Main.java
public static void showMenu() throws IOException { ... } else if (opcion == 6) { try { System.out.print("Digite la fecha del reporte a generar en formato yyyy-MM-dd: "); Date dateE = new SimpleDateFormat("yyyy-MM-dd").parse(sc.nextLine()); makeReport(dateE); } catch (ParseException e) { e.printStackTrace(); } } ... } public static void makeReport(Date date) throws IOException { Date dateToday = new Date(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH-m-ss-S"); String dateString = df.format(dateToday); Report report = new Report(); report.setNameFile("reporte-" + dateString); report.setExtension("txt"); report.setTitle("\n\n\t:: VISTOS - " + new SimpleDateFormat("EEE, d MMM yyyy").format(date) + " ::"); SimpleDateFormat dfNameDays = new SimpleDateFormat("EE, d MMM Y, hh:mm:ss a"); dateString = dfNameDays.format(dateToday); String contentReport = "Report date: " + dateString + report.getTitle(); ArrayList<Movie> movies_date = new ArrayList<>(); movies_date = Movie.makeMoviesListDate(date); for (Movie movie : movies_date) { contentReport += "\n\n" + movie; } ... }
MovieDAO.java
import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; @SuppressWarnings("finally") default Movie setMovieViewed(Movie movie) { try (Connection connection = connectToDB()) { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Statement statement = connection.createStatement(); String query = "INSERT INTO " + TVIEWED + " (" + TVIEWED_IDMATERIAL + ", " + TVIEWED_IDELEMENT + ", " + TVIEWED_IDUSUARIO + ", " + TVIEWED_DATE + ")" + " VALUES (" + TMATERIALS_ID[0] + ", " + movie.getId() + ", " + TUSER_IDUSUARIO + ", '" + dateFormat.format(new Date()) + "');"; if (statement.executeUpdate(query) > 0) System.out.println("Se marcó en visto"); } catch (SQLException e) { e.printStackTrace(); } finally { return movie; } } ... @SuppressWarnings("finally") default ArrayList<Movie> getMoviesViewedByDate(Date date) { ArrayList<Movie> movies = new ArrayList<>(); String dateFormat = new SimpleDateFormat("yyyy-MM-dd").format(date); try (Connection connection = connectToDB()) { String query = "SELECT * FROM " + TMOVIE + " AS m INNER JOIN " + TVIEWED + " AS v ON m." + TMOVIE_ID + " = v." + TVIEWED_IDELEMENT + " WHERE v." + TVIEWED_IDMATERIAL + " = " + TMATERIALS_ID[0] + " AND v." + TVIEWED_IDUSUARIO + " = " + TUSER_IDUSUARIO + " AND DATE(v.`" + TVIEWED_DATE + "`) = '" + dateFormat + "';"; PreparedStatement preparedStatement = connection.prepareStatement(query); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { Movie movie = new Movie( resultSet.getString("m." + TMOVIE_TITLE), resultSet.getString("m." + TMOVIE_GENRE), resultSet.getString("m." + TMOVIE_CREATOR), resultSet.getInt("m." + TMOVIE_DURATION), resultSet.getShort("m." + TMOVIE_YEAR)); movie.setId(resultSet.getInt("m." + TMOVIE_ID)); movie.setViewed(true); movies.add(movie); } System.out.println(movies.size()); preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } finally { return movies; } }
DataBase.java
public static final String TVIEWED_ID = "id";
Movie.java
public static ArrayList<Movie> makeMoviesListDate(Date date) { Movie movie = new Movie(); return movie.getMoviesViewedByDate(date); }
Seth Karim Luis Martínez
César David Ramírez Dimaté
Si definiste el campo con datetime en mysql, puedes haer la consulta del día con DATE(v.datetime) = '2018-06-30'.
Luis Guzmán
Diana Sandoval
Gracias, despues de mucho intentar y con la ayuda de los otros aportes, ESTA fue la mejor solución y la que me funciono, fue mas sencilla de entender!
Usuario anónimo
UserListo :)
Juan Camilo Arboleda Gutierrez
Cristian Gómez
Adjunto las imágenes del código insertado o modificado
Jhosmar Parra Montaño
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
Juan Pablo Poveda López
A mi me genera el reporte.txt vacio , ocurre que yo no hice el curso anterior, o bueno lo hice epro era otra version del curso y no se trabajó este proyecto por tanto hice un fork de un repo de un compa y desde ahi trabaje razon por la cual makereport es unmisterio pa mi. en fin alguiens abe que pueda ser ?
Alejandro Fuertes
Hola, ¿podrían ayudarme con el ejercicio? Paso la fecha en la query, es decir lo concateno con la sentencia insert into... En el momento de realizar el statement.executeUpdate() el programa salta hacia el catch y me devuelve lo siguiente en la consola:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '03:39:40)' at line 1
Emmanuel Rodríguez
¿Puedes mostrar el código o el repositorio remoto? De bote pronto, pudiera ser tu sentencia SQL con el que estás realizando el query. Documentación MySQL 8
Alejandro Fuertes
Hola, el problema era que al momento de cargar las fechas desde java para enviarlas a las bases de datos lo estaba cargando de este modo "currentTime", y al parecer como en base de datos los tipos de fecha se cargan como 'currentTime' (con los apóstrofes) lo que debía hacer era setearlo desde java de este modo: " 'currentTime' ".
Muchas Gracias y espero que le sirve a alguien en un futuro!
Facundo Pérez Schneider
Hola! Escribí un tutorial explicando cómo resolver este reto y por qué se resuelve de esa manera! :D Espero que les guste.
Ludian Quiñones Solano
profe deme una ayuda
Yossijaki Jorge Astilleros Chávez
Excelente reto!
David Campos
Yo simplemente desde el myphpadmin coloqué que capturará el dato de la fecha apenas se introdujera la tupla, esta bien hecho?
Alejandro Manzano
Supongo es solo una parte, hice lo mismo, pero el problema recae en colocar una condicional para que genere un reporte de una fecha solicitada por el usuario.
Yo en lo particular ando batallando con la consulta para que haga el join de dos tablas.
David Tomas López Calderón
Laura Sofía Córdoba
JESUS ALMIRCAR CASTELLANOS
Solución del reto
Braian Peña
Muy buena explicación de base de datos en java.
Luis Cristóbal Oliden Albrecht
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;
viewed " modifica la tabla viewedtimestamp NOT NULL : añadiéndole el campo timestamp y haciéndolo no nulo (que no queda en blanco) :Paul Cortes
Reto cumplido !!!!
Luis Enrique Henao Rodriguez
Yo resolví la consulta de las fechas así:
default ArrayList<Movie> getMoviesViewedByDate(Date date) { ArrayList<Movie> movies = new ArrayList<>(); Calendar cal = Calendar.getInstance(); cal.setTime(new Date()); String fechaBase = cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1) + "-" + cal.get(Calendar.DAY_OF_MONTH); try (Connection connection = connectToDB()) { StringBuilder query = new StringBuilder(); query.append("SELECT * "); query.append("FROM ").append(T_VIEWED).append(" v "); query.append("LEFT JOIN ").append(T_MOVIE).append(" m ON m.").append(T_MOVIE_ID).append("=").append("v.") .append(T_VIEWED_ID_ELEMENT); query.append(" WHERE v.").append(T_VIEWED_ID_MATERIAL).append("=").append(Material.MOVIE.getTipo()); query.append(" AND v.").append(T_VIEWED_ID_USER).append("=").append(ID_USUARIO); query.append(" AND v.").append(T_VIEWED_DATE_VIEWED).append(">?"); query.append(" AND v.").append(T_VIEWED_DATE_VIEWED).append("<?"); PreparedStatement ps = connection.prepareStatement(query.toString()); ps.setString(1, fechaBase + " 00:00:00"); ps.setString(2, fechaBase + " 23:59:59"); // System.out.println("query: " + ps.toString()); ResultSet rs = ps.executeQuery(); while (rs.next()) { Movie movie = new Movie(rs.getString("m." + T_MOVIE_TITLE), rs.getString("m." + T_MOVIE_GENRE), rs.getString("m." + T_MOVIE_CREATOR), rs.getInt("m." + T_MOVIE_DURATION), rs.getShort("m." + T_MOVIE_YEAR)); movie.setId(rs.getInt("m." + T_MOVIE_ID)); movie.setViewed(getMovieViewed(ps, connection, movie.getId())); movies.add(movie); } } catch (SQLException e) { e.printStackTrace(); } return movies; }
Dejo mi solucion:
ALTER TABLE `viewed` ADD `fecha_viewed` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER `id_user`;
public static final String TVIEWED_FECHAVIEWED = "fecha_viewed";
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
Primero creamos la nueva columna en la tabla viewed:
ALTER TABLE AmazonViewer.viewed ADD viewed_date DATETIME;
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; }
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() + "")";
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; }
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(); }
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";
} }
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(""); }
Hola a todos hago recuento del codigo que utilice para el reto:
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; }
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 "); }
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); }
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"; } }