Necesito ayuda con una BD

Hola expertos estoy realizando una agenda de citas medicas en accces, mi problema es el siguiente, al momento de capturar una nueva cita necesito que al dar click a un botón guardar, se verifique en la tabla donde se guardan los datos que no se repitan los siguientes datos:
   Nombre del Medico, Fecha de la Cita, Hora de la cita
Si es así que mande un mensaje diciendo que esa fecha y esa hora para el medico no esta disponible y permita corregir y si no se repiten los 3 al mismo tiempo que guarde la información capturada en los cuadro de texto, no se si me explico, pongo el código que estoy utilizando para ver si alguien puede ayudarme:
Private Sub cmdGuardar_Click()
Dim Doctor As Variant
Dim FCita As String
Dim HCita As Variant
Dim M, H As Variant
Dim F As String
    Doctor = Nz(DLookup("[Medico]", "Paciente", "[Medico]= cmbMedico"))
    FCita = Nz(DLookup("[Fecha]", "Paciente", "[Fecha]= txtFecha "))
    HCita = Nz(DLookup("[Hora]", "Paciente", "[Hora]= cmbHora"))
If Doctor = cmbMedico And FCita = TxtFecha And Hcita = cmbHora Then
        MsgBox "Fecha y Hora no disponibles para este Medico, Favor de Verificar", vbInformation, "Advertencia"
        TxtFecha.SetFocus
    Else
        DoCmd.SetWarnings False
        DoCmd.RunSQL "INSERT INTO Paciente(Id,Nombre,Apellidos,Medico,NoExp,Fecha,Hora,Observacion) VALUES('" & txtNCita.Value & "','" & txtNombre.Value & "','" & txtApellido.Value & "','" & cmbMedico.Value & "','" & TxtNoExp.Value & "','" & TxtFecha.Value & "','" & cmbHora.Value & "','" & txtObser.Value & "')"
        DoCmd.SetWarnings True
        MsgBox "El Paciente " & txtNombre & " " & txtApellido & " con No. De Exp " & TxtNoExp & " "
        MsgBox "se le asigno la cita el dia " & TxtFecha & " en horario " & cmbHora & " "
    End If
End Sub
Respuesta
1
Yo lo haría con un recordset. Supongo que cmbMedico, txtFecha y cmbHora son los combix y el cuadro de texto (la fecha), supongo también que en la tabla Paciente los campos fecha y hora son de tipo Fecha/Hora. En el código pondría:
Dim db as Database
Dim rs as Recordset
Set db=Currentdb
Set rs=dbOpenrecordset("Select Medico, Fecha, Hora from Paciente where Medico='" & form!cmbMedico.value & "' and Fecha=cDate('" & form!txtFecha.value & "') and Hora=cDate('" & form!cmbHora.value & "')")
If not rs.eof then
mensaje de error por duplicado
else
Insert into....
end if
Me cuentas.
Gracias por tu ayuda, me fue de mucha utilidad, disculpa ahora necesito darte otra molestia.
Tengo un formulario para modificar los registros, en dicho formulario hago una búsqueda por medio de un numero de expediente en un combo, selecciono el que deseo modificar y se llenan los demás cuadro te texto, al momento de dar click en un botón guardar se deberían guardar los cambio, pero al checar el registro sigue igual te pongo el código y me dices en que estoy mal gracia por tu valiosa ayuda:
Así hago la búsqueda y lleno los cuadro de texto:
Private Sub txtNoExp_BeforeUpdate(Cancel As Integer)
Dim rst As DAO.Recordset
'Suponiendo que el campo Identidad es Numerico
Set rst = CurrentDb.OpenRecordset("SELECT * from Paciente WHERE NoExp=" & Me.TxtNoExp)
If rst.EOF = False And rst.BOF = False Then
   'Relleno los cuadro de texto
    txtNCita = rst!Id
    txtNombre = rst!Nombre
    txtApellido = rst!Apellidos
    cmbMedico = rst!Medico
    TxtFecha = rst!Fecha
    cmbHora = rst!Hora
    txtObser = rst!Observacion
Else
    MsgBox "No. Expediente no tiene cita asignada", vbInformation, "Advertencia"
End If
rst.Close
Set rst = Nothing
End Sub
y asi intento guardar:
Private Sub cmdGuardar_Click()
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("Select Medico, Fecha, Hora from Paciente where Medico='" & Form!cmbMedico.Value & "' and Fecha=cDate('" & Form!TxtFecha.Value & "') and Hora=cDate('" & Form!cmbHora.Value & "')")
If Not rs.EOF Then
       MsgBox "Fecha y Hora no disponibles para este Medico, Favor de Verificar", vbInformation, "Advertencia"
       TxtFecha.SetFocus
    Else
        'DoCmd.SetWarnings False
        CurrentDb.Execute "INSERT INTO Paciente(Id,Nombre,Apellidos,Medico,NoExp,Fecha,Hora,Observacion) VALUES('" & txtNCita.Value & "','" & txtNombre.Value & "','" & txtApellido.Value & "','" & cmbMedico.Value & "','" & TxtNoExp.Value & "','" & TxtFecha.Value & "','" & cmbHora.Value & "','" & txtObser.Value & "')"
        'DoCmd.SetWarnings True
        MsgBox "El Paciente " & txtNombre & " " & txtApellido & " con No. de Exp " & TxtNoExp & " "
        MsgBox "se le asigno la cita el dia " & TxtFecha & " en horario " & cmbHora & " "
End If
rs.Close
End Sub
Espero puedas ayudarme, también quiero poder eliminar registros desde este mismo formulario, gracias de antemano
Un saludo
Adrian Morales
Si lo que quieres es modificar el registro, no entiendo el Insert Into que es para insertar un nuevo registros tendría que ser Update:
DoCmd.RunSql "Update Paciente Set  Nombre='" & txtNombre.Value & "', Apellidos='" & txtApellido.Value & "'............. where Id='" & txtNCita.Value & "'"
Siendo Id el campo único que identifica inequívocamente al registro a modificar (este campo no se podría modificar.
Para eliminar el registro crearías otro botón Borrar y la sql sería:
DoCmd.RunSql "Delete * from Paciente where Id='" & txtNCita.Value & "'"
Me cuentas.
Hola Angeles, buenos días
No sabes como agradezco tu ayuda me han sido de mucha utilidad tus consejos, te sigo molestando, en la ultima corrección que me enviaste me manda un error en esta linea, te envío condigo:
DoCmd.RunSQL "UPDATE Paciente SET Medico = '" & cmbMedico.Value & "', Fecha = '" & TxtFecha.Value & "', Hora = '" & cmbHora.Value & "', Observacion ='" & txtObser.Value & "' WHERE NoExp = '" & TxtNoExp & "'"
El error es no coinciden los tipos de datos en la expresión de criterios
necesito ayuda por fa, te lo agradezco de antemano
atentamente
Adrian morales
Si el campo Fecha y Hora en la tabla son del tipo Fecha/Hora tendrás que pasar del tipo string que te devuelve el cuadro de texto a tipo Fecha/Hora de esta forma:
 Fecha =cDate('" & TxtFecha.Value & "')
Igual para la Hora. Ten en cuenta que un cuadro de texto siempre te devuelve un resultado tipo texto.
Si algún campo de la tabla es de tipo numérico, tendrás que quitar la comilla simple, seria: " & Lo que sea & "
Me cuentas.
Gracias ángeles no sabes como me ayudaste, ya me había roto la cabeza buscando soluciones, pero como soy nuevo en esto, conozco poco, pero gracias a ti eh solucionado todo, solo algo más le puse a mi base de datos contraseña de ingreso.
Doy de alta a usuarios y todo eso, lo que quisiera es que vieras el código que uso y me digas si es el adecuado. Este es el código:
Private Sub cmdAceptar_Click()
On Error GoTo Err_cmdAceptar_Click
    If IsNull(QContraseña) = True Then
        MsgBox "Introduzca Contraseña", vbInformation, "Advertencia"
        QContraseña.SetFocus
        Exit Sub
    Else
        If DLookup("[PassWord]", "TblUsuario", "[IdUsuario] ='" & QUsuario & "'") = Me.QContraseña Then
            IdUsuario = DLookup("[IdUsuario]", "TblUsuario", "[IdUsuario] ='" & QUsuario & "'")
            DoCmd.Close
            DoCmd.OpenForm "Inicio"
        Else
            MsgBox "Contraseña Incorrecta", vbInformation, "Advertencia"
            QContraseña.SetFocus
        End If
    End If
Exit_cmdAceptar_Click:
    Exit Sub
Err_cmdAceptar_Click:
    MsgBox Err.Description
    Resume Exit_cmdAceptar_Click
End Sub

Y también quisiera que al momento de loguearse un usuario apareciera su nombre en el formulario
Disculpa como podría hacerle para que en un tabla se fueran guardando los pacientes que lleguen a su cita y se quiten de la tabla donde se capturaron con anterioridad, para así poder sacar estadísticas de los pacientes que asisten a su cita y los que no
agradezco mucho tu ayuda
Mil gracias
Adrian Morales
No me he olvidado, después de fiestas lo miro.
Feliz año, Angeles
Ok ángeles
Gracias por toda tu ayuda, no sabes como me han servido tus consejos, Feliz año, mucha paz y felicidad, para ti y tu familia, espero tus respuesta el próximo año
Un fuerte abrazo y mi agradecimiento
Bye
Atentamente
Adrian Morales
Para pasar una variable de un formulario a otro lo primero que hay que hacer es declararla como pública (para que se pueda utilizar en cualquier código de la BD)
En la pestaña Módulos abre uno nuevo y declara la variable (la llamaremos vUsu):
Option Compare Database
Public vUsu As String
Guardas éste módulo con el nombre que quieras.
En el código del botón cmdAceptar antes de abrir el formulario Inicio tienes que dar el valor a la variable:
IdUsuario = DLookup("[IdUsuario]", "TblUsuario", "[IdUsuario] ='" & QUsuario & "'")
DoCmd.Close
vUsu = Form!QUsuario.Value
DoCmd. OpenForm "Inicio"
En el formulario Inicio pones un cuadro de texto independiente que llamamos txtUsu y en las propiedades del formulario, Al abrir:
txtUsu.Value = DLookup("[NombreUsuario]", "[TblUsuario]", "[IdUsuario] ='" & vUsu & "'")
Respecto de la 2ª pregunta yo crearía una tabla HistoricoPaciente con un estructura exactamente igual a la tabla Paciente, cuando quieras pasar un expediente, botón con las sql siguientes:
doCmd.RunSql "Insert Into HistoricoPaciente Select * from Paciente where Id='" & txtNCita.Value & "'"
doCmd.runsql "Delete * from Paciente where Id='" & txtNCita.Value & "'"
Hola ángeles Feliz Año:
Gracias por tu respuesta, ahora tengo una nueva molestia, este es mi problema tengo un formulario para modificar y/o eliminar registros, la manera como cargo la información al formulario, es decir lleno los cuadro te texto es el siguiente:
Private Sub txtNoExp_BeforeUpdate(Cancel As Integer)
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb
'Dim rs As DAO.Recordset
'Suponiendo que el campo Identidad es Numerico
Set rs = db.OpenRecordset("SELECT * from Paciente WHERE NoExp=" & Me.TxtNoExp)
If rs.EOF = False And rs.BOF = False Then
   'Relleno las cajas de texto
    txtNCita = rs!Id
    txtNombre = rs!Nombre
    txtApellido = rs!Apellidos
    cmbMedico = rs!Medico
    TxtFecha = rs!Fecha
    cmbHora = rs!Hora
    txtObser = rs!Observacion
Else
    MsgBox "No. Expediente no tiene cita asignada", vbInformation, "Advertencia"
End If
rs.Close
Set rst = Nothing
End Sub

El problema es que busco por medio del expediente porque este es único, pero al dar una cita a un paciente este puede tener varias citas, dependiendo del medico que lo atenderá por ejemplo el No. de Exp. 0310/10, puede tener una cita con Psicología, Audiologia o Nutrición en diferentes días, al intentar modificar o eliminar este registro, de la manera como esta en el código, solo me muestra una de las tres citas, es decir aparecen los 3 registros y elija el que sea siempre me manda los mismos datos para las tres no se si me explique, espero me puedas ayudar.
Ahora me pidieron, que al momento de dar una cita, en el combo de la hora se vaya eliminando dicha hora para un medico y una fecha en especifico, podrías ayudarme
Gracias de antemano, espero tu respuesta y gracias
Atentamente
Adrian Morales
Voy a llamar a esta pregunta ROMA (la eterna), creo que nunca me han hecho tantas consultas en una sola pregunta... Pero bueno.
Si con el nº de expediente no es suficiente lo que tendrás que hacer, obviamente, es poner otra condición el el where: WHERE NoExp=" & Me.TxtNoExp) and medico=....
En cuanto al combox, si por ejemplo tienes una tabla Citas con los campos Medico y Hora, lo que tendrás que hacer es poner en origen de la fila la siguiente sql:
Select Hora from Citas where Medico is null order by Hora
Buenos Días
Disculpa ángeles, por tantas molestias que te eh dado, eh resuelto muchas de mis dudas y problema con esta base de datos, te comento, es una Agenda para dar citas medicas, aquí donde trabajo, me pidieron ese favor de hacer esta base de datos y pues me tope como ya viste con muchos inconvenientes, pero gracia a ti los eh resuelto.
Ahora tengo otro problema, como ya la están usando han salido inconvenientes, pero no se si pueda seguir pidiéndote ayuda, es sobre la misma base de datos, le pregunto porque no quiero ser molesto.
Si puedo seguir solicitando su ayuda hágamelo saber y le vuelvo a escribir explicándole el problema que tengo ahora y si no pues le agradezco mucho la ayuda y su atención que me brindo, pra finalizar la pregunta
Atentamente
Adrian Morales
Por supuesto que no me importa seguir con la ayuda en lo que pueda y hasta donde mis conocimientos me permitan.
Respecto a la extensión de la pregunta, el tema es el siguiente, me consta que hay muchos usuarios que en vez de preguntar miran las respuestas que les pueden valer,
En esta pregunta hemos tratado temas como los recordset, modificación de registros, cuadros combinados, contraseñas, pasar variables de un formulario a otro... en fin... consultas bastante comunes y que si se hubiesen hecho por separado, con una cabecera apropiada, servirían para otros. Esa es la cuestión, nada más.
Por supuesto que puedes seguir preguntándome, pero piensa en si seguir con esta pregunta o abrir otra, eso si repito: con una cabecera que indique el tema del que vamos a tratar, sino seguiríamos con la misma.
Hasta luego, Angeles

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas