Access - Consultas combinadas - '3420' Error el objeto no es válido o no tiene valor.

   
Vista:

Consultas combinadas - '3420' Error el objeto no es válido o no tiene valor.

Publicado por Nani (4 intervenciones) el 16/11/2017 13:36:22
Hola Estoy comenzando a programar tibiamente en access y me encuentro estancada con una consulta donde debo saber qué stand tiene más votos en la tabla "VOTOS" y sacar los datos del stand de la tabla "STAND"
Actualmente tengo este código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Private Sub Comando5_Click()
 
    Dim mySql As String
    Dim dbs As DAO.Database
    Dim rst As DAO.Recordset
 
    mySql = "SELECT MAX(Total_Votos)AS Total FROM Voto"
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset(mySql, dbOpenSnapshot)
 
 
    Me.txtResultado.Value = rst.Fields(0).Value
 
 
    rst.Close
    dbs.Close
    Set rst = Nothing
 
    Dim mySql2 As String
    Dim dbs2 As DAO.Database
    Dim rst2 As DAO.Recordset
 
    mySql2 = "SELECT Num_stand FROM Voto WHERE Total_Votos = (SELECT MAX(Total_Votos) FROM Voto)"
 
    Set dbs2 = CurrentDb
    Set rst2 = dbs.OpenRecordset(mySql2, dbOpenSnapshot)
 
    'Asignamos el valor al TextBox
    Me.txtNumStand.Value = rst2.Fields(0).Value
 
    'Cerramos el recordset y liberamos memoria
    rst2.Close
    dbs2.Close
    Set rst2 = Nothing
 
Me.Lista27.RowSource = "SELECT Num_Stand, Nombre, Cursos, Materia FROM Stand WHERE Num_Stand = '" & Me.txtNumStand.Value & "'"
 
End Sub

Y me tira este error: '3420' Error el objeto no es válido o no tiene valor.

Muchas gracias!!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Oscar Pérez

Consultas combinadas

Publicado por Oscar Pérez (77 intervenciones) el 16/11/2017 14:00:50
Buenas!

Ummmmm Para la primera y segunda parte podrías usar funciones de agregado de dominio, una vez las entiendas te solucionarán la vida programando, ¿Y eso qué es me dirás? jajaja pues ahora te lo explico.

La primera y la segunda parte podrías resumirla así:

1
2
Me.txtResultado.Value=DMax("Total_Votos","voto") 'Esto es lo mismo que lo que haces tú en 10 líneas XD
ME.txtNumStand.Value=Dlookup("Num_Stand","Voto","Total_Votos=" & Me.txtResultado.Value)

Además cuando busques el resultado de un recordset, puedes referenciar directamente el nombre del campo, es más intuitivo: rst!Total o rst.fields("Total") sin tener que hacerlo con el (0) que es el primero que devuelve, si tuvieras 50 campos podrías ir del 0 al 49 pero es más cómodo llamarlos por su nombre que así no te pierdes.

Y para la parte final, que creo que es la que te dá el error. Yo no usaría esos campos temporales que usas, podrías construir el sql uniendo las distintas funciones dmax y dlookup, yo suelo anidarlas dentro de la misma sentencia y así también te ahorras problemas. A no ser que tengas que utilizarlas para alguna otra cosa...

1
2
Me.Lista27.RowSource = "SELECT Num_Stand, Nombre, Cursos, Materia FROM Stand WHERE Num_Stand = '" & Dlookup("Num_Stand","Voto","Total_Votos=" & DMax("Total_Votos","voto"))
& "'"

Ya nos contarás... :)
Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consultas combinadas

Publicado por Anonimo (990 intervenciones) el 16/11/2017 16:49:31
Otro planteamiento para obtener el valor máximo o mínimo (o con un poco de picardía el decimotercero), consistiría en utilizar la ordenación por ese campo (ascendiente o descendiente según convenga) y tomar el primer registro (es lo que hacen 'de forma transparente' las funciones de dominio).

La ventaja de utilizar código, es que puede retornar el valor de cualquier campo sin que este sea el que impone el orden (las funciones de dominio tal como DMax devolverán el mayor valor localizado del campo que fuerza el orden), si se abre un recordset en modo lectura, se puede ordenar por cualquier campo (o por mas de un campo si se desea) y devolver datos asociados a ese valor (datos que no necesariamente han de intervenir en la ordenación).

Una SQL que devolvería solo un valor (se aplica 'TOP') y que se corresponde con el del campo 'Num_Stand' que tiene el mayor numero de votos:
1
Select TOP 1 Num_Stand FROM Stand Oder By Total_Votos DESC

Y si, quizás el numero de líneas sea alto, pero si se ponen las definiciones en la misma línea se ahorra 'espacio vertical', si se elimina la que define a la base de datos actual (es redundante) se ahorra algo mas y si se reutiliza el mismo recordset (cambiando su origen de datos) evitamos duplicar trabajos, dejando para el final (antes de salir de esa función o código) el cierre del recordset y la recuperación de espacio en memoria (esto no es indispensable hacerlo de firma individual para y por cada recordset abierto).

Hay tantas formas de llegar a mismo sitio como caminantes dispuestos a alcanzar el objetivo, este es uno mas y con respecto a la eficiencia ... se debería juzgar en la aplicación real.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consultas combinadas

Publicado por Nani (4 intervenciones) el 17/11/2017 00:39:21
Muchas gracias por ser tan atento en la respuesta!
La verdad es que no pude hacer funcionar tu solución... no sé qué haré mal .... Más arriba puse cómo pude resolverlo...
Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consultas combinadas

Publicado por Nani (4 intervenciones) el 17/11/2017 00:09:51
Muchas gracias Oscar!!!
Finalmente pude resolverlo de ésta manera:

1
2
3
4
5
6
7
8
9
Me.txtResultado.Value = DMax("Total_Votos", "voto")
Me.txtNumStand.Value = DLookup("Num_Stand", "Voto", "Total_Votos=" & Me.txtResultado.Value)
Me.Texto40.Value = DLookup("Nombre", "Stand", "Num_Stand=" & Me.txtNumStand.Value)
Me.Texto42.Value = DLookup("Cursos", "Stand", "Num_Stand=" & Me.txtNumStand.Value)
Me.Texto44.Value = DLookup("Materia", "Stand", "Num_Stand=" & Me.txtNumStand.Value)
 
Puesto que no pude completar la lista con ninguna de mis alternativas ni con las sugeridas:
Me.Lista27.RowSource = "SELECT Num_Stand, Nombre, Cursos, Materia FROM Stand WHERE Num_Stand = '" & Dlookup("Num_Stand","Voto","Total_Votos=" & DMax("Total_Votos","voto"))
& "'"

Si no te es mucha molestia, y se te ocurre alguna solución, me encantaría aprender la forma de cargar la selección en la lista...
Saludos y nuevamente gracias!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consultas combinadas

Publicado por Anonimo (990 intervenciones) el 17/11/2017 00:46:52
Creo que aun con el mayor numero de líneas que se necesitan para trabajar con recordset, seria infinitamente mas eficiente que esa reiterativa forma de utilizar las funciones de dominio.

Una cosa es que la función de dominio sea transparente y ahorre un par de líneas al programar y otra diferente creer en la utopía de que obtiene los datos por clarividencia.

Mas aun ... en la búsqueda de 'su mayor eficiencia' (para intentar compensar lo 'pesadas que son al ejecutarse') antes de nada las funciones de dominio intentan localizar o verificar si ese campo esta ordenado y si ese orden le es valido

Un programador (como 'padre de la criatura') se presupone que ese dato de su aplicación lo conoce y (si es un programador consecuente) va directamente a la opción mas idónea:

.- aplica el orden si existe
.- directamente crea el orden

Y ello sin perder el tiempo en 'dar vueltas a la manzana buscando aparcamiento'

Sobre 'cargar la lista' ... un par de detalles:
Lo primero es copiar esa SQL en el diseñador grafico de consultas de Access (en su 'Vista SQL') y verificar que funciona como se espera.

Lo segundo (y si lo anterior funciona según lo esperado) verificar que ese objeto cuadro de lista (en su diseño) tiene la opción correcta de tipo de datos (tabla o consulta) y si tiene los cuatro campos para mostrar o contener los cuatro datos que devuelve la consulta.

---por curiosidad :
¿esta contemplado el que exista mas de un Stand con los mismos votos? ... seria injusto para el (o los) otros esa situación, porque DLookup devuelve siempre 'el primero que encuentra' de los que cumplan las condiciones (y ese 'primero' acostumbra a ser el mismo siempre)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consultas combinadas

Publicado por Anonimo (990 intervenciones) el 17/11/2017 01:12:53
Por cierto, si queremos una sola línea y sin funciones de dominio o recordset, se puede hacer asi:

1
Me.Lista27.RowSource = "SELECT Num_Stand, Nombre, Cursos, Materia FROM Stand WHERE Num_Stand = (Select TOP 1 Num_Stand FROM Stand Oder By Total_Votos DESC)"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consultas combinadas

Publicado por Nani (4 intervenciones) el 17/11/2017 01:44:15
Coincido en tu idea de programación... verdaderamente necesitaba resolver con urgencia ese problema... contemplé la posibilidad de que se repita más de un stand con la misma cantidad de votos... como dije antes, me urgía resolverlo, ya con más tiempo me dedicaré a estudiarlo concienzudamente.
Saludos y gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Oscar Pérez

Consultas combinadas

Publicado por Oscar Pérez (77 intervenciones) el 17/11/2017 10:29:36
Buenas!

Asegurate de que el tipo de origen de la fila de Lista27 debería ser tabla/consulta, ya que de lo contrario no te dejará actualizar el rowsource desde código y luego en formato ajusta el número de columnas y el ancho de cada una a los valores que devuelve, que deberían ser 4 (Num_Stand, Nombre, Cursos, Materia ) y encabezados de columna, sí.

Si quieres puedes adjuntarnos la BBDD para que podamos investigar, ya que estas cosas son mucho más fáciles y rápidas de ver teniéndolo delante... :)

Saludos!
Óscar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad