Manejo de la BDGenero (II)
La segunda parte de este procedimiento consiste en comprobar la presencia o no del segmento vg y obrar en consecuencia.
Tal y como se enuncia, no es nada novedoso, ya que se asemeja al proceso seguido en el tratamiento de [la BDNombres], con la diferencia (interesante en términos de código) de que en esta 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 subsiguiente 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 precedente].
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
iReg = UBound(datosNuevos())
'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
'Selecciono el contenido nuevo y accedo a la subrutina EscribirTexto() para procesarlo
For i = 0 To UBound(mNuevos())
EscribirTexto(datosNuevos(i))
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 For anidados, dentro de los cuales actúa un condicional If-Else en la 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 For, el que da paso a la ejecución de la subrutina siguiente:
Sub EscribirTexto(texto As String)
Dim oHojas As Object, oHojaBD 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
oPosicion = oHojaBD.getCellRangeByName("A" & i)
vContenido = oPosicion.getString()
'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()
txtFem = InputBox("Escribe la alternativa en femenino de " & texto,"ALTERNATIVA",texto)
oPosicion = oHojaBD.getCellRangeByName("B" & CeldaPos)
oPosicion.setString(txtFem)
'Guardo y cierro BDGenero
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 y correspondiente 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 sobre esta sobre 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.
NOTAS
(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