Buscar en este blog
lunes, 26 de mayo de 2025
Becas NEAE
domingo, 25 de mayo de 2025
Interfaz. OOo Basic.
Escritura de datos en tabla
- Acceder al documento portador de tablas.
- Establecer los marcadores en las celdas y/o en las posiciones del documento (Insertar | Marcador)
- Crear el módulo para escribir el script (Herramientas | Macros | Organizar Macros | Basic).
- Desarrollar el script.
- Implementar un comando en el documento para facilitar el acceso al script
Dim mDatos(4) As String, mMarcas() As String
Dim oMarca As Object
Dim i As Integer
mDatos(0) = InputBox("Fecha de la actuación:")
mDatos(1) = InputBox("Nombre del Servicio de Orientación:")
mDatos(2) = InputBox("Nombre del Orientador o de la Orientadora:")
mDatos(3) = InputBox("Nota:")
mMarcas() = Array ("m0","m1","m2","m3")
For i = 0 To UBound(mMarcas())
oMarca = ThisComponent.getBookmarks().getByName(mMarcas(i))
oMarca.getAnchor.setString(mDatos(i))
Next
Este script contiene dos matrices para facilitar el posterior desarrollo del script. El contenidos de ambas queda claro en el script.
Aunque en el planteamiento más simple no sería necesario, un script mínimamente realista los requiere. Gracias a ellas, al final del script es posible automatizar eficientemente la escritura de los datos en el documento mediante un bucle (For i = 0 To UBound(mMarcas())).
El uso de la función InputBox() es la herramienta que facilita la interacción con el usuario, la cual se basa en el comando inserto en el documento (Cumplimentar datos).
Es clave para el correcto funcionamiento del script el uso de la variable de objeto oMarca, que se asocia a las funciones que nos dan acceso a los objetos marcadores insertados en el documento en el punto 2 del procedimiento. Este proceso, que se desarrolla dentro del bucle comentado antes, lo hace en dos momentos:
- Acceso al marcador (oMarca = ThisComponent.getBookmarks().getByName(mMarcas(i)))
- Escritura de datos (oMarca.getAnchor.setString(mDatos(i)))
Es importante finalizar todo este trabajo creando dos documentos: uno en formato odt, como documento-base, y otro en formato plantilla (ott) que será el que utilicemos en la práctica. El documento-base queda como reserva para posibles modificaciones o mejoras, además de para a posible pérdida del documento plantilla.
Documentos. Desde este enlace puedes descargar la versión odt. Antes de hacer nada, te recomiendo que, una vez descargado, generes una copia como plantilla (Archivo | Guardar como).
martes, 3 de diciembre de 2024
Textos. Automatización.
Documentos creados mediante script OOo Basic
Además de dar este paso, para mejorar la funcionalidad de nuestros docap puede ser necesario dar otros dos más: uno para facilitar la creación de interfaces basadas en formularios y otro para mejorar el posicionamiento de los contenidos en el documento.
jueves, 2 de mayo de 2024
Interfaz. OOo Basic
Campos de opción
- 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.
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")
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")
- 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 Sí (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 StringDim sMarca As StringDim iSelec As Integer, i As IntegermOpciones(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 ThensMarca = mMarcadores(i)Exit ForEnd IfNextoMarcador = ThisComponent.getBookmarks().getByName(sMarca)oMarcador.getAnchor.setString("X")
Interfaz. OOo Basic.
Campos condicionados
Los campos del apartado 5 del dictamen (también los del 6. Recursos de apoyo especializado) son de tipo condicionado, ya que el campo de la columna Sí/No condiciona su correspondiente de la columna Breve descripción: si contestamos Sí en el primero deberemos incluir información en el segundo; en caso contrario el campo asociado quedará vacío (1)
En este caso se trata de una tabla en la que se registra la presencia vs. ausencia de Medidas de Atención a la Diversidad (MAD). Su funcionamiento es igual al de la tabla anterior (dictamen): si la respuesta al ítem es Sí, se deberá aportar información en el campo asociado de la columna 4. En caso contrario (No) su campo asociado quedará vacío.
Sub DictamenMod2
Dim oMarcador As Object
Dim sAjustesOrganizativosA As String, sAjustesOrganizativosB As String
sAjustesOrganizativosA = InputBox("¿Son necesarios ajustes organizativos y metodológicos?","DICTAMEN. 5. Adapciones que precisa","Sí-No")
If sAjustesOrganizativosA= "Sí" Then
sAjustesOrganizativosB = InputBox("Describe las medidas organizativas, metodolóogicas y curriculares de acceso que consideras necesario.","DICTAMEN. 5. Adaptaciones que precisa")
ElseIf sAjustesOrganizativosA= "Sí" Then
sAjustesOrganizativosB = ""
Else
MsgBox("No has dado respuesta a lo demandado en el campo Ajustes organizativos del aparado 5 del DICTAMEN o la respuesta no se acepta como válida")
End If
oMarcador = ThisComponent.getBookmarks().getByName("mcr0")
oMarcador.getAnchor.setString(sAjustesOrganizativosA)
oMarcador = ThisComponent.getBookmarks().getByName("mcr1")
oMarcador.getAnchor.setString(sAjustesOrganizativosB)
End Sub
- Necesitamos crear la misma estructura que usamos en el caso de campos simples, incluyendo la creación de marcadores en el documento.
- Además de la variable object (oMarcador) que nos permite acceder a los objetos marcador del documento (mcr0 y mcr1) Declaramos dos variables de contenido por aspecto: una para el campo condicionante (sAjustesOrganizativosA ) y otra para el condicionado (sAjustesOrganizativosB):
Dim oMarcador As Object
Dim sAjustesOrganizativosA As String, sAjustesOrganizativosB As String
- Dar contenido a la variable condicionante se ajusta al modelo de campo básico, por lo que se le puede tratar mediante la misma fórmula...
sAjustesOrganizativosA = InputBox("¿Son necesarios ajustes organizativos y metodológicos?","DICTAMEN. 5. Adapciones que precisa","Sí-No")
... pero esto genera un posible error por omisión (respuesta vacía) o por separarse (en forma o en contenido) de las dos únicas opciones válidas (Sí/No). Para controlar estos posibles errores se pueden usar diferentes opciones y aunque estos errores sean excepcionales, su solución no es simple (2).
Otra posible formulación pasa por emplear la función MsgBox(), lo que nos obliga, a su vez una nueva variable Integer (Dim iR as Integer) a asociar a la función MsgBox(). Esta opción evita posibles errores por parte del usuario, aunque obliga también a modificar la estructura condicional, condicionando un script alternativo:
Dim oMarcador As Object
Dim sAjustesOrganizativosA As String, sAjustesOrganizativosB As String
Dim iR As Integer
iR = MsgBox ("¿Son necesarios ajustes organizativos y metodológicos?",4,"DICTAMEN. 5. Adaptaciones que precisa")
If iR = 6 Then
sAjustesOrganizativosA = "Sí"
sAjustesOrganizativosB = InputBox("Describe las medidas organizativas, metodolóogicas y curriculares de acceso que consideras necesario.","DICTAMEN. 5. Adapciones que precisa")
Else
sAjustesOrganizativosA = "No"
sAjustesOrganizativosB = ""
End If
Como podemos comprobar, esta segunda opción simplifica el script y lo hace más resisten a errores de uso (en realidad los reduce a cero), por lo que es preferible al primer script (3).
- Finalmente, la escritura en el texto se mantiene en la formulación ya explicada en la entrada anterior sobre campos simples, aunque ahora son necesarias dos fases de escritura, que aquí se resuelven meramente por repetición del mismo procedimiento (4):
oMarcador = ThisComponent.getBookmarks().getByName("mcr0")
oMarcador.getAnchor.setString(sAjustesOrganizativosA)
oMarcador = ThisComponent.getBookmarks().getByName("mcr1")
oMarcador.getAnchor.setString(sAjustesOrganizativosB)
miércoles, 1 de mayo de 2024
Interfaz. OOo Basic
Tablas. Campos simples.
- En el documento-modelo (dictamen convertido a formato Writer) me posiciono en el punto en el que deseo introducir el dato, por ejemplo, Tabla2, tras Nombre y apellidos (4)
- Sitúo el marcador (Insertar | Marcador) que denomino, por ejemplo, mcr4.
- Dando por creado Module1 desde el IDE con lo que esto supone, creo el script (5)
- Declaro las dos variables necesarias para el funcionamiento del script y los procedimientos de asignación de datos. En el caso de la variable sAlumno utilizando la función InputBox()
Sub DictamenMod1
Dim oMarcador As Object
Dim sAlumno As String
sAlumno = InputBox("Nombre y apellidos del alumno/a","DICTAMEN")
oMarcador = ThisComponent.getBookmarks().getByName("mcr4")
oMarcador.getAnchor.setString(sAlumno)
End Sub
- Mientras que la primera variable (oMarcador) es de tipo objeto, la segunda (sAlumno) es de tipo string. Podría ser de cualquier otro tipo (Integer, por ejemplo), pero el trabajo sobre un texto hace que sea tratada como cadena de texto en lo que al proceso de escritura se refiere.
- La instrucción sAlumno = InputBox("Nombre y apellidos del alumno/a","DICTAMEN") es de sobra conocida, por lo que no necesita más explicación: como sabemos, permite dotar de contenido a la variable de forma interactiva.
- Mediante la instrucción de asignación...
oMarcador = ThisComponent.getBookmarks().getByName("mcr4")
... estamos accediendo mediante OOo Basic al objeto documento activo (ThisComponent), a la colección de objetos marcador (.getBookmarks()) y al marcador identificado por su nombre (.getByName("mcr4")). Para ello, como ya vimos, es necesario que tal objeto haya sido creado previamente en el documento.
- Finalmente, la instrucción oMarcador.getAnchor.setString(sAlumno) asigna el texto referenciado en la variable sAlumno (el que previamente haya introducido el usuario mediante InputBox()) en el objeto referenciado por la variable oMarcador, haciendo uso del método .getAnchor y del sub-método o función .setString() asociado al anterior (6)
NOTAS










