[RESUELTO] MySql - Carga de datos de una consulta en un

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
Avatar de Usuario
gustavodiaz00
Mensajes: 64
Registrado: Mié Abr 26, 2017 1:29 am
Ubicación: Argentina, San Nicolás de los Arroyos

[RESUELTO] MySql - Carga de datos de una consulta en un

Mensaje por gustavodiaz00 »

Hola a todos.

Para cargar los datos de una tabla en MySql en un control de un cuadro de diálogo uso este código.

Código: Seleccionar todo

sub conectarMySql
  Dim oParms(2) As New "com.sun.star.beans.PropertyValue"
  Dim oCon as Object
  Dim oDlg As Object
  Dim oDlgModel As Object

  oManager = CreateUnoService("com.sun.star.sdbc.DriverManager")
  sURL  = "sdbc:mysqlc:://localhost:3306/base_elementos"

  oParms(0).Name = "user"
  oParms(0).Value = "root"
  oParms(1).Name = "password"
  oParms(1).Value = "21525406"
  oParms(2).Name = "JavaDriverClass"
  oParms(2).Value = "com.mysql.jdbc.Driver"

  oCon = oManager.getConnectionWithInfo(sURL, oParms())
  
  oMeta = oCon.getMetaData()
  connMeta = oMeta.getConnection().getMetaData()
  'print connMeta.URL
  'print connMeta.UserName
  
  oStatement = oCon.createStatement() 'Create an SQL statement object

  sSQL = "SELECT COUNT(*) FROM base_elementos.elementos" 'Obtengo la cantidad de registros de la tabla elementos
  oResultSet = oStatement.executeQuery(sSQL) 
  While oResultSet.next
      Registros = CInt(oResultSet.getString(1)) ' ID Max
  Wend
    
  dim Dato(Registros) 'Matriz para guardar los datos de la consulta

  sSQL= "SELECT numero FROM base_elementos.elementos WHERE `id_numero` = 1" ' Selecciono la columna numero de la tabla elementos
  oResultSet = oStatement.executeQuery(sSQL)
  oResultSet.next
  Dato(0) = oResultSet.getString(1) 'Cargo el primer dato del registro de la tabla
    
  for i = 2 to Registros
    sSQL= "SELECT numero FROM base_elementos.elementos WHERE `id_numero` = " & i & "" ' Selecciono la columna numero de la tabla elementos
    oResultSet = oStatement.executeQuery(sSQL) 
    oResultSet.next
    Dato(i-1) = oResultSet.getString(1) 'Cargo el resto de los datos de la tabla
  next

  DialogLibraries.LoadLibrary("Standard")
  oDlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
   
   oDlgModel = oDlg.Model
   
   with oDlgModel
      .PositionX = 100
	   .PositionY = 10
	   .Width = 170
	   .Height = 120
	   .Title = "Consulta SQL"
   End with	
   
   ListBoxData = oDlg.getcontrol("ListBox1")
   ListBoxData.addItems(Dato(), 0)

   oDlg.Execute()
  
  oCon.close()
  
end sub

El código funciona bien me conecto con la base, cuento cuantos registros tengo, realizo la consulta que me devuelve los datos de una columna de la tabla, cargo la matriz de datos y la asigno al control.
Lo que quiero saber es si hay alguna forma más óptima de cargar los datos devueltos en el control. Dado de de esta forma no me parece muy optimo.

Código: Seleccionar todo

    oResultSet = oStatement.executeQuery(sSQL) 
    oResultSet.next
    Dato(i-1) = oResultSet.getString(1)
No se me explico bien oResultSet.getString(1) es algun tipo de array de datos, pero si intento asignarlo al control ListBoxData.addItems(oResultSet.getString(), 0) es un error o si intento asignarlo a lamatriz directamente para despues asignarla al control tambien me da error Dato() = oResultSet.getString()

Hay alguna forma mas sencilla de hacer esto?

Desde ya muchas gracias.

Saludos
Última edición por gustavodiaz00 el Sab May 05, 2018 6:08 pm, editado 1 vez en total.
LibreOffice 6.1 en KDE Neon
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: MySql - Carga de datos de una consulta en un ListBox

Mensaje por Longi »

Buenas desde la ignorancia!
Me temo que el ResultSet no es un array, o al menos lo que vemos sería un array de nX1 dimensiones, cuando en realidad lo que necesitamos es un array de 1Xn, es decir, que lo que hay en el ResultSet son columnas, y lo que se necesita para el listBox es una fila.
Yo no manejo MySql, pero te dejo el código que uso yo en un cuadro de diálogo para sacar el total de tablas existentes en una base de datos. Seguramente sea más ineficiente que el tuyo, pero como es distinto, lo dejo puesto por si sirve.

Código: Seleccionar todo

Sub Dialogo6

    Dim oControl As Object                                                   ' Variable oControl
    TablaOrigen=""                                                          ' Ponemos la variable como vacío
    Clave=""                                                                 ' Ponemos la variable como vacío
    Tipo=""                                                                  ' Ponemos la variable como vacío
    CampoTrabajo=""
    TablaCopia=""
    '--------------------------------------------------------------
    ' Buscamos el total de las tablas de la base de datos de origen
   
    oDC = createUnoService("com.sun.star.sdb.DatabaseContext")               ' Servicio de Base de datos     
    Conn = oDC.getByName(URLOrigen).getConnection("","")                     ' Conexión con la base de Origen
    oStat=Conn.createStatement()                                             ' Creación del Statement
    oSQLQuery =  "SELECT ""TABLE_NAME"" FROM ""INFORMATION_SCHEMA"".""SYSTEM_TABLES"" WHERE""TABLE_SCHEM"" = 'PUBLIC' ORDER BY ""TABLE_TYPE"", UPPER ( ""TABLE_NAME"" )"                          ' Consulta para recoger los nombres
    oStat.setPropertyValue("ResultSetType",1005)                             ' Características de la consulta
    oResultSet = oStat.executeQuery(oSQLQuery)                               ' Se ejecuta la consulta
    '-------------------------------------------------------------------------
    ' Conseguimos los datos del ResultSet en la primera columna para escoger en un cuadro de diálogo

    DialogLibraries.LoadLibrary( "Standard" )                                ' Librería en la que está el diálogo
    oDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName("Dialogo6") )' Diálogo de trabajo
    oControl = oDialogo.getControl("Tablas")                                 ' Cuadro de lista  
    oControl1= oDialogo.getControl("Nombre")
    Etiqueta1= oDialogo.getControl("Etiqueta1")
    oDialogo.getModel.Width=108                                              ' Anchura del cuadro de diálogo
    oDialogo.getModel.height=140                                             ' Altura del cuadro de diálogo
    oCtrl = oDialogo.getControl("Nombre")                                                    
    oCtrl.getModel.BackgroundColor = RGB(245,245,245)                                                 
    '--------------------------------------------------------------------
    ' Recogemos las tablas para mostrarlas en el cuadro de lista del diálogo
   
    k = 0                                                                    ' Inicio de la instrucción en k=0
    Dim RowArray()                                                           ' Definición del Array      
    While oResultSet.next                                                    ' Hacemos avanzar en el ResultSet
    Redim Preserve RowArray(k)                                               ' Redimensionamos el Array
	RowArray(k) = oResultset.getString(1)                                    ' Establecemos el valor dentro del Array
	k = k+1                                                                  ' Ir al siguiente registro  
   	oControl.addItem (oResultset.getString(1) , -1)                          ' Añadimos el item al cuadro de lista
    Wend                                                                     ' Acaba el ciclo
    '-----------------------------------------------------
    ' Trabajamos con el diálogo

    oDialogo.execute()                                                       ' Ejecutamos el diálogo 

    if oControl.SelectedItem="" Then                                           ' Si no hemos seleccionado ninguna tabla
    msgbox "No seleccionó ninguna tabla, por lo que entendemos que abandona el procedimiento"' Nos avisa
    Exit Sub                                                            ' Nos echa
    Else                                                                     ' Si hemos seleccionado algo
    TablaOrigen=oControl.SelectedItem                                         ' La variable global queda como lo seleccionado
    End if                                                                   ' Acabamos la condición de elección
    oDialogo.dispose()                                                       ' Acabamos con el diálogo  

End Sub
Un saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
gustavodiaz00
Mensajes: 64
Registrado: Mié Abr 26, 2017 1:29 am
Ubicación: Argentina, San Nicolás de los Arroyos

Re: MySql - Carga de datos de una consulta en un ListBox

Mensaje por gustavodiaz00 »

Hola Longi, gracias por responder.

Si tenes razón con resulset, devuelve los datos de las columnas selecionadas del registro en la consulta.
Para obtener el dato siguiente en la columna hay que volver a realizar la consulta.

La respuesta la tenia delante de mis ojos y no me daba cuenta. Para hacer lo que queria hay que realizar un consulta con paginación.

Aca te dejo el codigo modificado para cargar los datos de una coluna de la tabla en un control como un listbox. :knock:

Código: Seleccionar todo

' Selecciono la columna numero de la tabla elementos y devuelvo los primeros 10 registros
    sSQL= "SELECT numero FROM base_elementos.elementos LIMIT 10" 
    oResultSet = oStatement.executeQuery(sSQL)
    
    k = 0                                                        ' Inicio de la instrucción en k=0
    Dim RowArray()                                        ' Creamos el Array para los datos
    While oResultSet.next
      Redim Preserve RowArray(k)                   ' Redimensionamos el Array
      RowArray(k) = oResultset.getString(1)      ' Establecemos el valor dentro del Array
      k = k+1
    Wend
    ListBoxData.addItems (RowArray() , -1)      ' Cargamos el control con los datos del Array
    
Y con una pequeña modificación en el código deberíamos poder cargar un DataGrid sin problemas.

Saludos a todos.
LibreOffice 6.1 en KDE Neon
Responder