none
Evitar que se guarde una cita con horas ocupadas

    Pregunta

  • Hola buenas tengo un nuevo problema resulta que estoy haciendo un form para guardar las citas donde escoje la hora de inicio y la hora final lo que necesito es que no se permita guardar una nueva cita entre las horas ya ocupadas he intentado asi en el boton guardar:

    Dim conn As String = ConfigurationManager.ConnectionStrings("default").ToString
    
            Dim cita As Integer = 0
    
            Using cn As New SqlConnection(conn)
    
                cn.Open()
    
                Using cmd As SqlCommand = cn.CreateCommand
    
                    cmd.CommandText = "SELECT Count(*) FROM Cita Where Fecha=@Fecha and HoraInicio BETWEEN " & _
                        " @HoraInicio And @HoraFin And HoraFin BETWEEN @HoraInicio And @HoraFin"
    
                    cmd.Parameters.AddWithValue("@Fecha", CDate(FechaDateTimePicker.Text))
                    cmd.Parameters.AddWithValue("@HoraInicio", HoraInicioDateTimePicker.Value.TimeOfDay)
                    cmd.Parameters.AddWithValue("@HoraFin", HoraFinDateTimePicker.Value.TimeOfDay)
    
                    cita = cmd.ExecuteScalar()
    
                    If (cita > 0) Then
    
                        MessageBox.Show("Ya existe una cita con la misma hora", "OPTICA BARRAQUEL", MessageBoxButtons.OK, MessageBoxIcon.Information)
                        Return
    
                    End If
    
                End Using
    
            End Using

    SI tengo una cita desde 09:00 hasta 09:30 guardadas y quiero volver a guardar una nueva con 09:00 hasta 09:30 me funciona

    pero si yo escojo 09:01 hasta 09:30 entonces no funciona y deja guardar la cita

    Espero puedan darme una mano ya que esto lo tengo que presentar mañana y me he partido la cabeza pensando como hacerlo funcionar

    Gracias y saludos

    jueves, 1 de diciembre de 2016 3:27

Respuestas

  • Hola,

    Puedes validarlo con between:

    SELECT
        COUNT(*)
    FROM
        Cita
    WHERE
        Fecha = @Fecha AND
        @HoraInicio Between HoraInicio AND HoraFin
        OR @HoraFin Between HoraInicio AND HoraFin

    No te recomiendo una solución con Count ya que verifica toda la tabla y solo necesitas verificar existencia de una, por lo que puedes cambiar a algo así:

    SELECT CASE WHEN EXISTS (SELECT * FROM  Cita
          WHERE
         Fecha = @Fecha AND
         @HoraInicio Between HoraInicio AND HoraFin
         OR @HoraFin Between HoraInicio AND HoraFin) THEN 1 ELSE 0 END

    Saludos

    jueves, 1 de diciembre de 2016 15:07

Todas las respuestas

  • JOSÉ251288,

    Pienso que la siguiente consulta de selección bastará para encontrar las horas que intersectan:

    SELECT 
        COUNT(*) 
    FROM 
        Cita 
    WHERE 
        Fecha = @Fecha 
        AND (HoraInicio <= @HoraFin AND (HoraFin > @HoraInicio AND HoraFin <= @HoraFin))


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 1 de diciembre de 2016 5:18
  • Hola efectivamente funciona si yo escojo fecha de inicio 09:01:00 y  fecha fin 09:30:00

    Pero si escojo fecha inicio 09:01:00 y fecha fin 09:29:00 ahi no encuentra nada

    Osea lo que deberia hacer es que entre la fecha de inicio y la fecha de fin escogida no me deberia permitir guardar

    si tengo fecha inicio 09:00:00 y fecha Fin 09:30:00 deberia buscar si entre ese rango hay guardado una cita

    para que asi solo se pueda escoger como fecha de inicio 09:31:00 para adelante

    gracias

    jueves, 1 de diciembre de 2016 14:13
  • Hola,

    Puedes validarlo con between:

    SELECT
        COUNT(*)
    FROM
        Cita
    WHERE
        Fecha = @Fecha AND
        @HoraInicio Between HoraInicio AND HoraFin
        OR @HoraFin Between HoraInicio AND HoraFin

    No te recomiendo una solución con Count ya que verifica toda la tabla y solo necesitas verificar existencia de una, por lo que puedes cambiar a algo así:

    SELECT CASE WHEN EXISTS (SELECT * FROM  Cita
          WHERE
         Fecha = @Fecha AND
         @HoraInicio Between HoraInicio AND HoraFin
         OR @HoraFin Between HoraInicio AND HoraFin) THEN 1 ELSE 0 END

    Saludos

    jueves, 1 de diciembre de 2016 15:07