none
Detener ejecucion RRS feed

  • Pregunta

  • Hola a todos.

    Necesito parar la ejecución de mi rutina.

    Suponiendo que en un botón Grabar tengo dos módulos que se ejecutan....

    Modulo1

    Modulo2

    Sucede que si tengo una condición en el Modulo1 que si es verdadera, se detiene todo.

    Sin embargo, no sucede así, aunque sea verdadera sigue ejecutando todo y el Modulo2 incluso.

    He probado con Exit Sub, Exit Try y nada funciona.

    Gracias.

    jueves, 4 de enero de 2018 3:02

Respuestas

  • Formulaz5,

    Bueno, acá veo que tu enfoque más práctico debería ser otro.

    Se me ocurren dos posibles soluciones:

    1- Si la condición parte de el valor del ComboCondicion, podrías comprobar en el evento SelectedChanged del mismo Combo, Seria:

    Private Sub ComboCondicion_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboCondicion.SelectedIndexChanged
            Modulo1()
    End Sub

    Siendo Modulo1:

    Private Sub Modulo1()
           Try
                If TexSubT.Text > 0 Then
                    If ComboCliente.SelectedValue = 0 And ComboCondicion.Text = "A Crédito" Then
                        Dim msg = "Debe Esoger un Cliente a Crédito de la lista."
                        Dim title = "Advertencia!!"
                        Dim style = MsgBoxStyle.Information
                        Dim response = MsgBox(msg, style, title)               
                    End If
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Excepción!", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
    End Sub


    2-Por lo que interpreto tu modulo1 está Haciendo comprobaciones, y el segundo deduzco que es el propio metodo para guardar. A mi criterio lo mas prolijo sería hacer las comprobaciones en los propios objetos a comprobar y asignar a "true" o "false" según corresponda a un campo de la clase. Luego en el evento click del boton guardar, hacer una simple comprobación de si es válido guardar. Todo esto pensado en uno de los principios de CleanCode (cada metodo debe hacer solo lo que debe hacer), creo que el botón guardar debe hacer exactamente solo eso, guardar.

    Sería algo como:

    Dim guardar As Boolean
     Private Sub ComboCondicion_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboCondicion.SelectedIndexChanged
            Try
                If TexSubT.Text > 0 Then
                    If ComboCliente.SelectedValue = 0 And ComboCondicion.Text = "A Crédito" Then
                        Dim msg = "Debe Esoger un Cliente a Crédito de la lista."
                        Dim title = "Advertencia!!"
                        Dim style = MsgBoxStyle.Information
                        Dim response = MsgBox(msg, style, title)
                        guardar = False
                    End If
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Excepción!", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
    End Sub
    Private Sub BotonGuardar_Click(sender As Object, e As EventArgs) Handles BotonGuardar.Click
            If guardar Then
                Modulo2()
            End If
    End Sub

    Obsevación1: Lo que yo hago en mis desarrollos, es que cuando un usuario se equivoca, avisarle en el momento que se está equivocando, no cuando ya está por finalizar una tarea. Para esto se puede usar el ErrorProvider. Yo en lo personal deshabilito los botones y les doy alertas ya sea por labels o el errorprovider, tambien podrías hacer uso de la vieja usanza de los messegebox.

    Observación2: no hace falta volver a TryCatchear los modulos cuando ya encapsuláste ambos modulos en un Try Catch previamente, eso sería redundancia de código.

    Espero te sirva mi enfoque.

    Saludos.


    Fernando Bequir



    jueves, 4 de enero de 2018 18:41

Todas las respuestas

  • Puedes colorar el código? ya que sí no, sera dificil ayudarte

    Saludos


    ARA San Juan 44 HEROES     ‗‗‗‗­|||||‗‗‗‗‗

    jueves, 4 de enero de 2018 3:55
  • Lo que llamas módulo 1 y módulo 2 los invocás desde la rutina del botón guardar o están dentro del mismo método? La salida más práctica es condicionar antes de ejecutar tus módulos.

    Aunque si pones el progreso de tu código te podremos ayudar mejor.


    Fernando Bequir

    jueves, 4 de enero de 2018 10:06
  • Aqui va el codigo...

     Private Sub BotonGuardar_Click(sender As Object, e As EventArgs) Handles BotonGuardar.Click
            Try
    Modulo1
    Modulo2
    
       Catch ex As Exception
                            MessageBox.Show(ex.Message, "Excepción!", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
    End Sub

     Private Sub Modulo1()
            Try
    If TexSubT.Text > 0 Then
                    If ComboCliente.SelectedValue = 0 And ComboCondicion.Text = "A Crédito" Then
                        Dim msg = "Debe Esoger un Cliente a Crédito de la lista."
                        Dim title = "Advertencia!!"
                        Dim style = MsgBoxStyle.Information
                        Dim response = MsgBox(msg, style, title)
                        End
                        'Exit Try
                       'Exit Sub
    'Aquí es que quiero que pare todo.
                    Else
    .....otros procedimientos....
    end if
    end if
    Catch ex As Exception
                            MessageBox.Show(ex.Message, "Excepción!", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
    End Sub

    Gracias.



    • Editado Formulaz5 jueves, 4 de enero de 2018 13:54
    jueves, 4 de enero de 2018 13:53
  • Si lo que quieres es finalizar la ejecución del procedimiento tienes que hacer

    Exit Sub

    Si lo que quieres es finalizar la ejecución de la aplicación haz

    Application.Exit()


    Saludos, Javier J

    jueves, 4 de enero de 2018 13:56
  • Lo que necesito es, que se detenga la corrida de ejecuciones alli.

    Ese comando que me das, devuelve una ventana de error donde me dice "Vshost32 dejo de ejecutarse". Supongo,  como lo dice el comando, que es para para toda la aplicacion y, no es eso lo que quiero.

    Gracias.

    jueves, 4 de enero de 2018 14:10
  • Intente pasar el enfoque al botón que invoca el procedimiento y tampoco. Yo antes, en otra plataforma de programación, pasaba el enfoque a otro control y allí todo se detenía sin salir del sistema.
    jueves, 4 de enero de 2018 14:12
  • Formulaz5,

    Bueno, acá veo que tu enfoque más práctico debería ser otro.

    Se me ocurren dos posibles soluciones:

    1- Si la condición parte de el valor del ComboCondicion, podrías comprobar en el evento SelectedChanged del mismo Combo, Seria:

    Private Sub ComboCondicion_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboCondicion.SelectedIndexChanged
            Modulo1()
    End Sub

    Siendo Modulo1:

    Private Sub Modulo1()
           Try
                If TexSubT.Text > 0 Then
                    If ComboCliente.SelectedValue = 0 And ComboCondicion.Text = "A Crédito" Then
                        Dim msg = "Debe Esoger un Cliente a Crédito de la lista."
                        Dim title = "Advertencia!!"
                        Dim style = MsgBoxStyle.Information
                        Dim response = MsgBox(msg, style, title)               
                    End If
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Excepción!", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
    End Sub


    2-Por lo que interpreto tu modulo1 está Haciendo comprobaciones, y el segundo deduzco que es el propio metodo para guardar. A mi criterio lo mas prolijo sería hacer las comprobaciones en los propios objetos a comprobar y asignar a "true" o "false" según corresponda a un campo de la clase. Luego en el evento click del boton guardar, hacer una simple comprobación de si es válido guardar. Todo esto pensado en uno de los principios de CleanCode (cada metodo debe hacer solo lo que debe hacer), creo que el botón guardar debe hacer exactamente solo eso, guardar.

    Sería algo como:

    Dim guardar As Boolean
     Private Sub ComboCondicion_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboCondicion.SelectedIndexChanged
            Try
                If TexSubT.Text > 0 Then
                    If ComboCliente.SelectedValue = 0 And ComboCondicion.Text = "A Crédito" Then
                        Dim msg = "Debe Esoger un Cliente a Crédito de la lista."
                        Dim title = "Advertencia!!"
                        Dim style = MsgBoxStyle.Information
                        Dim response = MsgBox(msg, style, title)
                        guardar = False
                    End If
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Excepción!", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
    End Sub
    Private Sub BotonGuardar_Click(sender As Object, e As EventArgs) Handles BotonGuardar.Click
            If guardar Then
                Modulo2()
            End If
    End Sub

    Obsevación1: Lo que yo hago en mis desarrollos, es que cuando un usuario se equivoca, avisarle en el momento que se está equivocando, no cuando ya está por finalizar una tarea. Para esto se puede usar el ErrorProvider. Yo en lo personal deshabilito los botones y les doy alertas ya sea por labels o el errorprovider, tambien podrías hacer uso de la vieja usanza de los messegebox.

    Observación2: no hace falta volver a TryCatchear los modulos cuando ya encapsuláste ambos modulos en un Try Catch previamente, eso sería redundancia de código.

    Espero te sirva mi enfoque.

    Saludos.


    Fernando Bequir



    jueves, 4 de enero de 2018 18:41