Dos consultas; Quitar Filtro y Evitar error 94

Puesto que he estado mirando otras respuestas en las que se daba solución a mis dudas pero debido a mi escaso conocimiento en programación pues no he sabido aplicarlas a mi base de datos. Tengo una base de datos sencilla, sus elementos principales son una Hoja de Datos, un Formulario de pestañas para los datos de la Tabla y un Informe de todos los registros del formulario con algunos campos de éste.

Mi primera consulta:

En el Informe tengo un botón de comando que pinchándolo me envía al registro específico del Formulario, mediante este código:

Dim vId As String
vId = Me.[Id].Value
DoCmd.OpenForm "Nombre de Formulario", , , "[Id]='" & vId & "'"

El problema es que cuando me envía a ese registro se activa el Filtro y no puedo moverme a otros registros. ¿Qué debería añadir a este código para evitar que se active el Filtro?.

Mi segunda consulta:

Es una base de datos de personas, en la pestaña 1 del Formulario tengo los datos de una persona, en la pestaña 2 de sus familiares. En los campos de la pestaña 2, por ejemplo padre, madre... Tengo un botón de comando que me envía a un formulario donde solo tengo la foto y el nombre del padre o de la madre. Pero si el campo está vacío, me sale el error 94 de campo nulo. Para evitar este error, como apaño he puesto por defecto en estos campos un ".", pero no me gusta como queda y me gustaría evitar este error dejando el campo vacío. ¿Cómo puedo hacerlo?

Si son tan amables de contestar me gustaría que me lo hiciesen bien detallado, ya que tengo poco conocimiento en programación.

3 Respuestas

Respuesta
1

A la primera consulta:

Si se le aplica el filtro 'al origen de datos' en el formulario no se le aplica ningún filtro ni podrá tener datos que no cumplan las condiciones impuestas a su origen de datos.

Si se desea 'filtrar a voluntad' el origen de datos no puede ser filtrado, y si se quiere abrir con un filtro, lo adecuada seria enviar la condición en el apartado OpenArgs (el último de la orden de apertura) y en el formulario aplicar el filtro y activarlo, este filtro si se puede manipular en tiempo de ejecución.

Lo más 'plano' posible: el formulario es como una cesta para fruta

Si al llenarla se ignora un tipo de fruta, en el cesto no habrá esa fruta.
La alternativa es cargar la cesta con toda la fruta y no compartir la que se desea reservar mediante un filtro (que como es volitivo se puede poner, quitar o cambiar).

Otra opción es volver a llenar la cesta (y esta vez añadir esa fruta antes ignorada)

A la segunda consulta:
El error donde lo da ¿en la imagen o en el texto asociado?

Si es en la imagen ¿su ubicación es interna o externa a la base de datos?
Si es en el nombre, puede intentarse con la función NZ que suele resolverlo sin mayor problema.

Hola, es en el nombre. El código busca en en el campo "Padre" para encontrarlo en la Hoja de Datos que por tanto también se encuentra vacío. ¿Puedes detallarme el código de la función NZ?

La función NZ es sencilla

Nz(Dato_a_evaluar, valor_alternativo) ==> Nz([Padre], "") o así: Nz([Padre], "Huérfano") 

Lo que hace es evaluar el dato y si es un null lo cambia por el valor alternativo

Si se publica como se hace esa búsqueda se podrá concretar la respuesta por si el valor alternativo no resuelve el problema (o el dato a evaluar no es ese).

Respuesta
1

Le respondo la primera. En la forma como abre el formulario NO está filtrando, sino ejecutando una cláusula WHERE y no hay forma de suprimir la condición. Debe utilizar algo como:

DoCmd.OpenForm "Nombre de Formulario", WhereCondition:="[Id]=" & vId

Y en "Nombre de Formulario", debe asignar un botón para suprimir el filtro, adicione el siguiente código en el evento "Al hacer clic":

 Me.FilterOn = False

 Con esto podrá moverse por los registros.

Se lo explico gráficamente.

Selecciono el empleado y haga clic en Abrir Form

Observe que aperece EDUARDO y en la parte inferior "Filtrado". Ahora hago clic en el botón para suprimir el filtro y obtengo.

Observe que me indica que hay 16 registros y "Sin filtrar".

OpenArgs no es el indicado para este caso. Tendría que al abrir filtrar y activar el filtro, además debe adicionar el botón para eliminar el filtro.

Lamentable quien se considere "experto" no diferencie entre mostrar todos los registros y filtrar. Esto confunde al usuario, lo más indicado es mostrar los datos específicos en presentación formulario y no como hoja de datos o formulario continuo. Esta forma de filtrar no lo digo yo, lo enseña la ayuda de Microsoft, pero hay quien quiere demostrar que Microsoft está equivocado.

¡Gracias! 

Mi intención era hacerlo sin tener que poner un botón expresamente para quitar el filtro, pero creo que no se puede hacer de otra manera. Muchas gracias por su aporte...

Necesariamente no se requiere del botón puede programar el evento Al hacer clic en cualquier parte del formulario. Por ejemplo:

Private Sub Detalle_Click()
  Me.FilterOn = False
End Sub

Y elimine el botón.  También puede programar una tecla, por ejemplo, F4. como muestra la imagen.

Para utilizar la tecla F4, necesita:

1. En propiedades del formulario Eventos cambie "Tecla de vista previa" a SI.

2. En el evento "Al bajar una tecla", ingrese este código

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  If KeyCode = vbKeyF4 Then
    Me.FilterOn = False
    Me.lblAviso.Visible = False
  End If
End Sub

Este código desactiva el filtro y oculta la etiqueta del mensaje, en fin, se pueden hacer muchas cosas.

Para la segunda pregunta trate programando el evento "Al ocurrir un error", ingrese este código

Private Sub Form_Error(DataErr As Integer, Response As Integer)
  If DataErr = 94 Then
    MsgBox "No hay foto", vbInformation, "Cuidado"
  End If
  Response = acDataErrContinue
End Sub

Como desconozco el formulario no le puedo dar más información.

Respuesta
1

Te voy a responder a la primera pregunta, luego te digo algo de la segunda.

No necesitas ningún botón en el formulario. Formulario que te pongo en continuo para que veas que desde el principio muestras todos los registros. Si tengo el informe, más o menos como

Pulso el botón de Ana y

Puedes ver que el cursor está en el registro de Ana, pero muestra todos los registros

En el evento Al hacer clic del botón le pongo simplemente

Private Sub Comando15_Click()
DoCmd.OpenForm "clientes", , , , , acDialog
End Sub

Y en el evento Al cargar del formulario Clientes le pongo

Private Sub Form_Load()
If CurrentProject.AllReports("clientes").IsLoaded Then
DoCmd.GoToRecord , , acGoTo, Reports!Clientes!IdCliente
End If
End Sub

Explico esto último. Si el informe Clientes está cargado, que si lo está pues "vienes" desde él, que se vaya al registro con el mismo idcliente que el del informe.

Con respecto a la segunda pregunta no entendí que control está vacío, si el control imagen o el del padre

¡Gracias! Sobre la primera consulta encontré la solución, no es la que me propones, pero me funciona. Muchas gracias por tu interés. Sobre la segunda, el campo que se encuentra vacío es el "Padre".

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas