[RESUELTO] Manipular el "CopyTableWizard"

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] Manipular el "CopyTableWizard"

Mensaje por Longi »

Buenas!
En las opciones manejadas por código del asistente de copia de tablas ("CopyTableWizard") hay una opción que se me resiste, y es la de "CreatePrimaryKey".
Querría que generase una clave primaria o no en función del destino de la importación (clave primaria para tabla nueva, y no clave primaria si va a una tabla ya existente), pero se me resiste. No he podido poniento '=True', ni '="True"', ni '(True)', ni '("True")', ni '=1', ni'=0', ni '=-1' , ni (True, "ID"), ni otras combinaciones que se me ocurrieron.
En http://www.openoffice.org/api/docs/comm ... PrimaryKey hace referencia a '::com::sun::star::beans::Optional< string > CreatePrimaryKey', pero como siempre, me resulta muy críptico todo (y además no se les ocurre mejor cosa que ponerlo en Inglés, por si no fuese ya de por sí difícil....(modo broma, claro!).
La parte del código que estoy manejando es este:

Código: Seleccionar todo

 Origen.command = TablaOrigen                                            ' Tabla de origen de la estructura que vamos a copiar
    oCTW = com.sun.star.sdb.application.CopyTableWizard.create(Origen,Destino)' Asistente de copia
    oCTW.setTitle("COPIAR TABLAS")                                           ' Título
    oCTW.destinationTableName = TablaCopia                                ' Tabla de destino
    oCTW.operation = com.sun.star.sdb.application.CopyTableOperation.CopyDefinitionAndData ' Copia solo la estructura
    oCTW.useHeaderLineAsColumnNames = true                                   ' Usamos la primera fila como título de la tabla

    If Value= False Then                                                        ' En caso de trabajar solo la estructura
    oCTW.CreatePrimaryKey = true
    End if                                                                   ' Acabamos la condición
La anteúltima línea es la culpable de que os esté dando guerra.
También soy consciente de que con que solo emerja el cuadro de diálogo ya podría hacer la elección a mano, pero es ese prurito de decir que soy capaz de manejar la situación y no la situación me maneja a mi.
Ah!, y sí, he sido incapaz de encontrarlo con Google.

Un saludo y gracias!
Última edición por Longi el Vie Jun 01, 2018 9:43 am, 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: Manipular el "CopyTableWizard"

Mensaje por fornelasa »

Ummm, tal vez Pudiera ser por lo que dice la ayuda en negrita
Especifica que se debe crear una nueva clave primaria en la base de datos de destino.
En el momento de la inicialización, puede especificar la configuración inicial para la clave principal en la interfaz de usuario.
No puede usar este atributo para determinar la clave principal, posiblemente creada por el asistente, una vez que haya finalizado. La razón es que, durante la ejecución del asistente, el usuario puede definir una clave primaria arbitrariamente compleja, p. incluyendo columnas múltiples, que ya no pueden ser representadas en este simple atributo.
Este atributo se ignora si Operation es CopyTableOperation AppendData.
No se admite el cambio de este atributo mientras el cuadro de diálogo se está ejecutando; el resultado de dicho intento no está definido.
Cuando el asistente debe crear una clave primaria, será una columna de incremento automático, si es posible.
También de acuerdo a la ayuda creo no acepta un argumento booleano
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: Manipular el "CopyTableWizard"

Mensaje por Longi »

Gracias de nuevo por la respuesta.
Yo también quise deducir eso, que el booleano no lo acepa, pero me parecía que entendía mal. ¿Para qué se quiere un booleano que luego no se acepta?
Al aceptarlo gráficamente (sobre el diálogo) sí que funciona, y querría pensar que al ponerlo en código antes de 'oCTW.execute()' (por cierto, que se me olvidó ponerlo en el código del post anterior), sería el equivalente a seleccionarlo gráficamente antes de lanzar el diálogo.
Por otra parte, si uso "WScript.Shell" consigo hacerlo funcionar sin problemas, pero no quería utilizarlo, ya que, aunque no tengo ni idea, me parece que solo es efectivo en windows, y quería hacer algo que sirviese para todos. (Porfa, confirmadme si es solo para windows o simplemente estoy equivocado como tantas veces).
Ah!, también he encontrado diferencias entre Open y Libre en el comportamiento del cuadro de diálogo, siendo más rígido el de Open, pero responden igual al código a modo de ejemplo que pongo a continuación:

Código: Seleccionar todo

    Origen.command = TablaOrigen                                                           ' Tabla de origen de la estructura que vamos a copiar
    oCTW = com.sun.star.sdb.application.CopyTableWizard.create(Origen,Destino)             ' Asistente de copia
    oCTW.setTitle("COPIAR TABLAS")                                                         ' Título
    oCTW.destinationTableName = TablaCopia                                                 ' Tabla de destino
    oCTW.operation = com.sun.star.sdb.application.CopyTableOperation.CopyDefinitionAndData ' Copia solo la estructura
    oCTW.useHeaderLineAsColumnNames = true                                                 ' Usamos la primera fila como título de la tabla
    '-----------------------------------------------
    ' Usamos Wscript.Shell para substituir el control "CreatePrimaryKey"
    
    set oWSObj1 = CreateObject("WScript.Shell")                                            ' Creamos el objeto   

    If Value= False Then                                                                   ' Si el nombre escogido para la tabla no lo hay en la base
    oWSObj1.SendKeys "{TAB 2}"                                                             ' Tecleamos dos veces "TAB"
    oWSObj1.SendKeys "{ENTER 2}"                                                           ' Tecleamos dos veces "ENTER"
    Else                                                                                   ' En caso de que sí que haya la tabla
    oWSObj1.SendKeys "{TAB}"                                                               ' Tecleamos una vez "TAB"
    oWSObj1.SendKeys "{Down 2}"                                                            ' Vamoa para abajo dos veces
    oWSObj1.SendKeys "{ENTER}"                                                             ' Tecleamos "ENTER" una vez
    End If                                                                                 ' Acabamos la condición de que exista o no la tabla

    oCTW.execute()                                                                         ' Se ejecuta el diálogo de copia
Cuando tenga todo medianamente funcional, según mis pruebas, lo colgaré, pero por el momento prefiero solo dejar algún fragmento.

Un saludo y gracias otra vez! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Manipular el "CopyTableWizard"

Mensaje por mauricio »

Longi escribió:¿Para qué se quiere un booleano que luego no se acepta?
En el momento de la inicialización, puede especificar la configuración inicial para la clave principal en la interfaz de usuario.
______________________________________________
"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: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Manipular el "CopyTableWizard"

Mensaje por Longi »

Gracias por responder.
Yo tenía la intención de hacer la selección por código, no con el interfaz, pero no lo consigo.
Al trabajar con "WScript.Shell" hay diferencias según el idioma con el que estemos trabajando, y también según si se usa Libre u Open.
Aunque está todo a medio hacer os dejo el enlace con todos los ejemplos que he estado trabajando hasta ahora.
Al empezar se trataba de una comparativa entre diferentes técnicas, en cuanto a lo que tarda en hacer una importación desde hoja de cálculo, pero luego uno se va liando.....
La parte de exportaciones todavía hay que trabajarla para que entre en el cuadro de diálogo, y por último intentaré hacer un cuadro de diálogo con las técnicas más rápidas y con opciones que aún no están implementadas, como copiar rangos o tablas completas, etc. (ya os avisé que no estaba completo)
El problema por el que os pregunto es el correspondiente al botón llamado "Importar5", que corresponde al final (después de pasar por el diálogo) al módulo "IMPORTACION5", y a la macro "Import". Ah!, y todo ello en la base de datos IMPORTAR29.
Para no perderse: Al dar al botón, aparece un navegador para escoger el origen de los datos (buscais una de las hojas de cálculo que van también en la carpeta, aunque podría buscarse cualquier otra). Después de seleccionada, abrirá un diálogo, en el que aparecen las hojas del archivo de cálculo que tienen datos. Se selecciona uno, y te deja en un cuadro de texto, (pendiente de modificación), donde escribes el nombre con el que se grabará la tabla en la que se hará la importación.
Si el nombre es el de una tabla que ya está, borrará los registros que tiene (también pendiente de modificación), y pegará los nuevos.
Si el nombre es nuevo, generará una tabla nueva. En este caso es en el que hay que añadir una columna con clave principal. Al no poder hacerlo por código, lo hice con "WScript.Shell", teniendo en cuenta las diferencias entre Libre y Open.
En poco tiempo aparece al fondo del diálogo el tiempo consumido, que en función del equipo puede ir de minuto y medio para 4000 registros a apenas 8 ó 10 segundos.
Esta es la versión más rápida que he visto (mezclé cosas de Roberto Beneitez, recogiendo los datos de la hoja de cálculo con un descriptor, y de Piaf, usando el asistente y el uso del navegador).
Si funcionase sin el "WScript.Shell" creo que sería perfecto.

https://drive.google.com/drive/folders/ ... sp=sharing

Gracias por aguantarme!

Un saludo! ;)
Última edición por Longi el Vie Jun 01, 2018 4:25 pm, editado 1 vez 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: Manipular el "CopyTableWizard"

Mensaje por fornelasa »

Longi, es que por ejemplo para mi tu código no es entendible al 100%, como que muestras un código digamos ya muy adelantado.
Preguntas:
Longi escribió:También soy consciente de que con que solo emerja el cuadro de diálogo ya podría hacer la elección a mano
¿No se supone que precisamente (aunque sea por código) la intención de usar un CopyTableWizard es porque lo queremos hacer a mano?
¿No se supone que si queremos copiar una tabla, la debemos copiar precisamente con todos sus datos y claves?
Casi, casi, casi estoy seguro que no puede hacerse (sin usar el SendKeys) mas que en el momento de la inicialización ...... creo.

Sin saber lo que hace tu codigo:
If Value= False Then ' En caso de trabajar solo la estructura
oCTW.CreatePrimaryKey = true
End if
No sé si has probado por ejemplo:

Código: Seleccionar todo

dato = oCTW.CreatePrimaryKey.IsPresent
If dato = false

Código: Seleccionar todo

clave = oCTW.CreatePrimaryKey.Value
if clave = "ID"
Es decir, no puedes asignar un valor directamente a la estructura CreatePrimaryKey porque dicha estructura tiene dos atributos, a saber:

Código: Seleccionar todo

IsPresent---True o False   
Value--- "ID" o cualquier String
https://www.openoffice.org/api/docs/com ... ional.html

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: Manipular el "CopyTableWizard"

Mensaje por Longi »

Buenas!
No he conseguido probar tus sugerencias (soy bastante manazas).
De todos modos, de lo que se trata es de importar una hoja de cálculo hacia una tabla de base. Si la tabla no existe, entonces copia la estructura y los datos con una clave principal. Si la tabla ya existe, se supone que ya tiene su clave principal, y por eso la importación no debiera generar esa columna.
El código que me has puesto tiene pinta de "describir" lo que hay (".IsPresent"), pero ese no sería el caso.
De todos modos, fuese como fuese, como lo que pretendo es que se dispare el procedimiento con los datos de los que ya dispone la macro, sin tener que entretenerse en el asistente, para apretar el botón de 'Crear' seguiríamos en la misma, por lo que creo que no es necesario que hagas más esfuerzos en intentar descifrar qué es lo que quiero decir en mis 'escritos' (soy de ciencias y de eso deriva que me exprese con ciertas deficiencias).
Gracias por todo y seguiré para adelante con lo que ya tengo, aunque, por supuesto, se admiten todas las sugerencias que se puedan hacer.

Otro saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Responder