none
MARCAR DIAS HABILES EN UN DATATIMEPICKER RRS feed

  • Pregunta

  • Hola amigos del foro traigo un problema a ver si se puede resolver.

    Tengo un programa hecho visual studio 2010 y la base en "mysql" para un videoclub, este videoclub en cuestion tiene promociones los dias feriados en el que se pueden alquilar peliculas y devolverlas en 48hs, lo que necesito es agregar un formulario con un datatimepicker y en el poder marcar las fechas que sean dias feriados y guardarlas por ej, si el dia "martes 31/05/2016" es dia feriado, cuando el cliente alquile la pelicula ese dia la lleve con la promocion y la pueda devolver dentro de las 48hs sin pagar la mora correspondiente. Busque en internet pero no encontre como hacerlo, si alguien me puede brindar una mano y el codigo de como se hace se los agradeceria muchisimo ya que estoy estancado con este problema. Desde ya muchisimas gracias.

    jueves, 19 de mayo de 2016 13:24

Respuestas

  • dj mac40,

    No, la tabla [DiasFeriados] (o como lo hayas nombrado) no tiene porque registrar todos los días del mes, registra únicamente los días feriados de tu localidad. La tabla es bastante simple, no debería contener más que un campo de tipo fecha. [DiasFeriados] (Fecha date).

    Teniendo el registro de los días feriados es simple realizar el cálculo por mora, debes excluir los días feriados de los días en que el usuario tuvo la película en custodia, algo como:

    DECLARE @FechaAlquiler date = '25/12/2016';
    DECLARE @FechaDevolucion date = '28/12/2016';
    
    DECLARE @DiasTranscurridos tinyint = DATEDIFF(DAY, @FechaAlquiler - @FehaDevolucion) - (SELECT COUNT(*) FROM [DiasFeriados] WHERE Fecha BETWEEN @FechaAlquiler AND @FechaDevolucion)

    Nota que primero realizo el cálculo de los días en que la película estuvo en poder del cliente, a eso discrimino los días feriados que pudieron haber en ese periodo de tiempo, como verás no es nada complejo. Ahora, entiendo que la mora resulta del tiempo excedente por el interés pactado, eso tampoco debería ocasionarte complicaciones.

    Coméntanos como te fue.

    • Marcado como respuesta dj mac40 lunes, 23 de mayo de 2016 9:33
    viernes, 20 de mayo de 2016 14:37

Todas las respuestas

  • dj mac40,

    Los días feriados debes de almacenarlos en una tabla para que evite el cobro de la mora.

    ¿Donde tienes inconvenientes? ¿El registro de los días feriados? ¿La consulta para evitar la mora en caso ser un día feriado?

    jueves, 19 de mayo de 2016 14:04
  • Hola:

     Lo mas fácil para consultar los holidays es ingresarlos en una tabla de tu base de datos para que posteriormente cuando desees mostrar esta información en un calendario solo sea cuestión de que lances una consulta de selección a la respectiva tabla para ver si el valor de fecha del día existe como holiday si existe entonces aplicas una lógica para marcar el día en el calendario.

     Afortunadamente muchas cosas ya existen y no tienes que reinventar la rueda, ni quebrarte la cabeza, en este caso podrías valerte de controles de terceros como este:

    Another Month Calendar

     Este control ya cuenta con la funcionalidad de marcar fechas especificas  de una forma muy sencilla.

     Espero que la información te haya sido de utilidad.


    Saludos desde Monterrey, Nuevo León, México!!!

    jueves, 19 de mayo de 2016 14:44
  • Hola amigo willams muchisimas gracias por responder.

    Ya habia pensado en esa solucion e hice una tabla en la base de datos llamada DiasFer le agregue "31 campos" como los dias que trae el mes, e hice un formulario con checkbox les cambia la apariencia a tipo botones los acomode como si fuera un calendario, y en el marque los dias feriados y los guarde perfecto en la tabla, pero te digo la verdad amigo willams, cuando llego el momento de usar esos datos no supe como hacerlo, otro problema que pense fue, si el mes era febrero por ejemplo que tiene 28 dias, como hacer para ignorar los dias restantes.

    Por eso habia pensado en el datatimepicker, que segun lei navegando en internet, se pueden marcar los dias feriados, pero no encontre como se hace.

    Asi que si me puedes dar una mano amigo willams, si es de la forma que te expuse arriba mejor ya que ese formulario lo tengo y me funciona bien pero como te dije, no se como usar los datos que tengo guardado en la base, o si no con el datatimepicker cualquier forma que sea mientras me sirva sera bienvenida.

    Desde ya muchisimas gracias amigo Willams por tu ayuda.

    viernes, 20 de mayo de 2016 9:37
  • Hola amigo Jose Luis muchisimas gracias por responder.

    Ya hice un formulario tipo calendario al que le agregue checkbox a los cuales les cambie la apariencia a tipo botones con los dias que trae el mes y los guarde en una tabla y funciona perfecto, lo que no se, es como recuperar la informacion de esa tabla para usarla, por eso trate de ver lo del datatimepicker pero tambien no se como se usa, por eso estoy estancado en ese problema.

    Desde ya amigo Jose Luis muchisimas gracias por tu ayuda.

    viernes, 20 de mayo de 2016 9:53
  • Hola:

     La estructura que mencionas haber creado para la tabla donde almacenaras los holidays no me parece correcta, te sugiero una estructura como la siguiente:

    Ejemplo:

    /*Tabla Holidays*/
    Holidays
    //Este campo almacenara el id del registro
    HolidayId
    //Almacenas la fecha 2016/12/25 ejemplo de una dia festivo
    Fecha

    Bien, tomando el cuenta la estructura que te sugiero, podrías lanzar una consulta a tu base de datos la cual recupere los días feriados de un rango de fecha especifico:

    Ejemplo de sentencia SQL:

    "SELECT Fecha FROM Holidays WHERE Fecha BETWEEN @inicioMes AND @finMes"

    De donde al parámetro "@inicioMes" le pasarías el valor inicial del mes consulta ejemplo "2016/12/01", sigues la misma lógica para el parámetro "@finMes".

     Una vez recuperadas las fechas existentes para el mes proporcionado entonces solo sera cuestión de que utilices el método AddDateInfo del control sugerido para pasarle la colección de fechas recuperadas.

    Ejemplo:

            public Form1()
            {
                InitializeComponent();
            }
    
            /// <summary>
            /// Este ejemplo utiliza un arreglo de fechas para simular las fechas correspondientes a los fsetivos que vas a recuperar 
            /// de tu base de datos
            /// </summary>
            private void FormatDates()
            {
                //El control utiliza un objeto llamado DateItem
                DateItem[] d = new DateItem[5];
                d.Initialize();
                for (int i = 0; i < 5; i++)
                    d[i] = new DateItem();
    
                d[0].Date = new DateTime(2016, 6, 3);
                //El objeto DateItem tiene una propiedad BackColor para recibir el color con el que resaltara la fecha
                d[0].BackColor1 = Color.Red;
                d[0].ImageListIndex = 3;
                d[0].Text = "Help";
                d[1].Date = new DateTime(2016, 5, 12);
                d[1].ImageListIndex = 2;
                d[2].Date = new DateTime(2016, 5, 16);
                d[2].BackColor1 = Color.LightBlue;
                d[2].ImageListIndex = 8;
                d[3].Date = new DateTime(2016, 5, 18);
                d[3].BackColor1 = Color.GreenYellow;
                d[3].ImageListIndex = 1;
                d[3].Text = "NorDev";
                d[4].Date = new DateTime(2005, 6, 22);
                d[4].ImageListIndex = 1;
                d[4].Text = "Cebit";
    
                //Utilizas el método AddDateInfo para agregar la colección de fechas y sus configuraciones
                monthCalendar1.AddDateInfo(d);
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                FormatDates();
            }
        }

    Resultado:

    Hasta ahí tienes marcadas en el calendario las fechas consideradas feriados, ahora solo sera cuestión que implementes el resto de la lógica para decidir no cobrar moras en esas fechas.



    Saludos desde Monterrey, Nuevo León, México!!!

    viernes, 20 de mayo de 2016 13:08
  • dj mac40,

    No, la tabla [DiasFeriados] (o como lo hayas nombrado) no tiene porque registrar todos los días del mes, registra únicamente los días feriados de tu localidad. La tabla es bastante simple, no debería contener más que un campo de tipo fecha. [DiasFeriados] (Fecha date).

    Teniendo el registro de los días feriados es simple realizar el cálculo por mora, debes excluir los días feriados de los días en que el usuario tuvo la película en custodia, algo como:

    DECLARE @FechaAlquiler date = '25/12/2016';
    DECLARE @FechaDevolucion date = '28/12/2016';
    
    DECLARE @DiasTranscurridos tinyint = DATEDIFF(DAY, @FechaAlquiler - @FehaDevolucion) - (SELECT COUNT(*) FROM [DiasFeriados] WHERE Fecha BETWEEN @FechaAlquiler AND @FechaDevolucion)

    Nota que primero realizo el cálculo de los días en que la película estuvo en poder del cliente, a eso discrimino los días feriados que pudieron haber en ese periodo de tiempo, como verás no es nada complejo. Ahora, entiendo que la mora resulta del tiempo excedente por el interés pactado, eso tampoco debería ocasionarte complicaciones.

    Coméntanos como te fue.

    • Marcado como respuesta dj mac40 lunes, 23 de mayo de 2016 9:33
    viernes, 20 de mayo de 2016 14:37
  • Hola Amigos Williams y Jose Luis Muchisimas Gracias por sus repuestas.

    Tenias razon amigo Williams utilize tu logica la modifique a lo que necesitaba y me funciono perfecto, pude solucionar mi problema.

    Ahora sin intencion de querer abusar de sus tiempos, se me presento otro problema, tengo un datagridview en un forlulario en el que se muestran todos los alquileres no devueltos, en el cargo el fecha que se alquilo la pelicula, la fecha de la devolucion y los dias de retraso que tiene, lo que necesito es no contar los domingos por ej; si la fecha de devolucion es el dia "03/05/2016" y la devueve el dia "23/05/2016" en el dia de retraso me muestre "17 dias" y no "20 dias" no se si me explico bien.

    Buscando en internet encontre una funcion que la probe y funciona pero me resta tambien los dias sabado y yo solo quiero que me saque los domingos solamente, la funcion es:

    CREATE DEFINER=`root`@`localhost` FUNCTION `sp_ContarDias`(a DATE,b DATE) RETURNS int(11) BEGIN DECLARE a1,d,di,df,ban,ban1,resultado INT; SET d=DATEDIFF(b,a)+1; SET di=DAYOFWEEK(a); SET ban=1; SET ban1=0; WHILE ban<d DO IF (di=8) THEN SET di=1; END IF; IF (di=6 OR di=7) THEN SET ban1=(ban1+1); END IF; SET di=(di+1); SET ban=(ban+1); END WHILE; SET resultado=(d-ban1); RETURN abs(resultado); END

    No se como modificarla para que me reste solo el domingo, o si me pueden brindar una forma mejor se los volveria a agradecer.

    Desde ya MUCHISIMAS GRACIAS POR SU APOYO.

    lunes, 23 de mayo de 2016 10:14