Como abrir un formulario o reporte a partir de un formulario con varios combos que filtren la información mostrar.
De todoexpertos:
Tengo una tabla para llevar información de propuestas o cotizaciones emitidas del Dpto Comercial, ya tengo las tablas, consultas y algunos formularios para la introducción de la información y algunos reportes también. Desea elaborar un formulario con varios campos combos combinados (que ya lo tengo) que me sirvan para filtrar la información a mostrar bien sea en otro formulario o un reporte. Los Combos Combinados son los campos Usuario, Cliente, Región, Situación de la propuesta, Sistema y Motivo. El Formulario o reporte debe ser filtrado por uno o varios campos para mostrar la información a través de un botón de Vista Previa o Imprimir en el formulario principal.
Deseo saber como seria el modulo para filtrar esta información al darle click al botos Vista Previo o Imprimir.
Si quieres un ejemplo con una explicación detallada, mira este enlace de Neckkito Nck :
http://siliconproject.com.ar/neckkito/index.php/component/content/article/93-ejemplos-explicados/ejemplos-de-formularios/194-crear-un-filtro-multiple
Un saludo.
Un nuevo foro de access, visítanos: http://nksvaccessolutions.com/Foro/
Buenos dias SVEINBJORN:
Ayer estuve probando el funcionamiento del codigo para la consulta realizada, hice todo lo que especifica el modulo y al momento de correrlo arroja un error en la linea de la ejecución del filtro (Me.FilterOn = True). Te anexo el procedimiento para que le eches un vistazo y me digas en que esta fallando. Te comento los campos por los que deseo hacer el filtrado ya son combos combinados. Estos se deberan reflejar en los resultados del filtrado de datos.
Option Compare Database
Option Explicit
Private Sub cmdBorrar_Click()
With Me
.cboUsuario.Value = Null
.cboCliente.Value = Null
.cboRegion.Value = Null
.cboStatus.Value = Null
.cboSistema.Value = Null
.cboMotivo.Value = Null
.FilterOn = False
End With
End Sub
Private Sub cmdFiltro_Click()
Dim vUsuario As String
Dim vCliente As String
Dim vRegion As String
Dim vStatus As String
Dim vSistema As String
Dim vMotivo As String
Dim vLargo As Integer
Dim miFiltro As String
'Cogemos los valores que hayamos seleccionado como filtro
vUsuario = Nz(Me.cboUsuario.Value, "")
vCliente = Nz(Me.cboCliente.Value, "")
vRegion = Nz(Me.cboRegion.Value, "")
vStatus = Nz(Me.cboStatus.Value, "")
vSistema = Nz(Me.cboSistema.Value, "")
vMotivo = Nz(Me.cboMotivo.Value, "")
'Inicilizamos el filtro
miFiltro = ""
'Creamos la primera parte del filtro
If vUsuario <> "" Then
miFiltro = "AND [Id_usuario]='" & vUsuario & "'"
End If
'Creamos la segunda parte del filtro
If vCliente <> "" Then
miFiltro = miFiltro & " AND [Id de cliente]='" & vCliente & "'"
End If
'Creamos la tercera parte del filtro
If vRegion <> "" Then
miFiltro = miFiltro & " AND [Id Region]='" & vRegion & "'"
End If
'Creamos la cuarta parte del filtro
If vStatus <> "" Then
miFiltro = miFiltro & " AND [Id de situación]='" & vStatus & "'"
End If
'Creamos la quinta parte del filtro
If vSistema <> "" Then
miFiltro = miFiltro & " AND [Id del Sistema]='" & vSistema & "'"
End If
'Creamos la sexta parte del filtro
If vMotivo <> "" Then
miFiltro = miFiltro & " AND [Id Motivo]='" & vMotivo & "'"
End If
'Ahora cogemos la longitud del filtro
vLargo = Len(miFiltro)
'Recomponemos el filtro eliminando el primer 'AND '
If vLargo > 0 Then
miFiltro = Right(miFiltro, vLargo - 4)
End If
'Aplicamos el filtro al formulario
Me.Filter = miFiltro
Me.FilterOn = True
End Sub
Por lo que veo intentas filtrar campos numéricos (Id Motivo, etc...) mientras que en la construcción del filtro les pasas un valor de texto (lo pasas entre comillas simples, que es el delimitador de texto). Otra cosa que no puedo ver sólo con el código es el valor que devuelven tus cuadros combinados. Quiero pensar que es un valor numérico (el correspondiente al Id...) aunque tu cuadro combinado muestre uno de texto. Es decir, que el origen de datos sea algo así: "SELECT Id Motivo, Motivo FROM..."
Modifica las lineas:
Dim v... As String
por:
Dim v... As Integer
las lineas
v...=Nz(Me.cbo....Value, "")
por
v...=Nz(Me.cbo....Value, -1)
y las construcciones del filtro
miFiltro = "AND [Id_...]='" & v... & "'"
por
miFiltro = "AND [Id_...]=" & v...
Si no funciona necesitaría ver la BD para ver qué es lo que te falla.
Hola SVEINBJORN.
Los campo de cuadro combinados son los campo clave de las tablas con la información, es decir el Id_usuario me devuelve el Nombre de Usuario de la tabla usuario donde los campos Id_usuario es autonumérico y Nombre de Usuario es Texto. El Id de cliente es autonumérico y Nombre Cliente es Texto. Así con los otros campo de cuadro combinados.
Mi formulario, toma los cuadros combinados de una consulta llamada Resumen de Propuestas en la cual coloque las diferentes tablas relacionadas para tomar la información.
En este Formulario que llame Cuadro de Diálogo de Informe Comercial puse los campos cuadros combinados por los que quiero filtrar la información.
Nota: Ing. Comerical es Usuario.
Si me das una dirección de correo te podria enviar la BD.
Saludos,
Jose Duran
¿Probaste con los cambios que te sugerí?
Puedes enviar tu BD (no hace falta que tenga datos reales, puedes inventarte un par de ellos) a: [email protected]
Anexe la BD al Droopbox, este es el link
https://www.dropbox.com/s/qibf4ky4rjh1k3r/Dpto%20Comercial.accdb?dl=0
Saludos,
Te devuelvo el archivo: http://www.filebig.net/files/dQeJvH78ia
Tienes 2 errores:
1º/ el que te comentaba antes que se solucionaba como te indiqué
2º/ el formulairo principal no sé por que motivo lo tienes hecho sobre una tabla y vinculado al subformulario. Si los haces independientes, todo va ok
Además, no indicas que lo que quieres filtrar es un subformulario...
Gracias por la respuesta.
Inicialmente quería filtrar un reporte, pero lo que surgió después es que quería revisar primero por pantalla, por lo que lo filtró en un subformulario. Pero sigo teniendo la opción de filtrar en un reporte, ya que se desea imprimir la información con los campos filtrados.
Saludos,
Disculpa mi insistencia, como seria el procedimiento pero para que genere el reporte con los datos filtrados, en vista previa e impresión.
Oye te queria consultar también los siguiente, ya he intentado en repetidas oportunidades cambiar la fuente en el subformulario cuando se coloca en modo tabla de datos. Por defecto el access coloca la fuente arial y le quiero cambiar esta fuente y su tamaño, de manera que los campos no se salgan del tamaño del formulario.
Para abrir un informe en vista preliminar filtrado usa:
DoCmd. OpenForm "NombreDelInforme", acVierPreview,, miFiltro
Donde miFiltro será el filtro que has creado con el código anterior. Consulta la ayuda de access del OpenForm para conocer todas sus opciones.
Lo otro se me ocurre que crees tu subformulario no en vista tabla, sino con una distribución tabular.
Buenas tarde Mi estimado amigo:
Quisiera saber si tu me puedes ayudar a diseñar el reporte donde pueda visualizar los campos filtrados en el formulario.
Ya tengo rato tratando de hacerlo y no lo consigo, por lo que te agradecería enormemente tu ayuda, como lo has venido haciendo.
Saludos,
Jose Duran
1º/ Diseña el informe, con los mismo campos (y nombres) que tiene el subformulario. A efectos del código lo llamaré RFiltrado.
2º/ En el formulario con los cuadros combinados añade un nuevo botón, y en el le pones el mismo código que para filtrar el subformulario.
3º/ Borra las 3 últimas lineas:
'Aplicamos el filtro al formulario
Me.[Subformulario Propuestas Activas para Inicio].Form.Filter = miFiltro
Me.[Subformulario Propuestas Activas para Inicio].Form.FilterOn = True
Y pon éstas:
'Abres el informe filtrado
DoCmd. OpenReport "RFiltrado", acViewPreview,, miFiltro
Y listo, no tiene más ciencia.
Por lo general no respondo nuevas consultas que no tienen que ver con la pregunta original, por lo que si necesitas más ayuda, abre una nueva consulta, indicando, en el título (si quieres que vaya dirigida a mí) mi nombre de usuario.
- Compartir respuesta
1 respuesta más de otro experto
José: En éste enlace tengo un ejemplo de constucción de un registro acumulado y como filtrar un Informe de los Registros seleccionados. Explicarlo aquí se haría demasiado largo.
http://www.mediafire.com/download/31xj4jpn6r48yq7/BDIngSocial_00.rar
Como verás es un ejercicio bastante Completo, y que podrás adaptar, cambiando los Nombres de Tabla, Campos etc.Mis saludos >> Jacinto
Buenos días Jacinto:
Ayer estuve probando el funcionamiento de un código parecido al que me enviaste (el que me envió otro experto de todoexpertos) para la consulta realizada, hice todo lo que especifica el módulo y al momento de correrlo arroja un error en la línea de la ejecución del filtro (Me.FilterOn = True). Te anexo el procedimiento para que le eches un vistazo y me digas en que esta fallando. Te comento los campos por los que deseo hacer el filtrado ya son combos combinados. Estos se deberán reflejar en los resultados del filtrado de datos.
Option Compare Database
Option Explicit
Private Sub cmdBorrar_Click()
With Me
.cboUsuario.Value = Null
.cboCliente.Value = Null
.cboRegion.Value = Null
.cboStatus.Value = Null
.cboSistema.Value = Null
.cboMotivo.Value = Null
.FilterOn = False
End With
End Sub
Private Sub cmdFiltro_Click()
Dim vUsuario As String
Dim vCliente As String
Dim vRegion As String
Dim vStatus As String
Dim vSistema As String
Dim vMotivo As String
Dim vLargo As Integer
Dim miFiltro As String
'Cogemos los valores que hayamos seleccionado como filtro
vUsuario = Nz(Me.cboUsuario.Value, "")
vCliente = Nz(Me.cboCliente.Value, "")
vRegion = Nz(Me.cboRegion.Value, "")
vStatus = Nz(Me.cboStatus.Value, "")
vSistema = Nz(Me.cboSistema.Value, "")
vMotivo = Nz(Me.cboMotivo.Value, "")
'Inicilizamos el filtro
miFiltro = ""
'Creamos la primera parte del filtro
If vUsuario <> "" Then
miFiltro = "AND [Id_usuario]='" & vUsuario & "'"
End If
'Creamos la segunda parte del filtro
If vCliente <> "" Then
miFiltro = miFiltro & " AND [Id de cliente]='" & vCliente & "'"
End If
'Creamos la tercera parte del filtro
If vRegion <> "" Then
miFiltro = miFiltro & " AND [Id Region]='" & vRegion & "'"
End If
'Creamos la cuarta parte del filtro
If vStatus <> "" Then
miFiltro = miFiltro & " AND [Id de situación]='" & vStatus & "'"
End If
'Creamos la quinta parte del filtro
If vSistema <> "" Then
miFiltro = miFiltro & " AND [Id del Sistema]='" & vSistema & "'"
End If
'Creamos la sexta parte del filtro
If vMotivo <> "" Then
miFiltro = miFiltro & " AND [Id Motivo]='" & vMotivo & "'"
End If
'Ahora cogemos la longitud del filtro
vLargo = Len(miFiltro)
'Recomponemos el filtro eliminando el primer 'AND '
If vLargo > 0 Then
miFiltro = Right(miFiltro, vLargo - 4)
End If
'Aplicamos el filtro al formulario
Me.Filter = miFiltro
Me.FilterOn = True
End Sub
José: Sin ver el entorno en el que está ese código para mi es dificil acertar en una respuesta.
El código lo veo correcto si realmente los Identificadores están en la Primera columna del Combo.
Lo único que se me ocurre es que lo que intentas Filtrar, no sea un Formulario Principal, y lo quieres filtrar sea un SubFormulario.
Si eso es así le tendrías que poner>>
Me!NombreDeTuSubformulario.Form.Filter = MiFiltro
Me!NombreDeTuSubformulario.Form.FilterOn = True
El .Form es opcional, pero el resto no. Saludos >> Jacinto
- Compartir respuesta