Extraer un Valor consultando varios campos

Mi pregunta va de lo siguiente. Necesito crear una consulta access donde halle en determinados campos un valor especifico. Con el siguiente ejemplo creo que lo explicaré mucho mejor.
Tengo 5 campos en una tabla y en ellas valores alfabéticos.
Tengo que extraer el nombre del campo donde se encuentre la letra "a"
EJ:
Tabla categorías
CATEGORIA1 CATEGORIA2 CATEGORIA3 CATEGORIA4 CATEGORIA5
a b c d e
b e d a c
e c a b d
El resultado de la consulta tendría que ser de la siguiente manera, que es donde se encuentra la letra a.
Categoria1
Categoria4
Categoria3
Espero haberme explicado, sino, lo vuelvo a explicar de otra manera.

2 Respuestas

Respuesta
1
Crea una consulta de selección. Añade las columnas correspondientes a cada categoría. En lineas de criterios distintas, introduce el valor a filtrar.
La SQL debería quedar, más o menos, así:
Select categoria1, categoria2, categoria3, categoria4, categoria5 FROM Categorias WHERE categoria1 = "a" OR categoria2 = "a" OR categoria3 = "a" OR categoria4 = "a" OR categoria5 = "a"
Prueba y cuentas
Xavi
Estimado Xavi:
Acabo de hacer exactamente lo que me indica. He especificado el valor "a" (que es el que me interesa) en filas diferentes de la fila "Criterios", pero al ejecutar la consulta muestra todas las columnas con sus valores correspondientes. ¿Tendría qué especificar algo más? Como por ejemplo, activar "Totales" y cambiar el "Agrupar por" por "Dónde" o algo así.
Muchísimas gracias
Vale, ahora lo pillo (no me había fijado bien en el resultado a obtener)
Me temo que no podrás conseguir eso mediante una consulta (al menos no con una consulta medianamente sencilla)
Se me ocurre realizar 5 cuentas distintas sobre la tabla (cada una de ellas con el criterio CategoriaX = "a") y, por cada una de ellas que supere 0, almacenar el valor en alguna variable.
Pero claro que eso ultimo dependerá del uso que le quieras dar a esa lista de categorías que cumplan la condición.
Po cierto, y desde la más completa ignorancia sobre tu aplicación, detecto un error de diseño. Imaginemos que tienes una tabla de clientes a los que puedes incluir en varias categorías (5). Yo no añadirá 5 campos a la tabla. Lo que haría es crear una tabla de relación entre categoría y clientes (campos Categoría y Cliente como clave compuesta, para evitar duplicados) y, con esa estructura, lo que pides es mucho más fácil.
Respuesta
1
Creo que lo que buscas no se puede hacer mediante consulta, se tiene que hacer por código.
Supongamos que la tabla se llama Categorías, creamos otra tabla que llamamos NombreCampos con un campo NombreCampo, con el código siguiente lo que haremos será insertar en esta tabla los nombres de los campos que cumplan la condición (por ejemplo que sean igual a "a":
Function BuscarEnCampos()
' Definimos las variables
Dim db As Database
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim fl As Field
' Activamos la base de datos
Set db = CurrentDb
' Creamos los recordset
Set rs1 = db.OpenRecordset("Categorias")
Set rs2 = db.OpenRecordset("NombreCampos")
' Recorremos el recordset de la tabla Categorias
Do While Not rs1.EOF
' Recorremos los campos del recordset para buscar la letra "a" si la encuentra insertamos el nombre del campo en la tabla NombreCampos
    For Each fl In rs1.Fields
        If rs1(fl.Name) = "a" Then
            rs2.AddNew
            rs2!NombreCampo = fl.Name
            rs2.Update
        End If
    Next fl
rs1.MoveNext
Loop
End Function
Me cuentas.
Estimada Angeles:
El código que me muestra me ha servido al 100%, pero le consulto lo siguiente, ¿que tendría que añadir al código para que me traiga un campo más, el "Expediente", es decir, dentro de la tabla Categorías hay otro campo más, que es el "Expediente". Necesito traerlo a la tabla "NombreCampos" para saber a que expediente corresponde la categoría que he seleccionado.
El resultado sería la tabla llamada "NombreCampos" con dos campos: "Expediente y NombreCampo".
Muchísimas Gracias
Angeles:
He detectado otra cosa en el código. Cuando especificamos en el código que recorra todos los campos en busca de la letra a, ¿sería posible que solo detactase la "a" minúsculas? Resulta que dentro de la tabla hay más campos con la misma letra pero en Mayúsculas. Me he dado cuenta porque compruebo que la tabla Categorías solo tiene 300 registros y la tabla que se llena automáticamente después de aplicar el código llega hasta casi los 1000 registros. ¿VB de access podría distinguir entre minúsculas y mayúsculas?
Muchas Gracias
Para añadir el expediente tienes que poner otro campo en la tabla NombreCampos que lo llamaremos expediente, cuando vas a insertar en esta tabla también pondrías ese campo:
            Rs2. AddNew
            rs2!NombreCampo = fl.Name
            rs2!Expediente = rs1!Expediente
            rs2.Update
Ya que el expediente lo tienes en el registros del recordset primero (rs1) el que se basa en la tabla categorías donde supongo tienes un campo llamado Expediente.
Para la otra pregunta es más complicado, ya que access no distingue entre mayúsculas y minúsculas, existen 2 funciones Minús y Mayus pero son solo para visualizar la cadena, no para seleccionar. Se me ocurre que se puede hacer con el valor del código, la función Asc() te da este valor, como la a minúscula tiene el código 97 pondríamos:
If Asc(rs1(fl.Name)) = 97 Then
en vez de:
 If rs1(fl.Name) = "a" Then
Me cuentas.
Estimada Angeles:
Respecto a traer el expediente he insertado la linea que correctamente Us. me muestra y funciona perfectamente. Pero, no he tenido tanta suerte con respecto al segundo tema. He sustitudido la linea If rs1 (fl.Name) = "a" Then por If Asc(rs1(fl.Name)) = 97 Then, pero al ejectutar el modulo me muestra un error que dice "Uso no Válido de Null". ¿A qué puede ser debido?
Muchísimas Gracias
Será porque tienes algunos campos en las categorías vacíos, prueba con:
If Nz(Asc(rs1(fl.Name))) = 97 Then
o bien
If Asc(Nz(rs1(fl.Name))) = 97 Then
Creo que es de la 2ª forma, tendría que probarlo, pero creo que sería el campo el que hay que tratar como nulo, pruébalo y me cuentas.
La función NZ() lo que hace es devolver 0 si el campo está vacío. Tenla en cuenta siempre que tengas campos vacíos, access es muy "pesado" con los nulos.
Me cuentas.
Hola Angeles:
La primera linea de código que me muestras, sigue apareciendo el error Uso no válido de Nulo y la segunda linea de código aparece un error que dice Argumento o llamada a procedimiento no válida. ¿Estoy haciendo algo mal?
Gracias
Saludos
La función Nz hay en ocasiones que no la admite y esta parece ser una de ellas. Lo que haremos será preguntar antes si el campo está vacío, si no lo está que compruebe si es a minúscula o no:
    For Each fl In rs1.Fields
     If IsNull(rs1(fl.Name))= False then
        If Asc(rs1(fl.Name)) = 97 Then         
            rs2.AddNew  
            rs2!NombreCampo = fl.Name
            rs2.Update
        End If
    End if   
    Next fl
De esta forma comparamos solo los campos que no están vacíos.
Estimada Angeles:
Como siempre, excelente. El código ha sido todo un éxito. Estaba en lo cierto. Los fallos lo daba por una cuestión de los manejos de los Nulos. Una vez más le agradezco infinitamente su ayuda.
Gracias
Reciba un cordial y atento saludo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas