Este es mi primera pregunta en este foro. Siempre ando en base, intentando cosas de informes, y esto es una consecuencia de esa 'manía' que tengo:
La idea inicial es la siguiente: En base no se pueden manejar subinformes, y los subformularios no tienen el mismo concepto y desarrollo que en otras suites, así que he estado intentando subinformes desde hace tiempo. Pensé que si conseguíamos que los formularios/informes los editábamos como 'Stand Alone', y los guardábamos en una tabla, después podríamos recuperarlos para ponerlos ( con marco o sin él ) en el interior de un formulairo/informe que haría de principal.
Sé que los documentos no deben ser guardados en tabla porque eso incrementa mucho el tamaño de base y le hace inestable, pero pensé que el objetivo justificaba los medios.
Conseguí modificaciones de una macro de DannyB y he hecho que me entren documentos en una tabla con campo longvarbinary, pero el resultado es que acumular en la tabla sí que los acumula, sin importar la extensión, pero al querer visualizarlo, en un formulario no se visualiza nada.
Después, con otra macro que tenía yo, introduzco, después de una tabla de un informe, coloco el documento, y en caso de que sea un documento de texto si que me lo muestra (caso de los 'Stand Alone', PERO HAN PERDIDO LA CONEXION CON LA BASE DE DATOS, Y ME SALEN SIN DATOS). En el resto de casos no me muestra nada.
¿Problema de extensiones?, o es un problema extenso?
En el caso de los 'StandAlone' se podría tener una conexión?
Las macros son las siguientes:
Código: Seleccionar todo
Sub ImportarDocumentosATabla()
'Adaptado de DannyB
'--------------------------------------------------
' 1º Declaramos las variables
Dim sRuta As String, ruta As String, Nombre As String, sSQL As Variant, Conn As Variant
Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
Dim oDoc As Object, oPathSettings As Variant, tempPath As Variant, TempFile As Variant
Dim cUrl As Variant, oSimpleFileAccess As Variant, iFileSize As Variant, oInputStream As Variant
Dim Statement As Variant, iAccess As Variant, oStat As Variant
'----------------------------------------------------------
' 2º Establecemos dos inputbox para introducir las variables correspondientes al documento a guardar
ruta = InputBox("¿Cual es la ruta del documento?. No te olvides de poner la extensión!")
Nombre= InputBox ("¿Con qué nombre quieres guardarlo?")
'----------------------------------------------------------------
' 3º Abrimos el documento para tenerlo bajo nuestro control
sRuta = ConvertToUrl( ruta) ' Convertimos la ruta del documento en URL
oDoc = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() ) ' Abrimos el documento
mOpciones(0).Name = Nombre ' Opción del array
mOpciones(0).Value = True ' Opción del array
'----------------------------------------------------------
' 4º Lo ponemos en un archivo temporal
oPathSettings = CreateUnoService( "com.sun.star.util.PathSettings" ) ' Servicio para crear el archivo temporal
tempPath = oPathSettings.Temp ' Archivo temporal
tempFile = "tmp.sxw" ' Parte del nombre del archivo temporal
cUrl = tempPath & tempFile ' Generamos el camino hacia el archivo temporal
oDoc.storeToURL( cUrl, mOpciones() ) ' Almacenamos el documento en el archivo temporal
'----------------------------------------------------------------
' 5º Nos preparamos para meterlo en la tabla de base
oSimpleFileAccess = createUnoService( "com.sun.star.ucb.SimpleFileAccess" ) ' Creamos el servicio SimpleFileAccess
iFileSize = oSimpleFileAccess.getSize( cUrl ) ' Obtenemos el tamaño del campo
oInputStream = oSimpleFileAccess.openFileRead( cUrl ) ' Creamos un inputstream desde el archivo temporal.
sSQL = "INSERT INTO DOCUMENTOS (FORMULARIOS) VALUES (?)" ' Definimos el statement preparado para el SQL
'----------------------------------------------------------------
' 6º Conectamos con la base de datos
Conn = ThisDatabaseDocument.CurrentController.ActiveConnection
Statement=Conn.createStatement() ' Creamos el servicio statement
Statement = Conn.prepareStatement(sSQL) ' Preparamos el Statement
Statement.setBinaryStream(1, oInputStream, iFileSize ) ' Insertamos el binary Stream ( ? ) en la columna 2 de la tabla
iAccess = Statement.executeUpdate() ' Se ejecuta el Update para fijar el dato
'----------------------------------------------------------------------
' 7º Cerramos el documento que queda incluido en la tabla documentos de la base de datos.
oDoc.close(True) ' Cerramos el documento
'---------------------------------------------------------------------------
' 8º Rellenamos la columna de 'Nombre'
oStat = Conn.CreateStatement ' Creamos un nuevo Statement
sSQL = "UPDATE ""DOCUMENTOS"" SET ""Nombre""= '"& Nombre &"' WHERE ""Nombre"" IS NULL"' Ponemos el nombre del documento en la tercera columna de la tabla
oStat.ExecuteUpdate(sSQL) ' Ejecutamos la consulta de Update.
End Sub
Código: Seleccionar todo
Sub InsertTextoGuardadoFinalMonotabla()
'--------------------------------------------------------------------
' 0 Declaramos las variables
Dim oreportdoc As Variant, ocontroller As Variant, oTexttable As Object
Dim oText As Variant, oCurs As Object, oPar As Variant, conn As Variant, oStat As Variant
Dim oFoto As Variant, FileName As Variant, FileUrl As Variant, rs As Variant
Dim objSize as New com.sun.star.awt.Size, BinStream As Variant
'------------------------------------------------------------------------------
'1º Abrimos el informe y establecemos valores
ocontroller = Thisdatabasedocument.currentController
if not ocontroller.isconnected then ocontroller.connect ' Conectamos con la base de datos
oreportdoc = Thisdatabasedocument.reportdocuments.getbyname("COMARCAS").open ' Abrimos el informe
oTexttable = oreportdoc.Texttables(0) ' La tabla del informe
'---------------------------------------------------------------
' 2ºPonemos un párrafo detrás de la tabla
oText = oreportdoc.getText() ' Texto del informe
oCurs = oText.createTextCursor() ' Cursor de texto
oPar = oreportdoc.createInstance("com.sun.star.text.Paragraph") ' Estructura de párrafo
oText.insertTextContentAfter ( oPar, oTexttable ) ' Colocamos el párrafo detrás de la tabla
'------------------------------------------------------------------
' 3ºPonemos el cursor de tabla fuera de la tabla
oCurs = oreportdoc.getCurrentController().getViewCursor() ' Cursor de tabla
oCurs.gotoEnd(False) ' Cursor al final de la celda
oCurs.gotoEnd(False) ' Cursor al final de la tabla
oCurs.goDown(1,False) ' El cursor sale de la tabla
Conn = ThisDatabaseDocument.CurrentController.ActiveConnection ' Tenemos activa la conexión con la base de datos
oStat = conn.createStatement
rs = oStat.executeQuery("SELECT ""ID"", ""FORMULARIOS"",""Nombre"" FROM ""DOCUMENTOS"" WHERE ""ID"" = 1" )
if rs.isBeforeFirst then ' Iniciamos el bucle que le pregunta a la consulta
rs.next ' Vamos al siguiente registro
FileName = rs.getString( rs.FindColumn("ID"))
FileName2 = rs.getString( rs.FindColumn("Nombre")) ' Recogemos el dato del campo "ID"
BinStream = rs.getBinaryStream( rs.FindColumn("FORMULARIOS" )) ' Recogemos los datos del campo "FORMULARIOS"
createUnoService("com.sun.star.ucb.SimpleFileAccess").writeFile( ConvertToURL( "c:\temp\" & FileName2 ), BinStream )' Escribimos los datos en un archivo temporal
end if ' Acabamos la condición
FileURL = convertToURL("C:\temp\"&FileName2 ) ' Convertimos la ruta a URL
'oFoto = oreportdoc.createInstance("com.sun.star.text.TextGraphicObject") ' La imagen guardada en la tabla
'objSize.Width = 2000 ' La anchura de la foto que queramos poner
'objSize.Height = 2000 ' La altura de la foto.
'oFoto.setSize(objSize) ' Se establece el tamaño
'oFoto.HoriOrient =2 ' El 0 supone que irá a la izquierda,el 1 a la derecha y el 2 al centro
'oFoto.GraphicURL = FileURL ' Se iguala la foto con la dirección URL
'oText.insertTextContent(oCurs, oFoto, false) ' Insertamosla imagen en el marco
' oText.insertTextContent(oCurs, oFoto, True) ' Insertamosla imagen en el marco
' oFoto.Surround = com.sun.star.text.WrapTextMode.PARALLEL ' Comportamiento de la imagen con su alrededor
oText= oreportdoc.getText() ' Texto dentro del marco
oCurs = oText.createTextCursor ()
oCurs.gotoEnd(False) ' Cursor de texto
DocToInsert = "C:\temp\" & Filename2
DocToInsertURL = convertToURL(DocToInsert)
oCurs.insertDocumentFromURL(DocToInsertURL,Array()) ' Insertamos el documento de texto
End Sub
Un saludo!