[RESUELTO] Cargar array con datos de un SELECT

Discute sobre las herramientas de la base de datos
Responder
pmartimor
Mensajes: 63
Registrado: Jue Mar 08, 2018 2:11 pm

[RESUELTO] Cargar array con datos de un SELECT

Mensaje por pmartimor »

Me gustaría saber si se puede, con OpenOffice, cargar los valores de un campo concreto devuelto por un SELECT en un array

Algo como...

Dim sSQL As String
Dim nRegistros AS Integer

' Aquí tendría que hallar el número de registros devueltos por el SELECT y hacer nRegistros = nº registros encontrados con un Select Count o lo que proceda...

sSQL="SELECT datos.CANTIDAD FROM datos WHERE condicion"

Dim myArray (nRegistros) AS Integer

' Aquí tendría que cargar myArray con los valores del campo CANTIDAD de cada registro encontrado
Última edición por pmartimor el Mié Feb 27, 2019 11:29 am, editado 1 vez en total.
LibreOffice 5.1.0.3 en clientes Windows 10, 7, XP sobre BD MySql.
Longi
Mensajes: 810
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Cargar array con datos devueltos por un SELECT

Mensaje por Longi »

Buenas!

Te pongo un ejemplo que tengo hecho con una consulta en la que saco las comarcas que están grabadas en una tabla, pero la consulta, lógicamente, tendrá que ser la que tu necesites:

Código: Seleccionar todo

    oCon = ThisDatabaseDocument.CurrentController.ActiveConnection                   ' Activamos la conexión con la base de datos
    oStat = oCon.CreateStatement                                                     ' Creamos el Statement
    sSQL="  SELECT ""Comarca"" FROM ""COMARCA"""
    oStat.setPropertyValue("ResultSetType",1005)                                     ' Características de la consulta
    oResultSet = oStat.executeQuery(sSQL)                                            ' Se ejecuta la consulta
    oResultSet.last                                                                  ' Va al último registro para contar los registros que tiene
    oResultSet.first                                                                 ' Mueve el cursor al primer registro
    oResultSet.previous 
    '-----------------------------------------------------------------------
    ' Establecemos un array que recoge todos los datos de la consulta

    j = 0                                                                            ' Constante
    Dim ArrayComarca()                                                               ' Definición del array  
    While oResultSet.next                                                            ' Recorremos todos los datos del Resultset
    Redim Preserve ArrayComarca(j)                                                   ' Redimensionamos el array
    ArrayComarca(j) = oResultset.getString(1)                                        ' Primer resultado del array
    j = j+1                                                                          ' Pasa al siguiente resultado del array
    Wend                                                                             ' Acabamos el ciclo del ResultSet
    '-------------------------------------------------
    ' Comprobamos que hemos rellenado el array, viendo elemento a elemento
    
    For i=LBound(ArrayComarca()) to UBound(ArrayComarca())                           ' Ciclo que recorre todos los elementos del array
    msgbox ArrayComarca(i)                                                           ' Vemos el elemento que toca en el ciclo
    Next                                                                             ' Vamos al siguiente elemento del array
Un saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
pmartimor
Mensajes: 63
Registrado: Jue Mar 08, 2018 2:11 pm

Re: Cargar array con datos devueltos por un SELECT

Mensaje por pmartimor »

Longi escribió:Buenas!

Te pongo un ejemplo que tengo hecho con una consulta en la que saco las comarcas que están grabadas en una tabla, pero la consulta, lógicamente, tendrá que ser la que tu necesites:

Código: Seleccionar todo

    oCon = ThisDatabaseDocument.CurrentController.ActiveConnection                   ' Activamos la conexión con la base de datos
    oStat = oCon.CreateStatement                                                     ' Creamos el Statement
    sSQL="  SELECT ""Comarca"" FROM ""COMARCA"""
    oStat.setPropertyValue("ResultSetType",1005)                                     ' Características de la consulta
    oResultSet = oStat.executeQuery(sSQL)                                            ' Se ejecuta la consulta
    oResultSet.last                                                                  ' Va al último registro para contar los registros que tiene
    oResultSet.first                                                                 ' Mueve el cursor al primer registro
    oResultSet.previous 
    '-----------------------------------------------------------------------
    ' Establecemos un array que recoge todos los datos de la consulta

    j = 0                                                                            ' Constante
    Dim ArrayComarca()                                                               ' Definición del array  
    While oResultSet.next                                                            ' Recorremos todos los datos del Resultset
    Redim Preserve ArrayComarca(j)                                                   ' Redimensionamos el array
    ArrayComarca(j) = oResultset.getString(1)                                        ' Primer resultado del array
    j = j+1                                                                          ' Pasa al siguiente resultado del array
    Wend                                                                             ' Acabamos el ciclo del ResultSet
    '-------------------------------------------------
    ' Comprobamos que hemos rellenado el array, viendo elemento a elemento
    
    For i=LBound(ArrayComarca()) to UBound(ArrayComarca())                           ' Ciclo que recorre todos los elementos del array
    msgbox ArrayComarca(i)                                                           ' Vemos el elemento que toca en el ciclo
    Next                                                                             ' Vamos al siguiente elemento del array
Un saludo! ;)
Muchas gracias longi, esto es lo que quería.
Perdona que abuse, pero cómo se volcarían después los datos del array una vez tratados y modificados en una tabla?
Supongo que con UPDATE pero ¿se puede crear un ciclo para volcar los datos de un array en una tabla de forma parecida?
Ya sé que esta sería otra pregunta y debería ir en otro hilo, pero al estar tan relacionada la hago en este mismo.
Perdona y gracias por tus generosas aportaciones.
LibreOffice 5.1.0.3 en clientes Windows 10, 7, XP sobre BD MySql.
Longi
Mensajes: 810
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Cargar array con datos devueltos por un SELECT

Mensaje por Longi »

Buenas!

Para eso no necesitas el array, directamente ejecutas el Update en cada ciclo y el trabajo ya queda hecho.
Te pongo el ejemplo sin el array y con las dos opciones (insert into si haces nuevos registros y Update si actualizas registros existentes). Ni que decir tiene que tienes que eliminar uno de ellos según tus necesidades.
Si usases la macro según está te funcionaría generando nuevos registros y después actualizándolos en cada vuelta del bucle, pero es un trabajo totalmente innecesario.

Código: Seleccionar todo

        oCon = ThisDatabaseDocument.CurrentController.ActiveConnection                   ' Activamos la conexión con la base de datos
        oStat = oCon.CreateStatement                                                     ' Creamos el Statement
        sSQL="  SELECT ""Comarca"",""Concello"" FROM ""COMARCA"""
        oStat.setPropertyValue("ResultSetType",1005)                                     ' Características de la consulta
        oResultSet = oStat.executeQuery(sSQL)                                            ' Se ejecuta la consulta
        oResultSet.last                                                                  ' Va al último registro para contar los registros que tiene
        oResultSet.first                                                                 ' Mueve el cursor al primer registro
        oResultSet.previous
        '-----------------------------------------------------------------------
        ' Establecemos un array que recoge todos los datos de la consulta


        While oResultSet.next                                                            ' Recorremos todos los datos del Resultset
' Si lo que quieres es añadir datos a una tabla       
        sSQL="  INSERT INTO ""PUEBLOS"" (""COMARCA"") VALUES '"& oResultSet.getString(1) &"' "
        oStat.ExecuteUpdate(sSQL)        
' Si lo que quieres hacer es actualizar registros
        sSQL ="UPDATE ""PUEBLOS"" SET ""COMARCA""= '"& oResultSet.getString(1) &"' WHERE ""Concello"" ='"& oResultSet.getString(2) &"'"      ' Que hará que marquemos como verdadero la existencia de carpeta de vacuno en la tabla de REGAS
        oStat.ExecuteUpdate(sSQL)                                                          ' Ejecutamos la consulta
        Wend                                                                             ' Acabamos el ciclo del ResultSet
Otro saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
RMG
Mensajes: 3884
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: Cargar array con datos devueltos por un SELECT

Mensaje por RMG »

Hola,

Otra opción, como no aclaras desde que situación partes, esto ejemplo, actualiza datos de una tabla con los datos de otra. Botón del formulario

Saludos
Adjuntos
update.zip
(15.08 KiB) Descargado 257 veces
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)
pmartimor
Mensajes: 63
Registrado: Jue Mar 08, 2018 2:11 pm

Re: Cargar array con datos devueltos por un SELECT

Mensaje por pmartimor »

Longi escribió:Buenas!

Para eso no necesitas el array, directamente ejecutas el Update en cada ciclo y el trabajo ya queda hecho.
Te pongo el ejemplo sin el array y con las dos opciones (insert into si haces nuevos registros y Update si actualizas registros existentes). Ni que decir tiene que tienes que eliminar uno de ellos según tus necesidades.
Si usases la macro según está te funcionaría generando nuevos registros y después actualizándolos en cada vuelta del bucle, pero es un trabajo totalmente innecesario.

Código: Seleccionar todo

        oCon = ThisDatabaseDocument.CurrentController.ActiveConnection                   ' Activamos la conexión con la base de datos
        oStat = oCon.CreateStatement                                                     ' Creamos el Statement
        sSQL="  SELECT ""Comarca"",""Concello"" FROM ""COMARCA"""
        oStat.setPropertyValue("ResultSetType",1005)                                     ' Características de la consulta
        oResultSet = oStat.executeQuery(sSQL)                                            ' Se ejecuta la consulta
        oResultSet.last                                                                  ' Va al último registro para contar los registros que tiene
        oResultSet.first                                                                 ' Mueve el cursor al primer registro
        oResultSet.previous
        '-----------------------------------------------------------------------
        ' Establecemos un array que recoge todos los datos de la consulta


        While oResultSet.next                                                            ' Recorremos todos los datos del Resultset
' Si lo que quieres es añadir datos a una tabla       
        sSQL="  INSERT INTO ""PUEBLOS"" (""COMARCA"") VALUES '"& oResultSet.getString(1) &"' "
        oStat.ExecuteUpdate(sSQL)        
' Si lo que quieres hacer es actualizar registros
        sSQL ="UPDATE ""PUEBLOS"" SET ""COMARCA""= '"& oResultSet.getString(1) &"' WHERE ""Concello"" ='"& oResultSet.getString(2) &"'"      ' Que hará que marquemos como verdadero la existencia de carpeta de vacuno en la tabla de REGAS
        oStat.ExecuteUpdate(sSQL)                                                          ' Ejecutamos la consulta
        Wend                                                                             ' Acabamos el ciclo del ResultSet
Otro saludo! ;)
Muchas gracias Longi y también a RMG, eso es lo que buscaba. :super: :super:
LibreOffice 5.1.0.3 en clientes Windows 10, 7, XP sobre BD MySql.
Responder