Como utilizar el bucle Do...Loop |
Responder | Página 12> |
Autor | |
andressf
Habitual Unido: 12/Abril/2011 Localización: Argentina Estado: Sin conexión Puntos: 147 |
Opciones de entrada
Gracias(0)
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 |
|
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14720 |
Opciones de entrada
Gracias(0)
|
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
|
|
andressf
Habitual Unido: 12/Abril/2011 Localización: Argentina Estado: Sin conexión Puntos: 147 |
Opciones de entrada
Gracias(0)
|
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. |
|
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14720 |
Opciones de entrada
Gracias(0)
|
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 |
|
andressf
Habitual Unido: 12/Abril/2011 Localización: Argentina Estado: Sin conexión Puntos: 147 |
Opciones de entrada
Gracias(0)
|
Buenas Xavi, jaja perdón. Podrás explicarme lo que me dices ya que no tengo muchos conocimientos. Gracias
|
|
lbauluz
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Unido: 29/Marzo/2005 Localización: La Gloria Estado: Sin conexión Puntos: 3849 |
Opciones de entrada
Gracias(0)
|
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
|
|
andressf
Habitual Unido: 12/Abril/2011 Localización: Argentina Estado: Sin conexión Puntos: 147 |
Opciones de entrada
Gracias(0)
|
Dale buenisimo, lo voy a estudiar para aplicarlo y te comento. Muchas gracias
|
|
andressf
Habitual Unido: 12/Abril/2011 Localización: Argentina Estado: Sin conexión Puntos: 147 |
Opciones de entrada
Gracias(0)
|
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.
|
|
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14720 |
Opciones de entrada
Gracias(0)
|
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 |
|
andressf
Habitual Unido: 12/Abril/2011 Localización: Argentina Estado: Sin conexión Puntos: 147 |
Opciones de entrada
Gracias(0)
|
Buenas... Podrás darme una ayuda con lo que me planteaste? 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 |
|
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14720 |
Opciones de entrada
Gracias(0)
|
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 |
|
andressf
Habitual Unido: 12/Abril/2011 Localización: Argentina Estado: Sin conexión Puntos: 147 |
Opciones de entrada
Gracias(0)
|
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 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 |
|
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14720 |
Opciones de entrada
Gracias(0)
|
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 |
|
andressf
Habitual Unido: 12/Abril/2011 Localización: Argentina Estado: Sin conexión Puntos: 147 |
Opciones de entrada
Gracias(0)
|
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. 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 |
|
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14720 |
Opciones de entrada
Gracias(0)
|
Si haces un movelast te mueves al ultimo registro.... y de ese no se puede ir al siguiente.
Quita el rs.Movelast
|
|
Responder | Página 12> |
Tweet
|
Ir al foro | Permisos de foro Usted No puede publicar nuevos temas en este foro Usted No puede responder a temas en este foro Usted No puede borrar sus mensajes en este foro Usted No puede editar sus mensajes en este foro Usted No puede crear encuestas en este foro Usted No puede votar en encuestas en este foro |