Access - BUCLE INFINITO

 
Vista:
Imágen de perfil de RICARDO ALONSO
Val: 1
Ha aumentado su posición en 59 puestos en Access (en relación al último mes)
Gráfica de Access

BUCLE INFINITO

Publicado por RICARDO ALONSO (14 intervenciones) el 17/10/2015 04:14:20
buenas noches...

En el proyecto tengo una secuencia de código para que me actualice la tabla de inventario y descuente los artículos que aparecen en un subformulario.

cuando corro el código se forma un bucle infinito y solo descarga el primer registro.

Como puedo lograr que tome cada uno de los registros del subformulario y ejecute el código?

el código es el siguiente

Private Sub CIERRA_FACTURA_Click()
Dim mySQL As String 'Definimos una variable para introducir en ella la secuencia SQL
Dim mySQL1 As String 'Definimos una variable para introducir en ella la secuencia SQL
Dim mySQL2 As String 'Definimos una variable para introducir en ella la secuencia SQL
Dim mySQL3 As String 'Definimos una variable para introducir en ella la secuencia SQL
mySQL3 = "UPDATE Inventario SET Cantidad = Cantidad - " & Me.Subformulario_FACTURACION.Form.CANTIDAD & " WHERE CODIGO =
'" & Me.Subformulario_FACTURACION.Form.ARTICULO & "'"
mySQL1 = "UPDATE CONS_FACT SET USADA = TRUE WHERE NO_RECIBO = " & Me.PrimeroDeNO_RECIBO & " "
mySQL = "UPDATE CAJA SET ENTRADAS = ENTRADAS + " & Me.subtotal & " "
mySQL2 = "UPDATE CAJA_CAJON SET ENTRADAS = ENTRADAS + " & Me.subtotal & " "
ACA ES DONDE TENGO EL PORBLEMA
Do
DoCmd.SetWarnings False 'Desactivamos los mensajes de Access de que se va a actualizar una tabla, etc.
DoCmd.RunSQL mySQL3 'Ejecutamos la consulta
DoCmd.SetWarnings True 'Volvemos a activar los mensajes
MsgBox " EL REGISTRO HA SIDO GRABADO"
Loop Until Me.Subformulario_FACTURACION.Form.ARTICULO = Null
DoCmd.SetWarnings False 'Desactivamos los mensajes de Access de que se va a actualizar una tabla, etc.
DoCmd.RunSQL mySQL 'Ejecutamos la consulta
DoCmd.RunSQL mySQL1 'Ejecutamos la consulta
DoCmd.RunSQL mySQL2 'Ejecutamos la consulta
DoCmd.SetWarnings True 'Volvemos a activar los mensajes
MsgBox " FACTURA CERRADA"
Me.Subformulario_FACTURACION.Visible = False
Me.CIERRA_FACTURA.Visible = False

Algo no estoy haciendo bien con algo pero no se que es..

De antemano agradezco su Atención y ayuda..
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

BUCLE INFINITO

Publicado por jose (830 intervenciones) el 17/10/2015 10:56:51
el bucle do --loop me da la impresión que siempre lee la isma linea , no veo donde pasas al registro siguiente



Me.Subformulario_FACTURACION.Form.ARTICULO.Recordset.Movefirst :rem ir al primer registro

do


Me.Subformulario_FACTURACION.Form.ARTICULO.Recordset.MoveNext : rem pasa al siguiente
Loop Until Me.Subformulario_FACTURACION.Form.ARTICULO = Null
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

BUCLE INFINITO

Publicado por Enrique Heliodoro (1664 intervenciones) el 17/10/2015 12:44:59
Las advertencias (en rutinas como la posteada) se desactivan al inicio, se procesan todos los datos y al finalizar TODOS los procesos se vuelven a activar (aquí se activan y desactivan para cada proceso y eso implica una perdida de eficiencia.

La forma mas eficiente de recorrer el conjunto de registros del subformulario (o del formulario si fuera el caso) consiste en utilizar su 'RecordsetClone' que no trastea los registros, los 'maneja de forma oculta e independiente'.

Y si queremos recorrer un conjunto de datos, lo correcto es comenzar en uno (normalmente el primero) y en cada paso del bucle avanzar uno (porque si no se avanza, no se llega al final).

Mi propuesta (para ese mismo código) consiste en recorrer los registros del subformulario sin imponer condiciones (la única condición es que los recorra todos), pero me surgen dudas de que es lo que representa 'Me.subtotal' , porque según esta definido no parece que ese valor se modifique (con la excepción de que sea una copia de un valor del subformulario), pero aun así, tomaría siempre el mismo valor (ya que la SQL no se refresca dentro del bucle)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de RICARDO ALONSO
Val: 1
Ha aumentado su posición en 59 puestos en Access (en relación al último mes)
Gráfica de Access

BUCLE INFINITO

Publicado por RICARDO ALONSO (14 intervenciones) el 18/10/2015 23:49:11
José muchas gracias por el aporte,
El problema radica en que precisamente no se como desplazarme ende un registro a otro, cuando ejecuto el código, la secuencia sql la ejecuta de manera infinita en el primer registro, y no se como avanzar al siguiente, probé con lo que me escribiste, pero me dice que la variable de objeto o bloque With no esta establecido.

¿me esta haciendo falta algo en el código??

Yo creo que si, te agradecería me ayudaras a organizar esto, puesto que no soy el mas experto en programación...

te repito la secuencia de código

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Sub CIERRA_FACTURA_Click()
DoCmd.SetWarnings False 'Desactivamos los mensajes de Access de que se va a actualizar una tabla, etc.
Dim mySQL As String 'Definimos una variable para introducir en ella la secuencia SQL
Dim mySQL1 As String
Dim mySQL2 As String 'Definimos una variable para introducir en ella la secuencia SQL
Dim mySQL3 As String 'Definimos una variable para introducir en ella la secuencia SQL
mySQL = "UPDATE CAJA SET ENTRADAS = ENTRADAS + " & Me.subtotal & " "
mySQL1 = "UPDATE CONS_FACT SET USADA = TRUE WHERE NO_RECIBO =  " & Me.PrimeroDeNO_RECIBO & " "
mySQL2 = "UPDATE CAJA_CAJON SET ENTRADAS = ENTRADAS + " & Me.subtotal & " "
mySQL3 = "UPDATE Inventario SET Cantidad = Cantidad - " & Me.Subformulario_FACTURACION.Form.CANTIDAD & "  WHERE CODIGO = '" & Me.Subformulario_FACTURACION.Form.ARTICULO & "'"
Me.Subformulario_FACTURACION.Form.ARTICULO.Recordset.MoveFirst: Rem ir al primer registro
Do
DoCmd.RunSQL mySQL3 'Ejecutamos la consulta
 MsgBox " EL REGISTRO HA SIDO GRABADO"
Me.Subformulario_FACTURACION.Form.ARTICULO.Recordset.MoveNext:
Loop Until Me.Subformulario_FACTURACION.Form.ARTICULO = Null
    DoCmd.RunSQL mySQL 'Ejecutamos la consulta
    DoCmd.RunSQL mySQL1 'Ejecutamos la consulta
    DoCmd.RunSQL mySQL2 'Ejecutamos la consulta
    DoCmd.SetWarnings True 'Volvemos a activar los mensajes
    MsgBox " FACTURA CERRADA"
 
End Sub

De Antemano mil gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

BUCLE INFINITO

Publicado por Enrique Heliodoro (1664 intervenciones) el 19/10/2015 00:05:12
Antes de ojear el archivo adjunto....

Si añades un PUNTO DE INTERRUPCION y ojeas el contenido de 'mySQL3' en cada paso del bucle, veras que no cambia un ápice (independiente a que entres o no en el bucle infinito).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

BUCLE INFINITO

Publicado por Enrique Heliodoro (1664 intervenciones) el 19/10/2015 00:35:17
No se si te será útil, pero aquí tiene 'casi lo mismo' pero abreviado

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub CIERRA_FACTURA_Click()
With Me.Subformulario_FACTURACION.Form.RecordsetClone 'definimos al conjunto de datos (todos los registros del subformulario)
.MoveFirst 'vamos al primero
Do Until .EOF 'y mientras no se acaben...
CurrentDb.Execute "UPDATE Inventario SET Cantidad = Cantidad - " & Str(!Cantidad) & " WHERE CODIGO = '" & !ARTICULO & "'"
.MoveNext 'vamos a por el siguiente
Loop
End With ' fin de la deficion por defecto
'lo que continua supongo que serán procesos complementarios
CurrentDb.Execute "UPDATE CAJA SET ENTRADAS = ENTRADAS + " & Str(Me.subtotal) 'Str evita el problema del separador decimal
CurrentDb.Execute "UPDATE CONS_FACT SET USADA = -1 WHERE NO_RECIBO = " & Me.PrimeroDeNO_RECIBO
CurrentDb.Execute "UPDATE CAJA_CAJON SET ENTRADAS = ENTRADAS + " & Str(Me.subtotal)
MsgBox " EL REGISTRO HA SIDO GRABADO"
MsgBox " FACTURA CERRADA"
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

BUCLE INFINITO

Publicado por Santiago Vargas (8 intervenciones) el 22/02/2016 02:21:33
Buenas noches.

Tengo el mismo inconveniente realice lo que acabas de decir pero me aparece que no coinciden los tipos me podrías ayudar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

BUCLE INFINITO

Publicado por Enrique Heliodoro (1664 intervenciones) el 22/02/2016 08:46:31
La información aportada no lo permite, puede ser causado por una 'traducción/adaptación' incorrecta o porque los datos realmente sean incompatibles
Pero ni se ha publicado lo que se ha creado (basado en el modelo), ni la línea donde se para la ejecución (y se desconoce absolutamente que origen de datos de esta manejando).

En fin, que cualquier respuesta seria perder el tiempo (jugando a las adivinanzas) mientras no se aporten datos concretos y formales.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar