** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Como utilizar el bucle Do...Loop
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Como utilizar el bucle Do...Loop

 Responder Responder Página  12>
Autor
Mensaje
andressf Ver desplegable
Habitual
Habitual
Avatar

Unido: 12/Abril/2011
Localización: Argentina
Estado: Sin conexión
Puntos: 147
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita andressf Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Como utilizar el bucle Do...Loop
    Enviado: 21/Septiembre/2021 a las 14:13
Buenas a todos, espero estén bien, desde ya agradezco su buena predispoición y el tiempo que se toman.
Estoy queriendo utilizar el bucle Do... Loop para que se repita la instrucción si se cumple la condición

Do While Forms!f_rev!F_Pedido_Revalida_Doc!ID_Nro_Rev_Doce > 1

DoCmd.RunSQL "Insert Into [T_Reval_Pedido_Docen](id_Rev_Ped_PRD, id_curso_rev_PRD,id_docent_PRD,id_insti_doc_PRD,nomyape_doc_PRD,tipo_dni_doc_PRD,dni_docent_PRD) Values (" & Forms!f_rev!F_Pedido_Revalida_Doc!ID_Nro_Rev_Doce & "," & Forms!f_rev!F_Pedido_Revalida_Doc!id_curso_rev & "," & Forms!f_rev!F_Pedido_Revalida_Doc!id_docent & "," & Forms!f_rev!F_Pedido_Revalida_Doc!id_insti_doc & ",'" & Forms!f_rev!F_Pedido_Revalida_Doc!nomyape_doc & "','" & Forms!f_rev!F_Pedido_Revalida_Doc!tipo_dni_doc & "'," & Forms!f_rev!F_Pedido_Revalida_Doc!dni_docent & ")"

Loop

Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 21/Septiembre/2021 a las 15:10
El "problema" de ese bucle es que, o bien no se ejecuta (porque el valor es menor o igual a 1) o se ejecuta eternamente (porque el valor supera 1)

En cualquier caso estaría bien que explicaras un poco más (conceptualmente) que es lo que deseas hacer porque yo no lo veo nada claro.

Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
andressf Ver desplegable
Habitual
Habitual
Avatar

Unido: 12/Abril/2011
Localización: Argentina
Estado: Sin conexión
Puntos: 147
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita andressf Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 21/Septiembre/2021 a las 15:49

Terrassa-BCN buenas, gracias por tu atención.

Tengo un formulario llamado F_curso el cual tiene un subformulario continúo vinculado con los datos de profesores.

Hay cursos que poseen 1 profesor y otros que tiene 2 o más.

El formulario F_curso tiene un botón que archivo todo en dos tablas que están relacionas.

Mientras el curso tenga un profesor no tengo inconvenientes me funciona todo bien, ahora el problema es que si el curso tiene 2 o más profesores ya que solo me copia el 1er profesor el 2do no me lo copia. Es ahí donde quiero colocar un bucle para que me copie si tiene 2 o más profesores.


Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 21/Septiembre/2021 a las 17:37
Hola,

Para empezar mi nombre es Xavi, no Terrassa-BCN.

El problema es que cuando lanzas el código toma los datos del primer registro.

Yo lo enfocaría recorriendo el RecordsetClone del subformulario y lanzando la consulta de inserción en cada registro.
Ello implica:
- declarar una variable recordset
- abrir un recordset sobre el subformulario
- recorrerlo con un bucle Do Loop hasta que no termine (EOF)
- lanzar una consulta de inserción en cada registro pero tomando los datos del recordset y no del formulario como haces tu ahora

No es extremadamente complicado pero tampoco es de párvulos.

Un saludo

Xavi, un minyó de Terrassa

Mi web
Arriba
andressf Ver desplegable
Habitual
Habitual
Avatar

Unido: 12/Abril/2011
Localización: Argentina
Estado: Sin conexión
Puntos: 147
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita andressf Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 22/Septiembre/2021 a las 13:41
Buenas Xavi, jaja perdón.

Podrás explicarme lo que me dices ya que no tengo muchos conocimientos. Gracias
Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: La Gloria
Estado: Sin conexión
Puntos: 3849
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita lbauluz Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 22/Septiembre/2021 a las 14:46
Hola andressf


Si te fijas, haces un bucle, que resumido sería así:

do while X > 1

Inserta A en base de datos
loop

Bien, depende del valor de X, si X es menor que 1, no entrará jamás.
Si X es mayor que 1, entrará en el bucle y jamás saldrá, puesto que X no cambia.

Deberías, en mi opinión,  poner un control cambiando el valor de X dentro del bucle 

Por ejemplo 


do while X > 1
Inserta A en base de datos
X = 0
loop


Seguro que la realidad es "un poco más complicada", pero la idea final es esa.

Un saludo.

Luis
El Búho es un pajarraco
Arriba
andressf Ver desplegable
Habitual
Habitual
Avatar

Unido: 12/Abril/2011
Localización: Argentina
Estado: Sin conexión
Puntos: 147
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita andressf Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 22/Septiembre/2021 a las 14:56
Dale buenisimo, lo voy a estudiar para aplicarlo y te comento.
Muchas gracias
Arriba
andressf Ver desplegable
Habitual
Habitual
Avatar

Unido: 12/Abril/2011
Localización: Argentina
Estado: Sin conexión
Puntos: 147
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita andressf Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 23/Septiembre/2021 a las 13:36
Buenas Xavi, esuve probando pero no me funciona, a ver si puedo explicarme, el problema es que repite la secuncia pero sobre el mismo registro, no busca en un 2do registro,  nose si me explico.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 23/Septiembre/2021 a las 13:55
Si, te explicas. Y la solución es que debes "moverte" al segundo registro. 

Si sigues pensando en clave formulario deberás moverte al segundo registro (mira DoCmd.MoveNext)  y cambiar la evaluación del bucle a "no hay más registros" (probablemente cuando salte un error)

Si pasas a pensar en clave de recordset, entonces vuelve a mi explicación y busca información sobre los conceptos que se mencionan.

Un saludo

Xavi, un minyó de Terrassa

Mi web
Arriba
andressf Ver desplegable
Habitual
Habitual
Avatar

Unido: 12/Abril/2011
Localización: Argentina
Estado: Sin conexión
Puntos: 147
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita andressf Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 24/Septiembre/2021 a las 17:11
Buenas...

Podrás darme una ayuda con lo que me planteaste?

'- declarar una variable recordset

Dim db As Database                      ' Declaro la variable db para tipo base de datos.

'- abrir un recordset sobre el subformulario  (Forms!f_rev!F_Pedido_Revalida_Doc)
                                                             
Set rs = Forms!f_rev!F_Pedido_Revalida_Doc.Form.RecordsetClone

'- recorrerlo con un bucle Do Loop hasta que no termine (EOF)

Do Until Not rs.EOF
DoCmd.RunSQL "Insert Into [T_Reval_Pedido](Id_Rev_Ped_Doc_P_R, Fecha_P_R, Reval_Ano_P_R, LOCALIDAD_P_R, cod_postal_P_R) Values ('" & Id_Rev & "','" & fecha_pres & "','" & Me.ano_r & "','" & Me.LOCALIDAD_I & "','" & Me.cod_postal_I & "')"

loop

'- lanzar una consulta de inserción en cada registro pero tomando los datos del recordset y no del formulario como haces tu ahora


Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 25/Septiembre/2021 a las 12:40
Declarar un recordset no es declarar una Database. Además es una buena práctica indicar el tipo. En este caso DAO

Dim rs As DAO.Recordset

(la db no es necesaria)

La apertura parece correcta.

El bucle debe evaluar una condición (no me acabé de expresar correctamente uy lo has traducido de forma literal) de forma que se repita mientras/hasta que no se cumpla. La ventaja de Do..Loop respecto a otras estructuras de bucle es que se puede controlar a la entrada, a la salida y con condiciones mientras y hasta. Si a eso le unimos el Not las posibilidades de condiciones son prácticamente todas.

En este caso se trata de que el bucle se ejecute hasta que termine el recordset:

Opción "mientras no finalice": Do While Not rs.EOF
Opción "hasta que finalice": Do Until rs.EOF

Para recorrer un recordset es necesario moverse por el ya que, de otra forma, siempre estará en el mismo registro y nunca saldrá del bucle:

Do condicion
  ' acciones
  rs.MoveNext
Loop

La SQL de acción debe tomar los valores del recordset en lugar del formulario. Debes entender que utilizamos el formulario como punto de partida y que recorremos los DATOS, no el formulario.

Debes sustituir Me. (consejo: mejor Me! que Me. para referirse a los controles de un formulario) por el recordset --> rs!ano_r

Finalmente, despues de recorrer el recordset (o sea: después de Loop) debes cerrarlo y "matarlo". 

rs.Close
Set rs = Nothing

Te recomiendo que busques y leas la información que puedas sobre todo lo que se ha apuntado en esta hilo. Los recordsets son sumamente útiles para hacer este tipo de acciones.

un saludo


Xavi, un minyó de Terrassa

Mi web
Arriba
andressf Ver desplegable
Habitual
Habitual
Avatar

Unido: 12/Abril/2011
Localización: Argentina
Estado: Sin conexión
Puntos: 147
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita andressf Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 28/Septiembre/2021 a las 16:10

Buenas y nuevamente gracias....

 

** Debes sustituir Me. (consejo: mejor Me! que Me. para referirse a los controles de un formulario) por el recordset --> rs!ano_r Esto no termino de entender como cambiarlo, ya que los campos pertenecen a un suf formulario.

 

Me sigue sin recorrer los registros solo me copia el 1ero, a ver donde estoy fallando... desde ya muchas gracias por tu paciencia...

 

 

Dim rs As DAO.Recordset
Set rs = Forms!f_rev!F_Pedido_Revalida_Doc.Form.RecordsetClone

rs.MoveLast

sqlinsert = "INSERT INTO T_Reval_Pedido_Docen(id_Rev_Ped_PRD,id_curso_rev_PRD,id_docent_PRD,id_insti_doc_PRD,nomyape_doc_PRD,tipo_dni_doc_PRD,dni_docent_PRD) Values (" & Forms!f_rev!F_Pedido_Revalida_Doc!ID_Nro_Rev_Doce & ",'" & Forms!f_rev!F_Pedido_Revalida_Doc!id_curso_rev & "','" & Forms!f_rev!F_Pedido_Revalida_Doc!id_docent & "','" & Forms!f_rev!F_Pedido_Revalida_Doc!id_insti_doc & "','" & Forms!f_rev!F_Pedido_Revalida_Doc!nomyape_doc & "','" & Forms!f_rev!F_Pedido_Revalida_Doc!tipo_dni_doc & "')"

DoCmd.RunSQL (sqlinsert)

rs.MoveNext

Loop

rs.Close

Set rs = Nothing



Editado por andressf - 28/Septiembre/2021 a las 16:13
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 28/Septiembre/2021 a las 18:06
1. Nunca entrarás en un bucle porque no lo inicias. La línea del Do no aparece por ningún sitio
2. Justo después de abrir el recordset te mueves al último ¿porqué?
3. Sigues sin cambiar el "chip": no se trata de sustituir el Me!loquesea por Forms!nombreform!loquesea; se trata de sustituir el Me!loquesea por rs!loquesea

Ejemplo del bucle con solo un campo:
Do Until rs.EOF
  sqlInsert = "INSERT INTO unaTabla (uncampotexto) VALUES('" & rs!uncampotexto & "')"
  DoCmd.RunSQL strInsert
  rs.Movenext
Loop


Xavi, un minyó de Terrassa

Mi web
Arriba
andressf Ver desplegable
Habitual
Habitual
Avatar

Unido: 12/Abril/2011
Localización: Argentina
Estado: Sin conexión
Puntos: 147
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita andressf Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 29/Septiembre/2021 a las 14:34
Hola...
Tengo tantas pruebas que se me pasó lo de abrir el bucle Do lo mismo con mover al principio... se me está quemando el cerebro..jajaja

Estoy intentando cambiar el chip, me copia, pero sigue sin recorrer los registros, solo el prmero me copia.

Dim rs As DAO.Recordset
Set rs = Forms!f_rev!F_Pedido_Revalida_Doc.Form.RecordsetClone
MsgBox rs.RecordCount
rs.MoveLast
Do Until rs.EOF

sqlInsert = "INSERT INTO T_Reval_Pedido_Docen (id_Rev_Ped_PRD,localidad_doc_PRD) VALUES('" & rs!temp_ID_Nro_Rev_Doce & "','" & rs!localidad_doc & "')"
DoCmd.RunSQL sqlInsert
rs.MoveNext
Loop

rs.Close
Set rs = Nothing


Editado por andressf - 29/Septiembre/2021 a las 15:10
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14720
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 29/Septiembre/2021 a las 15:27
Si haces un movelast te mueves al ultimo registro.... y de ese no se puede ir al siguiente.

Quita el rs.Movelast
Xavi, un minyó de Terrassa

Mi web
Arriba
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable