Dlookup (en dos campos a la vez)

Tengo el siguiente código que saque de la página de Sveinbjorn El Rojo y lo adapte:

Private Sub Cama_AfterUpdate()
Dim vCama, vCamaB As Variant
vCama = Me.Cama.Value
If IsNull(vCama) Then Exit Sub
vCamaB = DLookup("[Cama]", "Paciente", "[Cama]='" & vCama & "'")
If vCamaB = vCama Then
MsgBox "La cama elegida ya se encuentra ocupada, egrese al paciente que se encuentra en la cama seleccionada o elija otra.", vbInformation, "AVISO"
Me.Cama.Value = ""
Me.Id.SetFocus
Me.Cama.SetFocus
End If
End Sub

Lo que intento hacer ahora es adaptarlo pero que busque en 2 campos simultaneamente, o sea que si un usuario ingresa un dato en un campo y otro en otro, y ambos ya se encuentran en la tabla pero de ese, que salga el mensaje.

Deberia poder decirle en la expresion algo asi como vCamaB = Dlookup  ("[campo1]", "tabla", "[campo1]='" & vCampo1 & "'") y ("[campo2]", "tabla", "[campo2]='" & vCampo2 & "'")

Lo que no se es como hacer para que busque en dos campos y en determinado DNI (que corresponde a un paciente solo). No se si soy claro.

El ejemplo seria: hablamos de una tabla que registra tratamientos antibióticos de los pacientes. Cada registro posee un numero de indentificacion que se repite, que identifica al paciente. Yo lo que quisiera es poder avisar al usuario que si ingresa un tratamiento antibiótico por en por fecha, que si esos dos campos (ATB y Fecha) ya están ingresados anteriormente para ese paciente, salga el mensaje.

El usuario que ingresa el tratamiento lo hace desde un formulario, que se abre filtrado por el numero identificatorio de cada paciente.

2 respuestas

Respuesta
2

Me he perdido, por más que lo leo. Pero si en el formulario tienes el campo DNI, Atb y Fecha y que el paciente debe rellenar éstos dos últimos con poner en el evento Antes de actualizar del cuadro de texto fecha

If dcount("dni","nombredelatabla",""dni='" & me.dni & "'" and aTB = '" & me.atb & "' and fecha =#" & me.fecha & "#")>=1 then

msgbox "ese pacientes ya está registrado con esos valores"

End if

Es decir que cuando escribas la fecha( que se supone que de los tres cuiadros, es el último) contará si en la tabvla hay algún paciente con ese dni, ese tratamiento y en esa fecha. Si ya lo hay te sale el mensaje, Si no lo hubiera, como no sé que debe hacer no te lo he puesto, pero sería, por ejemplo,

Else

diocmd.loque sea

end if

Hola Icue, probé tu variante, en el before update del campo F_Inicio, pero no me salta el mensaje, no hace nada. Se graba el registro aunque este duplicando esos datos de los 3 campos.

Private Sub F_Inicio_BeforeUpdate(Cancel As Integer)
If DCount("[DNI]", "Paciente", "[Tipo_ATB]='" & Me.Tipo_ATB.Value & "' and [F_Inicio]=#" & Me.F_Inicio.Value & "# and [DNI]='" & Me.DNI.Value & "'") >= 1 Then
MsgBox "El esquema que intenta agregar ya se encuentra ingresado"
End If
End Sub

Chico, me coges de vacaciones.

Pero así a primera vista, te falta completar lo que debe hacer si ya está registrado. Por ejemplo,

If dcoun(...........) then

Msgbox"Ese paciente ya esta registrado", vbokonly, "No te lo aviso más, la próxima..."

Docmd. Cancelevent

else

docmd.openform.....o lo que sea

end if

Es decir, que si ya está registrado, que el cursor se vuelva al cuadro de texto Fecha por si quieres cambiarlo o por si has cometido un error.

Hola Icue, gracias por molestarte, te comento que ahí probé y funciona, el problema es la sintaxis de F_Inicio. Es un campo fecha, y según esta escrito no funciona el código, si lo saco, funciona. El campo F_Inicio es en la tabla de tipo Fecha/hora, con formato Fecha corta y mascara de entrada 00/00;0;_. No se si eso influirá.

uhh perdon Icue no habia leido lo de las vacaciones. Bueno no te preocupes, disfruta. En otro momento cuando estes me ayudas, ya bastante lo has hecho.

Con lo de las vacaciones me refería a que en la casa de la playa no tengo Internet. Entonces cuando quiero ver algo o hacer algo me tengo que ir a una cafetería. Pero al tercer café ya no puedo más. Por eso respondo de vez en cuando. Si no quieres calentarte la cabeza ponlo como

....[F_Inicio]=forms!nombredelformulario!F_inicio

Por cierto, lo de value sobra. Access, por defecto, cuando te refieres a un control, entiende que te refieres al valor que aparece.

De todas formas, como tienes mi correo, si ves que no funciona mándame la tabla.

Respuesta
1

Realmente no te hace falta "traerte" dos valores de la tabla, simplemente trae un valor, igual que haces ahora, pero utilizando 2 condiciones...

Resultado = DLookup("[CampoResultado]", "Tabla", "[CampoCondicion1]='" & Valor1 & "'" and "[CampoCondicion2]='" & Valor2 & "'")

Si no existe ningún registro que coincida con las 2 condiciones, Resultado sería igual a null. Si no es null, entonces el registro existe y debes mostrar el mensaje (si es que te entendí bien).

Salu2.

Claro, entiendo lo que me escribiste ok69, pero lo que me frena es que en la tabla, puede haber campos que busca el Dlookup repetidos. Yo lo que quisiera es que busque campos repetidos, pero de el paciente actual en el cual se esta cargando la información.

Ojo quizá no sea la manera esta, y estoy confundido.

La idea general es que hay una tabla que va a poseer tres campos "ATB", "F_Inicio" y "DNI". DNI es único para cada paciente. Lo que busco es que si el usuario carga por equivocación un ATB y F_Inicio iguales para ese paciente (repetidos), avise.

No se si entiendo bien el planteamiento.. lo que necesitas, entonces, es simplemente condicionar por 3 valores distintos.. es lo mismo que decía pero con una condición más... puedes añadir cuantas quieras separadas con AND para que se cumplan todas..

Resultado = DLookup("[CampoResultado]", "Tabla", "[ATB]='" & ValorATB & "' and [F_Inicio]=#" & ValorF_Inicio & "# and [DNI]='" & ValorDNI & "'")

Nota: Si F_Inicio es un campo de fecha, debes utilizar # en vez de comillas simples para encerrar el valor buscado.

Salu2.

ahhhh claro, tienes razón, que busque los 3 campos, entonces cuando se cumpla que los 3 se repitan, estaré ante el caso que quiero evitar. Lo voy a probar, Gracias por la ayuda ok69!

OK, si te funciona de esa manera cierra la pregunta cuando lo compruebes por favor, y si no, expón las nuevas dudas.

Salu2.

Hola, bueno intente pero no me sale, quisiera que si están esos 3 valores ingresados en el formulario (Tipo_ATB, F_Inicio y DNI) antes de guardarlo, salte mensaje. Para evitar duplicados. ¿Me darías una idea?

No se como se llaman los objetos del formulario ni los campos, pero dando por hecho que se llaman como has escrito, y que F_Inicio está definido como fecha en la tabla, sería algo así como...

Dim Resultado as Variant
Resultado = DLookup("[DNI]", "Paciente", "[Tipo_ATB]='" & Me.Tipo_ATB.Value & "' and [F_Inicio]=#" & Me.F_Inicio.Value & "# and [DNI]='" & Me.DNI.Value & "'")
if Not IsNull(Resultado) then
  MsgBox "Mensaje de aviso"
  Exit Sub
end If

Salu2.

¡Gracias! Pero Resultado debería ser lo que no se tiene que repetir en la tabla, cuando se ingresan los 3 valores. Deberia ir en el evento form before update creo, no?

No conozco como tienes montado "el tinglado", pero esa comprobación debería ir antes de crear el nuevo registro, si... ya sea en un botón que tengas para crear el nuevo registro, o en un evento como tu dices. Sea como sea, si la condición se cumple, es cuando debes mostrar el aviso y no crear el registro..

Añade tu respuesta

Haz clic para o
El autor de la pregunta ya no la sigue por lo que es posible que no reciba tu respuesta.

Más respuestas relacionadas