[RESUELTO] Exportar datos - Tabla Calc a Tabla Base

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
naves
Mensajes: 9
Registrado: Lun May 14, 2018 5:13 am

[RESUELTO] Exportar datos - Tabla Calc a Tabla Base

Mensaje por naves »

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

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) Descargado 214 veces
Ú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
RMG
Mensajes: 3879
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: Exportar datos - Tabla Calc a Tabla Base

Mensaje por RMG »

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.15 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
naves
Mensajes: 9
Registrado: Lun May 14, 2018 5:13 am

Re: Exportar datos - Tabla Calc a Tabla Base

Mensaje por naves »

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/mripbzs7ukju0 ... S.odb?dl=0

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

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

Agradezco su tiempo.
Libreoffice 5.2 en Debian 9
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Exportar datos - Tabla Calc a Tabla Base

Mensaje por mauricio »

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

""Tbl_Movimientos""
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
naves
Mensajes: 9
Registrado: Lun May 14, 2018 5:13 am

Re: Exportar datos - Tabla Calc a Tabla Base

Mensaje por naves »

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

Re: Exportar datos - Tabla Calc a Tabla Base

Mensaje por mauricio »

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
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
naves
Mensajes: 9
Registrado: Lun May 14, 2018 5:13 am

Re: Exportar datos - Tabla Calc a Tabla Base

Mensaje por naves »

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

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
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Exportar datos - Tabla Calc a Tabla Base

Mensaje por fornelasa »

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

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 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
naves
Mensajes: 9
Registrado: Lun May 14, 2018 5:13 am

Re: Exportar datos - Tabla Calc a Tabla Base

Mensaje por naves »

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
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

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

Mensaje por Longi »

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

    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.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] Exportar datos - Tabla Calc a Tabla Base

Mensaje por fornelasa »

(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

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 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
naves
Mensajes: 9
Registrado: Lun May 14, 2018 5:13 am

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

Mensaje por naves »

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
Responder