none
Indice fuera de los limites de la matriz.

    Pregunta

  • Hola,

    Tengo una aplicación funcionando desde hace algún tiempo, el problema me a venido de repente y solo se muestra en un pc... El programa esta en un servidor y a través de una unidad de red accedemos a el.

    Como comentaba solo se produce en un pc, en todos los demás funciona perfecto. Os dejo una imagen del error a ver si sabéis por donde puede venir... 
    Es un poco complicado por que no puedo generar el error para ver donde da, ya que solo da en un pc y cada vez que da el fallo tengo que solucionarlo entrando a 4 tablas por que es un tema de contabilidad...  

    He leído algo de actualizar el service pack, pero no se si tiene algo que ver...

    jueves, 23 de febrero de 2017 16:33

Respuestas

  • "J.Ramon" escribió:

    > Tengo una aplicación funcionando desde hace algún tiempo, el problema me a venido
    > de repente ...

    Hola, J. Ramón:

    De acuerdo al error que se muestra en el cuadro de diálogo que has adjuntado, la excepción IndexOutOfRangeExcepción se produce en el procedimiento CrearTXT existente en la clase Usuarios.Class_Conta, el cual es invocado por el evento Click del control llamado BttFact existente en la clase o formulario llamado Usuarios.Facturar. Mira a ver si en el citado procedimiento estás accediendo a un índice inexistente o fuera de los límites permitidos de alguna colección o matriz que utilices en dicho método.

    > ... y solo se muestra en un pc...

    Si solo te aparece en un PC, lo mismo los restantes PCs no han llegado a ejecutar todavía el código que hace que en ese PC aparezca una excepción del tipo IndexOutOfRangeException, por lo que puede que la semana que viene, dentro de tres meses, o cuando menos te lo esperes, aparezca el mismo error en otros PCs diferentes.

    > He leído algo de actualizar el service pack, pero no se si tiene algo que ver...

    No creo que tenga que ver con instalar o no un Service Pack, más bien con depurar correctamente el código fuente existente en el procedimiento donde se produce el error, que parece ser que es el procedimiento CrearTXT comentado. ;-)

    Para que te hagas una idea del motivo por el que se puede generar una IndexOutOfRangeException. Imagina que tienes declarado e instanciado el siguiente objeto DataTable:

        Dim dt As New DataTable()

    Si acto seguido quieres referenciar cualquier registro u objeto DataRow del objeto DataTable:

        Dim row As DataRow = dt.Rows(3)

    Obtendrás la excepción IndexOutOfRangeException. ¿Por qué? Porque simplemente no existe ningún objeto DataRow en el objeto DataTable utilizado, y menos aún, uno que tenga el índice 3. Para evitar el error, tendrías que verificar ANTES si existe o no el índice del objeto que deseas referenciar:

        Dim dt As New DataTable()
        Dim row As DataRow = Nothing
    
        If (dt.Rows.Count > 2) Then
            ' Referenciamos el objeto DataRow con
            ' índice 3 (el cuarto elemento).
            row = dt.Rows(3)
        End If

    Recuerda SIEMPRE que en Visual Basic .NET los índices de las colecciones y matrices están en base cero, lo que significa que el primer elemento tiene el índice 0, el segundo el índice 1, el tercero el índice 2, y así sucesivamente hasta llegar al último, que tendrá como índice el número total de elementos menos 1 (dt.Rows.Count - 1).

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    jueves, 23 de febrero de 2017 16:50
    Moderador
  • Hola J.Ramon,

    El error se está produciendo en el método CrearTXT() al presionar el botón 'BttFact'. Sería conveniente agregar un Try-Catch para capturar el error y evitar que la aplicación deje de funcionar.

    Si pudieras mostrar el código que implica ese método para ver que es lo que posiblemente está causando el error.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    jueves, 23 de febrero de 2017 16:47
  • Hola:

    Es difícil saber donde falla si no pones un control de errores, pero yo apuesto por:

                   'Quitamos a partir de la coma.
                    Dim entero() As String
                    entero = Split(importediv(i), ",")

    Estas cogiendo un string y 'consideras' que el separador decimal es la coma, pero es posible que en el ordenador que falla, el sistema operativo (windows), tengo como separador decimal otro caracter. Deberías comprobarlo.

    O mejor deberías usar el separador decimal del sistema:

    CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator
                    Dim entero() As String
                    entero = Split(importediv(i), CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator)

    Espero que te sirva.

    Un saludo



    viernes, 24 de febrero de 2017 9:55

Todas las respuestas

  • Hola J.Ramon,

    El error se está produciendo en el método CrearTXT() al presionar el botón 'BttFact'. Sería conveniente agregar un Try-Catch para capturar el error y evitar que la aplicación deje de funcionar.

    Si pudieras mostrar el código que implica ese método para ver que es lo que posiblemente está causando el error.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    jueves, 23 de febrero de 2017 16:47
  • "J.Ramon" escribió:

    > Tengo una aplicación funcionando desde hace algún tiempo, el problema me a venido
    > de repente ...

    Hola, J. Ramón:

    De acuerdo al error que se muestra en el cuadro de diálogo que has adjuntado, la excepción IndexOutOfRangeExcepción se produce en el procedimiento CrearTXT existente en la clase Usuarios.Class_Conta, el cual es invocado por el evento Click del control llamado BttFact existente en la clase o formulario llamado Usuarios.Facturar. Mira a ver si en el citado procedimiento estás accediendo a un índice inexistente o fuera de los límites permitidos de alguna colección o matriz que utilices en dicho método.

    > ... y solo se muestra en un pc...

    Si solo te aparece en un PC, lo mismo los restantes PCs no han llegado a ejecutar todavía el código que hace que en ese PC aparezca una excepción del tipo IndexOutOfRangeException, por lo que puede que la semana que viene, dentro de tres meses, o cuando menos te lo esperes, aparezca el mismo error en otros PCs diferentes.

    > He leído algo de actualizar el service pack, pero no se si tiene algo que ver...

    No creo que tenga que ver con instalar o no un Service Pack, más bien con depurar correctamente el código fuente existente en el procedimiento donde se produce el error, que parece ser que es el procedimiento CrearTXT comentado. ;-)

    Para que te hagas una idea del motivo por el que se puede generar una IndexOutOfRangeException. Imagina que tienes declarado e instanciado el siguiente objeto DataTable:

        Dim dt As New DataTable()

    Si acto seguido quieres referenciar cualquier registro u objeto DataRow del objeto DataTable:

        Dim row As DataRow = dt.Rows(3)

    Obtendrás la excepción IndexOutOfRangeException. ¿Por qué? Porque simplemente no existe ningún objeto DataRow en el objeto DataTable utilizado, y menos aún, uno que tenga el índice 3. Para evitar el error, tendrías que verificar ANTES si existe o no el índice del objeto que deseas referenciar:

        Dim dt As New DataTable()
        Dim row As DataRow = Nothing
    
        If (dt.Rows.Count > 2) Then
            ' Referenciamos el objeto DataRow con
            ' índice 3 (el cuarto elemento).
            row = dt.Rows(3)
        End If

    Recuerda SIEMPRE que en Visual Basic .NET los índices de las colecciones y matrices están en base cero, lo que significa que el primer elemento tiene el índice 0, el segundo el índice 1, el tercero el índice 2, y así sucesivamente hasta llegar al último, que tendrá como índice el número total de elementos menos 1 (dt.Rows.Count - 1).

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    jueves, 23 de febrero de 2017 16:50
    Moderador
  • La aplicación lleva tiempo ejecutándose y nunca a dado ese fallo, en cuanto dió el error lo probe en mi pc y en otro pc y tampoco daba ese error, dándole al mismo botón.
    CrearTXT es una función que tengo hecha, no la había puesto por que es bastante larga y si funciona en todos los pc's menos en uno, imagino que el fallo esta en esa pc.

     Shared Sub CrearTXT()
    
            'Sacamos el total de filas que hay en el datagridview.
            Dim total As Integer = Facturar.DataGridViewFacturar.Rows.Count - 1
            Dim facturatotal As Decimal = Facturar.DataGridViewFacturar.Rows(total).Cells("TOTAL Factura").Value
            'Ponemos el formato de 2 Decimales.
            facturatotal.ToString("##,##0.00")
    
            'Le ponemos la fecha de los recibos.
            Dim fecharecibo(2) As DateTime
            'Sacamos el importe dividido.
            Dim importediv(2) As Decimal
            If facturatotal > 0 Then
    
                'Le ponemos el tipo de pago.
                Dim tipopago As Integer = Facturar.TxtClapago.Text
                importediv(0) = facturatotal.ToString("##,##0.00")
                Select Case tipopago
                    Case 0
                        tipopago = 1
                        fecharecibo(0) = DateTime.Now
                    Case 1
                        tipopago = 1
                        fecharecibo(0) = DateTime.Now
                    Case 2
                        tipopago = 1
                        fecharecibo(0) = DateTime.Now
                    Case 3
                        tipopago = 1
                        fecharecibo(0) = DateTime.Now
                    Case 4
                        tipopago = 1
                        fecharecibo(0) = DateTime.Now.AddDays(30)
                    Case 5
                        tipopago = 2
                        fecharecibo(0) = DateTime.Now
                        fecharecibo(1) = DateTime.Now.AddDays(30)
                        importediv(0) = facturatotal.ToString("##,##0.00") / 2
                        'Redondeamos decimales
                        importediv(0) = Math.Round(importediv(0), 2)
    
                        importediv(1) = facturatotal.ToString("##,##0.00") - importediv(0).ToString("##,##0.00")
                        'Redondeamos decimales
                        importediv(1) = Math.Round(importediv(1), 2)
                    Case 6
                        tipopago = 3
                        fecharecibo(0) = DateTime.Now
                        fecharecibo(1) = DateTime.Now.AddDays(30)
                        fecharecibo(2) = DateTime.Now.AddDays(60)
                        importediv(0) = facturatotal.ToString("##,##0.00") / 3
                        'Redondeamos decimales
                        importediv(0) = Math.Round(importediv(0), 2)
    
                        importediv(1) = importediv(0).ToString("##,##0.00")
                        'Redondeamos decimales
                        importediv(1) = Math.Round(importediv(1), 2)
    
                        importediv(2) = facturatotal.ToString("##,##0.00") - (importediv(0) + importediv(1))
                        'Redondeamos decimales
                        importediv(2) = Math.Round(importediv(2), 2)
                End Select
    
                'Leemos del archivo bbva.ini
                Dim objreader As New StreamReader(Class1.rutaini & "\bbv.ini")
                'Creamos una variable donde almacenamos cada linea y las agregamos a arraylist.
                Dim Linea As String = ""
                Dim arrayText As New ArrayList
                Do
                    Linea = objreader.ReadLine
                    If Not Linea Is Nothing Then
                        arrayText.Add(Linea)
                    End If
    
                Loop Until Linea Is Nothing
                objreader.Close()
    
                For i = 0 To tipopago - 1
    
                    'Contamos caracteres antes de la coma.
                    Dim num As Decimal = 0
                    'Quitamos a partir de la coma.
                    Dim entero() As String
                    entero = Split(importediv(i), ",")
    
                    'Miramos los decimales que tenemos
                    Select Case entero(1).Length
                        Case 0
                            entero(1) = "00"
                        Case 1
                            entero(1) = entero(1) + "0"
                    End Select
                    'Ponemos los 0.
                    Dim fmt As String = "0000000000"
                    'Miramos cuanto ocupa factura total.
                    num = entero(0) + entero(1)
                    Dim car As String = num.ToString(fmt)
    
                    'Codigo del Cliente.
                    Dim codigocli As String = Trim(Facturar.TxtCodigo.Text)
    
                    'Miramos cuanto ocupa el Codigo del cliente.
                    Select Case Trim(codigocli).Length
                        Case 1
                            codigocli = "000" + codigocli
                        Case 2
                            codigocli = "00" + codigocli
                        Case 3
                            codigocli = "0" + codigocli
                        Case 4
                            codigocli = codigocli
                    End Select
    
                    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
                    'Miramos cuanto ocupa el nombre del cliente.
                    Dim nombrecli As String
                    nombrecli = Trim(Facturar.TxtNombre.Text) + Space(39 - Len(Trim(Facturar.TxtNombre.Text)))
    
                    'Quitamos la coma del TOTAL FACTURA.
                    num = num.ToString.Replace(",", "")
    
                    'Directorio donde esta la carpeta del BBV
                    Dim directorio As String = Class1.rutaBBV & "\F0" & i & "_" & numerofact & ".rec"
    
                    Dim archivo As New Object
                    Dim obj As New Object
    
                    obj = CreateObject("Scripting.FileSystemObject")
                    archivo = obj.createtextfile(directorio, True)
    
                    archivo.writeline(arrayText(3) & arrayText(0) & DateTime.Now.ToString("ddMMyy") & "      " & arrayText(1) & "                                                  " & Left(arrayText(2), 8))
                    archivo.writeline(arrayText(5) & arrayText(0) & DateTime.Now.ToString("ddMMyy") & fecharecibo(i).ToString("ddMMyy") & arrayText(1) & "                              " & arrayText(2) & "        " & arrayText(7))
                    archivo.writeline(arrayText(8) & arrayText(0) & "        " & codigocli & " " & nombrecli & Facturar.TxtCuentaFiscal1.Text.Trim() & Facturar.TxtCuentaFiscal2.Text.Trim() & Facturar.TxtCuentaFiscal3.Text.Trim() & Facturar.TxtCuentaFiscal4.Text.Trim() & car & "                Factura " & numerofact)
                    archivo.writeline(arrayText(9) & arrayText(0) & "                                                                        " & car & "      1" & "         4")
    
                    archivo.Close()
    
                Next
            Else
    
            End If
    
        End Sub

    viernes, 24 de febrero de 2017 9:31
  • Hola:

    Es difícil saber donde falla si no pones un control de errores, pero yo apuesto por:

                   'Quitamos a partir de la coma.
                    Dim entero() As String
                    entero = Split(importediv(i), ",")

    Estas cogiendo un string y 'consideras' que el separador decimal es la coma, pero es posible que en el ordenador que falla, el sistema operativo (windows), tengo como separador decimal otro caracter. Deberías comprobarlo.

    O mejor deberías usar el separador decimal del sistema:

    CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator
                    Dim entero() As String
                    entero = Split(importediv(i), CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator)

    Espero que te sirva.

    Un saludo



    viernes, 24 de febrero de 2017 9:55
  • Pues la verdad que si que puede ser.... El problema es que hasta que no tengamos que hacer un movimiento no podemos volver a probarlo jjjj

    Gracias, voy a probarlo y voy a añadir el Try - Catch

    viernes, 24 de febrero de 2017 10:31