• Martes 30 de Abril de 2024, 06:03

Autor Tema:  Error "Loop sin Do" cuando existe el "Do While"  (Leído 9297 veces)

lagunax

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Error "Loop sin Do" cuando existe el "Do While"
« en: Viernes 6 de Marzo de 2009, 00:07 »
0
Hola, Hola, aqui una vez más Lagunax molestando un poco a la comunidad, me ha surgido un error muy extraño, ojala que alguien pueda ayudarme a resolverlo.

Estoy realizando la sección de editar-eliminar registros de un pequeño sistema que utiliza BD access. Mediante un combobox y un text que sirve de filtro, despliego los datos de la BD en un MSHFlexgrid. Cuando hago click en una fila obtengo el ID de esos datos , el cual utilizo para modificar y eliminar la información.

He logrado realizar con exito el boton de editar [Command1] pero me surge un problema con el boton de eliminar rgistro [aqui Command4].

Aclaro que [Command2] limpia los text y combo boxes, [Command1] copia los valores para emular un boton "deshacer".

En [Command4] realizo una coneccion a la BD, un select, y luego recorro el recorset para encontar los campos que corresponden con el indice que obtuve del MSHFlexgrid1 (variable pasar_id). El problema surge cuando presiono el botón de eliminar, manda "Error de compilación: Loop sin Do". He intentado con F8 (paso a paso) pero al momento de presionar el botón se corta, por lo que no puedo verificar si simplemente no reconoce el Do o existe otro problema.

Option Explicit
Public bool As Boolean
Public bool2 As Boolean
Public auxi_grid As String
Public pasar_id As Integer
Public Numero As Integer
Public ident As Integer
Public auxi As Integer

Public copia_id As Integer
Public copia_nombre As String
Public copia_descripcion As String
Public copia_solucion_1 As String

Public cn As ADODB.Connection
Public rst As ADODB.Recordset
Sub Conectar()
       
    ' Crea una nueva conexión y un recordset
    Set cn = CreateObject("ADODB.Connection")
    Set rst = CreateObject("ADODB.Recordset")
       
    rst.CursorLocation = adUseClient
    ' abre la base de datos DIRECCION ANTERIOR
'    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data " & _
'            "Source=C:Program FilesMicrosoft " & _
'            "Visual StudioVB98SISTEMA BUSQUEDAAplicacion.MDB;Persist Security Info=False"
'DIRECCION NUEVA DEL SERVIDOR \XOA008
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data " & _
            "Source=\Xoa008COMPARTIDO SISTEMASSistema " & _
            "de Registro & Solución de ProblemasBase de DatosAplicacion.MDB;Persist Security Info=False"

 
End Sub
 
Sub Desconectar()
'MOSTRAR LA LISTA DE SOLUCIONES EN TEXT3.TEX
'    Form6.Text3.Text = rst("Solucion_1")
'*******************************************
    rst.Close
    cn.Close
    Set rst = Nothing
    Set cn = Nothing
End Sub


Private Sub Combo1_Click()
Call Conectar
 
rst.Open "SELECT ID,Nombre,Descripcion FROM TablaAplicacion WHERE Nombre Like '%" & _
             Combo1.Text & "%'", cn, adOpenStatic, adLockOptimistic

' Muestra los datos en el FlexGrid
Set MSHFlexGrid1.DataSource = rst

 
' Visualiza la cantidad de registros filtrados
Me.Caption = "Peugeot - Registros encontrados: " & CStr(rst.RecordCount)
 
Call Desconectar
End Sub

Private Sub Command1_Click()
'MARZO 5 - EVITAR ERROR AL PULSAR GUARDAR CON CAMPOS EN BLANCO
If Text3.Text = "" And Text5.Text = "" And Text6.Text = "" And Combo2.Text = "" Then
    MsgBox ("No hay Datos para Modificar.")
Else
Call Conectar
rst.Open "SELECT ID,Nombre,Descripcion,Solucion_1 FROM TablaAplicacion WHERE ID Like '%" & _
             Text4.Text & "%'", cn, adOpenStatic, adLockOptimistic
If rst.EOF = True Then
        Beep
Else
    Do While bool2 = False
        If rst.Fields("ID") = pasar_id Then '¿¿¿¿¿¿ crear variable para copiar
            rst.Fields("Nombre") = Combo2.Text
            rst.Fields("Descripcion") = Text5.Text
            rst.Fields("Solucion_1") = Text6.Text
            rst.Update
            MsgBox ("Se han guardado los cambios.")
            bool2 = True
        Else
            rst.MoveNext
        End If
    Loop
End If

rst.MoveFirst
Call Desconectar
bool2 = False

MSHFlexGrid1.Clear
End If
'Call copy_auxi
End Sub

Private Sub Command2_Click()
Form9.Hide
'MARZO 5 - LIMPIEZA AL SALIR DE EDITAR/BORRAR
MSHFlexGrid1.Clear
MSHFlexGrid1.Refresh
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
'Text4.Text = ""
Text5.Text = ""
Text6.Text = ""
Combo1.Text = ""
Combo2.Text = ""
Form1.Show
End Sub

Private Sub Command3_Click()
'AGREGADO DEL 5 DE MARZO
Combo2.Text = copia_nombre
Text5.Text = copia_descripcion
Text6.Text = copia_solucion_1
'Call local_clear_auxi
End Sub

//////////////////////////////////////////////////////////////////////////////////////////////////
AQUI INICIA EL PROBLEMA
//////////////////////////////////////////////////////////////////////////////////////////////////
Private Sub Command4_Click()
'MARZO 5
'On Error Resume Next
'Se utiliza la línea On Error Resume Next para indicarle a Visual Basic que siga ejecutando
'la forma, aún cuando ocurra un error de ejecución

Call Conectar
rst.Open "SELECT ID,Nombre,Descripcion,Solucion_1 FROM TablaAplicacion WHERE ID Like '%" & _
             Text4.Text & "%'", cn, adOpenStatic, adLockOptimistic
If rst.EOF = True Then
        Beep
Else
'Do While bool2 = False '////// ESTE ES EL CICLO QUE NO RECONOCE
Do Until bool2 = True
        If rst.Fields("ID") = pasar_id Then
            'MARZ0 5 MIDIFICADO
            'rst.Fields("Nombre") = Combo2.Text
            'rst.Fields("Descripcion") = Text5.Text
            'rst.Fields("Solucion_1") = Text6.Text
           
            If MsgBox("Se va a eliminar el Registro, ¿Desea continuar?", vbExclamation + vbYesNo, "Eliminacion de Registros") = vbYes Then
            rst.Delete
            rst.Requery
            rst.MoveNext
            'PARA EVITAR QUE AL ELIMINAR EL CURSOR DESPLIEGUE EL MISMO REGISTRO ELIMINADO
            'A PESAR DE QUE EL RECORDSET YA AVANZO
            'CALCULAR EL AVANCE DEL RECORSET
            Text3.Text = rst.Fields("ID")
            Combo2.Text = rst.Fields("Nombre")
            Text5.Text = rst.Fields("Descripcion")
            Text6.Text = rst.Fields("Solucion_1")
                If rst.EOF Then
                    rst.MoveLast
                End If
            MsgBox ("Registro Eliminado con Éxito.")
           
            bool2 = True
        Else
            rst.MoveNext
        End If
Loop
End If

rst.MoveFirst
Call Desconectar
bool2 = False

MSHFlexGrid1.Clear
End Sub
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////

Private Sub Form_Load()
MSHFlexGrid1.Clear

    With MSHFlexGrid1
        .SelectionMode = flexSelectionByRow
        .FixedCols = 0
        .ColWidth(0) = 700
        .ColWidth(1) = 2000
        .ColWidth(2) = 5000
'        .ColWidth(3) = 4000
'        .ColWidth(4) = 4000
    End With
 
    Text2.Text = ""
'    Text3.Text = ""
End Sub



Private Sub MSHFlexGrid1_Click()
'///////////////////////////////////////////////////////////////////
'CAMBIAR CADENAS STRING A INTEGER
'Dim Cadena As String, Numero As Integer
'Cadena = "12345.25"
'Numero = CInt(Val(Cadena)) 'Esto te cambia la cadena a un numero entero
Text1.Text = MSHFlexGrid1.Text

auxi_grid = MSHFlexGrid1.Text
Numero = CInt(Val(auxi_grid))
Text4.Text = Numero
Form7.Text1.Text = ""


Call Conectar
'CAMBIOS NUEVOS agregamos Solucion
rst.Open "SELECT ID,Nombre,Descripcion,Solucion_1 FROM TablaAplicacion WHERE ID Like '%" & _
             Text4.Text & "%'", cn, adOpenStatic, adLockOptimistic

'   Para acceder a un campo:
    If rst.EOF = True Then
        Form7.Text1.Text = ""
    Else
'CAMBIOS NUEVOS        Adodc1.RecordSource = "SELECT * FROM TablaAplicacion"
'CAMBIOS NUEVOS        Adodc1.Refresh
       
'///        With Adodc1.Recordset
'///            If .EOF And .BOF Then
'///                auxi = 0
'///            Else
            If MSHFlexGrid1.Text = "" Then
                MsgBox "La Tabla esta Vacia"
            Else
                Do While bool = False
'CAMBIOS NUEVOS                         If Adodc1.Recordset.Fields("ID") = Text4.Text Then
                         If rst.Fields("ID") = Text4.Text Then
                                Text3.Text = ""
                                Combo2.Text = ""
                                Text5.Text = ""
                                Text6.Text = ""
                         
                                Text3.Text = rst.Fields("ID")
                                Combo2.Text = rst.Fields("Nombre")
                                Text5.Text = rst.Fields("Descripcion")
                                Text6.Text = rst.Fields("Solucion_1")
                                bool = True
                                pasar_id = rst.Fields("ID")
                                'CAMBIO RECIENTE HOY 5 MARZO
                                Call local_clear_auxi
                                Call local_copy_auxi
                               
                         Else
'CAMBIOS NUEVOS                                Adodc1.Recordset.MoveNext
                                rst.MoveNext
                         End If
                Loop
            End If
'///            End If
'///        End With
'CAMBIOS NUEVOS        Adodc1.Recordset.MoveFirst 'CAMBIO RECIENTE
    End If
rst.MoveFirst
Call Desconectar

auxi_grid = ""
Numero = 0
Text4.Text = ""
bool = False
End Sub

Private Sub Text1_GotFocus()
    'Text1.Text = ""
End Sub

Private Sub Text2_Change()
    ' conecta
    Call Conectar
    bool = False
    ' Ejecuta la consulta SQL
'SENTENCIA SQL ORIGINAL
'    rst.Open "SELECT ID,Nombre,Descripcion FROM TablaAplicacion WHERE Descripcion Like '%" & _
 '            Text2.Text & "%'", cn, adOpenStatic, adLockOptimistic
   

    rst.Open "SELECT ID,Nombre,Descripcion FROM TablaAplicacion WHERE Descripcion Like '%" & Text2.Text & "%' And Nombre Like '" & Combo1.Text & "'", cn, adOpenStatic, adLockOptimistic
 
 
'   ' Para acceder a un campo:
    If rst.EOF = True Then
    '    Text3.Text = "" borrar text1
        Text1.Text = ""
    Else
'ULTIMA MODIFICIACION ADODC******************************************************
        ident = rst("ID")
        Adodc1.RecordSource = "SELECT * FROM TablaAplicacion"
        Adodc1.Refresh
      Do While bool = False
        If Adodc1.Recordset.Fields("ID") = ident Then
            'Text3.Text = Adodc1.Recordset.Fields("Solucion_1")
            'IMPRIME SOLUCION EN TEXT3.TEXT CUANDO FILTRAS INFO
            bool = True
        Else
            Adodc1.Recordset.MoveNext
        End If
      Loop
'*******************************************************************************
 ' GOOD       Text3.Text = rst("Solucion_1")
    End If
 
    ' Enlaza el FlexGRid
    Set MSHFlexGrid1.DataSource = rst
 
    ' Cantidad de registros
    Me.Caption = "Registros encontrados: " & CStr(rst.RecordCount)
 
    ' Desconecta de la base de datos
    Call Desconectar
   
    If Text2.Text = "" Then
   
        'Text3.Text = "" borrar text1
        Text1.Text = ""
    End If
End Sub

Private Sub Text2_GotFocus()
    Text2.Text = ""
End Sub

''MODIFICACION RECIENTE 5 de marzo////////////////////////////////////////////
' COPIA VARIABLES AUXI PARA BOTON DESHACER
Private Sub local_copy_auxi()
'copia_id = TxtID.Text
copia_nombre = Combo2.Text
copia_descripcion = Text5.Text
copia_solucion_1 = Text6.Text
End Sub

Private Sub local_clear_auxi()
'copia_id = 0
copia_nombre = ""
copia_descripcion = ""
copia_solucion_1 = ""
End Sub


Incluso he probado en vez de un "Do While" un "Do Until" (esta en comentarios) pero sigue sin reconocer el Do. Alguien podría ayudarme, porfavor.

De antemano Gracias.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Error "Loop sin Do" cuando existe el "Do While"
« Respuesta #1 en: Viernes 6 de Marzo de 2009, 01:53 »
0
UTILIZA LAS ETIQUETAS DE CÓDIGO

Código: Visual Basic
  1. Private Sub Command4_Click()
  2. 'MARZO 5
  3. 'On Error Resume Next
  4. 'Se utiliza la línea On Error Resume Next para indicarle a Visual Basic que siga ejecutando
  5. 'la forma, aún cuando ocurra un error de ejecución
  6.  
  7.     Call Conectar
  8.     rst.Open "SELECT ID,Nombre,Descripcion,Solucion_1 FROM TablaAplicacion WHERE ID Like '%" & _
  9.     Text4.Text & "%'", cn, adOpenStatic, adLockOptimistic
  10.     If rst.EOF = True Then
  11.          Beep
  12.     Else
  13.         'Do While bool2 = False '////// ESTE ES EL CICLO QUE NO RECONOCE
  14.         Do Until bool2 = True
  15.             If rst.Fields("ID") = pasar_id Then
  16.                 'MARZ0 5 MIDIFICADO
  17.                 'rst.Fields("Nombre") = Combo2.Text
  18.                 'rst.Fields("Descripcion") = Text5.Text
  19.                 'rst.Fields("Solucion_1") = Text6.Text
  20.  
  21.                 If MsgBox("Se va a eliminar el Registro, ¿Desea continuar?", vbExclamation + vbYesNo, "Eliminacion de Registros") = vbYes Then
  22.                     rst.Delete
  23.                     rst.Requery
  24.                     rst.MoveNext
  25.                     'PARA EVITAR QUE AL ELIMINAR EL CURSOR DESPLIEGUE EL MISMO REGISTRO ELIMINADO
  26.                     'A PESAR DE QUE EL RECORDSET YA AVANZO
  27.                     'CALCULAR EL AVANCE DEL RECORSET
  28.                     Text3.Text = rst.Fields("ID")
  29.                     Combo2.Text = rst.Fields("Nombre")
  30.                     Text5.Text = rst.Fields("Descripcion")
  31.                     Text6.Text = rst.Fields("Solucion_1")
  32.                     If rst.EOF Then
  33.                         rst.MoveLast
  34.                     End If
  35.                     MsgBox ("Registro Eliminado con Éxito.")
  36.  
  37.                     bool2 = True
  38.  
  39.                 Else
  40.                     rst.MoveNext
  41.                 End If
  42.                 Loop
  43.             End If
  44.  
  45.             rst.MoveFirst
  46.             Call Desconectar
  47.             bool2 = False
  48.  
  49.             MSHFlexGrid1.Clear
  50. End Sub
  51.  
Tu error radica en que entre el Do (línea 14) y el Loop (línea 42) abres 3 If pero sólo cierras 2, con lo que el Loop queda dentro del If y por tanto no tiene ningún Do previo. Si formateareas el código tal y como yo lo he hecho, estos errores resultan muy obvios.

Salud

lagunax

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Error "Loop sin Do" cuando existe el "Do While"
« Respuesta #2 en: Viernes 6 de Marzo de 2009, 21:50 »
0
Muchas gracias, es justo como lo indicas, ahora funciona correctamente.

Creo que al final me revolvi con varios If´s y busque donde no era. Se agradece la pronta respuesta.

Bye.

 :beer: