[RESUELTO] Sustituir texto por campos de una tabla
[RESUELTO] Sustituir texto por campos de una tabla
Hola,
Me he encontrado con un problema que había logrado en Access. Tenía una tabla con varios campos dedicada a encabezado, pie de página.. que solo tenía un registro. Lo utilizaba para esos campos. Con una macro rescataba esos datos de la tabla para ponerlos en un documento word reemplazando texto, así no tenía que ponerlos en cada uno de los documentos. Así, si había un cambio en alguno de ellos, cambiando esos campo de la tabla modificaba el de todos los documentos al abrirlos
Inserto el código que tenía de Access para que os hagais una idea de como iba. En este caso en concreto lo que hacía era sustituir un marcador por el campo de la tabla “Encabezado” pero así era para los pies de página, dirección..
Dim rs As Recordset 'Hace referencia a una tabla
Set rs = CurrentDb().OpenRecordset("Datos", dbOpenDynaset) 'Tabla referenciada
‘Ahora sustituye el Marcador1 por el campo Encabezado de la tabla Datos
If miword.Documents(1).Bookmarks.Exists("Marcador1") = True Then
miword.Documents.Item(1).Bookmarks.Item("Marcador1").Range.Text = rs!Encabezado
End If
---------------------------------------------------------------------------------------------------------------------------------------------
Y este es el código de LibreOffice que tengo y quiero adaptar con lo que he encontrado en el foro. Ya se que no esta bien. En rojo es donde tendría que rescatar el campo de la tabla.
‘Referencia a la tabla
Dim rstBooks As Object
rstBooks=createUnoService("com.sun.star.sdb.RowSet")
With rstBooks
.DataSourceName="Datos"
.CommandType=0 'table
.Command="tblDatos"
'.execute()
End With
‘Sustituye el texto que encuentra con %Encabezado% de writer por el campo Rutadili de la tabla Datos
sd.setSearchString("%Encabezado%") 'Busca el encabezado y lo reemplaza
found = doc.findAll(sd)
Valor = rstBooks.Fields(RutaDili) 'Aquí es donde tengo el problema. Debería de coger el valor del campo de la tabla
For f = 0 To found.Count - 1
t = found.getByIndex(f)
t.setString(valor)
Next f
Saludos.
Me he encontrado con un problema que había logrado en Access. Tenía una tabla con varios campos dedicada a encabezado, pie de página.. que solo tenía un registro. Lo utilizaba para esos campos. Con una macro rescataba esos datos de la tabla para ponerlos en un documento word reemplazando texto, así no tenía que ponerlos en cada uno de los documentos. Así, si había un cambio en alguno de ellos, cambiando esos campo de la tabla modificaba el de todos los documentos al abrirlos
Inserto el código que tenía de Access para que os hagais una idea de como iba. En este caso en concreto lo que hacía era sustituir un marcador por el campo de la tabla “Encabezado” pero así era para los pies de página, dirección..
Dim rs As Recordset 'Hace referencia a una tabla
Set rs = CurrentDb().OpenRecordset("Datos", dbOpenDynaset) 'Tabla referenciada
‘Ahora sustituye el Marcador1 por el campo Encabezado de la tabla Datos
If miword.Documents(1).Bookmarks.Exists("Marcador1") = True Then
miword.Documents.Item(1).Bookmarks.Item("Marcador1").Range.Text = rs!Encabezado
End If
---------------------------------------------------------------------------------------------------------------------------------------------
Y este es el código de LibreOffice que tengo y quiero adaptar con lo que he encontrado en el foro. Ya se que no esta bien. En rojo es donde tendría que rescatar el campo de la tabla.
‘Referencia a la tabla
Dim rstBooks As Object
rstBooks=createUnoService("com.sun.star.sdb.RowSet")
With rstBooks
.DataSourceName="Datos"
.CommandType=0 'table
.Command="tblDatos"
'.execute()
End With
‘Sustituye el texto que encuentra con %Encabezado% de writer por el campo Rutadili de la tabla Datos
sd.setSearchString("%Encabezado%") 'Busca el encabezado y lo reemplaza
found = doc.findAll(sd)
Valor = rstBooks.Fields(RutaDili) 'Aquí es donde tengo el problema. Debería de coger el valor del campo de la tabla
For f = 0 To found.Count - 1
t = found.getByIndex(f)
t.setString(valor)
Next f
Saludos.
Última edición por jopicach el Jue Dic 14, 2017 8:17 pm, editado 4 veces en total.
LibreOffice versión: 7.0.5.2 (x64) - Windows 10 Pro 64 bits
Re: Sustituir texto por campos de una tabla
Hola,
Algo como esto te debería funcionar. Se supone que solo existe un registro y solo eliges el campo Rutadili.
oStat = ThisDatabaseDocument.CurrentController.ActiveConnection.CreateStatement
sSQL = "SELECT Rutadili FROM tblDatos"
oRes = oStat.ExecuteQuery(sSQL)
oRes.Next
Valor = oRes.getString(1)
Saludos
Algo como esto te debería funcionar. Se supone que solo existe un registro y solo eliges el campo Rutadili.
oStat = ThisDatabaseDocument.CurrentController.ActiveConnection.CreateStatement
sSQL = "SELECT Rutadili FROM tblDatos"
oRes = oStat.ExecuteQuery(sSQL)
oRes.Next
Valor = oRes.getString(1)
Saludos
OpenOffice 4.1.15 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
Re: Sustituir texto por campos de una tabla
Hola,
Muchas gracias por tu respuesta. He probado el código, pero me da un error referente a la tabla. Adjunto el archivo para que se vea mejor.
Un saludo.
Muchas gracias por tu respuesta. He probado el código, pero me da un error referente a la tabla. Adjunto el archivo para que se vea mejor.
Un saludo.
- Adjuntos
-
- OOoBasic Combinar texto FINAL.7z
- (46.35 KiB) Descargado 117 veces
LibreOffice versión: 7.0.5.2 (x64) - Windows 10 Pro 64 bits
Re: Sustituir texto por campos de una tabla
Hola,
No es lo mismo Rutadili que RutaDili. Revisa que es ese el error.
Saludos
No es lo mismo Rutadili que RutaDili. Revisa que es ese el error.
Saludos
OpenOffice 4.1.15 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
Re: Sustituir texto por campos de una tabla
Hola de nuevo,
Muchas gracias RMG, ahí estaba el fallo, es "RutaDili" y no "Rutadili", y mira que lo había repasado. Ahora funciona perfectamente. Con el código que has puesto he realizado una búsqueda para poder añadir más columnas a ese registro y he encontrado respuesta en otros mensajes tuyos del foro. No se si estará muy bien y si podría mejorarse ahorrando algo del código repetitivo. Lo pongo a ver opiniones antes de darlo por [resuelto].
Muchas gracias RMG, ahí estaba el fallo, es "RutaDili" y no "Rutadili", y mira que lo había repasado. Ahora funciona perfectamente. Con el código que has puesto he realizado una búsqueda para poder añadir más columnas a ese registro y he encontrado respuesta en otros mensajes tuyos del foro. No se si estará muy bien y si podría mejorarse ahorrando algo del código repetitivo. Lo pongo a ver opiniones antes de darlo por [resuelto].
Código: Seleccionar todo
oStat = ThisDatabaseDocument.CurrentController.ActiveConnection.CreateStatement
sSQL = "SELECT ""RutaDili"", ""Direccion"", ""Telefono"" FROM tblDatos" ' Tres campos de la tabla tblDatos
oRes = oStat.ExecuteQuery(sSQL)
oRes.Next
Valor1 = oRes.getString(1) 'Primera columna
Valor2 = oRes.getString(2) 'Segunda columna
Valor3 = oRes.getString(3) 'Tercera columna
sd.setSearchString("%Encabezado%") 'Busca los %Encabezado% en todo el documento y los reemplaza por el valor de RutaDili de la primera columna
found = doc.findAll(sd)
For f = 0 To found.Count - 1
t = found.getByIndex(f)
t.setString(valor1)
Next f
sd.setSearchString("%Direccion%") 'Busca los %Direccion% en todo el documento y los reemplaza por el valor de Direccion de la segunda columna
found = doc.findAll(sd)
For f = 0 To found.Count - 1
t = found.getByIndex(f)
t.setString(valor2)
Next f
sd.setSearchString("%Telefono%") 'Busca los %Telefono% en todo el documento y los reemplaza por el valor de Telefono de la tercera columna
found = doc.findAll(sd)
For f = 0 To found.Count - 1
t = found.getByIndex(f)
t.setString(valor3)
Next f
Última edición por mauricio el Mar Dic 12, 2017 7:29 pm, editado 1 vez en total.
Razón: Usar etiquetas code
Razón: Usar etiquetas code
LibreOffice versión: 7.0.5.2 (x64) - Windows 10 Pro 64 bits
Re: Sustituir texto por campos de una tabla
Si no quieres repetir, puedes crear una matriz con los nombres de los campos. Recuerda también diferenciar el tipo de campo que devuelve la SQL, para texto getString, para entero getInt etc. Revisa la V mayúscula de la variable valor.
Saludos
Saludos
OpenOffice 4.1.15 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
Re: Sustituir texto por campos de una tabla
Gracias de nuevo por todo. Lo miraré.
Un saludo
Un saludo
LibreOffice versión: 7.0.5.2 (x64) - Windows 10 Pro 64 bits
Re: Sustituir texto por campos de una tabla
Hola,
Perdón, pero se me había pasado consulta importante sobre el mismo tema. Lo de obtener el texto del primer registro está claro con el 1, 2, 3.. en el valor se obtiene el valor según la columna. Pero, ¿y si quisiera obtener el valor por ejemplo de la primera columna pero del segundo o tercer registro?
oStat = ThisDatabaseDocument.CurrentController.ActiveConnection.CreateStatement
sSQL = "SELECT ""RutaDili"", ""Direccion"", ""Telefono"" FROM tblDatos"
oRes = oStat.ExecuteQuery(sSQL)
oRes.Next
valor1 = oRes.getString(1)
valor2 = oRes.getString(2)
valor3 = oRes.getString(3)
valor1 = oRes.getString(1,2) 'He intentado obtener el valor de la primera columna, pero de la segunda fila/registro
sd.setSearchString("%Fila2%") 'Busca el encabezado y lo reemplaza
found = doc.findAll(sd)
For f = 0 To found.Count - 1
t = found.getByIndex(f)
t.setString(valor1)
Next f
Saludos
Perdón, pero se me había pasado consulta importante sobre el mismo tema. Lo de obtener el texto del primer registro está claro con el 1, 2, 3.. en el valor se obtiene el valor según la columna. Pero, ¿y si quisiera obtener el valor por ejemplo de la primera columna pero del segundo o tercer registro?
oStat = ThisDatabaseDocument.CurrentController.ActiveConnection.CreateStatement
sSQL = "SELECT ""RutaDili"", ""Direccion"", ""Telefono"" FROM tblDatos"
oRes = oStat.ExecuteQuery(sSQL)
oRes.Next
valor1 = oRes.getString(1)
valor2 = oRes.getString(2)
valor3 = oRes.getString(3)
valor1 = oRes.getString(1,2) 'He intentado obtener el valor de la primera columna, pero de la segunda fila/registro
sd.setSearchString("%Fila2%") 'Busca el encabezado y lo reemplaza
found = doc.findAll(sd)
For f = 0 To found.Count - 1
t = found.getByIndex(f)
t.setString(valor1)
Next f
Saludos
LibreOffice versión: 7.0.5.2 (x64) - Windows 10 Pro 64 bits
Re: Sustituir texto por campos de una tabla
Hola,
While oRes.Next (mientras existan registros)
Haz lo que quieras hacer
Wend
Si quieres un registro concreto, puedes hacer un contador (For) dentro de While.
Saludos
Como te indico este ejemplo es para un solo registro. Para recoger todos los registros de tabla puedes usar la condición While.Algo como esto te debería funcionar. Se supone que solo existe un registro y solo eliges el campo Rutadili.
While oRes.Next (mientras existan registros)
Haz lo que quieras hacer
Wend
Si quieres un registro concreto, puedes hacer un contador (For) dentro de While.
Saludos
OpenOffice 4.1.15 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
Re: Sustituir texto por campos de una tabla
Hola,
He intentado la instrucción que me pones, pero no me pasa del primer registro y mira que he probado combinaciones, he consultado el libro de Mauricio para ver esa instrucción, páginas web y en algunas consultas del foro, y nada. He quitado código y modificado parte para que se vea mas claro y adjunto el archivo para que se vea lo último que he intentado hacer.
Un saludo.
He intentado la instrucción que me pones, pero no me pasa del primer registro y mira que he probado combinaciones, he consultado el libro de Mauricio para ver esa instrucción, páginas web y en algunas consultas del foro, y nada. He quitado código y modificado parte para que se vea mas claro y adjunto el archivo para que se vea lo último que he intentado hacer.
Un saludo.
- Adjuntos
-
- OOoBasic Combinar texto FINAL - 11.7z
- (31.65 KiB) Descargado 101 veces
LibreOffice versión: 7.0.5.2 (x64) - Windows 10 Pro 64 bits
Re: Sustituir texto por campos de una tabla
Hola,
Esto que es lo que te expliqué recoge todos los registros, si quieres solo uno, puedes capturarlo a través de seleccionarlo en el formulario. Para los otros campos, puedes hacer lo que hecho para ocupante.
oStat = ThisDatabaseDocument.CurrentController.ActiveConnection.CreateStatement
sSQL = "SELECT ""RutaDili"", ""Direccion"", ""Telefono"" FROM tblDatos"
oRes = oStat.ExecuteQuery(sSQL)
While oRes.Next
valor1 = oRes.getString(1)
valor2 = oRes.getString(2)
valor3 = oRes.getString(3)
c = c + 1
sd.setSearchString("%Ocupante"& c &"%")
found = doc.findAll(sd)
For f = 0 To found.Count - 1
t = found.getByIndex(f)
t.setString(valor1)
Next f
Wend
Esto que es lo que te expliqué recoge todos los registros, si quieres solo uno, puedes capturarlo a través de seleccionarlo en el formulario. Para los otros campos, puedes hacer lo que hecho para ocupante.
oStat = ThisDatabaseDocument.CurrentController.ActiveConnection.CreateStatement
sSQL = "SELECT ""RutaDili"", ""Direccion"", ""Telefono"" FROM tblDatos"
oRes = oStat.ExecuteQuery(sSQL)
While oRes.Next
valor1 = oRes.getString(1)
valor2 = oRes.getString(2)
valor3 = oRes.getString(3)
c = c + 1
sd.setSearchString("%Ocupante"& c &"%")
found = doc.findAll(sd)
For f = 0 To found.Count - 1
t = found.getByIndex(f)
t.setString(valor1)
Next f
Wend
OpenOffice 4.1.15 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
Sustituir texto por campos de una tabla
Hola,
Ahora aplicando ese código si que muestra todos los registros, a día de hoy yo no lo hubiese logrado. Lo estudiaré. Muchísimas gracias.
Un saludo.
Ahora aplicando ese código si que muestra todos los registros, a día de hoy yo no lo hubiese logrado. Lo estudiaré. Muchísimas gracias.
Un saludo.
LibreOffice versión: 7.0.5.2 (x64) - Windows 10 Pro 64 bits