Sintaxis correcta para función Dcount para fechas y números

Estoy tratando de usar la función Dcount, esto para que le alerte si en la fecha y hora seleccionadas de los cuadros de texto si ya existe otro registro al dar clic en el botón.

Campos Tabla:      

Día: guarda la fecha de la cita, el formato del cuadro combinado es fecha corta

Hora: Guarda el id de la hora que se muestra en el cuadro combinado y es de tipo numero.

He tratado de buscar ejemplos para campos de fecha y número pero no veo el error en mi sintaxis:

  If DCount("Dia", "tblNotas", "Dia= #" & Me.txt_Dia & "#  AND Hora= ' & Me.txt_Hora_Cita & ' AND ESTADO_CITA = 'PENDIENTE'") > 0 Then

 

     MsgBox "En la Fecha y Hora seleccionada ya existe una cita otorgada", vbCritical, "Campo Ocupado"

   Exit Sub

  End If

1 respuesta

Respuesta
2

Por partes

Si el campo Hora es texto

"Hora = '" & me.texhora & "'

Si el campo hora tiene como formato, por ejemplo, hora corta

"Hora=#" & me.texthora & "#

Y pendiente como es texto

EstadoCita="Pendiente"")

me sigue dando error de criterios, el campo Hora de la tabla es de tipo  numero, pero lo que se muestra en el cuadro texto es un texto porque el formato hora corta no me sirve porque a la hora le agregue texto por cuestiones de un control que le llevo. Pero guarda un numero en la tabla.

y el campo estado_cita si le pongo comillas dobles se marca en rojo

If DCount("Dia", "tblNotas", "Dia= #" & Me.txt_Dia & "#  AND Hora = '" & Me.txt_Hora_Cita & "' AND ESTADO_CITA = "PENDIENTE"") > 0 Then

Creo que ya lo resolví le quite las comillas simples al campo de hora, pero le puse que me limpie los campos ya que si no si me hacia el registro, después del else si le digo que me lo guarde

If DCount("Dia", "tblNotas", "Dia= #" & Me.txt_Dia & "# AND Hora = " & Me.txt_Hora_Cita & " AND ESTADO_CITA = 'PENDIENTE'") > 0 Then
MsgBox "En la Fecha y Hora seleccionada ya existe una cita otorgada", vbCritical, "Campo Ocupado"
Me.txt_Dia = Null
Me.txt_Hora_Cita = Null
Else
Me.txt_Hora_Cita.SetFocus
Me.LTS_Lista_Espera.Requery
Me.Refresh
DoCmd.RunCommand acCmdSaveRecord
Exit Sub
End If

Si un valor es numérico la expresión es

loquesea=" & me.hora & "

Si es texto es apóstrofe comillas

Cuando tengas dudas pones =forms! Nombredeformulario! Hora que así nunca se falla.

Si la instrucción la pones en el evento Antes de actualizar de algún control, yo pondría simplemente

msgbox"...

Docmd. Cancelevent

Así, si te sale ese mensaje, pulsas Aceptar y el cursor se vuelve al cuadro de texto que no cumpla la condición, para que lo cambies.

Pero eso va para gustos

Hola amigo

Me estuvo funcionado bien, pero me he dado cuanta que aveces deja de validar, no entiendo porque en ocaciones si funciona y ya luego no funciona.

Bueno te explico todo lo que debe hacer las validaciones:

  1. Me debe validar que los campos contengan información
  2. Me debe validar si ya existe la identificación y el área que digite.(no me permita registrar si ya existe ese cliente con esa área si ya existe un registro PENDIENTE )
  3. Me debe validar si ya existe una cita en la fecha y hora seleccionadas.(no me permita registrar si ya existe  una cita en fecha y hora)
  4. para finalizar, si se cumplen los puntos anteriores  permita registrar 

Este es el código:

Dim msg As String, estilo, title As String

    estilo = vbCritical + vbOKOnly

    title = "Error en la inserción por falta de datos"

    msg = "No se han podido crear los registros solicitados por no existir ninguna entrada en el campo "

    If IsNull(Me.txt_Num_Identificacion) Then

        msg = msg & "Identificación."

        MsgBox msg, estilo, title

        Me.txt_Num_Identificacion.SetFocus

        Exit Sub

    End If

    If IsNull(Me.txt_Nombre) Then

        msg = msg & "No has buscado al Paciente."

        MsgBox msg, estilo, title

If DCount("IDENTIFICACION", "tblRegistros", "IDENTIFICACION = " & Me.txt_Num_Identificacion & "  AND DESCRIPCION_PROCEDIMIENTO='" & Me.txt_Area & "'AND ESTADO_CITA = 'PENDIENTE'") > 0 Then

MsgBox "Este paciente ya se ha registrado anteriormente por el mismo tipo de procedimiento ", vbCritical, "Registro Doble"

Me.txt_Area.SetFocus

Exit Sub

End If

If DCount("Dia", " tblRegistros ", "Dia= #" & Me.txt_Fecha_Programacion & "#  AND Hora = " & Me.txt_Hora_Prog_Hospitalizacion & " AND ESTADO_CITA = 'PENDIENTE'") > 0 Then

MsgBox "En la Fecha y Hora seleccionada ya existe una cita otorgada, Cambie la Hora de la cita", vbCritical, "Campo Ocupado"

Else

Dim db As Database

Dim rs As Recordset

Set db = CurrentDb

Set rs = db.OpenRecordset("tblRegistros")

rs.AddNew

rs!IDENTIFICACION = "" & txt_Num_Identificacion

rs!NOMBRE = "" & txt_Nombre

rs.Update

rs.Close

Set rs = Nothing

db.Close

 MsgBox "Los datos se ingresaron satisfactoriamente", vbInformation, "Datos"

txt_Num_Identificacion = Null

txt_NOMBRE_COMPLETO = Null

Exit Sub

End If

:

Por partes, que me he perdido

1º Lo de validar todos los campos no sé que significa. Si es que te guarde todo lo que has escrito en un registro de un formulario, si el origen de registros de ese formulario es una tabla y los controles tienen como origen del control un campo de esa tabla o consulta no es necesario hacer nada, ya te los guarda directamente.

2º Si el orden de tabulación es Cliente y Area, en el evento antes de actualizar del cuadro de texto Area puedes poner

If Dcount("cliente","clientes","cliente='" & me.cliente & "' and área='" & me.area & "'")>=1 then

msgbox"Ese cliente y área ya existen",vbokonly,"Se borrarán los datos"

cliente=null

cliente.setfocus

área=null

end if

Ose, antes de actualizar el cuadro de texto Area, que cuente si hay clientes en la tabla Clientes con el valor de cliente que has escrito en el cuadro de texto y con el área que hayas escrito. Si los hay ya guardados, que borre el cuadro Cliente, que el cursor vaya allí y que borre el cuadro área.

3º Lo de la fecha y hora es exactamente igual,

If Dcount("cliente","clientes","fecha..... and hora.....)>=1 then

....

end if

4º Si el orden de tabulación es Cliente, Area, Fecha, hora, como en Area ya le dijimos que si se cumplía lo de Dcount no lo dejara pasar, supongamos que si lo ha dejado pasar. Entonces en Hora le pones lo mismo de Dcount pero con

Cliente=null

cliente.setfocus

Area=null

Fecha=null

Hora=null

end if

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas