Access

Hola,
Estoy intentando hacer mi primera base de datos. Quiero hacer un formulario que tiene 4 botones de opción que representan los años( todos, 2011, 2010,2009) donde se pueda seleccionar más de una opción. Una vez se ha seleccionado alguna o algunas de las 4 opciones crear un botón de acción para validar lo escogido y que se muestre una consulta donde salen una serie de registros donde solo salgan los años que hemos escogido con los botones de opción. ¿Es posible hacer esto o es muy complicado? Estoy muy verde en visual basic. Gracias y paciencia a quien me pueda ayudar
Respuesta
1
Podrse hacer se puede hacer casi todo. Ahora bien, requiere algunos conocimientos o, si no se poseen, entusiasmo y ganas de aprender.
Digo esto porque mucha gente (no digo que seas tu) preguntan esperando que alguien les ponga un código que puedan copiar y pegar sin pararse a analizar qué hace ese código.
Dicho esto, si, se puede hacer.
Un formulario, 4 casillas de verificación: chkTodos, chk2011, chk2010, chk2009 (observa que nombro los controles independientes con un prefijo que m ayude a saber que son: chk --> checkbox)
Un botón de comando para aplicar esos criterios (cmdAplicar)
Hasta aquí lo fácil.
Ahora viene el segundo nivel: hacer que, si seleccionas Todos (chkTodos), se deshabiliten el resto y viceversa (si seleccionas un año, deshabilitar el de todos)
En el evento Click del chkTodos
Me!chk2011.Enabled = Not Me!chkTodos
Me!chk2010.Enabled = Not Me!chkTodos
Me!chk2009.Enabled = Not Me!chkTodos
En el evento click de cada uno de los chkAño
If Me!chk2011 Or Me!chk2010 Or Me!chk2009 Then
Me!chkTodos.Enabled = False
Else
Me!chkTodos.Enabled = True
End If
Bueno, ya tenemos un código que habilita/deshabilita los checks. Vamos por el nivel 3: crear una SQL que nos devuelva los registros esperados.
Anotación: se supone que trabajas en un formulario basado en la tabla (o una consulta a ella) dónde tienes todos los controles asociados a los campos del Origen del registro.
En en evento click dek boton cmdAplicar.
' Primero verificamos que tenemos algo marcado.
If Not Me!chk2011 And Not Me!chk2010 And Not Me!chk2009 And Not Me!chkTodos Then
Exit Sub
End If
' Ahora creamos la SQL
Dim strSQL As String
strSQL = "SELECT * FROM laTabla WHERE 1=1"
If Me!chkTodos Then
Me.RecordSource = strSQL
Exit Sub
End If
' Creamos una clausula IN para la SQL que recoja los años marcados
strSQL = strSQL & " AND Año IN("
If Me!chk2011 Then
strSQL = strSQL & "2011,"
End If
If Me!chk2010 Then
strSQL = strSQL & "2010,"
End If
If Me!chk2011 Then
strSQL = strSQL & "2009,"
End If
' Quitamos la coma del final y cerramos l parentesis
strSQL = Left(strSQL, Len(strSQL)-1) & ")"
' Asignamos el origen del registo
Me.RecordSource = strSQL
Bueno, me parece que ya tienes bastante por dónde empezar...
Xavi
Hola xavi,
Primero de todo muchas gracias. Yo soy de los que no tengo mucha idea pero le pongo ganas.
Lo que me has dicho he ido haciendo y entendiendo hasta aquí. Me daba algún error pero al final me ha salido lo que me comentabas que había que lograr.
Lo siguiente la verdad no me entero mucho. ¿Podrías especificarme un poco estos pasos? ¿Tengo qué escribirlo esto en el cmdaplicar?
' Ahora creamos la SQL
Dim strSQL As String
strSQL = "SELECT * FROM laTabla WHERE 1=1"
If Me!chkTodos Then
Me.RecordSource = strSQL
Exit Sub
End If
' Creamos una clausula IN para la SQL que recoja los años marcados
strSQL = strSQL & " AND Año IN("
If Me!chk2011 Then
strSQL = strSQL & "2011,"
End If
If Me!chk2010 Then
strSQL = strSQL & "2010,"
End If
If Me!chk2011 Then
strSQL = strSQL & "2009,"
End If
' Quitamos la coma del final y cerramos l parentesis
strSQL = Left(strSQL, Len(strSQL)-1) & ")"
' Asignamos el origen del registo
Me.RecordSource = strSQL
Bueno, me parece que ya tienes bastante por dónde empezar...
Gracias
Seleccionas el botón cmdAplicar y, con el botón derecho, seleccionas la opción Generar evento. Cuando te de a elegir (Generador de expresiones, generador de macros o generador de código) selecciona la última. Aparecerás en el editor e VBA justo entre:
Private Sub cmdAplicar_Click()
y End Sub
Ahí es dónde debes poner ese código. Lo mismo que has hecho con los otros pedacitos de código que te he puesto.
En cuanto a lo que hace... pues crea una cadena SQL para pasarla como Origen del registro de un formulario de forma que esté filtrada según tus criterios.
Xavi
Hola xavi,
Ok a lo anterior.En el siguiente paso,
strSQL = "SELECT * FROM laTabla WHERE 1=1"
select todos los campos de la consulta que quiero filtrar donde 1=1?? El uno es= a uno no lo entiendo. Me puedes explicar el porque?
Gracias
El porque es muy simple: 1=1 siempre se cumple y, si no tuvieras nada seleccionado se complica un poco crear la WHERE.
Hecho de esta forma siempre tienes una WHERE válida a la que vas añadiendo criterios con el And.
Resumiendo : una cuestión práctica.
Hola xavi,
Ok, ahora he entendido lo del where 1=1. Ya me queda poco para acabar.
He llegado hasta el texto que he puesto más abajo. Al ponerlo y seleccionar cualquier botón que no sea el todos y darle al botón de aplicar me da un error. Si quito este ultimo trozo que pongo más abajo no me da ningún error.
Tampoco entiendo donde tengo que quitar la coma del final y cerrar el paréntesis( igual por eso me da el error).
Y en sí, la ultima expresión no se que hace. He mirado las instrucciones del left y el len, el -1, pero no le veo que hace en lo que busco yo.
¿Por ultimo como puedo hacer para probar que lo tengo bien y visualizar la consulta según los años que elijo?
Quitamos la coma del final y cerramos l paréntesis
strSQL = Left(strSQL, Len(strSQL)-1) & ")"
' Asignamos el origen del registo
Me.RecordSource = strSQL
Muchas gracias por tu ayuda
Dado que estas construyendo una SQL con una clausula IN que puede contener varios valores, en la creación de la misma se introducen los mismos seguidos de una coma.
Para eliminar la ultima coma, lo que se hace es coger la parte izquierda de la cadena mediante Left dónde, como segundo parámetro, debes indicar la longitud de cadena que quieres mantener. Como queremos toda la cadena menos el último carácter, debemos restarle 1 a la longitud actual.
Finalmente, y dado que estamos creando una clausula IN, debemos cerrar el paréntesis.
Eso es, en teoría, como debería funcionar.
Solo un par de cosas. EN mi primer código hay un gazapo en el último If:
If Me!chk2011 Then
strSQL = strSQL & "2009,"
End If
Obviamente es If Me!chk2009 Then
En cuanto a tu pregunta de como verlo: pon un punto de interrupción en la linea de asignación del Recordsource. Para poner un punto e interrupción pulsa F9 encima de la linea.
Cuando ejecutes el código, este se detendrá en esa linea sombreada en amarillo. Ahora es el momento de abrir la ventana de inmediato (Ctrl+G por si no estuviera abierta) y "pedirle" el valor de la variable SQL
? StrSQL
Esa SQL, puesta en una consulta de pruebas, debería darte los resultados que esperas. Si no fuera así, es muy probable que, en la consulta, detectaras dónde me he/nos hemos equivocado.
Hola Xavi,
LLevo un par de días probando lo que me comentaste y descubriendo cosas, estoy a punto, pero aun no me ha salido. Va muy bien lo del f9.
Creo que lo que recoja los años marcados según elija el botón lo hace bien, pero me parece que alguna expresión no es correcta. Por lo que yo entiendo el valor al final del strSQL tiene que ser o ( 2009)o( 2010)o(2009,2010)etc... ¿No tengo claro el valor que me daría en caso de pulsar el botón todos?
Primero de todo cuando le doy al botón de validar el formulario me pide que introduzca un año, esto no lo entiendo porque no debería ser así, los años se escogen solo por los botones que hemos creado. Le he quitado de --strSQL = strSQL & " AND Año IN("-- el and año y ya no me sale pero no se si es lo correcto. Esta expresión no la entiendo
¿Luego cuándo pongo un?srtSQL al final del botón validar, si me pongo encima de la linea me da que el valor de strSQL es--- strSQL = " SELECT * from años WHERE 1=1"in(y aquí me pone correctamente el año según lo que haya pulsado, excepto si pulso todos). Por eso creo que los botones ya los reconoce pero algo está mal.
Por ultimo he añadido un Docmd.OpenQuery "años" para que me visualice la tabla años, en caso que el valor de strSQl llegue a ser el correcto, ¿cómo se haría para visualizar la consulta filtrando los años que yo elijo en los botones?
Espero haberme explicado bien. Gracias por tu paciencia y espero conseguirlo
Saludos
La clausula WHERE de la SQL puede construirse de 2 formas:
Concatenando OR's o con IN's
Yo utilizo la IN porque me es más cómoda y fácil de realizar, pero también podrías concatenar OR's
Al mirar desde el punto de interrupción el valor de strSQL, deberías ver (habiendo seleccionado 2010 y 2011, por ejemplo)
SELECT * FROM años WHERE 1=1 AND Año In(2010, 2011)
Lo que me choca es que realices la consulta sobre una tabla llamada años...
Hola xavi,
Donde dices:
strSQL = strSQL & " AND Año IN("
¿Año sería el nombre del campo de la tabla o consulta de donde se quiere filtrar la información con los botones?
La tabla que llamo años es un ejemplo que puse para ver como se visulizaria la información.
Mi idea es hacer una consulta donde haya muchos campos de diferentes tablas, (entre ellos uno donde están los años) y visualizar toda la información, en este caso filtrado por los años.
En caso que el valor de strSQl llegue a ser el que me comentas arriba, ¿cómo se haría para visualizar la consulta filtrando los años que yo elijo en los botones?
Gracias
Hola xavi,
Veo que aun estoy muy verde para hacer un access tal como lo quiero hacer. Voy a leer más tutoriales para aprender más conceptos y lo volveré a intentar. Gracias igualmente por tu ayuda que me ha servido para aprender varios conceptos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas