jueves, 2 de mayo de 2024

Procedimientos. Textos.

Campos de opción

Considero campos de opción cuando en una tabla se presentan varios campos entre los que hay que seleccionar uno sólo como propuesta o identificador de la opción seleccionada. Tanto en el dictamen como en el informe podemos encontrar ejemplos de estos campos.



Los campos de opción de los documentos prescriptivos son reminiscencia y ejemplo del origen de estos documentos como recursos para cumplimentar manualmente o mediante el procesador de texto. En ese contexto suponen un avance respecto a la mera escritura de la opción y sirven además para acotar las posibles respuestas. Desde la perspectiva de la automatización de estos documentos suponen una complicación totalmente innecesaria, pero dado el carácter prescriptivo de los documentos-modelo, tenemos que considerarlos tal y como se presentan.

Analicemos ahora cómo se concretan estos campos en el dictamen...


... y en el informe (1)

Se puede considerar que todos ellos facilitan el uso "manual" de ambos documentos, dándoles una apariencia de formulario (más acentuada en el dictamen, que es realmente un formulario), pero otras opciones menos "vistosas" pero más funcionales podría resultar alternativas válidas. Por ejemplo, en el caso del apartado 2 del informe sería suficiente con completar la frase "Está motivado por:" con el texto que sigue a cualquiera de esas cuatro opciones. Algo similar se podría plantear para los apartados 3 y 4 del dictamen (2).

Dado que se presentan como opciones, analicemos el procedimiento de respuesta que se espera, tomando como ejemplo el apartado 3 del dictamen:
  • Dado que el dictamen es documento prescriptivo únicamente para casos de necesidades educativas especiales (NEE), el apartado se expresa mediante una tabla bastante compleja en la que se recoge la casuística NEE  tal y como está establecida normativamente por la Consejería de Educación.
  • Cada una de las categoría se asocia a una "casilla", de modo que "marcarla" (escribir una "x") implica seleccionar la opción que se considera responde a las características del alumno.
  • Se espera que el OE "marque" una y sólo una categoría.
  • Se supone también que esta forma gráfica facilita la identificación de la opción seleccionada.
De igual modo, pero se deberán cumplimentar los apartados 2 y 4 del dictamen y 2 del informe (3).

La forma de automatizar la cumplimentación de estos apartados según el comportamiento esperado podría ser la siguiente (4):

Dim oMarcador As Object
Dim sOpcion As String

sOpcion = InputBox ("Selecciona el motivo del informe" & Chr(13) &_

"A. Cambio de centro" & Chr(13) &_
"B. Cambio de etapa" & Chr(13) &_
"C. Nueva escolarización" & Chr(13) &_
"D. Revisión-Modificación","CIRCUNSTANCIAS QUE MOTIVAN EL INFORME", "A-B-C-D")

Select case sOpcion

Case "A"
oMarcador = ThisComponent.getBookmarks().getByName("mcr0")
 Case "B"
oMarcador = ThisComponent.getBookmarks().getByName("mcr1")
 Case "C"
oMarcador = ThisComponent.getBookmarks().getByName("mcr2")
 Case "D"
oMarcador = ThisComponent.getBookmarks().getByName("mcr3")

End Select

 oMarcador.getAnchor.setString("X") 

  • En este script se presupone que previamente se han establecido  cuatro marcadores en el documento, uno en cada una de las celdas (cuadrados) que anteceden a la causa y en el orden que permite hacer coincidir la opción A con el marcador mcr0, la B con mcr1, C con mcr2 y D con mcr3.
  • La variable sOpcion permite que el usuario identifique el motivo del informe según la causa que se expresa en la función InputBox()
  • El formato complejo del InputBox simula una lista de opciones, cuyo identificador (v.g. A) se expresa en el enunciado y se repite como opción de respuesta.
  • Esas opciones de respuesta se incluyen como tercer parámetro en la función InputBox(), debiendo el usuario eliminar las que no correspondan. Se espera que no se comentan errores en el manejo de estos datos (5)
  • Se utiliza el condicional múltiple Select case por ajustarse mejor a la demanda del algoritmo, pero podría usarse también una estructura If...ElseIf
  • La condicionalidad se aplica a la asignación del objeto marcador a la variable oMarcador. De este modo queda condicionado el marcador que será utilizado por la instrucción oMarcador.getAnchor.setString("X") para establecer la marca ("X"
Podemos hacer más legible el código introduciendo una variable para asignar el nombre del marcador (sMarca) de modo que el procedimiento de escritura se mantenga independiente del condicional Select case, resultando entonces el siguiente script:

Dim oMarcador As Object
Dim sOpcion As String, sMarca As String

sOpcion = InputBox ("Selecciona el motivo del informe" & Chr(13) &_

"A. Cambio de centro" & Chr(13) &_
"B. Cambio de etapa" & Chr(13) &_
"C. Nueva escolarización" & Chr(13) &_
"D. Revisión-Modificación","CIRCUNSTANCIAS QUE MOTIVAN EL INFORME", "A-B-C-D")

Select case sOpcion

Case "A"
sMarca = "mcr0"
 Case "B"
sMarca = "mcr1"
 Case "C"
sMarca= "mcr2"
 Case "D"
sMarca = "mcr3"

End Select

oMarcador = ThisComponent.getBookmarks().getByName(sMarca)
oMarcador.getAnchor.setString("X") 

Y también podemos hacer aun alguna mejora en nuestro script, pero el problema de base sigue siendo el mismo: para evitar errores dependemos únicamente de la habilidad del usuario. Si queremos evitar esta dependencia (que en este supuesto no es muy grave) deberemos reformular el script aplicando lo ya dicho en el anterior: cuando estemos ante una opción que se puede expresar en términos booleanos (V/F) la mejor solución es utilizar la función MsgBox() (6)

Para ello deberemos:
  • Crear las mismas variables que propongo en el script anterior
  • Crear una matriz con el contenidos de las opciones de respuesta que se expresan en la tabla (mOpciones(3)) y otra (mMarcadores(3)) con los identificadores de los marcadores. Asignar a ambos su contenido.
  • Crear una variable contador para usar en un bucle (i As Integer)
  • Y otra (iSelec As Integer) para capturar el valor del botón comando pulsado en el MsgBox()
  • Recorrer con un bucle For la matriz mOpciones()
  • Anidar al bucle un condicional If simple que contenga tanto la asignación del valor de la matriz mMarcadores() como la sentencia de salida del bucle en caso de que se cumpla la condición (valor 6: If iSelec = 6 Then) de la función MsgBox(). En caso contrario sigue el recorrido de las opciones (Motivos del informe)
  • Mantener las instrucciones para la escritura en el documento ("x" en el marcador que corresponda según elección del usuario)
Dim oMarcador As Object
Dim mOpciones(3) As String, mMarcadores(3) As String
Dim sMarca As String
Dim iSelec As Integer, i As Integer

mOpciones(0) = "Cambio de centro"
mOpciones(1) = "Cambio de etapa"
mOpciones(2) = "Nueva escolarización"
mOpciones(3) = "Revisión-Modificación"

mMarcadores = Array("mcr0","mcr1", "mcr2","mcr3") (7)

For i = LBound(mOpciones()) To UBound(mOpciones())

iSelec= MsgBox(mOpciones(i),4,,"CIRCUNSTANCIAS QUE MOTIVAN EL INFORME")
If iSelec = 6 Then
sMarca =  mMarcadores(i)
Exit For
End If
Next

oMarcador = ThisComponent.getBookmarks().getByName(sMarca)
oMarcador.getAnchor.setString("X") 
En este caso dejo [acceso al documento de ejemplo] para facilitarte el aprendizaje.

NOTAS

(1) También el dictamen tiene un campo de opción similar al de informe, pero he referido mostrar las tablas de los apartados 3 y 4 para no repetir ejemplos. 
 
(2) Esto permitiría tratarlos como campos simples, aunque serían necesarias instrucciones específicas que detallaran los contenidos que en la forma elegida se identifican como opciones.

(3) Si no fuera por las dificultad que conlleva la ubicación del puntero en la casilla correspondiente, y más en el contexto del conjunto del documento, se podría considerar que esta forma gráfica es una ayuda que se debería agradecer.

(4) Para variar, tomaré como ejemplo el apartado 2 del informe. Su sencillez facilita que el script sea relativamente breve, lo que redunda en una menor extensión de esta explicación. Pero el mismo procedimiento es aplicable a cualquiera de estas tablas, con las debidas modificaciones, claro está.

(5) En ese supuesto no se ofrece alternativa al error, lo cual no deja de ser optimista. Dado que se supone que el usuario es quien crea el docap o alguien directamente instruido por él, esta suposición optimista parece ser suficientemente realista.

(6) Realmente en este caso es dudoso que realmente sea mejor solución, pero interesa conocer cómo se puede plantear esta solución, ya que en otros casos, con tablas más complejas, como es el caso de la tabla 3 del dictamen, realmente puede ser mejor opción.

(7) Opto por esta solución de asignación de contenido para ejemplificarla, aunque también podría haber empleado la asignación individual, como en la matriz mOpciones(0)mMarcadores se presta al uso de Array() por la brevedad de las expresiones que contiene.

No hay comentarios:

Publicar un comentario

Comenta esta entrada