miércoles, 6 de agosto de 2025

DATOS. Usos

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 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