Jump to content

susodicho

Warianos
  • Posts

    128
  • Joined

  • Last visited

  • Days Won

    4

susodicho last won the day on July 5 2015

susodicho had the most liked content!

Información Personal

  • Pais
    Chile
  • Genero
    Hombre

susodicho's Achievements

Newbie

Newbie (1/14)

10

Reputation

  1. :mmm: Parece que estás ocupando la lógica del formato de fecha al revés, porque se supone que fechaNacimiento usa el formato de fecha chileno, pero tú lo estás interpretando como YYYY-MM-DD (que es el que usa la base de datos). El otro problema es que no sé qué hace el constructor de la clase Funcionario con la fecha, no tengo idea si hace algún tipo de conversión o no . Si el campo de texto jTextFieldNacimiento usa el formato de fecha YYYY-MM-DD, entonces estás haciendo mal las cosas, no hay que pedirles a los usuarios que usen un formato de fecha al que no están acostumbrados sólo porque el motor de base de datos usa ese formato :no: . Así que, si el campo de texto con la fecha de nacimiento está en el formato correcto (DD-MM-YYYY, el formato de fecha que se usa en Chile), entonces puedes ver si te sirve esta función que convierte una fecha en formato chileno a una en formato YYYY-MM-DD (el que usa la base de datos): public static String parseDMYtoYMD(String fecha) throws Exception { SimpleDateFormat sdf1 = new SimpleDateFormat("dd-MM-yyyy"); SimpleDateFormat sdf2 = new SimpleDateFormat("dd/MM/yyyy"); Calendar c = new GregorianCalendar(); String s; sdf1.setLenient(false); sdf2.setLenient(false); c.setTime(fecha.indexOf('-') >= 0 ? sdf1.parse(fecha) : sdf2.parse(fecha)); s = String.format("%1$04d-%2$02d-%3$02d", c.get(Calendar.YEAR), c.get(Calendar.MONTH) + 1, c.get(Calendar.DAY_OF_MONTH)); return s; }Ojo, la función devuelve una cadena (no una variable de tipo Date), así que tendrías que modificar el constructor de la clase Funcionario. Además, la función usa la clase Calendar, ya no deberías usar la clase Date. No me manejo mucho en Java, pero supongo que debe haber una mejor manera de expresar una fecha como cadena, sin tener que usar el poco elegante String.format. :huasonto:
  2. Creo que la librería C++ más común para ese tipo de cosas es Asio (incluso puedes encontrar código de ejemplo para un chat simple). La otra opción sería hacer una aplicación Qt, que incluye un módulo QtNetwork con clases para todo lo relacionado con sockets y protocolos de red (TCP, SSL/TLS, etc.). :huasonto:
  3. :mmm: Para empezar, parece que estás usando convenciones de Java en una aplicación C# :huasonto: , o sea, el método getRespuesta y el getALT_CO tienen pinta de propiedades (sí, en C# existen las propiedades), así que deberías cambiar todos esos métodos del tipo getAlgo y setAlgo por propiedades. Segundo, no veo que sea necesario el switch. Intenta usar la propiedad Value2 para cambiar el valor de una celda. Ejemplo: xlWorkSheet.Cells[2,3].Value2 = listita[x].getALT_CO().ToString(); Por último, debiste haber subido 2 capturas, una con la hoja de cálculo que obtienes cuando ejecutas tu programa y otra que muestre los datos como tú esperas que aparezcan. No tengo tanta imaginación como para imaginarme esas cosas basándome sólo en un fragmento de código como el que subiste. :huasonto:
  4. :mmm: ¿Qué versión del Dev-C++ instalaste? En todo caso, Dev-C++ no es un compilador, es un IDE y viene con alguna variante del compilador MinGW. :tecito: Si instalaste una versión antigua (anterior a la aparición de Win8), entonces sería normal que tenga algún tipo de problema, eso también ha pasado con Win7 y Vista. ¿Te fijaste qué versión del MinGW es la que trae? Por si acaso, a mí nunca me ha gustado mucho el Dev-C++, siempre ha sido inestable, incluso las versiones más recientes tienen problemas. Mejor instala el Code::Blocks (también es gratuito), tiene la opción de importar proyectos del Dev-C++. Además, ya sea que uses el Code::Blocks o el Dev-C++, tienes la posibilidad de instalar un compilador más actualizado (ten en cuenta que los 2 vienen con una versión más o menos antigua del MinGW, la que estaba disponible al momento del lanzamiento). :huasonto:
  5. Sí, ahora sólo tienes que revisar qué devuelve la función login y listo. Recuerda cambiar la declaración de los parámetros (los que quieres pasar por referencia). Ojo, no se pueden pasar propiedades por referencia ;) :huasonto:
  6. Cuando quieres validar a un usuario, revisas que el usuario exista y que la contraseña sea la correcta; por lo tanto, al hacer la consulta, ésta te puede devolver una fila o ninguna. Es decir, si el usuario no existe o la contraseña es incorrecta, no te devuelve ninguna fila; en caso contrario (el usuario existe y la contraseña es correcta) te devuelve una sola fila. Así que no hay necesidad de usar un while para recorrer todas las filas devueltas por la consulta, ya que como mucho será una fila.Como tu función login valida el inicio de sesión, sería lógico que sea de tipo booleana (devuelve verdadero si el usuario existe y la contraseña es correcta).La función login no está "devolviendo" el nombre de usuario ni la contraseña porque los 3 parámetros los estás pasando por valor, tienes que pasarlos por referencia.Así que la función login quedaría más o menos así: public bool login(string user, string pass, Label mensaje) { bool pulento = false; // etc. try { // etc. if (reader.HasRows) { // etc. pulento = true; } } catch (Exception e) { // etc. } finally { // etc. } return pulento; } :huasonto:
  7. :mmm: La consulta del procedimiento almacenado sólo devuelve el campo codUser (SELECT codUser FROM usuarios WHERE...), así que sólo puedes acceder a ese campo con el SqlDataReader. Desde comienzos de este milenio (cuando alguien descubrió que existen otros idiomas además del inglés) se prefiere guardar las cadenas como Unicode, así que sería bueno que cambiaras los VARCHAR por NVARCHAR para que tu aplicación se vea más moderna ;) . Un detalle, el prefijo usado normalmente para denotar clave primaria es PK, así que creo que deberías cambiar la declaración CONSTRAINT FK_USUARIOS PRIMARY KEY(codUser) por CONSTRAINT PK_USUARIOS PRIMARY KEY(codUser) :huasonto:
  8. [hide]Te conviene expresar las fechas como enteros y con el formato MMDD, así es fácil comparar rangos de fechas. $FECHA = $_POST['fecha']; $fecha = explode("/", $FECHA); $mes_dia = $fecha[1] * 100 + $fecha[0]; // Esta es la fórmula que necesitas para expresar la fecha como entero echo "MES/DIA = ".$mes_dia; O sea, la fecha de la navidad se expresaría como 1225 y el tercer día del año sería 103.Por ejemplo, si quieres saber si una fecha corresponde al segundo trimestre del año, haces algo como esto: if ($mes_dia >= 401 && $mes_dia <= 630) { echo "La fecha pertenece al segundo trimestre del año."; } Ahora, para saber a qué estación del año corresponde una fecha, usas la misma idea de arriba, o sea: ($mes_dia >= inicio && $mes_dia <= fin)excepto para el invierno, que sería: ($mes_dia >= inicio || $mes_dia <= fin)hay que cambiar el && por un ||, ya que el invierno comienza a fines de año y termina a comienzos del próximo.[/hide] :huasonto:
  9. <_< mysql_fetch_array devuelve un arreglo para cada fila devuelta por la consulta...¿en qué parte estás recorriendo todas esas filas? :huasonto:
  10. :mmm: En el formulario, el campo de texto se llama rut_coordinador, pero en el archivo crearcursodb.php estás tratando de acceder a coordinador_rut. No sé qué será lo que te complica para llenar la lista, por lo que entiendo, sólo tendrías que hacer un SELECT que te devuelva todas las filas de la tabla docente . Sobre la forma en que usas el campo obligatorio: No me parece buena idea usar una lista desplegable para seleccionar si un curso es obligatorio o no. Me parece más lógico usar una casilla de verificación (también conocida como checkbox). <label><input type="checkbox" name="obligatorio" />Esto es obligatorio</label>Deberías usar textos descriptivos en la interfaz de usuario, "s" y "n" no los encuentro muy claros. Me da la impresión que trataste de que los valores mostrados en la interfaz de usuario calzaran con los que usas internamente en tu base de datos (ya que el campo obligatorio es de tipo CHAR y toma valores "s" y "n") y así lograr que el INSERT te saliera más fácil ;) . Creo que mejor declaras este campo como BOOL, lo encuentro más lógico. :huasonto:
  11. :mmm: No estoy seguro qué entiendes tú por tamaño de la base de datos o de dónde sacas esa información, ¿el PhpMyAdmin muestra esa información?, ¿por qué esperas que el archivo SQL resultante tenga un determinado tamaño? Si tú esperas un determinado tamaño para el archivo SQL, entonces podrías intentar agregando la opción -c al mysqldump y ver si con eso obtienes el tamaño que tú esperas. En todo caso, en el PC que te da "problemas" ¿has revisado o probado el archivo SQL resultante? ¿tiene algo malo? ¿faltan líneas? ¿has revisado los otros archivos SQL? Así que podrías hacer lo siguiente para aclarar las cosas: Sube una captura de pantalla en donde aparezca el tamaño de la base de datos (tú dices que esperas como 40 MB, así que en alguna parte debe aparecer eso)Responde lo siguiente: ¿Hay algún problema con el archivo SQL de menor tamaño? ¿el archivo SQL tiene problemas para generar la base de datos correctamente? :huasonto:
  12. Básicamente, ahora película sería información sobre ésta (fecha de estreno, director, género, etc.), y copia es algo tangible (lo que realmente se le entrega al cliente). En otras palabras, las copias pueden extraviarse o deteriorarse, mientras que una película es una descripción de una copia. :huasonto:
  13. :mmm: Aers...por lo que veo, vas a tener que pensar en copias (no en películas), o sea, hasta ahora tu modelo está pensado de esta forma: Un cliente arrienda películaspero en realidad deberías verlo así:Una película tiene una o varias copiasUn cliente arrienda una o varias copiasAsí que parece que no vas a poder hacerle el quite a la entidad copia ;) . Entonces, vas a tener una tabla copias (o puede ser en singular), y ésta va a tener un campo que indica si está o no arrendada y quizás un campo que indique el formato (DVD, Blu-ray u otro). Con este esquema, me imagino que para poder ver si una película está disponible, vas a tener que pensar que ahora tienes contar la cantidad de copias que no están arrendadas:Buscas el título de la película en la tabla pelicula y obtienes el idpeliculaEn la tabla copias, cuentas la cantidad de filas con ese idpelicula que no estén arrendadas, y así sabes si esa película está disponible para arrendarla :huasonto:
  14. :mmm: Creo que la parte que te complica es que una película puede tener varias copias, o sea, si vas a la tienda donde arriendan películas y preguntas si tienen una determinada película, quizás te respondan que sí la tienen, pero que no le quedan copias para arrendar (todas están pedidas). Veo que en la tabla detalle_arr tienes un campo cantidad, pero no tengo claro qué significado le das tú. Supongo que el total de copias y copias disponibles podrían ser campos de la tabla pelicula, pero no estoy seguro De hecho, creo que se podría complicar más el modelo si consideras el formato, es decir, puedes tener varias copias de una película y quizás algunas copias están en DVD y otras en Blu-ray. :huasonto:
  15. No, el código PHP que está al comienzo del archivo login.php es para detectar algo que en realidad normalmente no debería ocurrir: ¿qué pasa si alguien ingresa a la página login.php si ya inició sesión?. Si tu sitio está bien hecho, no debería haber forma de que un usuario que inició sesión pueda acceder a la página login.php (en ninguna parte debería haber un enlace para que el usuario llegue a esa página). Así que yo pensé que si un usuario con sesión abierta se las ingenió para llegar a la página login.php es porque quizás quiere cerrar la sesión, y por eso lleva a la página cerrar.php. Esto puede ocurrir si un usuario tiene varias pestañas abiertas y hace rato inició sesión en una de ellas, después de un tiempo y con un montón de pestañas abiertas, decide entrar a la página y para eso usa el enlace a la página login.php que tiene almacenado en sus favoritos (marcadores o bookmarks) en una nueva pestaña. En este escenario, no parece buena idea cerrarle la sesión al usuario, ya que no se acordaba que ya había iniciado sesión en otra pestaña. Así que ahora creo sería mejor llevarlo a la página menu.php si ya tiene una sesión abierta, ya que esa es la pantalla que normalmente se muestra al iniciar sesión.Así que mejor cambia eso y aprovechas de poner algún comentario explicativo en esa parte del código PHP (el del comienzo del archivo login.php). De forma similar, también deberías revisar qué pasa cuando alguien se las ingenia para ingresar a la página verificar.php (normalmente nadie debería saber siquiera de la existencia de esa página), pero algún curioso podría ver el código fuente de la página login.php y darse cuenta que lleva a la página verificar.php. Fíjate qué pasa si se ingresa a la página verificar.php con y sin sesión abierta. ;) Tal como está hecho, resulta que el mensaje es persistente, o sea, aunque se recargue la página, siempre muestra el último mensaje de error (sin necesidad de haber pasado por verificar.php). Así que sí tiene una pifia. Nótese que verificar.php sí limpia el mensaje al comienzo (le asigna una cadena vacía) y, por lo tanto, si se inició sesión correctamente, no hay ningún problema. Además creo sería mejor usar otra forma de ver si ocurrió un error o no, así que podrías hacer los siguientes cambios (ojo, estos cambios no arreglan la pifia, sólo hacen que sea un poco más elegante):En login.php cambia esta línea:if(isset($_SESSION['mensaje']) && !empty($_SESSION['mensaje']))...por esta:if(isset($_SESSION['mensaje']))En verificar.php cambia esta línea:$_SESSION['mensaje'] = "";...por esta:unset($_SESSION['mensaje']);Insisto, esto no arregla el problema del mensaje de error persistente. Para arreglarlo, simplemente hay que destruir la variable que contiene el mensaje de error justo después de mostrarlo, o sea, en el archivo login.php, agrega la línea unset($_SESSION['mensaje']); después de la línea que muestra el mensaje. :huasonto:
×
×
  • Create New...