El grupo al cual envías entradas es un grupo Usenet. Si envías mensajes a este grupo, cualquier usuario de Internet podrá ver tu dirección de correo electrónico
Desde hace varias semanas estoy tratando de elaborar un Formulario de Búsqueda en una Base de Datos en Microsoft Acces 2003. La busqueda recorre los siguientes campos ObraId (Srting) Año (String) AutNomb(String) Titulo(String) Resumen(Memo)
La codificación que incluyo la he adaptado de allenbrowne. Sin embargo, al aplicar el filtro ocurre error en el Campo Resumen: "Compile error: Method or data member not found"
Aun ignoro si el resto del código es correcto. Me pueden ayudar a resolver este problema?
El código que tengo es el siguiente: Option Compare Database Option Explicit
Private Sub cmdFilter_Click() Dim strWhere As String Dim lngLen As Long
If Not IsNull(Me.txtFilterObraID) Then strWhere = strWhere & "([ObraID] = """ & Me.txtFilterObraID & """) AND " End If
If Not IsNull(Me.txtFilterAño) Then strWhere = strWhere & "([Año] = """ & Me.txtFilterAño & """) AND " End If
If Not IsNull(Me.txtFilterAutNomb) Then strWhere = strWhere & "([AutNomb] Like ""*" & Me.txtFilterAutNomb & """) AND " End If
If Not IsNull(Me.txtFilterTitulo) Then strWhere = strWhere & "([Titulo] Like """ & Me.txtFilterTitulo & """) AND " End If
If Not IsNull(Me.txtFilterResumen) Then strWhere = strWhere & "([Resumen] = """ & Me.txtFilterResumen & """) AND " End If
lngLen = Len(strWhere) - 5 If lngLen <= 0 Then MsgBox "Sin criterio", vbInformation, "Nada que hacer." Else strWhere = Left$(strWhere, lngLen)
(Ctrl+G). 'Debug.Print strWhere
Me.Filter = strWhere Me.FilterOn = True End If End Sub
Private Sub cmdReset_Click()
Dim ctl As Control
For Each ctl In Me.Section(acHeader).Controls Select Case ctl.ControlType Case acTextBox, acComboBox ctl.Value = Null Case acCheckBox ctl.Value = False End Select Next
Me.FilterOn = False End Sub
Private Sub Form_BeforeInsert(Cancel As Integer) Cancel = True MsgBox "Usted no puede agregar nuevos autores al formulario de búsqueda.", vbInformation, "Permiso denegado." End Sub
Private Sub Form_Open(Cancel As Integer) 'Me.Filter = "(False)" 'Me.FilterOn = True End Sub
El error lo mostraba en: If Not IsNull(Me.txtFilterResumen) Then strWhere = strWhere & "([Resumen] = """ & Me.txtFilterResumen & """) AND " End If
Afortunadamente, esta madrugada, para probar, eliminé esa linea y, sorpresa, la búsqueda funciona correctamente. Al recibir tu nota, volví a introducir dicha línea para verificar el error y "eureka" también funciona, no lo entiendo, pero, funciona.
Por lo anterior, para que los estudiantes puedan filtrar de otra tabla de la BD (que es relacional y está normalizada) agregué las siguientes líneas:
If Not IsNull(Me.txtFilterFacetaID) Then strWhere = strWhere & "([FacetaID] Like """ & Me.txtFilterFacetaID & """) AND " End If
El campo FacetaID se encuentra en la Tabla MiTabla2 que tiene la relación Muchos de la Tabla MiTabla1 (de la que he venido filtrando).
Siguiendo el mismo procedimiento aplicado a los otros filtros, coloqué en el formulario el textlabel txtFacetaID, sin embargo, al escribir una palabra y al dar click en filtrar, despliega: Enter Parameter Value, Al escribir la misma palabra, no filtra dato alguno, por el contrario, muestra todos los registros. Me parece que esa instrucción no indica que debe filtrar en MiTabla2, esto ignoro como hacerlo. Esto a pesar de que agregué en el formulario el campo FacetasID de MiTabla2. Entiendo que .Me en este caso no funciona.
Con la opción de Facetas (que es la nueva instrucción que he agregado) la idea es que los estudiantes al escribir una o varias facetas, el filtro encuentre todas las citas que le pertenecen. Puedes orientarme a encontrar una instrucción que permita, en el mismo formulario, filtrar en MiTabla2.
Esta búsqueda me funciona con sql que indico: SELECT [MiTabla1].ObraID, [MiTabla1].Year, [MiTabla1].AutNomb, [MiTabla2].FacetID, [MiTabla1].Titulo, [MiTabla1].Resumen FROM MiTabla1 INNER JOIN MiTabla2 ON [MiTabla1].ObraID = [MiTabla2].ObraID;
También, he estado investigando como traducir de sql a vba pero no he encontrado como hacerlo.
> Afortunadamente, esta madrugada, para probar, eliminé esa linea y, > sorpresa, la búsqueda funciona correctamente. Al recibir tu nota, volví a > introducir dicha línea para verificar el error y "eureka" también > funciona, > no lo entiendo, pero, funciona.
Es posible que tuvieras algún carácter erróneo que se subsanó al volver a escribirlo.
> El campo FacetaID se encuentra en la Tabla MiTabla2 que tiene la relación > Muchos de la Tabla MiTabla1 (de la que he venido filtrando).
El código que estás usando filtra los registros del origen del formulario. Si en la propiedad Origen del registro del formulario sólo tienes la tabla MiTabla1, nunca podrás filtrar por campos de la tabla MiTabla2. Tienes que indicar en esa propiedad que el origen va a ser una consulta, que devuelva los registros con los campos que desees a partir de las 2 tablas. Y un par de cosas:
1.- En la SQL que has indicado en tu mensaje, tienes el campo FacetID, no FacetaID. 2.- Si FacetaID (o FacetID) es texto y quieres usar un Like, mejor usa los asteriscos:
strWhere = strWhere & "([FacetaID] Like ""*" & Me.txtFilterFacetaID & "*"") AND "
3.- Si FacetaID (o FacetID) es numérico, no puedes usar las comillas para delimitarlo:
> También, he estado investigando como traducir de sql a vba pero no he > encontrado como hacerlo.
SQL y VBA son 2 cosas distintas. Puedes usar SQL dentro del VBA, o usar funciones del VBA en una consulta SQL, pero nunca podrás convertir una consulta de SQL en una función del VBA.
Siguiendo tus instrucciones corrigiendo la sql, mi formulario funciona como lo había pensado.
Sobre tus observaciones: 1. Tienes razón omití una "a" 2. Si es texto 3. También es texto
Sobre lo de traduccion de sql a vba, voy a estudiar mas al respecto, pues es tema nuevo para mi.
Adicionalmente, me gustaría aprender a : 1. En un campo llamado Año (String) filtrar entre años 2. La instrucción en un campo String para filtrar por AND y por OR
Por último, este ejercicio (que forma parte de varias aplicaciones que estoy haciendo) que me has ayudado a terminar con éxito, me ha permitido concluir que tengo claridad en el Algoritmo y en el Algoritmo Orientado a Objetos, pero, no he podido llegar a elaborar la Miniespecificación.
Por ejemplo, he estado estudiando un texto para aprender a programar. Después de los aspectos básicos de programación ese texto dedica varios capítulos a elaborar el Algoritmo, el Algoritmo Orientado a Objetos, la miniespecificación, el Diagrama de Flujo y la Codificación. La Miniespecificación lo deja a uno a las puertas de aprender a codificar en VB.NET, C#, Java y C++. Sin embargo, el texto enseña a escribir programas para calcular el área de de un cuadrado, el radio de un circulo, etc, casi todo orientado a calcular. En ninguna parte del texto o en la bibliografía de apoyo he visto ejemplos como los que me has ayudado a resolver, aspecto que me ha impedido a escribir la miniespecificación.
Para ilustrar lo indicado, incluyo un ejercicio que hice y cubre lo indicado: Muestra de una Tabla de Multiplicar
Algoritmo 1. Inicio 2. Se pregunta que tabla desea 3. Si la tabla está entre 1 y 10 entonces se imprime la tabla solicitada 4. Si la tabla solicitada no está entre el 1 y el 10, entonces se muestra un mensaje de error. 5. Fin
Algoritmo orientado a Datos 1. Inicio 2. Se pregunta que tabla desea (Tabla, i[1-10]) 3. Si la tabla está entre 1 y 10 entonces se imprime la tabla solicitada 4. Si la tabla solicitada no está entre el 1 y el 10, entonces se muestra un mensaje de error. 5. Fin
Miniespecificación 1. INICIO: 2. (i,i[0-n]) 3. (Tabla, i[1-10]) 4. << "Qué tabla deseas: " 5. >> Tabla 6. Si Tabla >= 1 Tabla <= 10 Entonces 7. i←1 8. Inicio <<Tabla+ "X" +i+ "=" + Tabla*1 9. i←i +1 10. Hasta que i> 10
11. De lo contrario 12. <<"Válido sólo del 1 al 10" 13. Fin Si 14. :FIN
Me puedes sugerir algun(os) textos en la web o impresos que me permitan a elaborar el ejercicio que me has ayudado a terminar, escribiendo el programa siguiendo los pasos descritos.
De nuevo muchas gracias
PD. Antes traté de enviar este mensaje, pero, ignoro si fue enviado
"Patxi Sanz" wrote: > > Afortunadamente, esta madrugada, para probar, eliminé esa linea y, > > sorpresa, la búsqueda funciona correctamente. Al recibir tu nota, volví a > > introducir dicha línea para verificar el error y "eureka" también > > funciona, > > no lo entiendo, pero, funciona.
> Es posible que tuvieras algún carácter erróneo que se subsanó al volver a > escribirlo.
> > El campo FacetaID se encuentra en la Tabla MiTabla2 que tiene la relación > > Muchos de la Tabla MiTabla1 (de la que he venido filtrando).
> El código que estás usando filtra los registros del origen del formulario. > Si en la propiedad Origen del registro del formulario sólo tienes la tabla > MiTabla1, nunca podrás filtrar por campos de la tabla MiTabla2. Tienes que > indicar en esa propiedad que el origen va a ser una consulta, que devuelva > los registros con los campos que desees a partir de las 2 tablas. Y un par > de cosas:
> 1.- En la SQL que has indicado en tu mensaje, tienes el campo FacetID, no > FacetaID. > 2.- Si FacetaID (o FacetID) es texto y quieres usar un Like, mejor usa los > asteriscos:
> strWhere = strWhere & "([FacetaID] Like ""*" & Me.txtFilterFacetaID & "*"") > AND "
> 3.- Si FacetaID (o FacetID) es numérico, no puedes usar las comillas para > delimitarlo:
> > También, he estado investigando como traducir de sql a vba pero no he > > encontrado como hacerlo.
> SQL y VBA son 2 cosas distintas. Puedes usar SQL dentro del VBA, o usar > funciones del VBA en una consulta SQL, pero nunca podrás convertir una > consulta de SQL en una función del VBA.
> Adicionalmente, me gustaría aprender a : > 1. En un campo llamado Año (String) filtrar entre años > 2. La instrucción en un campo String para filtrar por AND y por OR
Los 2 casos son criterios del SQL. Puedes revisar la sintaxis del motor de base de datos que uses en su ayuda. Aunque son similares, depende de lo que uses (Access, SQL Server, MySQL, ...), la sintaxis tiende a cambiar un poco.
Si quieres filtrar entre 2 valores, lo normal es BETWEEN:
[Año] BETWEEN "2005" AND "2009"
O una combinación de >= y <=:
[Año] >= "2005" AND [Año] <= "2009"
Y con el segundo ejemplo, creo que he respondido a la segunda parte de la pregunta ;-)
> Me puedes sugerir algun(os) textos en la web o impresos que me permitan a > elaborar el ejercicio que me has ayudado a terminar, escribiendo el > programa > siguiendo los pasos descritos.
De eso, casi que ni idea. Puedes buscar en Google, a ver que encuentras. Aunque yo había oído hablar de diagramas de flujo, no de miniespecificaciones. De todas formas, me da igual que tenga que crear la tabla de multiplicar, o un filtro múltiple, la idea es la misma, y lo único que cambian son las instrucciones que tendrás que usar al final.
Patxi. En mi caso como desconozco la codificación, creo que me sera mas facil hacerlo paso a paso, aunque me lleve mas tiempo Muchas gracias Voy a revisar la web.
Siguiendo con mi formulario para Filtrar, en el caso de las instrucciones, si escribo BETWEEN en mi código vba: If Not IsNull(Me.txtFilterYear) Then strWhere = strWhere & "([Year] = """ & Me.txtFilterYear & """) BETWEEN " End If
"Patxi Sanz" wrote: > > Adicionalmente, me gustaría aprender a : > > 1. En un campo llamado Año (String) filtrar entre años > > 2. La instrucción en un campo String para filtrar por AND y por OR
> Los 2 casos son criterios del SQL. Puedes revisar la sintaxis del motor de > base de datos que uses en su ayuda. Aunque son similares, depende de lo que > uses (Access, SQL Server, MySQL, ...), la sintaxis tiende a cambiar un poco.
> Si quieres filtrar entre 2 valores, lo normal es BETWEEN:
> [Año] BETWEEN "2005" AND "2009"
> O una combinación de >= y <=:
> [Año] >= "2005" AND [Año] <= "2009"
> Y con el segundo ejemplo, creo que he respondido a la segunda parte de la > pregunta ;-)
> > Me puedes sugerir algun(os) textos en la web o impresos que me permitan a > > elaborar el ejercicio que me has ayudado a terminar, escribiendo el > > programa > > siguiendo los pasos descritos.
> De eso, casi que ni idea. Puedes buscar en Google, a ver que encuentras. > Aunque yo había oído hablar de diagramas de flujo, no de > miniespecificaciones. De todas formas, me da igual que tenga que crear la > tabla de multiplicar, o un filtro múltiple, la idea es la misma, y lo único > que cambian son las instrucciones que tendrás que usar al final.
El error es lógico, ya que el BETWEEN precisa de una sintaxis específica, lo mismo que el igual.
Si traducimos más o menos los filtros, podemos decir algo así:
1.- Filtra los registros cuyo año sea igual al que he escrito en el control txtFilterYear, siempre y cuando no esté vacío:
If Not IsNull(Me.txtFilterYear) Then strWhere = strWhere & "([Year] = """ & Me.txtFilterYear & "")" End If
2.- Filtra los registros cuyo año esté entre los escritos en los controles txtFilterYear1 y txtFilterYear2, siempre y cuando no estén vacíos uno cualquiera de ellos:
If Not IsNull(Me.txtFilterYear1) Then If Not IsNull(Me.txtFilterYear2) Then strWhere = strWhere & "([Year] BETWEEN """ & Me.txtFilterYear1 & "" AND """ & Me.txtFilterYear2 & """)" End If End If
BETWEEN siempre necesita 2 datos, el mínimo y el máximo: el valor del campo debe estar entre una fecha y otra fecha, mientras que el igual sólo necesita uno: el valor del campo debe ser igual a una fecha.
Revisando la tabla que tiene el campo Año, encontré 18 registros sin ese dato, pero no está vacío, tiene el registro SAPN. Según lo indicado: ¿es ese registro el que muestra el error en el código que me has recomendado ?.
En caso de que no se logre encontrar ese dato, una posible solución que he pensado es agregar una nueva tabla a la base de datos que almacene todos los registros SPAN.
Te agradezco también, las dos referencias que has sugerido, me han ayudado bastante a entender lo referente a filtros en sql
"Patxi Sanz" wrote: > El error es lógico, ya que el BETWEEN precisa de una sintaxis específica, lo > mismo que el igual.
> Si traducimos más o menos los filtros, podemos decir algo así:
> 1.- Filtra los registros cuyo año sea igual al que he escrito en el control > txtFilterYear, siempre y cuando no esté vacío:
> If Not IsNull(Me.txtFilterYear) Then > strWhere = strWhere & "([Year] = """ & Me.txtFilterYear & "")" > End If
> 2.- Filtra los registros cuyo año esté entre los escritos en los controles > txtFilterYear1 y txtFilterYear2, siempre y cuando no estén vacíos uno > cualquiera de ellos:
> If Not IsNull(Me.txtFilterYear1) Then > If Not IsNull(Me.txtFilterYear2) Then > strWhere = strWhere & "([Year] BETWEEN """ & Me.txtFilterYear1 & "" > AND """ & Me.txtFilterYear2 & """)" > End If > End If
> BETWEEN siempre necesita 2 datos, el mínimo y el máximo: el valor del campo > debe estar entre una fecha y otra fecha, mientras que el igual sólo necesita > uno: el valor del campo debe ser igual a una fecha.
Como indiqué en mi anterior inquietud ante una pegunta de Patxi, tengo un campo que almacena años, sin embargo se están almacenando más registros sin ese dato. En vista de que hemos estado elaborando un código para filtrar entre años o entre un año.
Mi pregunta ahora es conviene agregar otra tabla a la base de datos para almacenar todos los registros carentes de ese dato. Empero, se podrían dejar esos registros en la tabla original con la precaución de incluir en el código de la búsqueda por años alguna instrucción que tome en cuenta esos registros.
No es lógico tener 2 tablas sólo porque un campo no tenga un dato.
Lo lógico es que decidas qué quieres hacer en el filtro: incluir siempre los registros sin valor, o no incluirlos. Si quieres incluirlos y no tienen guardado ningún dato (todavía no sé si guardas un valor nulo o un texto), puedes usar la función Nz.
Gracias por la aclaración sobre las dos tablas, pero, mi duda es que el campo es llenado con el año (que tiene valor texto), no obstante, en aquellos registros que no tienen año, se les escribe SAPN (de valor texto).
Mi inquietud es: ¿si el código para buscar entre años debe funcionar aun teniendo registros con SAPN? (por ahora hay 18 pero puede aumentar). Por el momento ese filtro no me funciona.
"Patxi Sanz" wrote: > No es lógico tener 2 tablas sólo porque un campo no tenga un dato.
> Lo lógico es que decidas qué quieres hacer en el filtro: incluir siempre los > registros sin valor, o no incluirlos. Si quieres incluirlos y no tienen > guardado ningún dato (todavía no sé si guardas un valor nulo o un texto), > puedes usar la función Nz.
Tienes un campo de tipo texto, por lo que hay que hacer las búsquedas teniendo en cuenta ese pequeño gran dato.
Si tienes 3 registros con estos datos en el año:
Número registro - Year 1 - "2008" 2 - "2009" 3 - "SAPN"
Y usas un filtro tal como:
"([Year] = """ & Me.txtFilterYear & "")"
Si en el cuadro de texto escribes 2008, encontrará el registro 1, si escribes 2009 encontrará el registro 2, y si escribes SAPN encontrará el registro 3.
Si quieres que los registros SAPN siempre aparezcan, independientemente del año que introduzca el usuario, tienes que agregarlo en el filtro: