domingo, 27 de julio de 2025

DATOS. Usos

Segunda fase: el DocAp

Automatización de textos con OOo Basic

Procedimiento basado en textos

Hasta este momento hemos trabajado sobre el texto-base, desarrollando los procedimientos que facilitan su estructuración en segmentos, la identificación de las categorías funcionales a las que pertenecen estos segmentos y la construcción de un cuestionario que nos ayude en la entrada de datos. Con todo ello resuelto (1) corresponde ahora formular el script-DocAp que nos permite sacar provecho del trabajo realizado y automatizar el documento.

Si el planteamiento del proceso en dos fases es definitorio del modelo de automatización que ensayamos en este ejemplo, el script que voy a presentar en esta entrada es su culminación. Funcionalmente cumple el papel de los script que sirvieron de soporte a un DocAp, de ahí que mantenga para él esa denominación.

El DocAp de la imagen, en su la hoja inicial (TextoBase) se activa el script NuevoInforme que muestro a continuación.



Sub NuevoInforme

'Acceso a la hoja con los datos (MatrizBase)

Dim oHojaDatos As Object
oHojaDatos = ThisComponent.getSheets().getByName("MatrizBase")

'Cargo datos en matrices y variables de trabajo
Dim mTextos() As String, mCateg() As String, mPreg() As String
Dim i As Integer, n As Integer
Dim oCelda As Object
Dim Conten As String

'Calculo el número de elementos de la matriz-base
For i = 0 To 100
	oCelda =  oHojaDatos.getCellRangeByName("B" & i+1)
	Conten = oCelda.getString()
	If Conten = "" Then
		n = i+1
		Exit For
	End If
Next

'Dimensiono las matrices
ReDim mTextos(n)
ReDim mCateg(n)
ReDim mPreg(n)

'Capturo el contenido de las columnas de datos
For i = LBound(mTextos()) To UBound (mTextos())
	oCelda = oHojaDatos.getCellRangeByName( "A" & i+1 )
	mTextos(i) = oCelda.getString()
	mTextos(i) = Trim(mTextos(i))
Next

For i = LBound(mCateg()) To UBound (mCateg())
	oCelda = oHojaDatos.getCellRangeByName( "B" & i+1 )
	mCateg(i) = oCelda.getString()
Next

For i = LBound(mPreg()) To UBound (mPreg())
	oCelda = oHojaDatos.getCellRangeByName( "C" & i+1 )
	mPreg(i) = oCelda.getString()
Next

'Modifico el contenido de las vi del texto a generar
For i = LBound(mTextos()) To UBound (mTextos())
	If mCateg(i) = "vi" Then
		mTextos(i) = InputBox (mPreg(i),"Datos actuales",mTextos(i))
	End If
Next

'Capturo la posición de la vi-condición de los datos vg
Dim post As String, pos As Integer
Dim genOr As String
oHojaDatos = ThisComponent.getSheets().getByName("CondicGen")
oCelda = oHojaDatos.getCellRangeByName("B1")
post = oCelda.getString()
pos = CInt(post)

'Capturo el género de la vi-condición original
oCelda = oHojaDatos.getCellRangeByName("B2")
genOr = oCelda.getString()

'Establezco el genero del nuevo alumno en base a la posición en la mTextos() de la vi
Dim AlNuevo As String
AlNuevo = mTextos(pos)

'Busco el género del nuevo alumno en la BDNombres 
Dim GenAlNuevo As String
GenAlNuevo = GeneroNombre(AlNuevo)

'Comparo el género de ambos nombres
Dim ComparaGen As Boolean
If genOr = GenAlNuevo Then
	ComparaGen = True
Else
	ComparaGen = False
End If

'En caso de discrepancia de género modifico los datos de las vg
Dim NuevoTermino As String
If ComparaGen = False Then
	For i = LBound(mCateg()) To UBound (mCateg())
		If mCateg(i) = "vg" Then
			NuevoTermino = Genero(mTextos(i))
			mTextos(i) = NuevoTermino
		End If
	Next
End If

'Recompongo el texto a partir de la matriz mTextos()
Dim NuevoTexto As String

For i = LBound(mTextos()) To UBound (mTextos())
	If i = 0 Then
		NuevoTexto = mTextos(i)
	Else
		If	mCateg(i) = "sl" Then
			NuevoTexto = (NuevoTexto & Chr(13) & Chr(13))
		ElseIf mCateg(i) = "sp" Then
			NuevoTexto = (NuevoTexto & mTextos(i))
		Else
			NuevoTexto = (NuevoTexto & " " & mTextos(i))
		End If
	End If
Next

'Escribo el texto recompuesto en un nuevo documento Writer
Dim sRuta As String
Dim mArg()
Dim oDoc As Object, oDocum As Object

sRuta = "private:factory/swriter"
oDoc = StarDesktop.loadComponentFromURL(sRuta, "_default", 0, mArg() )
oDocum= oDoc.Text
oDocum.insertString(oDocum.getEnd(),NuevoTexto, False)

End Sub


Como en otras ocasiones, los comentario del script facilitan su comprensión y ahorran ahora trabajo de explicación. Sólo es necesario insistir en una cuestión: se da por supuesto que el acceso a las bases de datos complementarias quedan bien resueltas mediante el recurso a dos funciones que aquí no se exponen (sí en el documento que se anexa), pero esto sólo es cierto si estas bases de datos son actualizadas "manualmente" por el profesional. No hay nada en el código que garantice que esto es así.

Esta es una de las cuestiones pendientes. No es la única.

Documentos.

Los enlaces que te proporciono a continuación requieren que crees una carpeta en tu Escritorio (Textos) y que modifique la dirección de archivos que se plantean en los script principales por la dirección que se ajuste a tus archivos. Como tienes que realizar estos cambios, puedes aprovechar para crear también tu estructura de directorio, incluyendo la unidad de trabajo o el directorio de la unidad C:

Ya están creadas las hojas auxiliares en el documento Calc, con lo que sólo te resta activar el cmd de la hoja principal para crear un nuevo informe.

Aunque el listado de nombres es amplio, te recomiendo que accedas a la BDNombres y te asegures de que el que tiene tu alumno ya está registrado (no hace falta hacer lo mismo con la BDGenero). En caso contrario, debes añadirlo a la lista (nombre y género). Si deseas trabajar desde el principio, deberás borrar antes las hojas MatrizBase y CondicGen; pero sólo si deseas trabajar con el script que crea ambas y los procesos que genera. Recuerda que ese script debe ser activado directamente desde el IDE y que está en la biblioteca Standard y en el módulo CrearMatrizBase

NOTA: 1 En realidad ya he aparcado antes unas cuantas cuestiones y lo haré de nuevo ahora para avanzar más rápido en este proyecto.

No hay comentarios:

Publicar un comentario

Comenta esta entrada