BD de colegio y en los promedios de notas quiero determinar su orden de mérito,que se repita la secuen si son iguales(1,2,3,3,4,

Tengo una Base de Datos de Colegio (Access) y quiero determinar un orden de mérito en un informe que ya está listo, es decir, el más alto promedio hasta el menor promedio, pero hay promedios que son iguales y quiero que en la secuencia coloque el mismo número o posición (1,2,3,4,4 (si se repite) y así sucesivamente, del mayor promedio hasta el menor promedio.

Respuesta
1

Si puede subir una imagen facilitaria la respuesta para no entrar en imagenes y texto innecesarios.

¡Gracias! 

La secuencia a la cual me refiero

Si puede envíeme la base de datos con datos ficticios a [email protected] y le colaboro

Entiendo que necesita es hacer una consulta. Al no recibir sus tablas le preparé este ejemplo, consta de 1 tabla 1 consulta y 1 función. Es preferible hacerlo con valores estáticos, lo recomiendo NO utilizar Dmin() y Dmax() porque presentan menor rendimiento en tablas de gran tamaño.

TABLA

DISEÑO CONSULTA

Observe que para la columna "ORDEN" utilizo la función RT_Tab1()

RESULTADO DE LA CONSULTA

FUNCIÓN - Copie esta función en un módulo

Function RT_Tab1(id As Double, seccion As Long) As Long
Static NumeroGrupo As Long
Static IdOld As Double
'Función para numerar grupos
'Ejemplo de llamada:
'                   ngrupo: RT_Tab1([idseccion];[idseccion])
'                   En este caso numera las secciones
   'Adaptada para respuesta TodoExpertos
   'Eduardo Pérez Fernánez
   '22/09/2022
     'controlamos si pertenece al mismo grupo que el anterior
     If id <> IdOld Or _
          seccion <> seccion Then
             NumeroGrupo = NumeroGrupo + 1
     End If
     IdOld = id
     RT_Tab1 = NumeroGrupo
End Function

Si quiere DESCENDENTE cambie Ascendente por este en la consulta

Cuando se ejecuta la consulta con este módulo por primera vez si da un orden, pero si se ejecuta nuevamente, cambia el número de ordenamiento.

Tiene razón estoy buscando una solución. Creo que si cierra el formulario y lo vuelve abrir no hay problema, pero esa no es la idea.

2 respuestas más de otros expertos

Respuesta
1

Con esto completo todo el programa.

Respuesta
1

No necesitas calentarte la cabeza. Si tengo una tabla con los nombres de los alumnos y sus promedios, sin ordenar

El campo Orden sólo sirve para los cálculos, nada más. Con ella construyo un formulario donde el control Orden está oculto.

Cuando lo abro

En el momento que pulso el botón

El código del botón es

Private Sub Comando9_Click()
DoCmd.SetWarnings False
Me.RecordSource = "select * from alumnos order by promedio desc"
Dim i As Byte
DoCmd.GoToRecord , , acFirst
For i = 1 To Me.Recordset.RecordCount
Orden = i
DoCmd.GoToRecord , , acNext
Next
DoCmd.GoToRecord , , acFirst
Posicion = 1
DoCmd.GoToRecord , , acNext
For i = 2 To Me.Recordset.RecordCount
If Promedio < DMin("promedio", "alumnos", "orden <" & Me.Orden & "") Then
Posicion = DMax("posicion", "alumnos", "orden <" & Me.Orden & "") + 1
ElseIf Promedio = DMin("promedio", "alumnos", "orden < " & Me.Orden & "") Then
Posicion = DMax("posicion", "alumnos", "orden <" & Me.Orden & "")
End If
DoCmd.GoToRecord , , acNext
Next
End Sub

Parece complicado pero te explico

- Lo de Docmd. Setwarnings es para que no aparezca la maldita ventanita de VA a...

- Luego ordena el formulario por el promedio descendente

. Se va al primer registro y en Orden le asigna un 1, se podría usar me.currentrecord pero...

- Se va al segundo y le asigna un 2, y así hasta el último. Este campo Orden lo uso para luego hacer cálculos.

- Una vez terminado se vuelve al primer registro y en Posición le pone un 1 ( alguien tiene que ser el primero, cum laude).

- De ahí se va al segundo y compara, si es menor que el anterior le asigna a la posición la posición anterior +1, si es igual al anterior a Posición le asigna el mismo valor que el registro anterior.

De ahí se va al tercero. Si el promedio es menor que el anterior le asigna un 3. Si es igual le asigna la misma posición que el anterior

Y así hasta abajo

Así se ejecuta perfectamente, pero quiero que se ejecute desde una consulta.

¿Me podría ayudar en ese aspecto?

Lo siento, no te puedo ayudar. Personalmente odio las consultas por:

1º Para que una consulta "funcione" primero tienes que haber rellenado una tabla. Entonces ¿para que perder el tiempo abriendo una consulta cuando en el mismo formulario donde voy a pasar datos a una tabla puedo calcularlo.?

2º Las consultas fueron diseñadas para operaciones básicas, por ejemplo, ver cuantos clientes tengo de Alemania, cuéntame cuantas personas tienen el pelo rubio, etc. Cuando se quiere hacer algo un poco más complicado se recurre al VB.

3º Y más importante. Opino que el lenguaje SQL en que están hechas las consultas es infinitamente menos versátil que el lenguaje VB en que está hecho todo el entorno Windows. Sólo tienes que ver que yo puedo decirle que vaya al registro x, pero en una consulta no.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas