miércoles, 6 de agosto de 2025

Textos. Procedimientos

Uso de la BDNombres (II)


Desde el script de la fase Docap del procedimiento de automatización también accedemos al archivo BDNombres; es más, lo hacemos potencialmente 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 nos 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 segunda es nuestra opción (y lo es), necesitamos acceder a la BD; pero esto que no nos asegura que encontremos la información que necesitamos.

Efectivamente nosotros buscaremos 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; es que también supone hacer uso de procedimientos funcionalmente distintos: en OOo Basic una función devuelve un dato y una subrutina ejecuta acciones; debemos trabajar con ambos formatos o crear uno que implique ambos. 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() paso recorrer el listado de nombres (oNombre = oHoja.getCellRangeByName("A" & i)) mediante un bucle For (For i = 1 To 1000) asignando el contenido de las celdas a la variable NombreCol (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 For (Exit For). En el segundo caso tenemos que:

  • copiar el dato Nombre en la columna A (oNombre.setString(NombreNuevo))
  • solicitar el dato Género al usuario (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 celda (oGenero = 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