[RESUELTO] Numerar los resultados de una select

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
RASAPA
Mensajes: 224
Registrado: Mar Mar 16, 2010 10:41 pm

[RESUELTO] Numerar los resultados de una select

Mensaje por RASAPA »

Buenos dias,
Necesito numerar los resultados que arroja una consulta SELECT empezando por el 1.
Para clarificar, lo que necesito es que a mas de los campos deseados me añada una columna al principio con la numeracion correlativa de los registros mostrados.
Llevo dias buscando y no encuentro nada parecido.
Agradeceria cualquier ayuda.

Saludos
Última edición por mauricio el Jue Mar 23, 2017 1:32 am, editado 2 veces en total.
Razón: Marcar icono de resuelto
LibreOffice 7.3.1.3
Linux Mint 20.3
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Numerar los resultados de una select

Mensaje por mauricio »

y... por curiosidad.. ¿para que?...

buscando en internet, veo que en PostgreSQL es posible, supongo que otros motores se podrá también, pero no lo encontré para HSQLDB.

Dependiendo de donde muestra el resultado, un simple ciclo resuelve el asunto.

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
RASAPA
Mensajes: 224
Registrado: Mar Mar 16, 2010 10:41 pm

Re: Numerar los resultados de una select

Mensaje por RASAPA »

Buenos dias Mauricio,
Bueno.. debe ser que si no hay retos la vida es muy aburrida !!!! :crazy:
La verdad es que estoy conectado a una base Mysql y me hace falta una lista NUMERADA con unos registros concretos de la base.
La salida ya esta solucionado, con el doImport y la sentencia SQL necesaria, arrojo todos los registros a una hoja de calculo, la cual ya puedo imprimir.
Pero, no me admiten la lista sin una numeracion correlativa en su primera columna, y que empieze por 1.

Ya ves, por una vez que soluciono el problema, va y resulta que no esta completo.

He visto que en Mysql es relativamente facil, hay varios ejemplos en internet, pero lo que he probado no me funciona en LibreOffice y no he sabido encontrar nada parecido para nuestra suite.

Mientras tanto, lo que he hecho es, una vez hecha la hoja de calculo, le añado una columna antes de la primera y despues la relleno con el oCursor.fillAuto(0,1)

Ya salgo del paso con esta solucion, aunque dando un rodeo, pero funciona. Eso sí, me ha dejado con las ganas de saber si es posible hacerlo directamente en SQL.

Muchas gracias.
LibreOffice 7.3.1.3
Linux Mint 20.3
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Numerar los resultados de una select

Mensaje por mauricio »

He trabajado poco con MySQL, pero se que es muy completo, seguramente debe poderse, hago unas pruebas y te cuento...

Saludos
______________________________________________
"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: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Numerar los resultados de una select

Mensaje por mauricio »

He encontrado este ejemplo:

Código: Seleccionar todo

SELECT  @s:=@s+1 serial_number,student_id,student_name,student_avg
FROM    students, (SELECT @s:= 0) AS s
Contra un servidor MySQL directamente desde Python, funciona perfectamente, el ID original de mis datos de prueba es:

Código: Seleccionar todo

4 Ana Karerina Leon Tolstoi
5 Guerra y Paz Leon Tolstoi
6 El Conde de Montecristo Alejandro Dumas
8 Los Miserables Victor Hugo
Ahora, aplica la instruccion SQL siguiente:

Código: Seleccionar todo

sql = 'SELECT CAST(@s:=@s+1 AS UNSIGNED) AS new_id, title, author FROM book, (SELECT @s:= 0) AS s'
y me los muestra asi:

Código: Seleccionar todo

(1, 'Ana Karerina', 'Leon Tolstoi')
(2, 'Guerra y Paz', 'Leon Tolstoi')
(3, 'El Conde de Montecristo', 'Alejandro Dumas')
(4, 'Los Miserables', 'Victor Hugo')
Solo te resta probar si te funciona desde LibreOffice

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
RASAPA
Mensajes: 224
Registrado: Mar Mar 16, 2010 10:41 pm

Re: Numerar los resultados de una select

Mensaje por RASAPA »

Buenos dias,
Probado en LibreOffice y no me funciona.
Lo he probado en una base HSQLDB y en otra que tengo vinculada con MYSQL. No me funciona en ninguna de los dos.
El error se produce en el doImport, me sale "Se ha producido un error en la sintaxi de la expresion SQL"

Saludos
LibreOffice 7.3.1.3
Linux Mint 20.3
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Numerar los resultados de una select

Mensaje por mauricio »

Claro, en HSQLDB nunca funcionará, son motores diferentes...

desconozco como funciona internamente el doImport, hubiera pensado que le pasa la instrucción SQL en crudo al motor de base de datos, tal vez cambiar doImport por una consulta directa, pero, solo probando.

Saludos
______________________________________________
"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: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Numerar los resultados de una select

Mensaje por mauricio »

Pues ejecutando el comando directamente con mi base conectada a MySQL, funciona correctamente, como puedes ver en la siguiente imagen.
foro.png
Pero tienes razón, con doImport, muestra un error de sintaxis, lo cual hay que reportar, pero como te comente antes, haciendo la consulta directamente, funciona muy bien:

Código: Seleccionar todo

sBaseDatos = "mysql"
     'Establecemos la consulta SQL
     sSQL = "SELECT CAST(@s:=@s+1 AS UNSIGNED) AS new_id, title, author FROM book, (SELECT @s:= 0) AS s"

     'Creamos el servicio para acceder y manipular las bases de datos
     oDBC = createUnoService("com.sun.star.sdb.DatabaseContext")    
     'Nos aseguramos de que exista la base de datos
     If oDBC.hasByName( sBaseDatos ) Then
         'Si existe, accedemos por el nombre
         oBD = oDBC.getByName( sBaseDatos )
         'Creamos una conexion a la base de datos
         oConexion = oBD.getConnection("","")
         'Creamos un objeto para las instrucciones SQL
         oDeclaracion = oConexion.createStatement()
         'Ejecutamos la consulta
         oResultado = oDeclaracion.executeQuery( sSQL)
         'Si hay resultados
         If Not IsNull( oResultado ) Then
             Do While oResultado.next
                 'Mostramos el contenido del campo
                 msg = CStr(oResultado.getLong(1)) + " " + oResultado.getString(2) + " " + oResultado.getString(3)
                 MsgBox msg
             Loop
         End If
     End If 
Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
RASAPA
Mensajes: 224
Registrado: Mar Mar 16, 2010 10:41 pm

Re: Numerar los resultados de una select

Mensaje por RASAPA »

Buenos días,
Si no es con doImport, hay alguna otra instrucción para devolver el resultado de la consulta a una hoja de calculo?
Que no sea tratando registro por registro, ya que son muchos y tardaría demasiado.
Saludos
LibreOffice 7.3.1.3
Linux Mint 20.3
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Numerar los resultados de una select

Mensaje por mauricio »

______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
RASAPA
Mensajes: 224
Registrado: Mar Mar 16, 2010 10:41 pm

Re: Numerar los resultados de una select

Mensaje por RASAPA »

Buenos dias,
He probado el devolver el resultado de una consulta a una hoja de calculo con easydev.
He utilizado este codigo:

Código: Seleccionar todo

	sSQL="SELECT CAST(@s:=@s+1 AS UNSIGNED) AS Reg ,ID,Compania " &_
		"FROM tblcompania ,(SELECT @s:=0) AS s " 
	con=util.conODBC("baseMysql","admin","admin")
	data=util.query(con,sSQL,True)
	doc=util.newDoc("")
	address = createUnoStruct("org.universolibre.EasyDev.CellRangeAddress")
	address.Doc = doc
	address.Current = True
	address.Sheet= "Full1"
        cell = util.getCell(address)
	util.setData(cell, data)
Y me salta este error:
Error de temps d'execució del BASIC.
S'ha produït una excepció
Type: com.sun.star.uno.RuntimeException
Message: <class 'KeyError'>: ('integer unsigned',), traceback follows
/home/ramon/.config/libreoffice/4/user/uno_packages/cache/uno_packages/lu32802q14n0.tmp_/EasyDev_v2.7.2.oxt/pythonpath/easydev/comun.py:203 in function <genexpr>() [cols_type = ('',) + tuple(DATA_TYPES[info.getColumnTypeName(c).lower()] for c in cols)]
/home/ramon/.config/libreoffice/4/user/uno_packages/cache/uno_packages/lu32802q14n0.tmp_/EasyDev_v2.7.2.oxt/pythonpath/easydev/comun.py:203 in function parse_data_type() [cols_type = ('',) + tuple(DATA_TYPES[info.getColumnTypeName(c).lower()] for c in cols)]
/home/ramon/.config/libreoffice/4/user/uno_packages/cache/uno_packages/lu32802q14n0.tmp_/EasyDev_v2.7.2.oxt/pythonpath/easydev/lodb.py:55 in function query() [return comun.parse_data_type(resulset)]

.
He probado con otras sentencias y el error salta cuando hay un campo UNSIGNED.
Saludos
LibreOffice 7.3.1.3
Linux Mint 20.3
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Numerar los resultados de una select

Mensaje por mauricio »

El error esta en el tipo de campo "integer unsigned" que no lo he considerado al mapear los valores de MySQL, lo agrego y te aviso por aquí para que valides...

Saludos...

P.D. Veo que usas Linux, en Linux tenemos una ventaja enorme, podemos usar el core de Python local, por lo que si usas MySQL, puedes hacer cosas maravillosas como acceder directamente a la misma y vaciar los datos directamente a Calc, entre otras muchas bellezas, veras, un enorme salto de velocidad.
______________________________________________
"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: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Numerar los resultados de una select

Mensaje por mauricio »

He actualizado la extensión, prueba con 2.7.3, no he tenido tiempo de validar, así que te toca esta tarea.

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
RASAPA
Mensajes: 224
Registrado: Mar Mar 16, 2010 10:41 pm

Re: Numerar los resultados de una select

Mensaje por RASAPA »

Buenos dias Mauricio,

Eres un CRACK :bravo: :bravo:
Lo he probado y como no va a funcionar?, pues claro que funciona.
Solucionado tanto el error del UNSIGNED, como los registros numerados que exporta a Calc.

Con el PD. me has puesto la miel en los labios.... pero donde encuentro esas cosas maravillosas que puedo hacer con linux, Mysql y Python ??, hay algun sitio donde pueda documentarme ?

Lastima que estes tan lejos, considera un abrazo, que te lo mereces. :super: :super:

Saludos
LibreOffice 7.3.1.3
Linux Mint 20.3
Responder