domingo, 27 de julio de 2025

Textos. Procedimientos

Segunda fase del procedimiento: el DocAp


Hasta este momento he estado trabajando sobre el texto-base, desarrollando los procedimientos que facilitan su estructuración en segmentos, la identificación de las categorías funcionales a las que pertenecen estos segmentos y la construcción de un cuestionario que nos ayude en la entrada de datos. Con todo ello resuelto (1), corresponde ahora formular el script-DocAp, esto es, el que nos permite sacar provecho del trabajo realizado y automatizar la elaboración del documento.


Si el planteamiento del proceso en dos fases es definitorio del modelo de automatización que ensayamos en este ejemplo, el script que voy a presentar en esta entrada es su culminación. Funcionalmente cumple el papel de los script que sirvieron de soporte a un DocAp, de ahí que mantenga para él esa denominación.


Como DocAp que disponible desde el cmd que se ve en la imagen, en la hoja inicial del soporte-Calc (TextoBase), que activa el script NuevoInforme que muestro a continuación.

Sub NuevoInforme

'Acceso a la hoja con los datos (MatrizBase)

Dim oHojaDatos As Object
oHojaDatos = ThisComponent.getSheets().getByName("MatrizBase")

'Cargo datos en matrices y variables de trabajo
Dim mTextos() As String, mCateg() As String, mPreg() As String
Dim i As Integer, n As Integer
Dim oCelda As Object
Dim Conten As String

'Calculo el número de elementos de la matriz-base
For i = 0 To 100
oCelda =  oHojaDatos.getCellRangeByName("B" & i+1)
Conten = oCelda.getString()
If Conten = "" Then
n = i+1
Exit For
End If
Next

'Dimensiono las matrices
ReDim mTextos(n)
ReDim mCateg(n)
ReDim mPreg(n)

'Capturo el contenido de las columnas de datos
For i = LBound(mTextos()) To UBound (mTextos())
oCelda = oHojaDatos.getCellRangeByName( "A" & i+1 )
mTextos(i) = oCelda.getString()
mTextos(i) = Trim(mTextos(i))
Next

For i = LBound(mCateg()) To UBound (mCateg())
oCelda = oHojaDatos.getCellRangeByName( "B" & i+1 )
mCateg(i) = oCelda.getString()
Next

For i = LBound(mPreg()) To UBound (mPreg())
oCelda = oHojaDatos.getCellRangeByName( "C" & i+1 )
mPreg(i) = oCelda.getString()
Next

'Modifico el contenido de las vi del texto a generar
For i = LBound(mTextos()) To UBound (mTextos())
If mCateg(i) = "vi" Then
mTextos(i) = InputBox (mPreg(i),"Datos actuales",mTextos(i))
End If
Next

'Capturo la posición de la vi-condición de los datos vg
Dim post As String, pos As Integer
Dim genOr As String
oHojaDatos = ThisComponent.getSheets().getByName("CondicGen")
oCelda = oHojaDatos.getCellRangeByName("B1")
post = oCelda.getString()
pos = CInt(post)

'Capturo el género de la vi-condición original
oCelda = oHojaDatos.getCellRangeByName("B2")
genOr = oCelda.getString()

'Establezco el genero del nuevo alumno en base a la posición en la mTextos() de la vi
Dim AlNuevo As String
AlNuevo = mTextos(pos)

'Busco el género del nuevo alumno en la BDNombres 
Dim GenAlNuevo As String
GenAlNuevo = GeneroNombre(AlNuevo)

'Comparo el género de ambos nombres
Dim ComparaGen As Boolean
If genOr = GenAlNuevo Then
ComparaGen = True
Else
ComparaGen = False
End If

'En caso de discrepancia de género modifico los datos de las vg
Dim NuevoTermino As String
If ComparaGen = False Then
For i = LBound(mCateg()) To UBound (mCateg())
If mCateg(i) = "vg" Then
NuevoTermino = Genero(mTextos(i))
mTextos(i) = NuevoTermino
End If
Next
End If

'Recompongo el texto a partir de la matriz mTextos()
Dim NuevoTexto As String

For i = LBound(mTextos()) To UBound (mTextos())
If i = 0 Then
NuevoTexto = mTextos(i)
Else
If mCateg(i) = "sl" Then
NuevoTexto = (NuevoTexto & Chr(13) & Chr(13))
ElseIf mCateg(i) = "sp" Then
NuevoTexto = (NuevoTexto & mTextos(i))
Else
NuevoTexto = (NuevoTexto & " " & mTextos(i))
End If
End If
Next

'Escribo el texto recompuesto en un nuevo documento Writer
Dim sRuta As String
Dim mArg()
Dim oDoc As Object, oDocum As Object

sRuta = "private:factory/swriter"
oDoc = StarDesktop.loadComponentFromURL(sRuta, "_default", 0, mArg() )
oDocum= oDoc.Text
oDocum.insertString(oDocum.getEnd(),NuevoTexto, False)

End Sub

Como en otras ocasiones, los comentario del script facilitan su comprensión y ahorran ahora trabajo de explicación. Sólo es necesario insistir en una cuestión: se da por supuesto que el acceso a las bases de datos complementarias quedan bien resueltas mediante el recurso a dos funciones que aquí no se exponen (sí en el documento que se anexa), pero esto sólo es cierto si estas bases de datos son actualizadas "manualmente" por el profesional. No hay nada en el código que garantice que esto es así.

Esta es una de las cuestiones pendientes. No es la única.

Documentos. 

Los enlaces que te proporciono a continuación para que los descargues requieren que crees una carpeta en tu Escritorio (Textos) y que modifique la dirección de archivos que se plantean en los script principales por la dirección que se ajuste a tus archivos. Como tienes que realizar estos cambios, puedes aprovechar para crear también tu estructura de directorio, incluyendo la unidad de trabajo o el directorio de la unidad C:

Ya están creadas las hojas auxiliares en el documento Calc, con lo que sólo te resta activar el cmd de la hoja principal para crear un nuevo informe. 

Aunque el listado de nombres es amplio, te recomiendo que accedas a la BDNombres y te cerciores de que el que tiene tu alumno (o alumna) ya está registrado (no hace falta hacer lo mismo con la BDGenero). En caso contrario, debes añadirlo a la lista (nombre y género). Si deseas trabajar desde el principio, deberás borrar antes las hojas MatrizBase y CondicGen; pero sólo si deseas trabajar con el script que crea ambas y los procesos que genera. Recuerda que ese script debe ser activado directamente desde el IDE y que está en la biblioteca Standard y en el módulo CrearMatrizBase.

NOTA (1) En realidad he aparcado unas cuantas cuestiones para otro momento; lo haré de nuevo ahora, ya que es necesario para avanzar en el desarrollo de la solución.

No hay comentarios:

Publicar un comentario

Comenta esta entrada