Manejo de la BDGenero (II)
Automatización de textos con OOo Basic
Procedimiento basado en textos
La segunda parte de este procedimiento consiste en comprobar la presencia o no del segmento vg y obrar en consecuencia, lo que, tal y como se enuncia, no parece nada novedoso, ya que se asemeja al proceso seguido en el tratamiento de BDNombres, con la diferencia (interesante en términos de código) de que en ésta nos limitábamos a una única variable y ahora tenemos que manejar una matriz.
Por otra parte, y al igual que en aquella, deberemos acceder a la BDGenero, recorrer su columna A (1) y comparar el texto que contiene cada una de sus celdas con el elemento de la matriz de vg (2). En caso de que nuestro segmento vg no exista, el recorrido de la columna A alcanzará la primera celda vacía, momento en que deberemos escribir en ella nuestra nueva vg.
Es a partir de este punto donde el código puede resolverse de forma directa (3) o mediante un algoritmo orientado a la automatización de la escritura de la alternativa en femenino (4).
Para dar un tratamiento específico a esta cuestión, lo aplazo a una tercera entrada y paso a mostrar el código que corresponde a esta entrada, que es continuación del de la entrada anterior.
En primer lugar decir que he modificado el script anterior, incluyendo el cambio de nombre (ahora RevisionMatrizVg), aunque realmente los cambios son pocos (más eliminación de código de control que nuevo código) ya que he optado por crear dos subrutinas encadenadas (ComparaGen() y EscribirTexto()) para ejecutar los procedimientos que te explicaré más abajo. Por eso dejo que accedas al nuevo script desde el documento que te aporto y me centro en explicar las subrutinas (5).
Sub ComparaGen (datosNuevos() As String, datosBD() As String)
Dim i As Integer, ii As Integer, iReg As Integer
Dim mNuevos() As Integer
iReg = UBound(datosNuevos())
ReDim mNuevos(iReg)
'Recorro la matriz datosNuevos() sobre la matriz datosBD() para comprobar si alguno es nuevo
For i = LBound(datosNuevos()) To UBound(datosNuevos())
For ii = LBound(datosBD()) To UBound(datosBD())
If datosNuevos(i) = datosBD(ii) Then
mNuevos(i) = 1
Exit For
Else
mNuevos(i) = 0
End If
Next
Next
'Selecciono el contenido nuevo y accedo a la subrutina EscribirTexto() para procesarlo
For i = 0 To UBound(mNuevos())
If mNuevos(i) = 0 Then
EscribirTexto(datosNuevos(i))
End If
Next
End Sub
Esta subrutina trabaja sólo con código (no accede a ningún documento) y se limita a comprobar si alguno de los segmentos textual vg del texto-base no está recogido en la BDGenero (6). En ese caso se pasa el control a otra subrutina que se encarga de añadirlo.
El núcleo principal de esta subrutina se expresa como estructura compleja formada por dos bucles anidados, dentro de los cuales actúa un condicional If-Else con el que se comprueba la igualdad vs. diferencia entre el contenido de las matrices de segmentos vg y que alimenta una tercera matriz mNuevos() en la que se registra la condición elemento-repetido -> 1 vs. elemento-no-repetido -> 0.
Es el análisis de ese valor numérico de los elementos de esta matriz, mediante un nuevo bucle el que da paso a la ejecución de la subrutina siguiente:
Sub EscribirTexto(texto As String)
Dim sRuta As String
Dim mArg()
Dim oDocum As Object
Dim oHojas As Object, oHojaBD As Object
Dim oPosicion As Object
Dim vContenidos As String
Dim CeldaPos As Integer, i As Integer
'Accedo a la BDGenero y a la hoja que contiene el listado de segmentos
sRuta = ConvertToUrl("C:/Users/TuIdentificador/Escritorio/Textos/BDGenero.ods")
oDocum = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mArg() )
oHojas = oDocum.getSheets()
oHojaBD = oHojas.getByName("Genero")
'Recorro el listado A para calcular el número de registros de la BD
For i = 1 To 1000
oPosicion = oHojaBD.getCellRangeByName("A" & i)
vContenido = oPosicion.getString()
If vContenido = "" Then
CeldaPos = i
Exit For
End If
Next
'Me posiciono en la primera celda libre y escribo en ella el contenido identificado como nuevo
oPosicion = oHojaBD.getCellRangeByName("A" & CeldaPos)
oPosicion.setString(texto)
'Provisionalmente, escribo el segmento en femenino piéndolo mediante InputBox()
Dim txtFem As String
txtFem = InputBox("Escribe la alternativa en femenino de " & texto,"ALTERNATIVA",texto)
oPosicion = oHojaBD.getCellRangeByName("B" & CeldaPos)
oPosicion.setString(txtFem)
'Guardo y cierro BDGenero
oDocum.store()
oDocum.close(True)
End Sub
Esta segunda subrutina vuelve a acceder a BDGenero (7), motivo por el que es necesario incluir todo el proceso de acceso al documento que se describe y observa en el código, tras la declaración de las pertinentes variables.
A esto le sigue un procedimiento para identificar la longitud del lista de registros (sobre la columna A), que tiene como objetivo calcular la posición de la primera celda vacía, siendo en ésta en la que se escribe el contenido identificado como nuevo y pasado como parámetro a esta subrutina desde la que es llamada ComparaGen().
Provisionalmente planteo un procedimiento basado en InputBox() (8) que facilita completar el registro con el segmento textual expresado en femenino. Digo provisionalmente porque pretendo trabajar sobre esta cuestión para ver posibilidades de automatización parcial (al menos), cuestión ésta que será tratada en una próxima entrada.
Documentos. Puedes descargar estos dos documentos Calc para trabajar con lo presentado hasta el momento respecto al manejo de BDGenero.
- El documento de gestión, que contiene la matriz-base
- Y el documento auxiliar BDGenero
1 Por simplificar el procedimiento, tomaremos como referencia el género masculino, tanto en el texto-base como en el resto de los componentes del procedimiento. De ahí que tomemos como referencia la columna A. Cabe la posibilidad de partir del femenino o de cualquiera de ambos género de forma aleatoria, debiendo, en su caso, de modificar condicionalmente la referencia a columna (A vs. B). No obstante es esta una variación que aporta poco a la mejora del procedimiento y lo hace innecesariamente más complejo, por lo que opto por la simplificación que supone forzar al uso del masculino.
2 Este es el punto en que este procedimiento se diferencia del tratamiento de BNombres: ahora recorremos dos conjuntos de datos, por l que necesitaremos articular dos ciclos anidados.
3 Esto es, escribir sobre la celda correspondiente de la columna B la palabra o expresión correspondiente en femenino, la cual se solicita al usuario mediante
InputBox().
4 Se trata de un algoritmo tentativo y que muy posiblemente resuelva sólo en parte el problema, por lo que no cabe esperar que haga innecesario el recurso a la vía directa descrita en 3.
5 La primera
ComparaGen() es llamada desde el script principal RevisionMatrizVg pasando como parámetros las dos matrices creadas en él ComparaGen( mvgTexto() , mSegMas() )
6 Para ser más preciso tendría que decir en el contenido de la columna A (masculino) de esa BD, el cual manejamos ahora como matriz (
datosBD()). De ese proceso previo se encargó el script principal, como ya pudimos ver en la entrada precedente.
7 Se trata de un acceso (y cierre) reiterado, aunque esto es debido a la estructura cíclica desde la que se la llama desde
ComparaGen()
8 Con lo que implica: solicitar el dato al usuario.
No hay comentarios:
Publicar un comentario
Comenta esta entrada