none
Funciona el EXIT WHILE?

    Pregunta

  • Hola, buenos días.

    No me funciona el "Exit while". En versiones anteriores al Visual Studio 2015 sí que funcionaba y me parece raro. Paso el código por si hay otra opción.

     Private Sub acumular()
            Try
                Using cnn As New SqlConnection(AccesoBd.CadenaConexion)
                    vCommand = New SqlCommand("pTransferenciasS", cnn)
                    vCommand.CommandType = CommandType.StoredProcedure
                    vAdapter = New SqlDataAdapter(vCommand)
                    vBuilder = New SqlCommandBuilder(vAdapter)
                    vDs = New DataSet()
                    vCommand.Parameters.AddWithValue("@vencimiento", MDIMenu.vfechapago)
                    vAdapter.Fill(vDs, "FACTURAS_RECIBIDAS")
                    vTable = vDs.Tables("FACTURAS_RECIBIDAS")
                    cnn.Open()
                    DataGridView1.DataSource = ""
                    DataGridView1.DataSource = vTable
                    'DataGridView1.Columns("VENCIMIENTO").Width = 100
                    DataGridView1.Columns("ACREEDOR").Width = 270
                    'DataGridView1.Columns("CIF").Width = 80
                    DataGridView1.Columns("IMPORTE").Width = 80
                    DataGridView1.Columns("IMPORTE").DefaultCellStyle.Format = "N2"
                    DataGridView1.Columns("IMPORTE").DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight
                    DataGridView1.Columns("IMPORTE_ACUMULADO").Width = 100
                    DataGridView1.Columns("IMPORTE_ACUMULADO").DefaultCellStyle.Format = "N2"
                    DataGridView1.Columns("IMPORTE_ACUMULADO").DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight
                    DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
                End Using
                Dim vpt1 As String
                Dim vps2 As Double
                vps2 = 0.0
                Dim fila As Integer = 0
                Dim vpt2 As String
                Dim vps1 As Double
                While fila <= DataGridView1.RowCount - 1
                    vpt1 = DataGridView1.Rows(fila).Cells(1).Value
                    vps1 = 0.0
                    vpt2 = ""
    
    
                    While DataGridView1.Rows(fila).Cells(1).Value = vpt1 And fila <= DataGridView1.RowCount - 1
    
                        vps1 = vps1 + DataGridView1.Rows(fila).Cells(3).Value
                        If vpt2 = "" Then
                            vpt2 = vpt2 & DataGridView1.Rows(fila).Cells(7).Value
                        Else
                            vpt2 = vpt2 & "," & DataGridView1.Rows(fila).Cells(7).Value
                        End If
                        DataGridView1.Rows(fila).Cells(9).Value = MDIMenu.vfechapago
    
                        If fila = DataGridView1.RowCount - 1 Then
                            DataGridView1.Rows(fila).Cells(4).Value = vps1
                            DataGridView1.Rows(fila).Cells(8).Value = vpt2
                            vps2 = vps2 + vps1
                            Exit While
                            Exit While
                        Else
                            If fila < DataGridView1.RowCount - 1 Then
                                fila = fila + 1
                            End If
                        End If
                    End While
                    If fila < DataGridView1.RowCount - 1 Then
                        fila = fila - 1
                        DataGridView1.Rows(fila).Cells(4).Value = vps1
                        DataGridView1.Rows(fila).Cells(8).Value = vpt2
                        vps2 = vps2 + vps1
                        fila = fila + 1
                    End If
    
                End While
            Catch expSQL As SqlException
                MsgBox(expSQL.ToString, MsgBoxStyle.OkOnly, "SQL Exception")
            End Try
        End Sub
    
    Saludos.

    jueves, 1 de diciembre de 2016 12:03

Respuestas

  • Ángelroso,

    Es lógico, la primera instrucción Exit While permitirá salir inmediatamente del bucle, es decir, la ejecución continuará con la instrucción siguiente a End While (del bucle anidado). Si buscas salir del bucle anidado y a la vez del bucle externo podrías hacer lo siguiente:

    If fila = DataGridView1.RowCount - 1 Then
    	'...
    	vps2 = vps2 + vps1
    
    	fila = DataGridView1.RowCount
    
    	Exit While
    Else
    	'...

    Nota que con la asignación realizada el bucle externo terminará con la ejecución.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    • Marcado como respuesta Ángelroso jueves, 1 de diciembre de 2016 15:57
    jueves, 1 de diciembre de 2016 15:43

Todas las respuestas

  • Por supuesto que sigue funcionando.  Las preguntas obvias:

    ¿Seguro que llegas a la instrucción. Probaste depurando?

    ¿Por qué tienes dos Exit While?

    jueves, 1 de diciembre de 2016 13:24
  • Hola, Anibal.

    Gracias por contestar.

    Con el depurador, se salta el segundo Exit While.

    Tengo 2 exit while, porque tengo 2 whiles y quiero que una vez llegado al último registro se salga de los 2. Al saltarse el segundo cpntinua y se convierte en un bucle sin salida.

    Saludos.

    jueves, 1 de diciembre de 2016 14:46
  • El segundo nunca se te va a ejecutar ya que el primero corta la ejecución y te envía al primer end while debajo de ese primer end while tendrías que volver a ejecutar la validación para salirte del while principal.  Por ejemplo cambiar esto

    ...

     End If
    End While
    If fila < DataGridView1.RowCount - 1 Then

    ...

    Por esto

    ...

     End If
    End While

    If fila = DataGridView1.RowCount - 1 Then Exit While

    If fila < DataGridView1.RowCount - 1 Then

    ....

    y recuerda quitar el Exit While Repetido.

    jueves, 1 de diciembre de 2016 15:36
  • "Ángelroso" preguntó:

    > No me funciona el "Exit while". En versiones anteriores al Visual Studio 2015
    > sí que funcionaba y me parece raro. Paso el código por si hay otra opción.
    >
    > While fila <= DataGridView1.RowCount - 1
    >
    >     While DataGridView1.Rows(fila).Cells(1).Value = vpt1 And fila <= DataGridView1.RowCount - 1
    >
    >         Exit While
    >
    >         Exit While
    >
    >     End While
    >
    > End While

    Hola:

    Me extraña que en versiones anteriores de Visual Studio 2015 te funcionara el segundo Exit While, al menos, tal cual lo has indicado en tu código, porque estás repitiendo la misma instrucción Exit While dentro de una misma instrucción While ... End While, lo que significa que el segundo Exit While NUNCA SE COMPILARÁ, y por tanto, NUNCA SE EJECUTARÁ.

    Ten en cuenta que cuando se ejecuta el primer Exit While se abandona el bucle, por lo que NO SE EJECUTARÁ todo lo que haya después del Exit While, incluido otra instrucción Exit While, cuestión que es normal que así suceda. Lo que sería anormal es que funcionara. :-)

    Para que te funcione el segundo Exit While lo tendrás que ejecutar en la segunda instrucción While ... End While anidada:

        While condición
    
            While condicion
       
               ' Abandonar el segundo bucle
               Exit While
    
            End While
    
            ' Abandonar el primer bucle
            Exit While
    
        End While

    Conclusión: una instrucción While ... End While solamente puede tener una única instrucción Exit While.

    Instrucción While...End While (Visual Basic)

    Exit (Instrucción, Visual Basic)

    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, 1 de diciembre de 2016 15:42
    Moderador
  • Ángelroso,

    Es lógico, la primera instrucción Exit While permitirá salir inmediatamente del bucle, es decir, la ejecución continuará con la instrucción siguiente a End While (del bucle anidado). Si buscas salir del bucle anidado y a la vez del bucle externo podrías hacer lo siguiente:

    If fila = DataGridView1.RowCount - 1 Then
    	'...
    	vps2 = vps2 + vps1
    
    	fila = DataGridView1.RowCount
    
    	Exit While
    Else
    	'...

    Nota que con la asignación realizada el bucle externo terminará con la ejecución.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    • Marcado como respuesta Ángelroso jueves, 1 de diciembre de 2016 15:57
    jueves, 1 de diciembre de 2016 15:43
  • Hola, gracias a todos.

    Esta respuesta me ha dado la solución.

    Saludos.

    jueves, 1 de diciembre de 2016 15:58