Cargar 1000 registros en una lista
Publicado: Mié Dic 16, 2009 10:29 pm
He realizado varias publicaciones en este foro, y poco a poco he encontrando como llenar una lista, como capturar la selección y otras varias cositas que he aprendido en este foro, en este momento debo llenar una lista de 11000 registros, actualmente la estoy llenando la lista con la instrucción:
for co1 = 1 to 678'oRango.Rows.getCount()
olstDatos.addItem( oHojaDatos.getCellByPosition(0,co1).getString, olstDatos.getItemCount)
co1 = co1 + 1
Next
o con esta tambien funciona
Do Until oHojaDatos.getCellByPosition(0,co1).getString = ""
olstDatos.addItem( oHojaDatos.getCellByPosition(0,co1).getString, olstDatos.getItemCount)
co1 = co1 + 1
Loop
Resulta que las dos para efectos de 0 a 500 registros funcionan perfectamente, pero cuando le quiero cargar + de 10.000 registros se bloquea aparentemente el programa y se demora aprox 40min, haciendo seguimiento al código se encontro que aparentemente la demora es por lo que gasta la rutina en cargar la lista.
Según lo anterior no se si ustedes me puedan ayudar con un metodo o instrucción que no se demore tanto cargandome la lista o que me pueda asignar directamente el rango de datos.
Con esta instrucción estoy recibiendo un Array con todos los datos pero no se como asignarlo a la lista si que se demore tanto, la intruccion es:
Data = oRango.getDataArray()
el código completo que estoy utilizando es:
Option Explicit
Dim olstDatos As Object
Public sValor As String
Dim oRango As Object
Dim Data() As Double
Dim oDlg As Object 'Define un objeto para llamar al Dialogo
Dim oHojaDatos As Object 'Define un objeto para Referirse a la Hoja de donde se traen los datos
Dim co1 As Long 'identifica el contador y la posición de columna
Dim oRegistros As Long
'Funcion Pricipal
Sub Main
oDlg = CargarDialogo( "dlgDatos" ) ' Llama la función
olstDatos = oDlg.getControl("lstDatos")
oHojaDatos = ThisComponent.getSheets.getByName("Fasecolda")
co1 = 1
'Referencia al rango A2:A10
oRango = oHojaDatos.getCellRangeByName("A2:A10420")
'Y lo seleccionamos
ThisComponent.getCurrentController.select(oRango)
Data = oRango.getDataArray()
for co1 = 1 to 678'oRango.Rows.getCount()
olstDatos.addItem( oHojaDatos.getCellByPosition(0,co1).getString, olstDatos.getItemCount)
co1 = co1 + 1
Next
' Do Until oHojaDatos.getCellByPosition(0,co1).getString = ""
' olstDatos.addItem( oHojaDatos.getCellByPosition(0,co1).getString, olstDatos.getItemCount)
' co1 = co1 + 1
' Loop
oDlg.execute()
sValor = olstDatos.getSelectedItem()
oDlg.dispose()
msgbox Svalor
'Coloca el valor seleccionado en la posición indicada
ThisComponent.getCurrentController.getActiveSheet.getCellByPosition(4,4).setString( sValor )
End Sub
sub CargueDos
for co1 = 679 to 1876'oRango.Rows.getCount()
olstDatos.addItem( oHojaDatos.getCellByPosition(0,co1).getString, olstDatos.getItemCount)
co1 = co1 + 1
Next
end sub
Function CargarDialogo( Nombre As String ) As Object
'Cargamos la librería Standard en memoria
DialogLibraries.LoadLibrary( "Standard" )
'Cargamos el cuadro de diálogo en memoria
CargarDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName( Nombre ) )
End Function
for co1 = 1 to 678'oRango.Rows.getCount()
olstDatos.addItem( oHojaDatos.getCellByPosition(0,co1).getString, olstDatos.getItemCount)
co1 = co1 + 1
Next
o con esta tambien funciona
Do Until oHojaDatos.getCellByPosition(0,co1).getString = ""
olstDatos.addItem( oHojaDatos.getCellByPosition(0,co1).getString, olstDatos.getItemCount)
co1 = co1 + 1
Loop
Resulta que las dos para efectos de 0 a 500 registros funcionan perfectamente, pero cuando le quiero cargar + de 10.000 registros se bloquea aparentemente el programa y se demora aprox 40min, haciendo seguimiento al código se encontro que aparentemente la demora es por lo que gasta la rutina en cargar la lista.
Según lo anterior no se si ustedes me puedan ayudar con un metodo o instrucción que no se demore tanto cargandome la lista o que me pueda asignar directamente el rango de datos.
Con esta instrucción estoy recibiendo un Array con todos los datos pero no se como asignarlo a la lista si que se demore tanto, la intruccion es:
Data = oRango.getDataArray()
el código completo que estoy utilizando es:
Option Explicit
Dim olstDatos As Object
Public sValor As String
Dim oRango As Object
Dim Data() As Double
Dim oDlg As Object 'Define un objeto para llamar al Dialogo
Dim oHojaDatos As Object 'Define un objeto para Referirse a la Hoja de donde se traen los datos
Dim co1 As Long 'identifica el contador y la posición de columna
Dim oRegistros As Long
'Funcion Pricipal
Sub Main
oDlg = CargarDialogo( "dlgDatos" ) ' Llama la función
olstDatos = oDlg.getControl("lstDatos")
oHojaDatos = ThisComponent.getSheets.getByName("Fasecolda")
co1 = 1
'Referencia al rango A2:A10
oRango = oHojaDatos.getCellRangeByName("A2:A10420")
'Y lo seleccionamos
ThisComponent.getCurrentController.select(oRango)
Data = oRango.getDataArray()
for co1 = 1 to 678'oRango.Rows.getCount()
olstDatos.addItem( oHojaDatos.getCellByPosition(0,co1).getString, olstDatos.getItemCount)
co1 = co1 + 1
Next
' Do Until oHojaDatos.getCellByPosition(0,co1).getString = ""
' olstDatos.addItem( oHojaDatos.getCellByPosition(0,co1).getString, olstDatos.getItemCount)
' co1 = co1 + 1
' Loop
oDlg.execute()
sValor = olstDatos.getSelectedItem()
oDlg.dispose()
msgbox Svalor
'Coloca el valor seleccionado en la posición indicada
ThisComponent.getCurrentController.getActiveSheet.getCellByPosition(4,4).setString( sValor )
End Sub
sub CargueDos
for co1 = 679 to 1876'oRango.Rows.getCount()
olstDatos.addItem( oHojaDatos.getCellByPosition(0,co1).getString, olstDatos.getItemCount)
co1 = co1 + 1
Next
end sub
Function CargarDialogo( Nombre As String ) As Object
'Cargamos la librería Standard en memoria
DialogLibraries.LoadLibrary( "Standard" )
'Cargamos el cuadro de diálogo en memoria
CargarDialogo = CreateUnoDialog( DialogLibraries.Standard.getByName( Nombre ) )
End Function