Documentos en tablas de base

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
Longi
Mensajes: 808
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Documentos en tablas de base

Mensaje por Longi »

Buenas!
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
La opción de que fuese una foto la he silenciado con comillas simples. Si el documento es una imagen, tampoco sale.

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
Gracias por vuestra atención.

Un saludo!
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Longi
Mensajes: 808
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Documentos en tablas de base

Mensaje por Longi »

Buenas otra vez!

Como una imagen vale más que mil palabras, os adjunto una base hecha de ejemplo.
Las macros habría que afinarlas más, ya que no he sido aún capaz de diferenciar si el documento es imagen, pdf o texto simple, de tal manera que he 'silenciado' las opciones de imagen con comillas simples.
Si les quitáis esa mordaza, podreis ver que sobre un documento de texto anda rondando por ahí un marco para una imagen, que no termina de cargar nada.
El documento con nombre FOTO1 se refiere a una foto que he cargado en la tabla con la macro de carga de documento, pero no se ve nada al intentar ponerla detrás de la tabla del informe ( tampoco en el formulario DOCUMENTOS ).
La FOTO2 la he cargado como se cargan normalmente las fotos, y entonces, sin la mordaza de las comillas simples en la macro, sí que se carga después de la tabla del informe y se ve en el formulario. Por eso digo si se trata de un tema de extensiones ( y no me refiero a las del pelo.....-Tonterías de las mías.)

Bueno, ya me contaréis!

Un saludo!
Bueno!, como se me va de peso, aquí dejo el enlace:

https://drive.google.com/open?id=0B9p04 ... UQxTmdjeTA
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
mauricio
Mensajes: 6093
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Documentos en tablas de base

Mensaje por mauricio »

Este documento, lo usas en OpenOffice o en LibreOffice?... supongo que son subinformes te refieres a información detallada de un concepto padre, que es lo que recuerdo, es así?...
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Longi
Mensajes: 808
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Documentos en tablas de base

Mensaje por Longi »

Buenas!

He utilizado open en el desarrollo inicial, pero para estas macros he tenido que usar libre por el tema del trabajo. Sin embargo funcionan igual de bien ( o de mal ) tanto en libre como en open, al menos en las pruebas que he hecho.

Si, un subinforme sería como información detallada de cada registro del informe inicial: Informe 'padre': todos los equipos de fútbol, mientras que el subinforme sería por ejemplo la estadística de goles, etc de cada uno de ellos.
En realidad eso ya lo conseguí, pero hay que meter la consulta, las tablas, los gráficos, etc todo con código, pero no es el concepto que en otras suites se tiene de la entidad 'sub....' En esos casos se puede tener un informe o subinforme diseñado y en el diseño de otro, se puede meter y crear la relación entre ellos, quedando uno como 'padre' y el otro como 'hijo' o como subordinado. ( Al fin y al cabo es intentar hacer automatismos similares a lo que hace Access para que sea más atractivo para más gente ).

Gracias por atenderme.

Un saludo!
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Responder