jueves, 7 de agosto de 2025

Textos. Procedimientos

Manejo de la BDGenero (I)


Cuando creé el procedimiento de automatización texto-base planteé que el tratamiento de los documentos auxiliares se basaría inicialmente en el mero mantenimiento manual, así que era responsabilidad del profesional crear y actualizar manualmente estos listados Calc. Esta labor debía ser previa a la aplicación del DocAp, ya que este precisaba contar con acceso a información fiable y actualizada. En entradas recientes (vg [en esta]) desarrollé una alternativa que facilita el mantenimiento semiautomatizado de la BDNombres. Ahora pretendo avanzar en esa línea respecto a la BDGenero.


Cuando trabajamos con la BDNombres para acceder a los nombres y su género gramatical asociado no necesitamos saber más que la vi-nombre (en este nuestro primer caso) del alumno o de la alumna, lo que significa que damos por hecha la segmentación del texto-base sin entrar en detalles al respecto. Ahora tenemos que tratar de forma sistemática y secuencial con los resultados de dicha segmentación si queremos (semi)automatizar el mantenimiento de la BDGenero, ya que es de los segmentos vg de nuestros textos de los que se alimenta.

El procedimiento que pretendo desarrollar ahora implica alimentar el contenido de BDGenero desde los segmentos vg identificados en nuestro texto-base y recogidos (contenido e identificador) en la hoja MatrizBase. Este es el primer reto y una diferencia respecto al manejo de BDNombres.

A pesar de esta diferencia, la solución será más compleja que la dada para actualizar BDNombres, pero no en cuanto procedimiento. Pero lo que pretendo ahora es ir un poco más allá y desarrollar algún procedimiento que permita generar el tratamiento alternativo (m vs. f) del segmento. Si no lo conseguimos, o sólo parcialmente, siempre nos quedarán el procedimiento input-manual mediante funciones InputBox(). Pero vayamos por partes y no adelantemos acontecimientos.

El procedimiento a desarrollar parte de cero en lo que al acceso a los datos se refiere, cosa que no tiene por qué ser así en una aplicación integrada del mismo dentro del procedimiento general de automatización de textos. Aunque supone más trabajo he creído necesario enfocarlo de este modo para acentuar su autonomía del procedimiento general de automatización, así que dedicaré esta primera entrada al desarrollo de la primera fase del procedimiento: el acceso selectivo al contenido de los segmentos vg. En la siguiente entrada me ocuparé de la segunda fase del procedimiento: el traslado de esos datos al documento BDGenero, si es que resulta pertinente, claro.

Sub AccesoDatosMatriz

'Accedo a la hoja MatrizBase
Dim oHoja As Object
oHoja = ThisComponent.getCurrentController.getActiveSheet()

'Accedo a la columna B para identificar cuantos segmentos existen
'La columna A resulta engañosa por contener segmentos vacíos
Dim i As Integer, a As Integer, ii As Integer, iii As Integer
Dim oCont As Object
Dim sId As String

'La variable ii indica el número total de segmentos de la matriz-base
ii = 0
'La variable iii indica el número de segmentos vg
iii = 0

For i = 1 To 1000
oCont = oHoja.getCellRangeByName("B" & i)
sId = oCont.getString()
If sId <> "" Then
ii = ii + 1
If sId = "vg" Then
iii = iii + 1
End If
ElseIf sId = "" Then
Exit For
End If
Next

'Recorro la matriz-base buscando los segmentos vg para cargarlos en la matriz mvgTextos()
Dim oTexto As Object, oId As Object
Dim sTexto As String
Dim mvgTexto() As string

'La variable iii sirve para dimensionar la matriz mvgTexto()
ReDim mvgTexto(iii-1)

a = 0

'La variable ii sirve para establecer el recorrido del bucle
For i= 1 To ii
'Recorro la columna B buscando vg
oId = oHoja.getCellRangeByName("B" & i)
sId = oId.getString()
If sId = "vg" Then 'En su caso accedo a la columna A y copio el contenido en mvgTexto()
oTexto= oHoja.getCellRangeByName("A" & i)
sTexto = oTexto.getString()
mvgTexto(a) = sTexto
a = a + 1
End If
Next

'CONTROL de funcionamiento

MsgBox "Número de segmentos de la matriz " & (UBound(mvgTexto())+1)

For i = 0 To UBound(mvgTexto())
MsgBox "Segmento " & i+1 & Chr(13) & mvgTexto(i)
Next 

End Sub

Espero que los comentarios del código te ayuden a entender su funcionamiento que, como ves, se desarrolla del siguiente modo:
  • Accedo a la hoja que contiene la matriz-base (oHoja = ThisComponent.getCurrentController.getActiveSheet())
  • Y recorro su columna B para establecer las dimensiones de esa matriz y de la que se construirá para contener los datos de interés (el texto de las vg). De esto se encarga el primer buche For (For i = 1 To 1000)
  • Una vez definido el recorrido y la dimensión de la matriz contenedora (ReDim mvgTexto(iii-1)) recorro de nuevo la matriz sobre la columna B (For i= 1 To ii), buscando esta vez las vg para pasar su contenido a mvgTexto() (mvgTexto(a) = sTexto), siempre que se cumpla la condición (If sId = "vg" Then ) y después de acceder al contenido (columna A) (oTexto= oHoja.getCellRangeByName("A" & i))
Al final del script incluyo código para controlar el funcionamiento de esta primera fase del procedimiento. Posteriormente prescindiremos de él; también habrá que cambiar el nombre del script para ajustarlo a su nivel de desarrollo.

Hasta aquí hemos conseguido acceder selectivamente a los segmentos de interés (vg) por lo que disponemos ahora del contenido de dichos segmentos para ejecutar la segunda fase: trasladar el contenido a BGGenero, cosa que desarrollaré en una nueva entrada.

No hay comentarios:

Publicar un comentario

Comenta esta entrada