[RESUELTO] Problema con setDate

Discute sobre las herramientas de la base de datos
Responder
toñito52
Mensajes: 5
Registrado: Dom Sep 29, 2019 7:36 pm

[RESUELTO] Problema con setDate

Mensaje por toñito52 »

Hola a todos:

Estoy probando con base de libreoffice y me he encontrado con un problema. En una sencilla tabla con dos campos alumno(texto) y fnto (date) quiero ejecutar esta macro

Código: Seleccionar todo

Sub Example7
REM INSERT RECORDS FROM FILE USING PREPARED STATEMENT
Dim Context
Dim DB
Dim Conn
Dim Stmt
Dim strSQL As String
Dim I As Integer

'CREATE A DATABASE CONTEXT OBJECT
	Context=CreateUnoService("com.sun.star.sdb.DatabaseContext")
'GET DATABASE BY NAME
	DB=Context.getByName("AssociateDatabase")
'ESTABLISH CONNECTION TO DATABASE
	Conn=DB.getConnection("","")
'CREATE A PREPAREDSTATEMENT OBJECT
	strSQL="INSERT INTO " & _
	"ALUMNO1(ALUMNO, FNTO) " & _
	"VALUES('pepito',?)"
	Stmt=Conn.prepareStatement(strSQL)
	Stmt.setDate(1,"12/31/19") 'linea que da errorrrrrrrrrrrrrr (variable no establecida)
	Stmt.executeUpdate()
	Conn.close()
end sub

esta otra funciona, en cambio si funciona

Código: Seleccionar todo

Sub Example7
REM INSERT RECORDS FROM FILE USING PREPARED STATEMENT
Dim Context
Dim DB
Dim Conn
Dim Stmt
Dim strSQL As String
Dim I As Integer

'CREATE A DATABASE CONTEXT OBJECT
Context=CreateUnoService("com.sun.star.sdb.DatabaseContext")
'GET DATABASE BY NAME
DB=Context.getByName("AssociateDatabase")
'ESTABLISH CONNECTION TO DATABASE
Conn=DB.getConnection("","")
'CREATE A PREPAREDSTATEMENT OBJECT
strSQL="INSERT INTO " & _
"ALUMNO1(ALUMNO, FNTO) " & _
"VALUES(?,'12/31/19')"
Stmt=Conn.prepareStatement(strSQL)
Stmt.setstring(1,"pepito")
Stmt.executeUpdate()
Conn.close()
end sub
¿Por qué? ¿Alguien puede darme una respuesta?

Editado : Por RMG. Título en mayúsculas no permitido según las normas del foro.
Última edición por mauricio el Mar Oct 01, 2019 5:25 pm, editado 2 veces en total.
Razón: Marcar icono de resuelto
tonito52
libreoffice Version: 6.3.1.2 (x64)
RMG
Mensajes: 3884
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: Problema con setDate

Mensaje por RMG »

Hola,

Revisa las dobles comillas de la fecha por comilla simple.

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)
toñito52
Mensajes: 5
Registrado: Dom Sep 29, 2019 7:36 pm

Re: Problema con setDate

Mensaje por toñito52 »

Antes de plantear la cuestión había probado

Stmt.setDate(1,'12/31/19') - SE PONE EN GRIS A PARTIR DE (1, Y DA EL ERROR "EXPECTED 2 ARGUMENTS, GOT 1"
Stmt.setDate(1,#12/31/19#) - VARIABLE DE OBJETO NO ESTABLECIDA
Stmt.setDate(1,#31/12/19#) - DISCREPANCIA DEL TIPO DE DATOS
Stmt.setDate(1, 31/12/19) - VARIABLE DE OBJETO NO ESTABLECIDA

Casi es como si no reconociera setDate.
Es código recogido en un pdf que busqué por internet. Estoy aplicando el código tal cual aparece. En ocasiones tengo que hacer pequeños ajustes pero con esto por más que he buscado en foros e internet no encuentro nada que me aclare lo que está mal .

Gracias por su interés y responder tan rápido.
tonito52
libreoffice Version: 6.3.1.2 (x64)
Avatar de Usuario
mauricio
Mensajes: 6093
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Problema con setDate

Mensaje por mauricio »

Hablo de memoria así que tienen que validarlo.

Los métodos setTIPO, reciben dos parámetros, la columna a la que aplican y el valor a establecer, entonces, si tienes dos campos, no puede establecer a los dos el índice 1, uno debe ser diferente.
______________________________________________
"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: 6093
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Problema con setDate

Mensaje por mauricio »

Y según la documentación, setDate espera una estructura Date:

Código: Seleccionar todo

setDate(
	[in] long parameterIndex, 
	[in] com.sun.star.util.Date x
 )
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
toñito52
Mensajes: 5
Registrado: Dom Sep 29, 2019 7:36 pm

Re: Problema con setDate

Mensaje por toñito52 »

La tabla tiene dos campos ALUMNO(TEXTO) Y FNTO (FECHA)

Si pruebo ? en el campo alumno introduciendo yo la fecha FUNCIONA no da problema (uso setString para el campo texto)

Código: Seleccionar todo

"ALUMNO1(ALUMNO, FNTO) " & _
"VALUES(?,'12/31/19')"
Si lo hago al contrario poniendo ? para la fecha y escribiendo yo el dato del alumno NO FUNCIONA (uso setDate para el campo fecha FNTO)

Código: Seleccionar todo

"ALUMNO1(ALUMNO, FNTO) " & _
   "VALUES('pepito',?)"
En este caso al llegar a la linea del setdate me da el error

Y esta parte

Código: Seleccionar todo

setDate(
   [in] long parameterIndex,
   [in] com.sun.star.util.Date x
)
es la que ya no entiendo nada de nada por que no se como traducirlo en mi ejemplo.

long parameterIndex: entiendo que es el índice del parámetro (1, 2...). 1 para el primer interrogante, 2 para el segundo...

[in] com.sun.star.util.Date x: Esto ya sí que no sé lo que es. En el caso de texto pondría (1, "pepito") pero en el caso de la fecha sigo sin saber qué poner. Ya he probado la fecha en todas las formas que se me ocurre con comillas dobles, simples, #, sin nada...) y siempre me da error.

Gracias en todo caso, por vuestro interés.
tonito52
libreoffice Version: 6.3.1.2 (x64)
Avatar de Usuario
mauricio
Mensajes: 6093
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Problema con setDate

Mensaje por mauricio »

Usando Firebird esto funciona:

Código: Seleccionar todo

	dbc = createUnoService("com.sun.star.sdb.DatabaseContext")
	DB = dbc.getByName("people")	
        con = DB.getConnection("","")
    
   	sql = "INSERT INTO ""Table1"" (""alumno"", ""fecha"") VALUES('Pepita', CURRENT_DATE)"
   	cursor = con.createStatement()
   	cursor.execute(sql)

   	sql = "INSERT INTO ""Table1"" (""alumno"", ""fecha"") VALUES('Lolita', '9/30/2019')"
   	cursor = con.createStatement()
   	cursor.execute(sql)
   	
	con.close()
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
toñito52
Mensajes: 5
Registrado: Dom Sep 29, 2019 7:36 pm

Re: Problema con setDate

Mensaje por toñito52 »

Saludos a todos lo que leen esto y a los que tratan de ayudar:

Yo soy de access y vba y quería probar libreoffice base para ver hasta donde se puede llegar.
Simplemente busqué un pdf (Database Development OpenOffice.org & OOBasic Copyright © 2006 Roberto C. Benitez) con varios ejemplos y los he ido probando. Pero al cuarto ejemplo he tenido este problemilla.

He probado tu código y funciona perfectamente. Pero no está usando un preparestatment con sus parámetros correspondientes y la función/método setdate

De hecho había un ejemplo anterior en ese pdf que funcionaba a la perfección con mis pequeñas adaptaciones

Código: Seleccionar todo

Sub Example2
REM INSERT RECORDS INTO DATABASE TABLE
Dim Context
Dim DB
Dim Conn
Dim Stmt
Dim Result
Dim strSQL As String
dim campoint as integer
dim campotext as string
dim campofecha as date
Context=CreateUnoService("com.sun.star.sdb.DatabaseContext")
DB=Context.getByName("AssociateDatabase")
Conn=DB.getConnection("","")
Stmt=Conn.createStatement()
campoint = 5555
campotext = "toño"
campofecha = #01/07/1967#
strSQL="INSERT INTO ALUMNOS(NIE, ALUMNO, FNTO) VALUES("& campoint &", '" & campotext &"', '" & campofecha &"')"
Stmt.executeUpdate(strSQL)
Conn.close()
End Sub
Como ves uso campos int, text y fecha y funciona sin problemas

Pero con el preparestatment y setdate solo consigo errores.

Habida cuenta que es solo curiosidad seguiré intentando aprender y ver lo que funciona y lo que no.
No os hago perder más el tiempo aunque seguro que no tardaré en volver a preguntaros más cosas.

Gracias a todos por vuestro interés. (Y si de todas formas alguien encuentra solución estaré encantado de conocerla).
tonito52
libreoffice Version: 6.3.1.2 (x64)
Avatar de Usuario
mauricio
Mensajes: 6093
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Problema con setDate

Mensaje por mauricio »

Reitero, si quieres usar la preparación de la sentencia SQL, debes de respetar el índice de cada columna, que empieza en 1, y establecer el valor correcto para cada tipo de campo, mira el ejemplo que subí al wiki:

https://wiki.documentfoundation.org/Mac ... tencia_SQL

Por favor, si consideras que esta resuelto, debes de marcar el tema como [RESUELTO], gracias.
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
toñito52
Mensajes: 5
Registrado: Dom Sep 29, 2019 7:36 pm

Re: [RESUELTO]Problema con setDate

Mensaje por toñito52 »

Gracias a todos.

Al final he encontrado la solución en internet
https://ask.libreoffice.org/en/question ... g-a-macro/

Alguien respondió en un foro con este código

Código: Seleccionar todo

Dim aDate As New com.sun.star.util.Date
    'Used to get the date'
        aDate = CtlView.getDate()
        myDay = aDate.Day
        myMonth = aDate.Month
        myYear = aDate.Year
    'Used to set a date'
        aDate.Day = 02
        aDate.Month = 28
        aDate.Year = 16
        CtlView.setDate(aDate)
Lo he puesto en mi propio código y ha quedado de esta forma

Código: Seleccionar todo

Sub Example7
REM INSERT RECORDS FROM FILE USING PREPARED STATEMENT
Dim Context
Dim DB
Dim Conn
Dim Stmt
Dim strSQL As String
Dim I As Integer
dim adate as new com.sun.star.util.Date

'CREATE A DATABASE CONTEXT OBJECT
   Context=CreateUnoService("com.sun.star.sdb.DatabaseContext")
'GET DATABASE BY NAME
   DB=Context.getByName("AssociateDatabase")
'ESTABLISH CONNECTION TO DATABASE
   Conn=DB.getConnection("","")
'CREATE A PREPAREDSTATEMENT OBJECT
   strSQL="INSERT INTO " & _
   "ALUMNO1(ALUMNO, FNTO) " & _
   "VALUES('pepito',?)"
   adate.Day = 14
   adate.Month = 12
   adate.Year = 2019
   Stmt=Conn.prepareStatement(strSQL)
   Stmt.setDate(1,adate) 'linea que da errorrrrrrrrrrrrrr (variable no establecida)
   Stmt.executeUpdate()
   Conn.close()
end sub
Y voilá ya está todo funciona perfectamente.

Al fin he podido descifrar lo que signifca el código que me habías puesto

Código: Seleccionar todo

setDate(
   [in] long parameterIndex,
   [in] com.sun.star.util.Date x
)

Gracias por vuesto precioso tiempo y hasta la próxima
tonito52
libreoffice Version: 6.3.1.2 (x64)
Responder