lunes, 22 de diciembre de 2025

Evaluación


Automatización de la evaluación

Input incremental



La prueba PLON-R. Fonología es un buen ejemplo (y motivo) para que nos planteemos cómo resolver la presentación de los reactivos cuando ésta requiere (en este caso por procedimiento estandarizado) un ajuste en función de la edad del niño. Aquí el inicio es común a todas las edades, pero la finalización está en función de la edad, es variable en número de reactivos e incremental.

Es posible abordar la automatización de la presentación de este tipo de pruebas desde diferentes enfoque, unos más complejos, otros más simples, aunque a veces la simplicidad resulta serlo menso de lo que parece.

Empecemos por una posible solución, que se concreta como distintas opciones de presentación, adaptadas a priori a las exigencias de cada edad: una pantalla para tres años, otra para cuatro y así hasta la pantalla de seis años, que es la edad máxima. En total disponemos de cuatro posibilidades y sólo mostraremos aquella que se ajuste al contenido de la variable condicionante (la edad).

En OOo Basic esta es la forma en que se concreta el procedimiento que lo hace posible, empezando por el código de acceso a la pantalla (hoja) de cada edad, inicialmente oculta:

Sub IrCuestionario

'Variables

Dim oHoja As Object, oCelda As Object

Dim Edad As String

Dim al_edad As Integer

'Acceso al valor de edad

oHoja = ThisComponent.getSheets().getByName("Resultados")

oCelda = oHoja.getCellRangeByName("B4")

Edad = oCelda.GetString()

al_edad = CInt(Edad)

'Acceso al cuestionario en función de la edad

If al_edad = 3 Then

vHoja(1,True)

PasoHoja (2)

ElseIf al_edad = 4 Then

vHoja(2,True)

PasoHoja (3)

ElseIf al_edad = 5 Then

vHoja(3,True)

PasoHoja (4)

ElseIf al_edad >= 6 Then

vHoja(4,True)

PasoHoja (5)

End If

vHoja(0,False)

End Sub

Primero accedemos a la celda que contiene el dato de edad (Edad = oCelda.GetString()) y después visibilizamos esa hoja (vHoja(1,True)) mediante un condicional (If al_edad = 3 Then) y nos posicionamos en ella (PasoHoja (2)), a la vez que ocultamos la hoja de procedencia (vHoja(0,False)) para que sólo quede visible la pantalla que nos interesa.

Después de resuelta esta primera fase, y dado que el diseño del DocAp lo define como instrumento para que el OE registre los resultados, corresponde ahora copiarlos en su ubicación "definitiva" y borrar los datos introducidos para que no interfieran con un uso futuro. Además deberemos devolver el protagonismo a la hoja de inicio y ocultar la que acabamos de emplear.

De todo ello se encargan los siguientes script:

Sub Puntuar_3a

Dim elem As Integer
Dim edad As String

'Elementos en función de la edad
elem = 20
'Llamada a función de captura de edad
edad =  al_edad()
'Llamar a la subrutina Puntuar()
Puntuar(elem,edad)

End Sub

Function al_edad () As string

Dim oHoja As Object, oCelda As Object
Dim i As Integer
Dim edad As String

'Acceso a Resultados para capturar la edad
oHoja = ThisComponent.getSheets().getByName("Resultados")
oCelda = oHoja.getCellRangeByName("B4")
edad = oCelda.getString

al_edad = edad

End Function


Sub Puntuar (n_i As Integer, edad As String)

Dim oHoja As Object, oCelda As Object

Dim i As Integer, edad_n As Integer, nh As Integer

Dim mDatos(n_i) As Integer

'Canalización hacia la página de registro en función de la edad

edad_n = CInt(edad)

If edad_n < 6 Then

oHoja = ThisComponent.getSheets().getByName("Lista" & edad & "a")

ElseIf edad_n >= 6 Then

oHoja = ThisComponent.getSheets().getByName("Lista6a")

End If

'Paso de datos a matriz de resultados

For i = 0 To UBound(mDatos())

oCelda = oHoja.getCellRangeByName("E" & i+4)

mDatos(i) = oCelda.getValue

Next

'Copia de los datos a la hoja Resultados

oHoja = ThisComponent.getSheets().getByName("Resultados")

'Copia de los datos en la hoja

For i = 0 To UBound(mDatos())

oCelda = oHoja.getCellRangeByName("B" & i+6)

oCelda.setValue(mDatos(i))

Next

'Identificar la hoja de datos a ocultar

If edad_n = 3 Then

nh = 1

ElseIf edad_n = 4 Then

nh = 2

ElseIf edad_n = 5 Then

nh = 3

ElseIf edad_n >= 6 Then

nh = 4

End If

'Movimiento a la hoja DatosId

vHoja(0,True)

PasoHoja(0)

vHoja(nh,False) 'Oculta la hoja de datos que corresponde según la edad del sujeto

'Llamar a la subrutina para borrar los datos del cuestionario de puntuación

BorrarPtos(edad_n)

End Sub

El script principal (Puntuar_3a) se repite tantas veces como periodos etarios tiene el test (cuatro) y aparentemente, como puedes ver, es muy simple: en realidad se limita a entregar un dato (elem = 20) y a solicitar otro a una función (edad =  al_edad()), para entregar ambos como parámetros a una subrutina (Puntuar(elem,edad)), que es la que se encarga de la mayor parte del trabajo. Esto es así porque la subrutina es, en realidad, la abstracción de lo que podría contener el script principal si fuera único, si sólo hubiera un bloque de edad y no cuatro.

Mientras que la función al_edad() es muy simple (se limita a acceder a la celda que contiene la edad del alumno para entregársela al script), la subrutina es compleja:

  • Se sitúa en la página empleada para recoger los datos
  • Captura esos datos
  • Accede a la página de almacenamiento de datos y los copia
  • Visualiza la hoja principal y desplaza el foco hacia ella
  • Identifica la hoja de registro que se debe ocultar
  • La oculta esa hoja de registro
  • Llama a la subrutina de borrado del contenido de la hoja de registro
Esta nueva subrutina de borrado recibe como parámetro el dato de la edad del sujeto, ya que lo necesita para identificar qué hoja debe borrar y cuantas celdas debe recorrer.

Sub BorrarPtos(edad As Integer)

Dim oHoja As Object, oCelda As Object

Dim i As Integer, n As Integer

Dim IdPag As String

'Ir a la página

If edad = 3 Then

IdPag = "Lista3a"

n = 20

ElseIf edad = 4 Then

IdPag = "Lista4a"

n = 43

ElseIf edad = 5 Then

IdPag = "Lista5a"

n = 55

ElseIf edad >= 6 Then

IdPag = "Lista6a"

n = 60

End If

'Nos posicionamos en la hoja y recorremos las celdas para borrar el contenido

oHoja = ThisComponent.getSheets().getByName(Idpag)

For i = 0 To n

oCelda = oHoja.getCellRangeByName("E" & i+4)

oCelda.setString("")

Next

End Sub

Se selecciona la hoja sobre la que actual mediante una estructura condicional y borrar su contenido mediante un bucle que lo recorre. El límite superior de ese recorrido viene definido también por la edad del sujeto, ya que es esta la que determina el número de reactivos que se aplican y, por tanto, de posibles celdas en las que se recoge la puntuación.

No hay comentarios:

Publicar un comentario

Comenta esta entrada