Documentos en tablas de base

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...

Documentos en tablas de base

Notapor Longi » Mié Jul 22, 2015 7:01 am

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   Expandir vistaContraer vista
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   Expandir vistaContraer vista
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.5, en Windows 10
Openoffice 4.1.3, en Windows 7
Libreoffice 6.0, en Windows 10
Longi
 
Mensajes: 566
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Documentos en tablas de base

Notapor Longi » Mié Jul 22, 2015 5:38 pm

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.5, en Windows 10
Openoffice 4.1.3, en Windows 7
Libreoffice 6.0, en Windows 10
Longi
 
Mensajes: 566
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Documentos en tablas de base

Notapor mauricio » Mié Jul 22, 2015 6:09 pm

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
Avatar de Usuario
mauricio
 
Mensajes: 5873
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX

Re: Documentos en tablas de base

Notapor Longi » Mié Jul 22, 2015 8:21 pm

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.5, en Windows 10
Openoffice 4.1.3, en Windows 7
Libreoffice 6.0, en Windows 10
Longi
 
Mensajes: 566
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España


Volver a Macros y API UNO

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados