Autor Tema: Error Remove Item  (Leído 4105 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Liudex

  • Bytes
  • *
  • Mensajes: 27
  • Reputación: +1/-0
    • Ver Perfil
Error Remove Item
« en: Noviembre 03, 2015, 12:59:28 pm »
Amigos, buenos dias, tengo un problema verdaderamente fastidioso, a la vez que facil , facil por que es un codigo simple que ya he usado en varias ocasiones, pero que ahora me da error y no lo he resuleto. es tan corto el codigo que hasta me da verguenza preguntar..

Uso este codigo para eliminar columnas y filas de un mshflexgrid.

Código: [Seleccionar]
Public Sub Del_Line(msh As mshflexgrid)
    For y = 1 To msh.Rows - 1
        If (msh.TextMatrix(y, 9) <> "ProV1") Then
           msh.RemoveItem (y)
        End If
    Next y
End Sub


Cuando lo uso me el siguiente error:
Subindice fuera del intervalo... gracias de antemano
Si Se puede Imaginar, Se Puede Programar........

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:Error Remove Item
« Respuesta #1 en: Noviembre 03, 2015, 02:40:26 pm »
No vendrá por el lado de "TextMatrix(y, 9)" ? ,
 no recuerdo bien el hflexgrid, 9 es la columna? existe la columna 9?

Liudex

  • Bytes
  • *
  • Mensajes: 27
  • Reputación: +1/-0
    • Ver Perfil
Re:Error Remove Item
« Respuesta #2 en: Noviembre 03, 2015, 05:11:09 pm »
Si existe la configuración del Mshflexgrid coloco:

Código: [Seleccionar]
Public Sub Init_Grid(Grd As mshflexgrid)       
    With Grd
        .Cols = 10
        .FixedRows = 1
        .TextArray(0) = ""
        .TextArray(1) = "Item"
        .TextArray(2) = "Especificaciones"
        .TextArray(3) = "Observaciones"
        .TextArray(4) = "Precio"
        .TextArray(5) = "IdProd"
        .TextArray(6) = "Unidad"
        .TextArray(7) = "CantSol"
        .TextArray(8) = "CantPend"
        .TextArray(9) = "IdProv"
   end with


Para utilizar el código se hace el llamado de la función.

call  Init_Grid(grdprov1)
Si Se puede Imaginar, Se Puede Programar........

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:Error Remove Item
« Respuesta #3 en: Noviembre 03, 2015, 05:54:53 pm »
bueno traté de repetir tu codigo, y como suponiamos, el indice fuera de intervalo se da en :
msh.TextMatrix(y, 9)

Por que?

creo que es por que dentro del FOR se va incrementando Y, entonces la primera vez, elimina la fila 1, pero ahora ROWS ya contiene 1 fila menos, "Y" vuelve a incrementar, y llega un punto en donde por ej, si inicialmente tenia 10 filas, Y vale 10, pero ya me queda solo 1 fila en la coleccion de filas, entonces nunca voy a poder eliminar el item 10, porque ya no existe.

probalo asi, creo que funciona:

Código: (VB) [Seleccionar]
    Dim i As Integer
    Do While i < msh.Rows
        i = i + 1
        If (msh.TextMatrix(1, 9) <> "ProV1") Then
           msh.RemoveItem (1)
        End If
    Loop



obethermy

  • Megabyte
  • ***
  • Mensajes: 116
  • Reputación: +6/-7
    • Ver Perfil
Re:Error Remove Item
« Respuesta #4 en: Noviembre 03, 2015, 07:07:03 pm »
Cuando son registros de bases de datos no hace falta colocar .row=4 y .cols=10 ya que las toma automaticamente a lo mejor ese es tu error.




Liudex

  • Bytes
  • *
  • Mensajes: 27
  • Reputación: +1/-0
    • Ver Perfil
Re:Error Remove Item
« Respuesta #5 en: Noviembre 04, 2015, 10:05:55 am »
Gracias a todos por sus respuestas, use el codigo que me recomendo el amigo Waldo, pero aun que no me da el error no realiza el filtrado de forma correcta, por que si hay 10 filas que contienen "Prov1" las elimina y deja solo una. El error es tal cual lo que dice Waldo.
Si Se puede Imaginar, Se Puede Programar........

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:Error Remove Item
« Respuesta #6 en: Noviembre 04, 2015, 03:58:41 pm »
Bueno, ahora creo que si  ;D

volví a dejar tu metodo,  y puse un control de errores, de esta manera se borran todas las distintas de Prov1, y despues, cuando quedan solos las que contiene Prov1, da el error.
Con el OnError se controla el error, y segun lo que probé  se podria salir ahi mismo del for, para no seguir dando vueltas en el for, pero probalo vos

Código: (VB) [Seleccionar]
    Dim y As Integer
   
    With msh
    For y = 1 To .Rows - 1
        On Error Resume Next
        If (.TextMatrix(y, 9) <> "ProV1") Then
            If Err = 0 Then
                .RemoveItem (y)
            Else
                Err.Clear
                'seria mejor salir del for con el primer error
                'probar descomentando la siguiente linea
                'Exit For
            End If
        End If
    Next y
    End With
   

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Error Remove Item
« Respuesta #7 en: Noviembre 05, 2015, 01:22:36 am »
A caray, que miedo me da el On Error Resume Next jeje.

El problema es hacer un loop de filas que luego se borran. Porque no haces el loop hacia arriba, de esa forma al borrar no debería darte errores:

For y = .Rows To 1 Step -1

Y naturalmente haces la validación de la primera fila.
Me encuentras en YAcosta.com

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:Error Remove Item
« Respuesta #8 en: Noviembre 05, 2015, 10:19:54 am »
A caray, que miedo me da el On Error Resume Next jeje.

JA ja ja, es verdad, a mi tampoco me gusta, pero si lo controlas no debería pasar nada  ;D
Otra opcion sería como decis vos.

Liudex

  • Bytes
  • *
  • Mensajes: 27
  • Reputación: +1/-0
    • Ver Perfil
Re:Error Remove Item
« Respuesta #9 en: Noviembre 05, 2015, 10:31:25 am »
Probe con el nuevo codigo de Waldo y el error sigue igual.. he utilizado esta forma y me funciono..

Código: [Seleccionar]
   Dim m, n, x, y As Integer
        m = 1
        n = Msh.Rows - 1
        Do Until m > n
            For x = 1 To Msh.Rows - 1
               For y = (x) To Msh.Rows - 1
                  If (Msh.TextMatrix(x, 9) = Cond1) Then
                     Msh.RemoveItem (x)
                  End If
               Next
            Next
          m = m + 1
        Loop

Igual que el amigo Yvan le tengo idea al resume next.. estoy seguro que podria funcionar si usamos el loop hacia arriba, cuando pruebe dare la respuesta...
gracias a todos por su colaboracion.
Si Se puede Imaginar, Se Puede Programar........

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Error Remove Item
« Respuesta #10 en: Noviembre 05, 2015, 02:36:47 pm »
hace como dice yvan siempre que quieras eliminar algo de una colección es mejor empezar del fin l principio.

Liudex

  • Bytes
  • *
  • Mensajes: 27
  • Reputación: +1/-0
    • Ver Perfil
Re:Error Remove Item
« Respuesta #11 en: Noviembre 05, 2015, 03:17:21 pm »
En definitiva y segun las recomendaciones de Waldo e Yvan, este es el codigo definitivo:
Código: [Seleccionar]
    With Msh
      For y = (.Rows - 1) To 1 Step -1
          If (.TextMatrix(y, 9) = "Cond") Then
              If Err = 0 Then
                  .RemoveItem (y)
              Else
                  Err.Clear
              End If
          End If
      Next y
    End With

Lo probe sin las lineas del control de error y funciona perfecto, y le elimine el resume next para que Yvan se sienta completamente feliz...
Si Se puede Imaginar, Se Puede Programar........

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:Error Remove Item
« Respuesta #12 en: Noviembre 05, 2015, 04:01:34 pm »
me alegro,
pero si sacaste el control de error, tendria que tambien sacar : If Err = 0 Then y Err.Clear, ya que Err viene siempre en 0, y si llega a haber un error, como no tiene control de error, directamente explotaría :)

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Error Remove Item
« Respuesta #13 en: Noviembre 05, 2015, 05:56:39 pm »
....

Lo probe sin las lineas del control de error y funciona perfecto, y le elimine el resume next para que Yvan se sienta completamente feliz...

Me siento completamente feliz si llegaste a tu solución, al margen de lo demás. Exitos
Me encuentras en YAcosta.com