jueves, 21 de agosto de 2025

Textos. Procedimientos

Varios segmentos gramaticalmente condicionantes (II)


Completamos con esta entrada lo iniciado [en la anterior] respecto a la implementación del modelo complejo (varias vi-condicionantes), pero esta vez en cuanto afecta a la fase B (DocAp) del modelo (1). He de reconocer que no me ha resultado fácil llegar a una solución que funcione, de ahí el tiempo transcurrido desde la entrada anterior a la publicación de la actual. 


También debo decir que el script no me termina de convencer (creo que debería ser más sencillo), pero de momento tendrá que valer. Veamos el resultado; bueno, una parte, porque la otra son las funciones que contribuyen al correcto funcionamiento del script principal, pero esas quedan para que tú las analices desde el IDE del documento-soporte (2).

Sub NuevoInforme

'Matrices y variables para el acceso a los datos de la hoja MatrizBase
Dim oHojaM As Object, oCelM As Object
Dim sCelM As String
Dim m As Integer, nM As Integer

oHojaM = ThisComponent.getSheets().getByName("MatrizBase")

For m = 0 To 100
oCelM =  oHojaM.getCellRangeByName("B" & m+1)
sCelM = oCelM.getString()
If sCelM = "" Then
nM = m-1
Exit For
End If
Next

'Matrices para contener los datos de los datos del modelo
Dim mModelSeg() As String, mModelCateg() As String
Dim mModelViCond() As integer
Dim mPreguntasVi() As String

'Dimensionado de las matrices de datos del modelo
ReDim mModelSeg(nM)
ReDim mModelCateg(nM)
ReDim mModelViCond(nM)
ReDim mPreguntasVi(nM)

'Carga de datos en las matrices de datos del modelo

For m = 0 To UBound(mModelSeg())
oCelM =  oHojaM.getCellRangeByName("A" & m+1)
mModelSeg(m) = oCelM.getString()
Next

For m = 0 To UBound(mModelCateg())
oCelM =  oHojaM.getCellRangeByName("B" & m+1)
mModelCateg(m) = oCelM.getString()
Next

For m = 0 To UBound(mModelViCond())
oCelM =  oHojaM.getCellRangeByName("C" & m+1)
mModelViCond(m) = CInt(oCelM.getString())
Next

For m = 0 To UBound(mPreguntasVi())
oCelM =  oHojaM.getCellRangeByName("D" & m+1)
mPreguntasVi(m) = oCelM.getString()
Next

'Matrices y variables para el acceso a los datos de la hoja CondicGen
Dim oHojaG As Object, oCelG As Object
Dim sCelG As String
Dim g As Integer, nG As Integer

oHojaG = ThisComponent.getSheets().getByName("CondicGen")

For g = 0 To 100
oCelG =  oHojaG.getCellRangeByName("B" & g+1)
sCelG = oCelG.getString()
If sCelG = "" Then
nG = g-1
Exit For
End If
Next

'Matrices para contener los datos de las vi-cond
Dim mViPos() As Integer
Dim mVIGen() As String

'Dimensionado de las matrices vi-cond
ReDim mViPos(nG)
ReDim mVIGen(nG)

'Carga de datos de las vi-cond

For g = 0 To UBound(mViPos())
oCelG =  oHojaG.getCellRangeByName("B" & g+1)
mViPos(g) = CInt(oCelG.getString())
Next

For g = 0 To UBound(mViGen())
oCelG =  oHojaG.getCellRangeByName("D" & g+1)
mViGen(g) = oCelG.getString()
Next

'========================================================
'Desarrollo del DocAp
'========================================================
'PASO 1. Actualizar datos de las vi

'Matriz contenedora de datos DocAp
Dim mDatosInfo(nM) As String
Dim i As Integer

'paso de datos de la matriz modelo a la matriz info. Las vi se resuelven mediante InputBox()
For i = 0 To UBound(mDatosInfo())
If mModelCateg(i) = "vi" Then
mDatosInfo(i) = InputBox(mPreguntasVi(i),"CUESTIONARIO", mModelSeg(i))
Else
mDatosInfo(i) = mModelSeg(i)
End If
Next

'PASO 2. Identificar las vi-cond en la matriz de datos del informe y establecer su género gramatical
Dim ii As Integer
Dim InfovicondDato(nG) As String, InfovicondGen(nG) As String

For i = 0 To UBound(mViPos())
For ii = 0 To UBound(mDatosInfo())
If ii = mViPos(i) Then
InfovicondDato(i) = mDatosInfo(ii)
InfovicondGen(i) = GeneroNombre(InfovicondDato(i))
End If
Next
Next

'PASO 3. Analizar si las vi-cond del modelo y las del informe son del mismo género o de diferente
Dim mComparaViGen(nG) As Boolean

For i = 0 To UBound(mComparaViGen())
If mVIGen(i) = InfovicondGen(i) Then
mComparaViGen(i) = True
Else
mComparaViGen(i) = False
End If
Next

'PASO 4. Acceder a los datos de la BDGenero

Dim mGenM() As String, mGenF() As String
Dim nGn As Integer 'Variable para redimensionar las matrices mGenM() y mGenF()

'Accedo a la función que devuelve el valor de nGn
nGn = nGenero

'Redimensiono las matrices mGenM() y mGenF()
ReDim mGenM(nGn)
ReDim mGenF(nGn)

'Captura de datos mGenM() mediante la función GenMasc()
mGenM() = GenMasc(nGn)

'Captura de datos mGenF() mediante la función GenFem()
mGenF() = GenFem(nGn)

'PASO 5. Modificar las matrices inicial y final a partir de la igualdad/diferencia de género entre las vi-cond modelo e informe.

Dim mGenIni(nGn) As String, mGenFin(nGn) As String
Dim sNuevoContenido As String

For i = 0 To UBound(mComparaViGen())
If mComparaViGen(i) = True Then
For ii = 0 To UBound(mDatosInfo())
If mModelCateg(ii) = "vg" Then
If  mViPos(i) = mModelViCond(ii) Then
mDatosInfo(ii) = mDatosInfo(ii)
End If
End If
Next
ElseIf mComparaViGen(i) = False Then
mGenIni() = PosGenInicial(mGenM(), mGenF(),mViGen(i))
mGenFin() = PosGenFinal(mGenM(), mGenF(),mViGen(i))
For ii = 0 To UBound(mDatosInfo())
If mModelCateg(ii) = "vg" Then
If  mViPos(i) = mModelViCond(ii) Then
For iii = 0 To UBound(mGenIni())
If mDatosInfo(ii) = mGenIni(iii) Then
sNuevoContenido = mGenFin(iii)
mDatosInfo(ii) = sNuevoContenido
End If
Next
End If
End If
Next
End If
Next

'PASO 6 . Cambio del contenido de los segmentos vn

Dim NombreAlumno As String

For i = 0 To UBound(mPreguntasVi())
If mPreguntasVi(i) = "Alumno. Nombre" Then
NombreAlumno = mDatosInfo(i)
End If
Next

For i = 0 To UBound(mDatosInfo())
If mModelCateg(i) = "vn" Then
mDatosInfo(i) = NombreAlumno
End If
Next

'=========================================================
'RESTO DEL SCRIPT

'Recomponemos el texto a partir de la matriz mDatosInfo()

Dim NuevoTexto As String

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

'Escribimos el texto en un nuevo documento (Servicio 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

Se diferencian en este script tres partes, siendo la primera el acceso a los datos necesarios para el funcionamiento del script y la tercera la recomposición del texto del informe y su conversión en documento Writer. La segunda, la más definitoria de este procedimiento, está centrada en el procesamiento de los datos y su adaptación a la concordancia gramatical (de género) (vg) tal y como ésta queda definida en función de la pluralidad (y consecuente complejidad) de variables (vi) condicionantes.

Los comentario que acompañan al código del script describen satisfactoriamente (eso creo) las distintas fases del desarrollo del procedimiento, haciendo innecesario que esta cuestión sea tratada aquí de nuevo, pero no está de más una descripción general de éste, prestando especial atención a la segunda (y central) parte del mismo.

Opto (primera parte) por poner a disposición del script (para su procesamiento) los datos necesarios, los cuales han sido establecidos en la parte primera del modelo (fase 1 o preparatoria) y guardados en las hojas MatrizBase y CondicGen.  Procedemos a recuperar esos datos en forma de matrices. 

También son necesarios los datos contenidos en la BDGenero, por lo que (en la segunda parte del script) son recopilados en dos matrices (mGenM() y mGenF()(3)

Pero una vez que los datos están disponibles, resulta que la complejidad derivada de la pluralidad de fuentes de condicionalidad (dos vi-cond en este caso) hace que el procedimiento que deriva de dicha condicionalidad resulte de una complejidad muy superior a la esperada, siendo muestra de ello la propia complejidad de la estructura que la aborda y que repito ahora de  nuevo para mejor ilustrar lo que digo:

'PASO 5. Modificar las matrices inicial y final a partir de la igualdad/diferencia de género entre las vi-cond modelo e informe.

Dim mGenIni(nGn) As String, mGenFin(nGn) As String
Dim sNuevoContenido As String

For i = 0 To UBound(mComparaViGen())
If mComparaViGen(i) = True Then
For ii = 0 To UBound(mDatosInfo())
If mModelCateg(ii) = "vg" Then
If  mViPos(i) = mModelViCond(ii) Then
mDatosInfo(ii) = mDatosInfo(ii)
End If
End If
Next
ElseIf mComparaViGen(i) = False Then
mGenIni() = PosGenInicial(mGenM(), mGenF(),mViGen(i))
mGenFin() = PosGenFinal(mGenM(), mGenF(),mViGen(i))
For ii = 0 To UBound(mDatosInfo())
If mModelCateg(ii) = "vg" Then
If  mViPos(i) = mModelViCond(ii) Then
For iii = 0 To UBound(mGenIni())
If mDatosInfo(ii) = mGenIni(iii) Then
sNuevoContenido = mGenFin(iii)
mDatosInfo(ii) = sNuevoContenido
End If
Next
End If
End If
Next
End If
Next

  • Primero cabe diferenciar entre el desarrollo del script en función de que las vi-cond sean o no el mismo género (vg. If mComparaViGen(i) = True Then)
  • En segundo lugar genera una nueva diferenciación (bifurcación) el hecho de que la vi-cond del modelo sea de género femenino o de género masculino. Aunque este caso sólo afecta realmente a la opción negativa de la primera condición, implica además una alteración de la referencia de los contenidos de la BDGenero, lo que conlleva la creación de dos nuevas matrices y la modificación de su contenido en función de esta segunda condición (4)
  • El núcleo del ajuste del contenido de las vg requiere establecer la comparación entre el contenido del segmento y el de la BDGenero, teniendo en cuenta una doble delimitación: que el segmento sea de tipo vg (If mModelCateg(ii) = "vg" Then) y que posea un índice numérico acorde con la vi-cond de referencia (If  mViPos(i) = mModelViCond(ii) Then). Sólo en ese caso se desarrolla el procedimiento antes indicado, que se concreta de forma diferentes en función del cumplimiento de una u otra condición en el condicional primero (igual vs. diferencia de género de las vi-cond) (vg...
If  mViPos(i) = mModelViCond(ii) Then -> mDatosInfo(ii) = mDatosInfo(ii)

...cuando ambas vi-cond (modelo - informe) son del mismo género (5).

  • A la complejidad de estructura que deriva de los diferentes niveles de condicionalidad se añade la que conlleva el uso reiterado de la iteración que deriva de la estructura matricial de los datos y de la apuesta por la automatización del procedimiento que preside el desarrollo de este modelo, la cual, a su vez, precisa de ambas (iteración y matrices).
Para finalizar decir que, aunque esta prueba está superada satisfactoriamente para este caso (6), la prueba de fuego aun está pendiente: aplicar el modelo al abordaje de la automatización de un informe psicopedagógico.

Documento. El [siguiente documento] contiene (IDE) el código que concreta (de momento) la versión compleja de este modelo de automatización en sus dos fases, incluyendo los script principales y los secundarios (7).

 NOTAS

 
(1) Hablamos pues de una modificación del script principal de esa segunda fase, esto es, del script NuevoInforme.
(2) Se trata de las funciones contenidas en el módulo Funciones. Como en muchos casos, su principal contribución consiste en aligerar líneas de código el script principal.
(3) De esto se ocupan dos de las funciones (GenMasc() y GenFem()). Esto permite liberar al código del script principal de especificar el procedimiento de acceso a la base de datos y a los datos mismos.
(4) Esta modificación requiere del recurso a dos funciones (PosGenInicial() y PosGenFinal()) que aligeran también (y significativamente) el contenido del script principal.
(5) Debo reconocer que esta obviedad me resultó difícil de comprender, ya que mi primera forma de enfocar esta cuestión reducía la pertinencia de este procedimiento a la condición False de esa comparación (la que se desarrolla en la segunda rama de la condicionalidad principal y finaliza con mDatosInfo(ii) = sNuevoContenido. Lógicamente esto provocaba que fracasara la aplicación del procedimiento general en cuanto no se cumplía (para los dos casos de las vi-cond) el criterio de diferencia de género.
(6) Esta afirmación no es del todo correcta, ya que no se resuelve satisfactoriamente según los objetivos del modelo la actualización de la vn. Pero dada la peculiaridad de este tipo de segmento y la necesidad de un procedimiento específico de abordaje, se puede considerar fundamentalmente cierta dicha afirmación.
(7) Aquí también son válidas las advertencias tantas veces formuladas sobre el control de la ubicación del documento y la actualización de la dirección correspondiente de (vg) sRuta = ConvertToUrl("C:/Users/TuNombreDeUsuario/Escritorio/Textos/BDGenero.ods"). Se debe añadir que son necesarios dos documentos situados en la misma ruta que el documento que soporta estos script: BDNombres y BDGenero. El segundo está disponible desde [esta entrada]; el primero deberás crearlo tú sobre Calc (doble columna nombre - género (f vs. m); ej. Antonio | m) 

No hay comentarios:

Publicar un comentario

Comenta esta entrada