/Anonimizzato15375Utente anonimizzato06 ott 2017, 02:44Ciao a tutti, ho una listbox dove carico ed ordino dei numeri in senso crescente. Finché questi sono pochi (circa una cinquantina) l'ordinamento è veloce ma quanto il numero di elementi all'interno della list box diventa elevato (400-500 e oltre) l'ordinamento diventa lento impiegando svariati secondi. Potete darmi una mano a risolvere il problema, grazie. Ecco il codice che ho utilizzato: Public Sub Ordinacrescente() Dim I As Integer Dim J As Integer Dim iCount As Integer Dim Temp As Integer iCount = schermata_volumi.lst_Numeri.ListCount For J = 0 To iCount - 2 For I = 0 To iCount - 2 With schermata_volumi.lst_Numeri If Val(.List(I)) > Val(.List(I + 1)) Then Temp = .List(I + 1) .List(I + 1) = .List(I) .List(I) = Temp End If End With Next I Next J End Sub
OoregonSuper FamosoIscritto danov, 2011Messaggi2191706 ott 2017, 08:32Se i dati arrivano da un DB ordinali con SQL. Altrimenti caricali in un vettore e ordinali prima di caricarli nella listbox. Se lo fai direttamente nella listbox sarà comunque lento. Per ordinare i dati nel vettore usa l'algoritmo quicksort.
/Anonimizzato15375Utente anonimizzato06 ott 2017, 10:16Ciao oregon, i dati vengono da un file mdb di access. Sto provando a risolvere il problema ma non ci riesco, sono poco pratico. Potresti aiutarmi?
OoregonSuper FamosoIscritto danov, 2011Messaggi2191706 ott 2017, 10:19Puoi aiutarmi? Ogni volta che ti rispondo ti aiuto. O no? Se i dati arrivano da Access probabilmente li prendi tramite una query. Se è così usa la clausola ORDER BY
/Anonimizzato15375Utente anonimizzato06 ott 2017, 10:43Hai ragione..., è da sempre che mi aiuti... purtroppo non sono ancora abbastanza bravo nella programmazione... nella listbox carico i dati in questo modo: Public Function carica_volumi() 'CARICO LA LISTA CON GLI ID DEL DATABASE If rs.RecordCount = 0 Then schermata_volumi.lst_Volumi.Clear errormsg = MsgBox("Nessun documento caricato", vbCritical, "Attenzione!") Exit Function End If rs.MoveLast rs.MoveFirst max = rs.RecordCount rs.MoveFirst schermata_volumi.lst_Volumi.Clear For I = 1 To max schermata_volumi.lst_Volumi.AddItem rs("id") rs.MoveNext Next I End Function
OoregonSuper FamosoIscritto danov, 2011Messaggi2191706 ott 2017, 10:53Manca la parte di codice con cui ottieni il recordset rs
/Anonimizzato15375Utente anonimizzato06 ott 2017, 11:06Option Explicit Public DB As Database Public rstInfo As Recordset Public rs As Recordset Public max As Long Public I As Long Public errormsg Public dbadd As Boolean Public dbedit As Boolean Dim Stringa As String Public Function ApriDB() 'LEGGO IL DATABASE Set DB = OpenDatabase(App.Path & "\libri.mdb", False, False, "; pwd=gianni24") Set rs = DB.OpenRecordset("Info", dbOpenTable) End Function
OoregonSuper FamosoIscritto danov, 2011Messaggi2191706 ott 2017, 11:10Non devi ottenere la tabella (con dbOpenTable) ma devi usare una SELECT OpenRecordset("SELECT * FROM Info ORDER BY Dato") mettendo al posto di Dato il nome del campo numerico con cui vuoi ordinare.
/Anonimizzato15375Utente anonimizzato06 ott 2017, 11:29Si così va, soltanto che numera in ordine 1, 10, 100 invece di 1, 2 , 3, 4, 5, 6, 7, 8, 9, 10, 11, ...
OoregonSuper FamosoIscritto danov, 2011Messaggi2191706 ott 2017, 11:35Ma il campo che contiene il dato nel tuo db è numerico o testo?
OoregonSuper FamosoIscritto danov, 2011Messaggi2191706 ott 2017, 11:48Sbagliato. Se sono numeri deve essere numerico.
/Anonimizzato15375Utente anonimizzato06 ott 2017, 11:54Hai perfettamente ragione, ma quando selezione il numero id dalla listbox se è numerico mi da errore: Public Function seleziona_documento() 'DALLA LISTA CARICO I DATI NELLE TEXTBOX Set rs = DB.OpenRecordset("Select * from Info where id = '" & Trim(schermata_volumi.lst_Volumi.List(schermata_volumi.lst_Volumi.ListIndex)) & "'") rs.MoveFirst schermata_volumi.txt_id = rs("id") schermata_volumi.txt_autore = rs("autore") schermata_volumi.txt_titoloedizione = rs("titoloedizione") schermata_volumi.txt_testo = rs("testo") End Function
OoregonSuper FamosoIscritto danov, 2011Messaggi2191706 ott 2017, 12:47Di quale errore parli? Questo che c'entra con quello che hai chiesto fino ad ora? Ripeto ... il campo deve essere numerico.
/Anonimizzato15375Utente anonimizzato06 ott 2017, 13:37Oregon è vero quello che dici, ma cliccando sui numeri dentro la listbox (inserito come campo numerico anzicché testo) mi da errore nel caricare gli altri campi del database nei textbox.