Utilizando Seek o DlooKup

Tengo una tabla con una clave múltiple. Cuando yo utilizo el Dlookup() el me chequea un campo del registro solamente, me gustaría chequear los dos campos de un registro(que forman la clave) pero no se como hacerlo. Tal vez pueda hacerlo con seek

1 respuesta

Respuesta
1
En realidad con el dlookup puedes comprobar tantos campos como quieras, sólo que tienes que hacerlo según la sintaxis sql de un where.
Ejemplo
Dlookup("campoDatos","mitabla","campo1=" & undatonumerico & " and campo2='" & undatoalfanumerico & "'")
Lamento no concretar más el ejemplo, pero es que no das mucha información en la pregunta.
Y en cuanto al seek, no creo que sea lo que buscas. Deduzco por la pregunta que aún no te has metido con el visual basic, y para usar el seek hay que liarse con recordsets, indexes, y demás. No es una simple función como el dlookup, y, por ejemplo, no puedes usarlo en campos de formulario para calcular valores 'al vuelo'.
Aún así, si sigues interesado, avisa.
El código que tengo es el siguiente:
Private Sub CantHojas_AfterUpdate()
Dim Chequea As Variant
Chequea = (DLookup("[NroPlano]", "TablaPlano", _
"NroPlano=" & Me!NroPlano & "and CantHojas='" & Me!CantHojas.Me & "'"))
If (Not IsNull(Chequea)) Then
MsgBox "Ya existe una hoja de este plano en la base de datos (ACEPTAR PARA VER PLANOS EXISTENTES", vbInformation, "Plano Ya cargado"
Me!NroPlano.Undo
DoCmd.RunMacro "ConsultaNroPlano"
End If
End Sub
Cuando corro la rutina, da el siguiente error en la línea "Chequea = (DlooKop(...: Se ha producido en error '458' en tiempo de ejecución, el objeto no admite esta propiedad o método.
Gracias por tu pronta respuesta
Ese error te lo provoca el me! CantidadHojas. Me. Quítale el último .Me
Y a lo mejor es que se te ha pasado al teclearlo, pero donde dice
...& "and CantHojas="...
debe decir
...& " and CantHojas="...
Ojo al espacio delante del and.
Un ejemplo. Tal como lo tienes, lo que se pasa a la base de datos puede ser
NroPlano=27and CantHojas='nose'
Cuando debería haber un espacio entre el 27 y el and.
Cambia los dos y me cuentas que pasó
corrección del .me:
Private Sub CantHojas_AfterUpdate()
Dim Chequea As Variant
Chequea = (DLookup("[NroPlano]", "TablaPlano", _
"NroPlano=" & Me!NroPlano & "and CantHojas='" & Me!CantHojas & "'"))
If (Not IsNull(Chequea)) Then
MsgBox "Ya existe una hoja de este plano en la base de datos (ACEPTAR PARA VER PLANOS EXISTENTES", vbInformation, "Plano Ya cargado"
Me!NroPlano.Undo
DoCmd.RunMacro "ConsultaNroPlano"
End If
End Sub
AHORA DA EL SIGUIENTE ERROR: Se ha pruducido el error '3075' en tiempo de ejecución
ERROR DE SINTAXIX (FALTA OPERADOR) EN LA EXPRESIÓN DE CONSULTA 'NroPlano = P67055abcand CantHojas = '1"
Más de lo mismo. Y por lo visto, el nroplano es de tipo texto, no numérico, por lo que lo tienes que poner entre comillas igual que el segundo campo. Cambia la línea por
Chequea = (DLookup("[NroPlano]", "TablaPlano", _
"NroPlano='" & Me!NroPlano & "' and CantHojas='" & Me!CantHojas & "'"))
Hazlo con copiar y pegar, que me parece que lo del espacio en blanco antes no lo hiciste bien.
Fíjate dónde está el tema. Si el campo que estás consultando en la tabla TablaPlano es de tipo texto, entre comillas simples. Si es de tipo numérico, sin comillas.
En fin, a ver qué pasa.
Hora me da el error '2001' en tiempo de ejecución: Cancelo la operación anterior
Hice el cambio de las comillas. Ahora da el error:'3464' en tiempo de ejecución. No coinciden los datos en la expresión de criterios.
Yo definí el NroPlano = caracter
CantHojas = numerico
Nos estamos liando entrecruzando mensajes. Déjalo como te daba el 'cancelo la operación anterior', que lo de las comillas te lo dije al ver un mensaje que por lo visto era anterior.
Como lo tenías cuando te daba el 'canceló la operación' el dlookup estaba funcionando bien, ya que el 'cancelo la operación...' lo provoca el me! Nroplano. Undo. El undo sólo se puede aplicar en eventos change o beforeupdate. No funciona en un evento afterupdate, como tu lo tienes. Quita la línea, o coméntala y prueba. Debería funcionar.
Si te interesa limpiar el campo, hazle un Me! NroPlano=null y listos
Ah! Si tienes algún otro error (espero que no) Dale al botón de depurar que posiblemente te salga y me dices que linea se te queda pintada en amarillo.
Lo deje donde me dijiste y le hice los cambios de Me!Nroplano y el error continua dando en la línea "Chequea = (DLookup...". El mismo.. 'error '2001' en tiempo de ejecución: Cancelo la operación anterior'
La búsqueda la realizo en la tabla asociada al formulario y la idea es chequear con los campos claves es chequear que el registro no haya suido grabado anteriormente y no esperar el comando de salvar registro y así ganar tiempo en la carga. Lo curioso es que cuando inspecciono los valores de los campos noto que el segundo campo Canthojas(de la tabla) siempre es igual a Me.CantHojas(del formulario) aunque realmente no sea así.
Perdona el retraso, ... pero estaba de fin de semana :-)
Y la verdad, tengo que reconocerte que no se porque te da ese error... a mí me funciona, y ese error suele estar relacionado con que el formulario se guarde cuando se han modificado los datos origen, pero este no es el caso, así que tengo que preguntarte si se te ha ocurrido algo que pueda tener relación durante este par de días, porque yo por lo menos ya no sé qué decirte.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas