[RESUELTO] Exportar datos - Tabla Calc a Tabla Base

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

[RESUELTO] Exportar datos - Tabla Calc a Tabla Base

Notapor naves » Lun May 14, 2018 5:43 am

Hola a todos:

A pesar de que este es mi primer tema soy un asiduo visitante de este foro, ya que me interesa mucho la ofimática y generalmente busco ayuda y consejos aquí.

El motivo de la presente es solicitar de su apoyo para resolver la siguiente cuestión, tengo un libro en Calc que sirve como formato de formulario para los pedidos que los clientes realizan vía correo, en este libro hay una tabla que me gustaría exportar mediante una macro a una tabla en Base, pero no logro conseguirlo.

Cabe mencionar que ando perdido en el campo de Id_Movimiento puesto que es clave primaria en la tabla de base y no se si se tenga que registrar con IDNEW() o como proceder.

Quedo a sus órdenes, ojala alguien pueda iluminar el sendero.

Chao!

Añado código hasta el momento:
Código: Seleccionar todo   Expandir vistaContraer vista
REM  *****  BASIC  *****

Sub Exportar_tabla_base()
dim oDocto as object
dim oSheet as object
dim oDato as object
oDocto = thiscomponent.currentcontroller
oSheet = oDocto.activesheet
oServicio = createunoservice("com.sun.star.sdb.DatabaseContext")
obase = oServicio.getbyname("BD_MORKAS")
conn = obase.getconnection("","")
stmt = conn.createstatement()
'--------------------------------------------------------------------
for i = 1 to 9
idmovimiento = oSheet.getcellbyposition(0,i).string
concepto = oSheet.getcellbyposition(1,i).string
tipomovimiento = oSheet.getcellbyposition(2,i).string
fecha = format(oSheet.getcellbyposition(3,i).string,"dd-mm-yy")
idcliente = oSheet.getcellbyposition(4,i).string
notas = oSheet.getcellbyposition(5,i).string
idpedido = oSheet.getcellbyposition(6,i).string
idprecio = oSheet.getcellbyposition(7,i).string
valores = " VALUES ("+"'"+idmovimiento+"',"&"'"+concepto+"',"+"'"+tipomovimiento+"',"&"'"+fecha+"',"&"'"+idcliente+"',"&"'"+notas+"',"&"'"+idpedido+"',"&"'"+idprecio+"')"
strSQL = "INSERT INTO Tbl_Movimientos (Id_Movimiento,Concepto,Tipo_Movimiento,Fecha,Id_Cliente,Notas,Id_Pedido,Id_Tipo_Precio)" + valores
stmt.executeUpdate(strSQL)
next
conn.close()
msgbox "Se han exportado los datos correctamente"
End Sub


Adjunto archivo Calc
TOTAL.ods
Libro de Calc con macro de exportación
(44.77 KiB) 1 vez
Última edición por mauricio el Mié May 16, 2018 5:23 am, editado 5 veces en total
Razón: Marcar icono de resuelto
Libreoffice 5.2 en Debian 9
naves
 
Mensajes: 6
Registrado: Lun May 14, 2018 5:13 am

Re: Exportar datos - Tabla Calc a Tabla Base

Notapor RMG » Lun May 14, 2018 5:10 pm

Hola,

Si el campo Id_Movimiento es campo clave por supuesto que lo debes cargar y no puede estar duplicado, si es autonumerico, no hace falta cargarlo, el mismo se rellena.

Saludos
OpenOffice 4.1.5 y LibreOffice 5.4.5.1 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
RMG
 
Mensajes: 3239
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: Exportar datos - Tabla Calc a Tabla Base

Notapor naves » Lun May 14, 2018 5:44 pm

Hola RMG:

Muchas gracias por tu pronta respuesta, eso me quita la duda referente al campo clave primaria, pero al correr la macro me devuelve el siguiente error:
Imagen

La base de datos BD_MORKAS esta registrada, y no entiendo donde puede estar el problema.

Añado archivos
Archivo BD_MORKAS odb
https://www.dropbox.com/s/mripbzs7ukju035/BD_MORKAS.odb?dl=0

Archivo TOTAL ods
https://www.dropbox.com/s/lqregr7x3diqytk/TOTAL.ods?dl=0

¿Alguien tiene alguna idea de cual puede ser el problema?

Agradezco su tiempo.
Libreoffice 5.2 en Debian 9
naves
 
Mensajes: 6
Registrado: Lun May 14, 2018 5:13 am

Re: Exportar datos - Tabla Calc a Tabla Base

Notapor mauricio » Lun May 14, 2018 5:59 pm

El error es claro, no existe la tabla "Tbl_Movimientos", si realmente existe, entonces agrega una doble comilla en la instrucción:
Código: Seleccionar todo   Expandir vistaContraer vista
""Tbl_Movimientos""
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
AOO 4.1 | LibO 5.4 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 5566
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: México, D.F.

Re: Exportar datos - Tabla Calc a Tabla Base

Notapor naves » Lun May 14, 2018 6:20 pm

Hola Mauricio:

Antes que nada es un placer ver tu respuesta, soy alumno tuyo por decirlo de algun modo; ya que tu gran libro Aprendiendo OOo Basic me ha ayudado tanto a aprender de libreoffice basic.

Perdona ya vi la situación y es cierto un pequeño gran detalle que se me paso, agregar doble comilla.

¡Muchisimas gracias, por todo Mauricio! Saludos!!!
Libreoffice 5.2 en Debian 9
naves
 
Mensajes: 6
Registrado: Lun May 14, 2018 5:13 am

Re: Exportar datos - Tabla Calc a Tabla Base

Notapor mauricio » Mar May 15, 2018 12:23 am

Me da mucho gusto cada vez que se que el libro le ha servido a alguien, para eso lo escribí.

Por favor, si consideras que el tema ha sido resuelto, marcalo como tal, mira en: ¿Cómo marcar como RESUELTO un tema?, de esta forma, conseguiremos un Foro más ordenado.

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
AOO 4.1 | LibO 5.4 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 5566
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: México, D.F.

Re: Exportar datos - Tabla Calc a Tabla Base

Notapor naves » Mar May 15, 2018 6:34 pm

Hola a todos de nuevo:

Perdon por modificar de resuelto a todavia pendiente, pero no he podido realizar la exportación de calc a base.
Imagen

Añado código modificado hasta el momento
Código: Seleccionar todo   Expandir vistaContraer vista
REM  *****  BASIC  *****

Sub Exportar_tabla_base()
dim oDocto as object
dim oSheet as object
dim oDato as object
oDocto = thiscomponent.currentcontroller
oSheet = oDocto.activesheet
oServicio = createunoservice("com.sun.star.sdb.DatabaseContext")
obase = oServicio.getbyname("BD_MORKAS")
conn = obase.getconnection("","")
stmt = conn.createstatement()
'--------------------------------------------------------------------
for i = 1 to 9
idmovimiento = oSheet.getcellbyposition(0,i).string
concepto = oSheet.getcellbyposition(1,i)
tipomovimiento = oSheet.getcellbyposition(2,i).string
fecha = format(oSheet.getcellbyposition(3,i).string,"dd-mm-yy")
idcliente = oSheet.getcellbyposition(4,i)
notas = oSheet.getcellbyposition(5,i).string
idpedido = oSheet.getcellbyposition(6,i)
idprecio = oSheet.getcellbyposition(7,i)
valores = " VALUES ('"+concepto+"',"+"'"+tipomovimiento+"',"&"'"+fecha+"',"&"'"+idcliente+"',"&"'"+notas+"',"&"'"+idpedido+"',"&"'"+idprecio+"')"
strSQL = "INSERT INTO ""Tbl_Movimientos"" (Concepto,Tipo_Movimiento,Fecha,Id_Cliente,Notas,Id_Pedido,Id_Tipo_Precio)" + valores
stmt.executeUpdate(strSQL)
next
conn.close()
msgbox "Se han exportado los datos correctamente"
End Sub


El error de valor de propiedad que creo esta dando problemas es en el campo fecha.

¿Qué opinan ustedes?

Saludos
Libreoffice 5.2 en Debian 9
naves
 
Mensajes: 6
Registrado: Lun May 14, 2018 5:13 am

Re: Exportar datos - Tabla Calc a Tabla Base

Notapor fornelasa » Mar May 15, 2018 11:51 pm

Hablando exactamente de este tema:
Exportar datos - Tabla Calc a Tabla Base

bien ..... ok, ahora:
El error de valor de propiedad que creo esta dando problemas es en el campo fecha.

Sin duda, exportar datos de Calc a Base usando campos fecha es un verdadero dolor de cabeza, sugiero que el campo fecha de tu tabla "Tbl_Movimientos" sea de tipo VARCHAR, es más fácil manejarlo así.

Y continuando:
Exportar datos - Tabla Calc a Tabla Base

Otro gravisimo error es usar nombres de este tipo:
Tbl_Movimientos
Id_Movimiento
Tipo_Movimiento
Id_Pedido
Vaya que nos gusta sufrir!!! :mrgreen:

Cambia a mayúsculas y sin guion bajo (el nombre de la tabla y los nombres de campo), te ahorraras muchos dolores de cabeza, ejemplo:
TBLMOVIMIENTOS
IDMOVIMIENTO
CONCEPTO
TIPOMOVIMIENTO
FECHA
IDCLIENTE
NOTAS
IDPEDIDO
IDTIPOPRECIO

Mira esta macro (he quitado por el momento el FOR)

Código: Seleccionar todo   Expandir vistaContraer vista
Sub Exportar_tabla_base()
dim oDocto as object
dim oSheet as object
dim oDato as object
oDocto = thiscomponent.currentcontroller
oSheet = oDocto.activesheet
oServicio = createunoservice("com.sun.star.sdb.DatabaseContext")
obase = oServicio.getbyname("BD_MORKAS")
conn = obase.getconnection("","")
stmt = conn.createstatement()
'--------------------------------------------------------------------

idmovimiento = oSheet.getcellbyposition(0,1).value
concepto = "'" & oSheet.getcellbyposition(1,1).string & "'"
tipomovimiento = "'" & oSheet.getcellbyposition(2,1).string & "'"
fecha = "'" & oSheet.getcellbyposition(3,1).string & "'"
idcliente = oSheet.getcellbyposition(4,1).value
notas = "'" & oSheet.getcellbyposition(5,1).string & "'"
idpedido = oSheet.getcellbyposition(6,1).value
idprecio = oSheet.getcellbyposition(7,1).value
strSQL = "INSERT INTO TBLMOVIMIENTOS(IDMOVIMIENTO, CONCEPTO, TIPOMOVIMIENTO, FECHA, IDCLIENTE, NOTAS, IDPEDIDO, IDTIPOPRECIO)VALUES(" & idmovimiento & "," & concepto & "," &tipomovimiento & "," &fecha & "," &idcliente & "," &notas & "," &idpedido & "," &idprecio & ")"
stmt.executeUpdate(strSQL)

conn.close()
msgbox "Se han exportado los datos correctamente"
End Sub


Imagen

Imagen
lo 5.4.6 | aoo 4.1.5 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 2925
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Exportar datos - Tabla Calc a Tabla Base

Notapor naves » Mié May 16, 2018 4:48 am

Hola Fornelasa:

Antes que nada agradezco mucho tu tiempo, la verdad que me diste una respuesta muy ilustrativa y elaborada. Soy novel en esto de libre basic, me esta gustando bastante y con ayuda como la tuya, de RMG y Mauricio, se me aclara más el camino.

Sobre la propuesta de fecha:
Es cierto, al cambiar a tipo varchar el campo de fecha se sortea fácilmente el problema.

Sobre la propuesta de los nombres.
También tienes razón y la pondré en practica aunque me costara un poco más de trabajo desenraizar hábitos de escritura. (No suelo utilizar Mayus)

Muchas gracias, saludos!!!
Libreoffice 5.2 en Debian 9
naves
 
Mensajes: 6
Registrado: Lun May 14, 2018 5:13 am

Re: [RESUELTO] Exportar datos - Tabla Calc a Tabla Base

Notapor Longi » Mié May 16, 2018 9:16 am

Buenas!

En cuanto al tema de fechas, lo que he visto en mi corta experiencia es que al importar desde calc una columna tipo fecha, si tiene un valor vacío, entonces se para todo.
Estoy preparando un paquete de macros para importar desde hoja de cálculo a base, desde base a base, exportar de base a hoja de cálculo y entre bases diferentes a aquella con la que estás trabajando, pero de momento es un tanto embrionario.
Lo que hago para esta rutina ya propuesta, y utilizada con éxito, es detectar qué columna es de tipo fecha, y la cargo como tal en Base, excepto para los campos que están vacíos, en los que inserto el valor 'NULO'.
En ese momento, todo cuadra perfectamente.(salvo casuística que no se me haya ocurrido probar, por supuesto!)
Un extracto del código que os comento:

Código: Seleccionar todo   Expandir vistaContraer vista
    For co1 = LBound( ColumnasFechas() ) To UBound( ColumnasFechas() )                      ' Ciclo que recorre los componentes del array en el que guardamos los índices de columna que es tipo fecha
     if j+1<>ColumnasFechas( co1 ) Then                                                     ' Si la columna no es fecha
       if oHojaActiva.getcellbyposition(j,i).string="" Then                                 ' Si el campo está vacío
        A = "Null"                                                                          ' Ponemos la variable 'A' como nulo
       Else                                                                                 ' En caso de no estar vacío
        A="'"& oHojaActiva.getcellbyposition(j,i).string &"'"                               ' A será el texto en la celda   
       End if                                                                               ' Acabamos la condición de vacío
      End if                                                                                ' Acabamos la condición de no fecha
     if j+1=ColumnasFechas( co1 ) Then                                                      ' Si la columna es fecha
      if oHojaActiva.getcellbyposition(j,i).Value <> 0 Then                                 ' Si el valor es mayor que 0
        A = "'"& format(oHojaActiva.getcellbyposition(j,i).Value,"yyyy-mm-dd") &"'"         ' Damos formato de fecha
      Else                                                                                  ' En caso de que el valor sea 0 (no hay fecha)
        A="Null"                                                                            ' A queda como nulo
      End if                                                                                ' Acabamos la condición de que tenga valor<>0
     End if                                                                                 ' Acabamos la condición de que sea fecha
    next                                                                                    ' Vamos a la siguiente columna


Sé que fuera de contexto no tiene mucho sentido, ya que hay un array de columnas, etc, pero en definitiva hay una variable 'A' que tomará el valor de la celda si ésta tiene algo, y si no, quedará con valor NULO (que no vacío). La variable es la que se incorpora como valor para el SQL de inserció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: 347
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: [RESUELTO] Exportar datos - Tabla Calc a Tabla Base

Notapor fornelasa » Mié May 16, 2018 5:20 pm

(No suelo utilizar Mayus)
bueno, a sufrir ...... :mrgreen:
Y en base a lo que dice longi: :super:

Ejemplo de uso correcto:
Código: Seleccionar todo   Expandir vistaContraer vista
A = "'"& format(oSheet.getcellbyposition(2,1).Value,"yyyy-mm-dd") &"'"

strSQL = "INSERT INTO ""base_Claves""(""Id_Concepto"", ""Dt_Concepto"", ""Fecha"")VALUES(" & idmovimiento & "," & concepto & "," & A & ")"

Saludos, Federico.
lo 5.4.6 | aoo 4.1.5 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 2925
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: [RESUELTO] Exportar datos - Tabla Calc a Tabla Base

Notapor naves » Mié May 16, 2018 7:52 pm

Hola Longi y Federico:

Longi - Gracias por tu información y código referente a las fechas, por el momento creo que seguire las indicaciones de fornelasa y no me la complicare. Pondre el campo como varchar, ya que no necesito trabajar con ese campode fecha para otra cosa más que para que sea informativo. Aunque por si llegara necesitar que el campo sea "date" guardare tu código.

Saludos!

Federico: En serio que tome tu consejo, voy a utilizar mayus, pero por el momento en el borrador del proyecto lo dejare así.

Gracias a ambos, Saludos!!!
Libreoffice 5.2 en Debian 9
naves
 
Mensajes: 6
Registrado: Lun May 14, 2018 5:13 am


Volver a Macros y API UNO

¿Quién está conectado?

Usuarios navegando por este Foro: Ambrosio y 5 invitados