Uso de la BDNombres (II)
Automatización de textos con OOo Basic
Procedimiento basado en textos
Desde el script de la fase Docap del procedimiento de automatización también accedemos al archivo BDNombres. Lo hacemos por dos motivos, lo que conlleva también dos procedimientos claramente diferentes.
En la fase preparatoria podemos prescindir de la BDNombres porque el propio texto-base nos aporta información que permite identificar el género de la vi-nombre, así que si accedemos a esta fuente de datos es para automatizar el incremento del número de registros y hacer más potente esta fuente de información, precisamente para su uso en la fase DocAp.
Y es que, como ya dije en varias ocasiones, en esta fase no disponemos de datos para identificar el género asociado al nombre (vi-nombre), salvo el doble recurso a añadirlo como dato-input o buscarlo en esa fuente de datos externa que es BDNombres. Si esta es nuestra segunda opción (y lo es), necesitamos acceder a la BD; pero esto que no nos asegura encontrar la información que necesitamos.
Efectivamente nosotros buscamos el nombre en el listado de la BD. Si lo encontramos accedemos al campo género asociado y pasaremos este dato al script principal. Lo que ahora describimos es el funcionamiento típico de una función. ¿Pero qué sucede en caso de que el nombre no esté registrado en la base de datos?.
En este caso caben diferentes posibilidades, pasando por la de añadir el nuevo nombre (y el género correspondiente) a nuestro listado. Esta solución describe la ejecución de una subrutina.
En resumen, la doble opción que se abre ante nosotros no sólo implica la necesidad de desarrollar procedimientos distintos en cuanto a su funcionamiento; también supone hacer uso de procedimientos funcionalmente distintos: en OOo Basic una función devuelve un dato y una subrutina ejecuta acciones y debemos trabajar con ambas o crear un procedimiento que implique ambas. Ese es ahora el reto.
Empecemos por mostrar el script desde el que se llama al código complementario, que adelanto será una función.
Sub AccesoBDNombresDesdeDocap
Dim viNombre As String, vGenero As String
'Simulo el acceso desde el script de la fase dos (DocAp)
'en la que dispongo de la vi-nombre identificada aquí como viNombre
'pero no dispongo del dato género asociado al nombre
'La idea es:
' 1º. solicitar el dato a la BDNombres mediante una función
' 2º. de existir el nombre localizar y pasar el género gramatical asociado
viNombre = "Rosamunde"
vGenero = BuscarNombre(viNombre)
'En caso de cumplirse el criterio de existencia aquí finaliza el proceso
If vGenero = "" Then
MsgBox "No existe el nombre, luego no existe dato de género"
Else
MsgBox ("Datos: " & Chr(13) &_
"Nombre del alumno " & viNombre & Chr(13) &_
"Género gramatical " & vGenero )
End If
'pero de no existir el nombre necesitamos desarrollar el suproceso siguiente:
' 3º. Buscar la primera celda de la columna nombre (A) vacía
' 4º. Escribir en ella el nombre (viNombre)
' 5º. Pedir mediante InputBox() el dato género gramatical asociado
' 6º. Escribirlo en la misma posición en la columna Género (B)
End Sub
Dado que se trata de un script de trabajo y que está ampliamente comentado, no necesario más aplicación, así que paso a mostrar el código de la función.
Function BuscarNombre(NombreNuevo As String) As String
'Variables
Dim sRuta As String
Dim mArg()
Dim oDocumento As Object, oNombre As Object, oGenero As Object
Dim oHoja As Object
Dim i As Integer
Dim NombreCol As String, NombreGen As String
'Accedo a BDNombres y a la hoja que contiene el listado de nombres y género asociado
sRuta = ConvertToUrl("C:/Users/TuIdentificador/Escritorio/Textos/BDNombres.ods")
oDocumento = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mArg() )
oHoja = oDocumento.getCurrentController.getActiveSheet()
'Recorro la columna de nombres buscando el nombre de referencia
For i = 1 To 1000
oNombre = oHoja.getCellRangeByName("A" & i)
NombreCol = oNombre.getString()
If NombreCol = NombreNuevo Then
oGenero = oHoja.getCellRangeByName("B" & i)
NombreGen = oGenero.getString()
Exit For
ElseIf NombreCol = "" Then
oNombre.setString(NombreNuevo)
NombreGen = InputBox("Género asociado al nombre " & NombreNuevo,"Género gramatical","m-f")
oGenero = oHoja.getCellRangeByName("B" & i)
oGenero.setString(NombreGen)
Exit For
End if
Next
'Guardo los cambios
oDocumento.store()
'Cierro el archivo
oDocumento.close(True)
'Paso el dato de género al identificador de la función
BuscarNombre = NombreGen
End Function
Después de acceder a los datos oHoja = oDocumento.getCurrentController.getActiveSheet() recorro el listado de nombres oNombre = oHoja.getCellRangeByName("A" & i) mediante un bucle For i = 1 To 1000 asignando el contenido de las celdas a la variable NombreCol = oNombre.getString()
Esto nos permite trabajar con el contenido del listado para compararlo con el nombre del alumno a alumna a que la se realizar el informe. Para ello empleamos un condicional If NombreCol = NombreNuevo Then con dos opciones: que exista el nombre en el listado (primera parte del condicional, ya vista) o que no exista ElseIf NombreCol = "" Then.
En el primer caso accedemos al dato Género NombreGen = oGenero.getString() y salimos del ciclo Exit For. En el segundo caso tenemos que:
- copiar el dato Nombre en la columna
oNombre.setString(NombreNuevo) - solicitar el dato Género al usuario mediante
InputBox()(función)NombreGen = InputBox("Género asociado al nombre " & NombreNuevo,"Género gramatical","m-f") - ... y copiarlo en la posición de la columna B
oGenero.setString(NombreGen)después de haber accedido a esa celdaoGenero = oHoja.getCellRangeByName("B" & i)
Para evitar errores de funcionamiento, es necesario salir del ciclo tras copiar el género en la celda B (Exit For), lo que da acceso a tres subprocesos fundamentales:
- Guardar los datos (
oDocumento.store()) - Cerrar el documento (
oDocumento.close(True)) - Y pasar el dato Género a la función para trasladarlo al script desde el que fue llamada (
BuscarNombre = NombreGen)
Observarás que esta función incluye también la ejecución de instrucciones sobre el archivo BDNombres, con lo que no sólo devuelve un dato. Esto hace innecesario crear una subrutina que realice esa primera tarea cuando resulta necesaria, sin perder de vista el cumplimiento de la función principal de la función (valga la redundancia).
No hay comentarios:
Publicar un comentario
Comenta esta entrada