[RESUELTO]Comparativa Relaciones Hoja de Cálculo y Base

Discute sobre las herramientas de la base de datos
Responder
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

[RESUELTO]Comparativa Relaciones Hoja de Cálculo y Base

Mensaje por Longi »

Buenas!
Como siempre, metiéndome en fregados de difícil solución.
Manejo con cierta frecuencia tablas que pueden llegar a los 5000 registros, y proceden de una aplicación corporativa, que tiene salida a Calc o Excel.
Tengo, gracias a los esfuerzos de Forlenasa y otros ímprobos trabajadores del foro, una adaptación de un procedimiento de Roberto Beneitez que incorpora las tablas a Base, y después ya puedo manejar los datos a mi antojo, y con los automatismos que en su día estimé oportunos.
Cada vez que uso la aplicación borro las tablas y las vuelvo a cargar, ya que los datos tienen variaciones diarias. Explico esto porque hay otra manera de trabajar, y es hacer una copia de la tabla, con toda la carga de datos, y ya no vuelves a hacer ninguna importación, así según trabajes, necesitas un sistema u otro.
Lo cierto es que cuando las tablas son grandes (5000 registros, por ejemplo), y la máquina no es de última generación, las cosas pueden ser un poco lentas, así que me puse a recopilar los distintos métodos que pude (podíamos llamarlo investigación bibliográfica), y las puse todas en una base de ejemplo, y acompañé a la base con una tabla de 3678 registros de calc o de excel. Añadí para cada procedimiento un contador de tiempo, que variará con la máquina, incluso con el momento en el que esté el ordenador (descargas en segundo plano, etc), pero creo que puede servir como comparativa.
Hay 4 importaciones diferentes (Roberto Beneitez, Modificación de ésta por Forlenasa, Modificación hecha por SLV y una adaptación de un código de Forlenasa que hice yo)
 Editado: Fornelasa 
Hay 3 exportaciones (Roberto Beneitez, Dmitri Popov y Rudolfo)
Por último hice un intento (Botón Copiar) para emular el método 'drag and drop', abriendo el origen de datos en segundo plano, seleccionando los datos, copiándolos, y.....si tienes el panel de tablas a la vista, con la tabla "TRANSPORTISTAS" seleccionada, y le das al botón, puede que en un primer intento solo te salga el contador de tiempo (no se ha hecho nada), pero si lo intentas más veces, entonces aparece el cuadro de diálogo que aparece normalmente en 'drag and drop', aceptas, y la carga es en la mitad de tiempo que la técnica más rápida (adaptación de Forlenasa).
 Editado: Fornelasa 
En fin, para acabar ya: No sé cómo hacer que el foco se ponga en la ventana del panel de tablas, para que al pegar la copia de la tabla se dispare el cuadro de diálogo, o que sin que aparezca el cuadro de diálogo se haga todo en segundo plano de forma automática.
Otra cosa: en el formulario he puesto un control de tabla para rellenar con las rutas y los nombres de tablas y de hojas de cálculo, así como sus extensiones, ya que son variables que habría que modificar para cada procedimiento, y al hacerlo así lo hice con constantes globales, evitando tener que buscar por todos los módulos.
Si se pudiese arreglar, sería un proyecto de ejemplo para colgar en el foro de ejemplos.

El enlace sería https://drive.google.com/file/d/0B9p04i ... sp=sharing
 Editado: Lo siento!, se me olvidó poner que para que funcione la base debe estar registrada, si no solo funcionaría importación 1, importación 3, copiar, con sus limitaciones, y no comprobé las exportaciones.
Ah! parece que funcionan las importaciones mejor en Aoo que en Libre, cosa que no ocurre con las exportaciones. 
Gracias y perdón por el rollo. ;)
Última edición por Longi el Mié May 17, 2017 8:58 pm, editado 2 veces en total.
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Comparativa Relaciones Hoja de Cálculo y Base

Mensaje por fornelasa »

Voy a dar mi comentario aun sabiendo que a lo mejor ni entendí tu consulta.
Creo que mientras tengas el foco en Formularios -> Inicio -> TuMenu; es imposible seleccionar la tabla TRANSPORTISTAS del panel de tablas porque precisamente el foco está en TuMenu; a no ser que hagamos lo siguiente (obvio con macro):
1) Cierres TuMenu
2) y después enfoques o selecciones la tabla TRANSPORTITAS (que quien sabe como se haga esta tarea)
3) Corras la macro Copiar pero que esta macro no llame a otras macros que re-direccionen el foco a otros menús
4) y cuatro, que vuelvas a abrir TuMenu

¿Sí, es más o menos lo que solicitas?

Saludos, Federico.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Comparativa Relaciones Hoja de Cálculo y Base

Mensaje por Longi »

Punto1:
¡Disculpa porque te cambio el alias constantemente! y en alguna ocasión te cambié también por Xixeme.
Punto2:
Lo que escribes en tu punto 2:"(que quien sabe como se haga esta tarea)" es el quiz del asunto.
Con

Código: Seleccionar todo

    If oDocumento.getTitle()=NombreBase & ".odb" Then                                        ' Si tiene el título que nos interesa
    document   = oDocumento.CurrentController.Frame
    oVentana = oDocumento.getCurrentController.getFrame.getComponentWindow()
    oVentana.setFocus()
   End if
ya llego a enfocar a la ventana en la que están los formularios seleccionados, pero no sé como enfocar en las tablas si no es con el ratón.
Si tientes abierto el formulario, lo minimizas, clicas en tablas, y ya para rizar el rizo, seleccionas la tabla. Después maximizas el formulario y clicas en el botón 'COPIAR', puede que en el primer intento no te dé resultado, pero si eres cabezota como yo, entonces en el siguiente intento se comporta como si estuviese el foco en el panel de tablas, y además en la tabla que le marcaste, saltando el asistente del 'drag and drop'.
Por cierto, ese asistente tendrá un URL al que llamar?, así quizá evitamos el tema del enfoque.....Vamos, que hablo por no estar callado.
Punto3:
Muchas gracias por echarle un vistazo
Punto4:
Se admiten variaciones, sugerencias y nuevas macros o procedimientos para poder comparar y ver qué método es el más adecuado, aunque lo cierto es que en su día ya hiciste aportaciones más que suficientes al respecto.
Punto5:
Lo dicho, que muchas gracias.

Un saludo!
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Comparativa Relaciones Hoja de Cálculo y Base

Mensaje por fornelasa »

Longi escribió: Punto2:
Lo que escribes en tu punto 2:"(que quien sabe como se haga esta tarea)" es el quiz del asunto.
ummmmmm, mientras llega una opción mejor, intenta y haz pruebas experimentales con este código; usando el bloc de notas (Si usas windows, sino, ya valió):
guárdalo con el siguiente nombre así tal cual con la extensión selTabla.wsf
es decir la ruta del archivo sería más o menos así C:\Users\Federico\Downloads\selTabla.wsf

Esta macro selecciona la segunda tabla del panel de tablas

Código: Seleccionar todo

<package>
   <job id="vbs">
      <script language="VBScript">
      Dim Args      
      Set Args = WScript.Arguments      
        set Objeto = WScript.CreateObject("WScript.Shell")
        Objeto.AppActivate Args(0)
        Objeto.SendKeys "{UP}"
        Objeto.SendKeys "{UP}"
	Objeto.SendKeys "{TAB}"
	Objeto.SendKeys "{TAB}"
	Objeto.SendKeys "{TAB}"
	Objeto.SendKeys "{DOWN}"
        'Objeto.SendKeys "~"
       </script>
   </job>
</package>
y llámalo así:

Código: Seleccionar todo

Sub SeleccionarTabla()
   AppString = StarDeskTop.ActiveFrame.Title
   Shell("WScript ""C:\Users\Federico\Downloads\selTabla.wsf""" & " " & AppString,False)
End Sub
Nota esta linea

Código: Seleccionar todo

AppString = StarDeskTop.ActiveFrame.Title
Si no está en el frame adecuado no funcionará; el frame correcto o foco correcto sería el frame normal cuando abres Base

Por favor analizalo y después comentas, ojala sirva de algo.
No eches en saco roto lo que comente en mi primer post.

Saludos, Federico.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Comparativa Relaciones Hoja de Cálculo y Base

Mensaje por Longi »

Buenas!
Nada fuera de lo previsible!: no fui capaz de ponerlo a funcionar.
Supongo que es el código de una especie de grabación de lo que se hace en pantalla en Windows, pero soy muy, muy, muy torpe.
De todos modos, estoy recordando lo de que el árbol no te deja ver el bosque. Bien, el asunto de manejar las ventanas e intentar llegar a la tabla que me interesa es simplemente con la intención de disparar el código que hay detrás del botón de 'Aceptar' del cuadro de diálogo que sale al enfocar en el panel de tablas y arrastrar una hoja de calc encima de él.
En su defecto, si tuviésemos método para que emergiese el cuadro de diálogo al llamarlo por código, como encontré este código para el cuadro informativo sobre la versión en la que se está trabajando:

Código: Seleccionar todo

Sub exemploComandoUNO
   ' cria a estrutura
   Dim cmdUNO As New com.sun.star.util.URL
   ' define URL do comando
   cmdUNO.Complete = ".uno:About"
   ' cria o objeto de análise
      oURLT = CreateUnoService("com.sun.star.util.URLTransformer")
   ' analisa
   oURLT.parseStrict(cmdUNO)
   ' Frame é o objeto que trata os comandos UNO
   oFrame = thisComponent.getCurrentController().getFrame()
   ' obtém um objeto representando o comando About
   ' [ com.sun.star.frame.XDispatch ]
   oDispatcher = oFrame.queryDispatch( cmdUNO, "", 0)
   ' encaminha o comando
   msgBox "Ok para diálogo Sobre", 176, "Executar comando:"
   oDispatcher.dispatch( cmdUNO, Array() )
End Sub
Entiendo que si fuese tan sencillo, los que sabeis ya lo tendríais puesto a punto hace mucho.
Gracias por el intento.

Un saludo!
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Comparativa Relaciones Hoja de Cálculo y Base

Mensaje por fornelasa »

Se supone que cuando le das clic al botón COPIAR lo primero que debería hacer la macro es seleccionar la tabla TRANSPORTISTAS para que a partir de ahí te haga el copiado de los datos de Calc A Base.
Como lo dije en mi primer post ,el problema es que dentro de la macro Copiar envías el foco de atención a otros lados y eso hace que tu macro no funcione.
Imagina por un momento que la macro COPIA solo tiene este código:

Código: Seleccionar todo

Sub Copia()
    Thisdatabasedocument.formdocuments.getbyname("INICIO").close(true)	'LINEA PARA QUITAR EL FOCO DEL FORMULARIO
    AppString = StarDeskTop.ActiveFrame.Title
    Shell("WScript ""C:\Users\Federico\Downloads\selTabla.wsf""" & " " & AppString,False)
End Sub
Obviamente (previamente) copiaste y pegaste de aquí al bloc de notas el código que te indiqué post arriba y llamaste al archivo selTabla.wsf

Hazlo con tu archivo de ejemplo que has enviado y veremos como selecciona la segunda tabla del panel de tablas.

Saludos, Federico.
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Comparativa Relaciones Hoja de Cálculo y Base

Mensaje por Longi »

Pues esta vez sí que pasó algo distinto de lo previsible.
Hice algunas modificaciones y todo quedó perfecto para cómo formulé la pregunta, por lo que lo tengo que marcar como resuelto, ya que a lo que se preguntó se le dió la respuesta perfecta (Gracias maestro! :super: )
La macro queda de este modo para añadir a la base de datos:

Código: Seleccionar todo

Sub Copia()

    Dim sRuta As String, document As Object, dispatcher As Object
    Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"
    Dim oDocumento As Object
    
    msgbox "Esto es un intento de simular la técnia de 'drag and drop', abre origen de datos en segundo plano, los copia, y si tenemos seleccionado el panel de formularios, entonces sale el cuadro de diálogo de pegado de datos sobre la segunda tabla, que al aceptar carga la tabla rápidamente."
    
    Call Constantes_Globales                                                                 ' Llamada a la macro de constantes globales
    Call ELIMINACION                                                                         ' Limpiamos la tabla por si tiene registros previos
    '--------------------------------------------------------------
    ' Accedemos a las funciones de Calc para calcular el tiempo empleado
    
    oFunctionAccess = createUnoService("com.sun.star.sheet.FunctionAccess")                  ' Acceso a las funciones de Calc
    dDateTime1=oFunctionAccess.callFunction("NOW", Array())                                  ' Primera marca de tiempo
    '------------------------------------------------------
    ' Opciones del documento de calc que vamos a copiar
   
    mOpciones(0).Name = "Hidden"                                                             ' Nombre de la propiedad 'Escondido'
    mOpciones(0).Value= True                                                                 ' Trabajamos en segundo plano
     
    sRuta= ConvertToUrl(RutaHoja & NombreHoja &"."& ExtensionHoja)
    oDocumento = StarDesktop.loadComponentFromURL( sRuta, "_blank", 0, mOpciones() )         ' Hoja de cálculo que abrimos
    ' ----------------------------------------------------------------------
    ' Accedemos al documento
    
    document   = oDocumento.getCurrentController.getFrame                                    ' Accedemos al documento
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")                       ' Creamos el ayudador
    ' ----------------------------------------------------------------------
    ' Establecemos valores de trabajo
    
    dim args1(0) as new com.sun.star.beans.PropertyValue                                     ' Array de acciones
    args1(0).Name = "ToPoint"                                                                ' Nombre de la acción
    args1(0).Value = "$A$2"                                                                  ' Seleccionamos la celda A2
    dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())                    ' Nos colocamos en la celda
    ' ----------------------------------------------------------------------
    ' Establecemos la selección y la copiamos
    
    dim args2(0) as new com.sun.star.beans.PropertyValue                                     ' Array de acciones
    args2(0).Name = "Sel"                                                                    ' Nombre de la acción seleccionar
    args2(0).Value = true                                                                    ' Le decimos que si
    dispatcher.executeDispatch(document, ".uno:GoToEndOfData", "", 0, args2())               ' Vamos al final de los datos
    dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())                        ' Copiamos los datos
    '---------------------------------------------------------------------
    ' Repasamos todos los documentos del escritorio
    
    oDocumentos = StarDesktop.getComponents()                                                ' Documentos que hay en el escritorio
    oEnumeraDocumentos = oDocumentos.createEnumeration()                                     ' Enumeramos los documentos
    Do While oEnumeraDocumentos.hasMoreElements()                                            ' Mientras haya más elementos
    oDocumento = oEnumeraDocumentos.nextElement()                                            ' Vamos al siguiente
    If HasUnoInterfaces(oDocumento, "com.sun.star.frame.XModel") Then                        ' Si tiene modelo
    If oDocumento.getTitle()=NombreBase & ".odb" Then                                        ' Si tiene el título que nos interesa (el nombre de la base de datos)
    document= oDocumento.CurrentController.Frame                                             ' Determinamos el marco (Frame)
    oVentana = oDocumento.getCurrentController.getFrame.getComponentWindow()                 ' Ventana en el marco
    oVentana.setFocus()                                                                      ' Enfocamos
    Shell("WScript ""C:\Users\pablo\Desktop\Nueva carpeta 2\selTabla.wsf""" & " " & NombreBase & ".odb",False) ' Vamos a la tabla
    Wait 80                                                                                  ' Si no esperamos nos da error
    dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())                       ' Iniciamos el pegado
    End if                                                                                   ' Acabamos la condición del título
    End if                                                                                   ' Acabamos la condición del modelo
    loop                                                                                     ' Vamos al siguiente elemento
    '-----------------------------------------------
    ' Volvemos al formulario de inicio
    
    oDocumentos2 = StarDesktop.getComponents()                                               ' Documentos que hay en el escritorio
    oEnumeraDocumentos2 = oDocumentos2.createEnumeration()                                   ' Enumeramos los documentos
   
    Do While oEnumeraDocumentos2.hasMoreElements()                                           ' Mientras haya más elementos
    oDocumento2 = oEnumeraDocumentos2.nextElement()                                          ' Vamos al siguiente
    If oDocumento2.getTitle()="IMPORTAR2.odb : INICIO" Then                                  ' Si tiene el título que nos interesa
    Wait 100                                                                                 ' Hay que esperar un poco
    document= oDocumento2.CurrentController.Frame                                            ' Marco del documento
    oVentana2 = oDocumento2.getCurrentController.getFrame.getComponentWindow()               ' Ventana en el marco
    oVentana2.setFocus()                                                                     ' Enfocamos al formulario
    End if                                                                                   ' Acabamos condición de título
   
    If oDocumento.getTitle()=NombreHoja &"."&  ExtensionHoja or oDocumento.getTitle()=NombreHoja &"."& ExtensionHoja & " (solo lectura)" Then
    oDocumento.close(True)
    End if

    loop                                                                                     ' Vamos al siguiente elemento
    '--------------------------------------------------------
    ' Ponemos el segundo punto de tiempo
   
    dDateTime2=oFunctionAccess.callFunction("NOW", Array())                                  ' Segunda marca de tiempo
    Call Contador                                                                            ' Llamada a la macro que nos cuenta el tiempo
   
End Sub
El pequeño pero, y que tendrá que ser motivo en otro hilo (este queda resuelto), es que hay que estar en el panel de formularios y solo apunta a la segunda tabla, de tal manera, que en la base de datos de comparación, al aparecer nuevas tablas, acaba por apuntar aquella a la que no queremos, porque pasa a ser la tercera, etc.

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

Re: [RESUELTO]Comparativa Relaciones Hoja de Cálculo y Base

Mensaje por Longi »

Buenas!

Aunque ya lo había puesto como resuelto, hice modificaciones y he conseguido acceder al panel de tablas sin la ayuda de macro externa, pero sigo sin saber seleccionar la tabla.
Cambié la carpeta añadiendo la macro externa y añadí 'COPIAR 1', que es la que no necesita la macro, pero sigue sin estar terminada.

https://drive.google.com/file/d/0B9p04i ... sp=sharing

Otro saludo! :?
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: [RESUELTO]Comparativa Relaciones Hoja de Cálculo y Base

Mensaje por fornelasa »

Me es claro que usando la macro externa no es precisamente lo optimo.
Hablando de la macro Copia y usando la macro externa, ella siempre funciona mejor si agregamos o colocamos estas lineas de este modo:

Código: Seleccionar todo

msgbox "Esto es un intento .................... la segunda"
Thisdatabasedocument.formdocuments.getbyname("INICIO").close(true)
Call Constantes_Globales
Call ELIMINACION
Shell("WScript ""C:\Users\............. ' EL Shell debe ir aquí y no allá
Y al final:

Código: Seleccionar todo

dDateTime2=oFunctionAccess.callFunction("NOW", Array())
Thisdatabasedocument.formdocuments.getbyname("INICIO").Open
Call Contador
   
Si deseas que la macro externa seleccione la tercer tabla en vez de la segunda entonces agrega abajo de:

Código: Seleccionar todo

Objeto.SendKeys "{DOWN}"
otro

Código: Seleccionar todo

Objeto.SendKeys "{DOWN}"
Por ejemplo también:
Si deseas que la macro externa seleccione la primer tabla en vez de la segunda entonces agrega abajo de:

Código: Seleccionar todo

Objeto.SendKeys "{DOWN}"
Un

Código: Seleccionar todo

Objeto.SendKeys "{UP}"
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Responder