Buenas tardes.
Tengo una aplicación en access 2003 (.mdb) en la que uso un código que realiza lo siguiente en pocas palabras:
-Sobre un formulario toma valores
-Estos valores los reemplaza de una tabla
-Me abre una aplicación de libreofficce (plantilla de writter) y me hace las sustituciones.
Con un formato superior de acces (.accdb), me abre la plantilla de writer pero no me realiza las sustituciones y no tengo ni idea de porqué no lo hace.
Adjunto los datos básicos:
TABLA:
| CodeToReplace |
ReplaceWithFieldName |
numerador |
| {Datos1} |
Forms!Registro!campo1 |
1 |
CodeToReplace (texto largo)
ReplaceWithFieldName (texto largo)
numerador (Número)
FORMULARIO:
Sobre un botón, en el evento al hacer clic, coloco el siguiente código:
Private Sub DatosRegistro_Click()
Dim dbLocal As Database
Dim snpReplaceCodes As Recordset
Dim strCurrAppDir As String
Dim strFinalDoc As String
Dim varReplaceWith As Variant
Dim mibusqueda As Object
Dim oservicio As Object
Dim Escritorio As Object
Dim document As Object
On Error GoTo Error_DatosRegistro_Click
Set dbLocal = CurrentDb()
strCurrAppDir = Left$(dbLocal.Name, InStrRev(dbLocal.Name, "\"))
strFinalDoc = strCurrAppDir & "Plantillas/Datos.ott"
On Error GoTo Error_DatosRegistro_Click
strFinalDoc = Replace(strFinalDoc, "\", "/")
strFinalDoc = "file:///" + strFinalDoc
Dim args(1) As Object
Set oservicio = CreateObject("com.sun.star.ServiceManager")
Set Escritorio = oservicio.createInstance("com.sun.star.frame.Desktop")
Set args(0) = oservicio.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
args(0).Name = "Hidden"
args(0).Value = True
Set document = Escritorio.loadComponentFromURL(strFinalDoc, "_blank", 0, args())
Call document.getCurrentController.getFrame.getContainerWindow.setVisible(True)
Call document.getCurrentController.getFrame.getComponentWindow.setVisible(True)
Set mibusqueda = document.createReplaceDescriptor
'abro ahora la tabla de las sustituciones
Set snpReplaceCodes = dbLocal.OpenRecordset("TRDatos", _
dbOpenSnapshot)
Do While Not snpReplaceCodes.EOF
varReplaceWith = Eval(snpReplaceCodes!ReplaceWithFieldName)
varReplaceWith = IIf(IsNull(varReplaceWith), " ", CStr(varReplaceWith))
mibusqueda.setsearchstring (snpReplaceCodes!CodeToReplace)
mibusqueda.setreplacestring (varReplaceWith)
Call document.replaceall(mibusqueda)
snpReplaceCodes.MoveNext
Loop
'
snpReplaceCodes.Close
Exit Sub
Error_DatosRegistro_Click:
beep
' MsgBox "Ha ocurrido el error:" & vbCrLf & _
' Err.Description, vbCritical, "OLE Error!"
Exit Sub
End Sub
PLANTILLA LibreOffice Writer
Es una plantilla de extensión .ott en la que el campo a sustituir del formulario va entre llaves:
{Dato1}
TRDatos es la tabla de sustituciones, Registro es el formulario y Datos.ott es la plantilla de Writer (en una carpeta llamada Plantillas).
Supongo (por suponer) que debe ser una adaptación entre versiones o algún tipo de librería... pero no tengo ni idea. Si alguien ve algo que me pueda dar alguna luz lo agradecería.
Gracias de antemano.
Editado por maserrano - 20/Enero/2020 a las 13:52