Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

revision codigo: sacar duplicado

Estas en el tema de revision codigo: sacar duplicado en el foro de Visual Basic clásico en Foros del Web. HOLAS CON LE SIGUIENTE CODIGO RECORRO LOS LISTBOX Y BUSCO DUPLICADOS Y SUMO CANTIDAD, PESO, VALOR. EL ASUNTO ES QUE CON POCOS REGISTROS FUNCIONA, PERO ...
  #1 (permalink)  
Antiguo 22/11/2011, 06:53
 
Fecha de Ingreso: noviembre-2009
Mensajes: 315
Antigüedad: 14 años, 5 meses
Puntos: 0
Pregunta revision codigo: sacar duplicado

HOLAS
CON LE SIGUIENTE CODIGO RECORRO LOS LISTBOX Y BUSCO DUPLICADOS Y SUMO CANTIDAD, PESO, VALOR.
EL ASUNTO ES QUE CON POCOS REGISTROS FUNCIONA, PERO CON MAS DE 100, NO.
PORFA SI ME PUEDEN AYUDAR
Código vb:
Ver original
  1. For i = 0 To (List1.ListCount) - 2
  2.         P = i
  3.        
  4. For Ñ = 0 To (List1.ListCount) - 2
  5.               If List1.List(i) <> List1.List(Ñ) And es = True Then   ' agrega datos y elimina p
  6.                List1.ListIndex = P
  7.                 List2.ListIndex = P
  8.                 List5.ListIndex = P
  9.                 List3.ListIndex = P
  10.                 List4.ListIndex = P
  11.                                                                                                              
  12.                 cod = List1.Text
  13.                 uni = uni + Round(List5.Text)
  14.                 peso = peso + Round(List3.Text)
  15.                 neto = neto + Round(List4.Text)
  16.                 des = List2.Text
  17.                                                                                                              
  18.                 List1.RemoveItem P
  19.                 List2.RemoveItem P
  20.                 List5.RemoveItem P
  21.                 List3.RemoveItem P
  22.                 List4.RemoveItem P
  23.                                                                                                              
  24.                 List1.AddItem cod
  25.                 List2.AddItem des
  26.                 List3.AddItem peso
  27.                 List4.AddItem neto
  28.                 List5.AddItem uni
  29.                 es = False
  30.         End If
  31.     If List1.List(i) = List1.List(Ñ) Then
  32.             List1.ListIndex = Ñ
  33.         If List1.ListIndex = i Then GoTo sig
  34.                 List2.ListIndex = Ñ
  35.                 List3.ListIndex = Ñ
  36.                 List5.ListIndex = Ñ
  37.                 List4.ListIndex = Ñ
  38.                 uni = uni + Int(List5.Text)
  39.                 peso = peso + Round(List3.Text)
  40.                 neto = neto + Round(List4.Text)
  41.                 List1.RemoveItem Ñ
  42.                 List2.RemoveItem Ñ
  43.                 List3.RemoveItem Ñ
  44.                 List5.RemoveItem Ñ
  45.                 List4.RemoveItem Ñ
  46.                     es = True
  47.     End If
  48.    
  49. sig:
  50. Next Ñ
  51. Next i

muuuuuuuuuuuuuuuuuuchas graciassss!!!

Última edición por carnero; 23/11/2011 a las 13:00
  #2 (permalink)  
Antiguo 23/11/2011, 14:50
 
Fecha de Ingreso: noviembre-2009
Mensajes: 315
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: revision codigo: sacar duplicado

alguien me puede dar siquiera alguna idea?
porfavor
  #3 (permalink)  
Antiguo 23/11/2011, 15:31
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: revision codigo: sacar duplicado

Hola, el problema creo, por lo menos por mi parte, es que me cuesta mucho intentar adivinar lo que estas haciendo ya que, aunque para gustos colores, no termino de entender porque utilizas la información tan desperdigada en List, cuando podrías tenerla en un MsFlexGrid, que una vez puesta podrías ordenar por la columna de código y después ir recalculando los totales.

¿ Se supone que cada List tiene 1 dato relacionado con los demàs ?
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #4 (permalink)  
Antiguo 23/11/2011, 15:46
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 8 meses
Puntos: 29
Respuesta: revision codigo: sacar duplicado

Concuerdo con Erbuson en que no se tiene muy claro que intentas hacer en ese código.
Según tu texto (y en contra de lo que parece querer tu codigo) se me hace que intentas algo como esto:

Código vb:
Ver original
  1. Dim X As Long, I As Long, REINICIAR As Integer
  2.  
  3.   REINICIAR = 1
  4.   Do Until REINICIAR = 0
  5.     REINICIAR = 0
  6.     For I = 1 To List1.ListCount - 2
  7.       For X = I + 1 To List1.ListCount - 1
  8.         If List1.List(I) = List1.List(X) Then ' SI TIENEN EL MISMO CODIGO SE SUMAN
  9.          List2.List(I) = Val(List2.List(I)) + Val(List2.List(X))
  10.           List3.List(I) = Val(List3.List(I)) + Val(List3.List(X))
  11.           List4.List(I) = Val(List4.List(I)) + Val(List4.List(X))
  12.           List5.List(I) = Val(List5.List(I)) + Val(List5.List(X))
  13.                                                                                                        
  14.           List1.RemoveItem X
  15.           List2.RemoveItem X
  16.           List3.RemoveItem X
  17.           List4.RemoveItem X
  18.           List5.RemoveItem X
  19.           REINICIAR = 1
  20.           Exit For
  21.         End If
  22.       Next X
  23.       If REINICIAR = 1 Then Exit For
  24.     Next I
  25.   Loop

El como se sumen ya tu lo verás. Eso del Round y tal...

Saludos
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
  #5 (permalink)  
Antiguo 23/11/2011, 16:42
 
Fecha de Ingreso: noviembre-2009
Mensajes: 315
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: revision codigo: sacar duplicado

Cita:
Iniciado por erbuson Ver Mensaje
Hola, el problema creo, por lo menos por mi parte, es que me cuesta mucho intentar adivinar lo que estas haciendo ya que, aunque para gustos colores, no termino de entender porque utilizas la información tan desperdigada en List, cuando podrías tenerla en un MsFlexGrid, que una vez puesta podrías ordenar por la columna de código y después ir recalculando los totales.

¿ Se supone que cada List tiene 1 dato relacionado con los demàs ?
PORQUE NO SE USAR EL MSFLEXGRID

LIST1.LISTINDEX= 1 SE RELACIONA CON LIST1.LISTINDEX= 2 Y CON LIST1.LISTINDEX= ...

Y ESTOS SE PUEDEN REPETIR EN EL LIST, ENTONCES LOS TENGO QUE JUNTAR Y RECALCULAR.

OAJALA ME ENTIENDAN
MUCHAS GRACIAS POR EL TIEMPO!
  #6 (permalink)  
Antiguo 23/11/2011, 17:25
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: revision codigo: sacar duplicado

Una vez que le coges el tranquillo, es bastante simple, al fin y al cabo es como si se tratara de una Hoja Excel, a base de Filas y Columnas y probablemente es mas facil de entender si piensas que las filas son los Registros de un archivo y las columnas los campos.

Si quieres, indica cual es la extructura de tu fichero y que tipo de datos y en un par de 'lecciones' te digo como usarlo de un modo eficiente.

Ten en cuenta que tiene funciones de ordenacion automática y puedes hacer algunas funciones de tipo generíco para usarlas con el Grid y simplificar mucho su proceso.

En cuanto a tu comentario dices que List1.ListIndex = 1 se relaciona con List1.ListIndex = 2, inicialmente había supuesto que List1.ListIndex =1 se correspondia con List2.ListIndex = 1 (mira tu si lo había entendido mal)

Si es como has dicho, creo que en realidad la extructura la tienes mal planteada, pues lo lógico sería por ejemplo:

List1.ListIndex=1 ... Referencia
List2.ListIndex=1 ... Unidades
List3.ListIndex=1 ... Precio
List4.ListIndex=1 ... Importe

List1.ListIndex=2 ... Referencia
List2.ListIndex=2 ... Unidades
List3.ListIndex=2 ... Precio
List4.ListIndex=2 ... Importe

¿ No crees ?
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #7 (permalink)  
Antiguo 23/11/2011, 21:14
 
Fecha de Ingreso: noviembre-2009
Mensajes: 315
Antigüedad: 14 años, 5 meses
Puntos: 0
Exclamación Respuesta: revision codigo: sacar duplicado

Cita:
Iniciado por erbuson Ver Mensaje
Una vez que le coges el tranquillo, es bastante simple, al fin y al cabo es como si se tratara de una Hoja Excel, a base de Filas y Columnas y probablemente es mas facil de entender si piensas que las filas son los Registros de un archivo y las columnas los campos.

Si quieres, indica cual es la extructura de tu fichero y que tipo de datos y en un par de 'lecciones' te digo como usarlo de un modo eficiente.

Ten en cuenta que tiene funciones de ordenacion automática y puedes hacer algunas funciones de tipo generíco para usarlas con el Grid y simplificar mucho su proceso.

En cuanto a tu comentario dices que List1.ListIndex = 1 se relaciona con List1.ListIndex = 2, inicialmente había supuesto que List1.ListIndex =1 se correspondia con List2.ListIndex = 1 (mira tu si lo había entendido mal)

Si es como has dicho, creo que en realidad la extructura la tienes mal planteada, pues lo lógico sería por ejemplo:

List1.ListIndex=1 ... Referencia
List2.ListIndex=1 ... Unidades
List3.ListIndex=1 ... Precio
List4.ListIndex=1 ... Importe

List1.ListIndex=2 ... Referencia
List2.ListIndex=2 ... Unidades
List3.ListIndex=2 ... Precio
List4.ListIndex=2 ... Importe

¿ No crees ?
nonono me exprese mal, es:

List1.ListIndex=1 ... Referencia

List2.ListIndex=1 ... Unidades

List3.ListIndex=1 ... Precio

List4.ListIndex=1 ... Importe

te agradeceria que me ayudes con el MSFLEXGRID.
por ejemplo como le cargo una consulta sql o si por ejemplo puedo comparar 2 consultas, osea, que me entregue todos los registros de la consulta A que no estan en la consulta B.

gracias
  #8 (permalink)  
Antiguo 23/11/2011, 21:42
 
Fecha de Ingreso: noviembre-2009
Mensajes: 315
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: revision codigo: sacar duplicado

Cita:
Iniciado por pkj Ver Mensaje
Concuerdo con Erbuson en que no se tiene muy claro que intentas hacer en ese código.
Según tu texto (y en contra de lo que parece querer tu codigo) se me hace que intentas algo como esto:

Código vb:
Ver original
  1. Dim X As Long, I As Long, REINICIAR As Integer
  2.  
  3.   REINICIAR = 1
  4.   Do Until REINICIAR = 0
  5.     REINICIAR = 0
  6.     For I = 1 To List1.ListCount - 2
  7.       For X = I + 1 To List1.ListCount - 1
  8.         If List1.List(I) = List1.List(X) Then ' SI TIENEN EL MISMO CODIGO SE SUMAN
  9.          List2.List(I) = Val(List2.List(I)) + Val(List2.List(X))
  10.           List3.List(I) = Val(List3.List(I)) + Val(List3.List(X))
  11.           List4.List(I) = Val(List4.List(I)) + Val(List4.List(X))
  12.           List5.List(I) = Val(List5.List(I)) + Val(List5.List(X))
  13.                                                                                                        
  14.           List1.RemoveItem X
  15.           List2.RemoveItem X
  16.           List3.RemoveItem X
  17.           List4.RemoveItem X
  18.           List5.RemoveItem X
  19.           REINICIAR = 1
  20.           Exit For
  21.         End If
  22.       Next X
  23.       If REINICIAR = 1 Then Exit For
  24.     Next I
  25.   Loop

El como se sumen ya tu lo verás. Eso del Round y tal...

Saludos
y si hay mas registros iguales' porejemplo en un list con 100000 registros 6255 son iguales? gracias

mira mi codigo:
Código vb:
Ver original
  1. For I = 0 To List1.ListCount - 2
  2.    if I >= List1.ListCount Then Exit For    le tuve que poner esa condicion porque sino al quitar los campos repetidos el for sigue de largo y me tira error, aunque en teoria no deveria si el for esta en 9 y listcount en 9 o 10 deberia salirse!!
  3.                 List1.ListIndex = I
  4.             P = List1.ListIndex
  5.            
  6.       For X = 0 To List1.ListCount - 2
  7.       'If X >= List1.ListCount Then Exit For
  8.            If eli = True Then
  9.             X = X - 1
  10.             eli = False
  11.             End If
  12.            
  13.             List1.ListIndex = X
  14.                      If List1.ListIndex = P Then GoTo sig
  15.         If List1.List(I) = List1.List(X) Then ' SI TIENEN EL MISMO CODIGO SE SUMAN
  16.  
  17.                                                                                                        
  18.                         uni = uni + Int(Val(List5.List(X)))
  19.                         peso = Round(peso, 2) + Round(Val(List3.List(X)), 2)
  20.                         neto = neto + Round(Val(List4.List(X)))
  21.                                                                                                        
  22.           List1.RemoveItem X
  23.           List2.RemoveItem X
  24.           List3.RemoveItem X
  25.           List4.RemoveItem X
  26.           List5.RemoveItem X
  27.          
  28.           eli = True
  29.           REINICIAR = 1
  30.             est = True
  31.           'Exit For
  32.          
  33.         End If
  34. sig:
  35.       Next X
  36.      ' If REINICIAR = 1 Then Exit For
  37.    Next I
  38.   Loop

que opinas? como lo podria mejorar?

gracias ;)

edito----
no funciona con muchos registros u.u

Última edición por carnero; 24/11/2011 a las 00:17
  #9 (permalink)  
Antiguo 24/11/2011, 01:44
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: revision codigo: sacar duplicado

Cita:
Iniciado por carnero Ver Mensaje
te agradeceria que me ayudes con el MSFLEXGRID.
por ejemplo como le cargo una consulta sql o si por ejemplo puedo comparar 2 consultas, osea, que me entregue todos los registros de la consulta A que no estan en la consulta B.

gracias
Aqui si que lo lamento, pero en cuanto a Bases de Datos, ni pajolera idea, cuando yo empecé con esto hace muuuuchos años, casi ni existían y mis programas se basan en archivos directos y la carga de estos hacia el Grid, nada tiene que ver con técnicas SQL

Ya digo, el Grid es mi pasión pero las Bases de Datos, van a ser esa asignatura que me va a quedar siempre pendiente, a estas alturas no estoy para cambiar de sistema, ten en cuenta que soy casi tan prehistórico como el Ms-Dos

Un saludo
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #10 (permalink)  
Antiguo 24/11/2011, 01:50
 
Fecha de Ingreso: noviembre-2009
Mensajes: 315
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: revision codigo: sacar duplicado

Cita:
Iniciado por erbuson Ver Mensaje
Aqui si que lo lamento, pero en cuanto a Bases de Datos, ni pajolera idea, cuando yo empecé con esto hace muuuuchos años, casi ni existían y mis programas se basan en archivos directos y la carga de estos hacia el Grid, nada tiene que ver con técnicas SQL

Ya digo, el Grid es mi pasión pero las Bases de Datos, van a ser esa asignatura que me va a quedar siempre pendiente, a estas alturas no estoy para cambiar de sistema, ten en cuenta que soy casi tan prehistórico como el Ms-Dos

Un saludo
ajajaajajajajjaajajjajaja

bueno pero cargar datos lo veo por otro lado, como que opciones tienes con el MsFlexGrid.
por ejemplo la misma pregunta pero olvidate de las bd.
como comparo 2 MsFlexGrid?
  #11 (permalink)  
Antiguo 24/11/2011, 02:04
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: revision codigo: sacar duplicado

Mientras tu contestabas, yo estaba dandole vueltas a esta opcion, que no la he probado pero se me ocurre que podría funcionar.

Código vb:
Ver original
  1. Private Sub Totalizacion()
  2.   Dim Hasta As Integer, LineaActual As Integer, LineaTotales As Integer
  3.   Hasta = List1.ListCount - 1
  4.   ' Efectuamos un bucle invertido desde el final
  5.  For LineaActual = Hasta To 0 Step -1
  6.     ' Conservaremos en el 1º los totales de las referencias iguales
  7.    LineaTotales = ElPrimero(List1.List(LineaActual))
  8.     ' Si la linea de Totales es distinta de la linea actual,
  9.    ' significa que como mínimo hay dos
  10.    If LineaTotales <> LineaActual Then
  11.       ' Sumamos la actual a la inicial
  12.      List2.List(LineaTotales) = List2.List(LineaTotales) + List2.List(LineaActual)
  13.       List3.List(LineaTotales) = List3.List(LineaTotales) + List3.List(LineaActual)
  14.       List4.List(LineaTotales) = List4.List(LineaTotales) + List4.List(LineaActual)
  15.       List5.List(LineaTotales) = List5.List(LineaTotales) + List5.List(LineaActual)
  16.       ' Eliminamos la linea procesada de todos los List
  17.      List1.RemoveItem (LineaActual)
  18.       List2.RemoveItem (LineaActual)
  19.       List3.RemoveItem (LineaActual)
  20.       List4.RemoveItem (LineaActual)
  21.       List5.RemoveItem (LineaActual)
  22.     End If
  23.   Next
  24. End Sub
  25.  
  26. Private Function ElPrimero(Referencia As String) As Integer
  27.   ' Devuelve el número de indice del 1er elemento coincidente
  28.  For ElPrimero = 0 To List1.ListCount - 1
  29.     If List1.List(ElPrimero) = Referencia Then Exit Function
  30.   Next
  31. End Function

La idea es mantener como linea de Total la primera aparicion de la referencia en el list, acumulando hacia esta desde el final hacia arriba.

Si quieres pruebalo y me dices si algo funciona o falla.
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #12 (permalink)  
Antiguo 24/11/2011, 02:41
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 8 meses
Puntos: 29
Respuesta: revision codigo: sacar duplicado

Por muy bien que esten los códigos, (el mio solo tiene un ligero fallo), seguirás teniendo problemas mientras no cambies de sistema.

El fallo está en que un listbox solo admite 32767 elementos, y con solo que añadas 1 mas, los valores de listcount empiezan a ser negativos. De ese modo cuando intentas correr la sub, como el count es <0, no se hace nada y se sale de la sub. Por eso no te funciona con muchos elementos.


PD: De hecho lo he revisado y además de corregir el fallo que tenía lo he hecho muchisimo mas rápido:
PD2: Para solucionar el problema de la cantidad de elementos lo que puedes hacer es sumarlos segun cargas las listas y asi no habra fallos siempre que los codigos de articulo no superen los 32766 elementos.

Código vb:
Ver original
  1. Private Sub Command1_Click()
  2.   CargarTabla
  3. End Sub
  4.  
  5. Private Sub CargarTabla()
  6.   Dim f As Long
  7.   For f = 1 To 125767  ' MAXIMOS ELEMENTOS = NO HAY LIMITE
  8.    List1.AddItem Int(Rnd * 15) + 1 ' MAXIMOS CODIGOS = 32766
  9.    List2.AddItem Int(Rnd * 15) + 1
  10.     List3.AddItem Int(Rnd * 15) + 1
  11.     List4.AddItem Int(Rnd * 15) + 1
  12.     List5.AddItem Int(Rnd * 15) + 1
  13.     QuitaDup
  14.   Next f
  15. End Sub
  16.  
  17. Private Sub QuitaDup()
  18.   Dim X As Long, I As Long, REINICIAR As Integer
  19.   'MsgBox List1.ListCount
  20.  REINICIAR = 1
  21.   Do Until REINICIAR = 0
  22.     REINICIAR = 0
  23.     For I = 0 To List1.ListCount - 2
  24.       For X = List1.ListCount - 1 To I + 1 Step -1
  25.         If List1.List(I) = List1.List(X) Then ' SI TIENEN EL MISMO CODIGO SE SUMAN
  26.          List2.List(I) = Val(List2.List(I)) + Val(List2.List(X))
  27.           List3.List(I) = Val(List3.List(I)) + Val(List3.List(X))
  28.           List4.List(I) = Val(List4.List(I)) + Val(List4.List(X))
  29.           List5.List(I) = Val(List5.List(I)) + Val(List5.List(X))
  30.           List1.RemoveItem X
  31.           List2.RemoveItem X
  32.           List5.RemoveItem X
  33.           List3.RemoveItem X
  34.           List4.RemoveItem X
  35.           REINICIAR = 1
  36.           'Exit For ' Y SE REINICIA EL TRABAJO PARA NO CONTAR CON LA LINEA ELIMINADA
  37.        End If
  38.       Next X
  39.       DoEvents
  40.       If REINICIAR = 1 Then Exit For
  41.     Next I
  42.   Loop
  43.  
  44. End Sub

Claro que, de este modo, la sub QuitaDup puede ser reemplazada por una que solo compare el ultimo elemento añadido a la lista, y sería mucho más rápido.


Código vb:
Ver original
  1. Private Sub Form_Load()
  2.   CargarTabla
  3. End Sub
  4.  
  5. Private Sub CargarTabla()
  6.   Dim F As Long
  7.   For F = 1 To 112767  ' MAXIMOS ELEMENTOS = NO HAY LIMITE ' 112767 ELEMENTOS CARGADOS Y SUMADOS EN 12 SEGUNDOS (EN MI PC)
  8.    List1.AddItem Int(Rnd * 15) + 1 ' MAXIMOS CODIGOS = 32766
  9.    List2.AddItem Int(Rnd * 15) + 1
  10.     List3.AddItem Int(Rnd * 15) + 1
  11.     List4.AddItem Int(Rnd * 15) + 1
  12.     List5.AddItem Int(Rnd * 15) + 1
  13.     QuitaDup
  14.   Next F
  15. End Sub
  16.  
  17. Private Sub QuitaDup()
  18.   Dim I As Long, X As Long
  19.   X = List1.ListCount - 1
  20.   For I = 0 To List1.ListCount - 2
  21.     If List1.List(I) = List1.List(X) Then
  22.       List2.List(I) = Val(List2.List(I)) + Val(List2.List(X))
  23.       List3.List(I) = Val(List3.List(I)) + Val(List3.List(X))
  24.       List4.List(I) = Val(List4.List(I)) + Val(List4.List(X))
  25.       List5.List(I) = Val(List5.List(I)) + Val(List5.List(X))
  26.       List1.RemoveItem X
  27.       List2.RemoveItem X
  28.       List3.RemoveItem X
  29.       List4.RemoveItem X
  30.       List5.RemoveItem X
  31.       Exit For
  32.     End If
  33.   Next I
  34. End Sub
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!

Última edición por pkj; 24/11/2011 a las 03:45
  #13 (permalink)  
Antiguo 24/11/2011, 06:19
 
Fecha de Ingreso: noviembre-2009
Mensajes: 315
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: revision codigo: sacar duplicado

Cita:
Iniciado por pkj Ver Mensaje
Por muy bien que esten los códigos, (el mio solo tiene un ligero fallo), seguirás teniendo problemas mientras no cambies de sistema.

El fallo está en que un listbox solo admite 32767 elementos, y con solo que añadas 1 mas, los valores de listcount empiezan a ser negativos. De ese modo cuando intentas correr la sub, como el count es <0, no se hace nada y se sale de la sub. Por eso no te funciona con muchos elementos.


PD: De hecho lo he revisado y además de corregir el fallo que tenía lo he hecho muchisimo mas rápido:
PD2: Para solucionar el problema de la cantidad de elementos lo que puedes hacer es sumarlos segun cargas las listas y asi no habra fallos siempre que los codigos de articulo no superen los 32766 elementos.

Código vb:
Ver original
  1. Private Sub Command1_Click()
  2.   CargarTabla
  3. End Sub
  4.  
  5. Private Sub CargarTabla()
  6.   Dim f As Long
  7.   For f = 1 To 125767  ' MAXIMOS ELEMENTOS = NO HAY LIMITE
  8.    List1.AddItem Int(Rnd * 15) + 1 ' MAXIMOS CODIGOS = 32766
  9.    List2.AddItem Int(Rnd * 15) + 1
  10.     List3.AddItem Int(Rnd * 15) + 1
  11.     List4.AddItem Int(Rnd * 15) + 1
  12.     List5.AddItem Int(Rnd * 15) + 1
  13.     QuitaDup
  14.   Next f
  15. End Sub
  16.  
  17. Private Sub QuitaDup()
  18.   Dim X As Long, I As Long, REINICIAR As Integer
  19.   'MsgBox List1.ListCount
  20.  REINICIAR = 1
  21.   Do Until REINICIAR = 0
  22.     REINICIAR = 0
  23.     For I = 0 To List1.ListCount - 2
  24.       For X = List1.ListCount - 1 To I + 1 Step -1
  25.         If List1.List(I) = List1.List(X) Then ' SI TIENEN EL MISMO CODIGO SE SUMAN
  26.          List2.List(I) = Val(List2.List(I)) + Val(List2.List(X))
  27.           List3.List(I) = Val(List3.List(I)) + Val(List3.List(X))
  28.           List4.List(I) = Val(List4.List(I)) + Val(List4.List(X))
  29.           List5.List(I) = Val(List5.List(I)) + Val(List5.List(X))
  30.           List1.RemoveItem X
  31.           List2.RemoveItem X
  32.           List5.RemoveItem X
  33.           List3.RemoveItem X
  34.           List4.RemoveItem X
  35.           REINICIAR = 1
  36.           'Exit For ' Y SE REINICIA EL TRABAJO PARA NO CONTAR CON LA LINEA ELIMINADA
  37.        End If
  38.       Next X
  39.       DoEvents
  40.       If REINICIAR = 1 Then Exit For
  41.     Next I
  42.   Loop
  43.  
  44. End Sub

Claro que, de este modo, la sub QuitaDup puede ser reemplazada por una que solo compare el ultimo elemento añadido a la lista, y sería mucho más rápido.


Código vb:
Ver original
  1. Private Sub Form_Load()
  2.   CargarTabla
  3. End Sub
  4.  
  5. Private Sub CargarTabla()
  6.   Dim F As Long
  7.   For F = 1 To 112767  ' MAXIMOS ELEMENTOS = NO HAY LIMITE ' 112767 ELEMENTOS CARGADOS Y SUMADOS EN 12 SEGUNDOS (EN MI PC)
  8.    List1.AddItem Int(Rnd * 15) + 1 ' MAXIMOS CODIGOS = 32766
  9.    List2.AddItem Int(Rnd * 15) + 1
  10.     List3.AddItem Int(Rnd * 15) + 1
  11.     List4.AddItem Int(Rnd * 15) + 1
  12.     List5.AddItem Int(Rnd * 15) + 1
  13.     QuitaDup
  14.   Next F
  15. End Sub
  16.  
  17. Private Sub QuitaDup()
  18.   Dim I As Long, X As Long
  19.   X = List1.ListCount - 1
  20.   For I = 0 To List1.ListCount - 2
  21.     If List1.List(I) = List1.List(X) Then
  22.       List2.List(I) = Val(List2.List(I)) + Val(List2.List(X))
  23.       List3.List(I) = Val(List3.List(I)) + Val(List3.List(X))
  24.       List4.List(I) = Val(List4.List(I)) + Val(List4.List(X))
  25.       List5.List(I) = Val(List5.List(I)) + Val(List5.List(X))
  26.       List1.RemoveItem X
  27.       List2.RemoveItem X
  28.       List3.RemoveItem X
  29.       List4.RemoveItem X
  30.       List5.RemoveItem X
  31.       Exit For
  32.     End If
  33.   Next I
  34. End Sub
no tenia idea que tenia limite el list, la mejor solucion sera no usar el list

con que componente puedo hacer lo mismo y no tener estos problemas??
gracias otraves ;)

Etiquetas: duplicado, revision
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:52.