** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Insertar x registros en una tabla
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoInsertar x registros en una tabla

 Responder Responder Página  12>
Autor
Mensaje
mfafa Ver desplegable
Asiduo
Asiduo


Unido: 23/Septiembre/2009
Localización: España
Estado: Sin conexión
Puntos: 459
Enlace directo a este mensaje Tema: Insertar x registros en una tabla
    Enviado: 30/Mayo/2019 a las 18:58
Hola, Buenas tardes!


Tengo dos tablas (Tabla1 y Tabla2) con los siguientes campos:

Id (autonumérico)y Nombre.

La Tabla2: Id y Adjunto.

Para copiar los Id y los nombres (8 registros en total) de la Tabla1 a la Tabla2, esto lo consigo con el siguiente código:

Dim db As Database
Dim rs As DAO.Recordset
Dim rs2 As DAO.Recordset
'Dim mivalor As Integer
'Dim i As Integer
Set db = CurrentDb
DoCmd.SetWarnings False
DoCmd.RunSQL ("DELETE FROM Tabla2")
DoCmd.SetWarnings True
Set rs = db.OpenRecordset("select * from tabla1")
rs.MoveLast
'mivalor = rs.RecordCount
rs.MoveFirst
'For i = 1 To mivalor
Set rs2 = db.OpenRecordset("select * from tabla2")
Do
rs2.AddNew
rs2("Id") = rs("id")
rs2("Adjunto") = rs("Nombre")
rs2.Update
rs.MoveNext
rs2.MoveNext
Loop


Pero me salta el error 3021 no hay reg. Activo.

Lo que necesito que me copie estos dos items tantas veces que tiene un mes, es decir, si el mes es enero que me repita 3 veces los registros y se pare en 7º registro.

La idea final es crear un calendario anual y ajustar los nombres a los días del calendario.

Muchas Gracias.   

Arriba
mfafa Ver desplegable
Asiduo
Asiduo


Unido: 23/Septiembre/2009
Localización: España
Estado: Sin conexión
Puntos: 459
Enlace directo a este mensaje Enviado: 30/Mayo/2019 a las 23:19
Hola!

Voy a subir el archivo en la nube a ve r si alguien me pueda echar una mano.

http://www.filebig.net/files/vCksgcibCK

como se observa que hay dos tablas 1 y 2. en la tabla2 hay 365 registros (el año 2019), lo que necesito es llenar los otros campos por los otros 8 registros. Lo he conseguido en parte pero me falta repetir los mismos 8 registros hasta el final de año.

Muchas Gracias.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: en línea
Puntos: 11009
Enlace directo a este mensaje Enviado: 31/Mayo/2019 a las 10:03
Vamos a comentar el código:

Dim db As Database
Dim rs As DAO.Recordset
Dim rs2 As DAO.Recordset
'Dim mivalor As Integer
'Dim i As Integer
Set db = CurrentDb
** borramos los registros de Tabla2
DoCmd.SetWarnings False
DoCmd.RunSQL ("DELETE FROM Tabla2")
DoCmd.SetWarnings True

** abrimos Tabla1
Set rs = db.OpenRecordset("select * from tabla1")

** todo este bloque no vale para nada ya que el movefirst anula el movelast y no usas para nada el recordcount
rs.MoveLast
'mivalor = rs.RecordCount
rs.MoveFirst
'For i = 1 To mivalor

** abrimos la tabla2
Set rs2 = db.OpenRecordset("select * from tabla2")

** Do ... ¿hasta cuándo? ¿cómo se sale del bucle?
Do
** añadimos un registro a tabla2 -bien-
rs2.AddNew
rs2("Id") = rs("id")
rs2("Adjunto") = rs("Nombre")
rs2.Update

** vamos al siguente registro de tabla1, vale
rs.MoveNext

** ¿vamos al siguiente registro de tabla2?   ¿àra qué?      ??????? esto seguro que te casca
rs2.MoveNext

** final del bucle, insisto, ¿cómo se sale del mismo?
Loop




Antes de poner líneas de código aquí y allá, a ver si por casualidad funcionan, lo que hay que hacer es un esquema, paso a paso, de lo que queremos que haga un código, una vez que eso funcione (de un modo lógico) es cuando empezaremos a codificar en el lenguaje de programación que estemos usando.

Empieza por el principio, y haz este esquema que te digo, con él conseguirás tu propósito, ... cuando seas un 'perro viejo' en esto de la programación podrás escribir código mirando a la pantalla directamente (yo todavía me hago esquemas de procesos en algunas rutinas 'chungas' de programar).



Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
mfafa Ver desplegable
Asiduo
Asiduo


Unido: 23/Septiembre/2009
Localización: España
Estado: Sin conexión
Puntos: 459
Enlace directo a este mensaje Enviado: 31/Mayo/2019 a las 20:46
Hola!
Muchas gracias por responder Jesús!

He conseguido con este código que me copie los 8 registros que existen en la tabla1 en la tabla2, pero no consigo que se vuelva a copiar tantas veces como registros tenga esta tabla que son 365 registros (Fecha del 1-01-2019 al 31-12-2019)

Dim db As Database
Dim rs As DAO.Recordset
Dim rs2 As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("select * from tabla1")
Set rs2 = db.OpenRecordset("tabla2", dbOpenDynaset)
rs.MoveFirst
Do Until rs.EOF
    rs2.Edit
    rs2.Fields(1).Value = rs("id")
    rs2.Fields(2).Value = rs("Nombre")
    rs2.Update
    rs.MoveNext
    rs2.MoveNext
Loop
rs.Close
rs2.Close
Set rs = Nothing
Set rs2 = Nothing


Seguiré investigando.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: en línea
Puntos: 11009
Enlace directo a este mensaje Enviado: 31/Mayo/2019 a las 21:15
¿Podrías poner el código que has puesto comentando lo que hace cada línea?


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
mfafa Ver desplegable
Asiduo
Asiduo


Unido: 23/Septiembre/2009
Localización: España
Estado: Sin conexión
Puntos: 459
Enlace directo a este mensaje Enviado: 31/Mayo/2019 a las 21:56
Hola!
De nuevo Muchas gracias por responder Jesús!

Publicado originalmente por mfafa mfafa escribió:



'** Declaramos una variable db para tipo base de datos (DataBase).
Dim db As DataBase

'** variable rs para tipo grupo de registros (RecordSet)
Dim rs As DAO.Recordset

'** variable rs2 para tipo grupo de registros (RecordSet)
Dim rs2 As DAO.Recordset

'** Asignamos a la variable db la base de datos activa (CurrentDb)
Set db = CurrentDb

'** Asignamos a la variable rs, los registros de la tabla1
Set rs = db.OpenRecordset("select * from tabla1")

'** Asignamos a la variable rs2, los registros de la tabla2
Set rs2 = db.OpenRecordset("tabla2", dbOpenDynaset)

'** Nos situamos en el primer registro de la Tabla1
rs.MoveFirst

'** Mientras no lleguemos al ultimo registro de la tabla1
Do Until Not rs.EOF

'** Editamos la tabla2
    rs2.Edit

'** Copiamos el valor del campo "id" de la tabla1 al campo de la tabla2
    rs2.Fields(1).Value = rs("id")

'** Copiamos el valor del campo "Nombre" de la tabla1 al campo correspondiente de la tabla2
    rs2.Fields(2).Value = rs("Nombre")

'** Actualizamos
    rs2.Update

'** Nos movemos al siguiente registro de la tabla1
    rs.MoveNext

'** Nos movemos al siguiente registro de la tabla2
    rs2.MoveNext

'** Final del bucle
Loop

'** Cerramos los recordset
rs.Close
rs2.Close
'** Vaciamos la memoria
Set rs = Nothing
Set rs2 = Nothing



Gracias
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: en línea
Puntos: 11009
Enlace directo a este mensaje Enviado: 31/Mayo/2019 a las 23:16
Traducido al cristiano:
- pone los campos id y nombre del registro 1 de la tabla1 en el registro 1 de la tabla 2
- pone los campos id y nombre del registro 2 de la tabla1 en el registro 2 de la tabla 2
...
A tener en cuenta:
- si en la tabla 2 hay menos registros que en la tabla1, solo se copiarán este número de registros ignorándose el resto de los que tenga la tabla1
- además te cascará el rs2.Edit ya que no tendrá registro que editar

Por cierto, si la tabla1  tiene registros ese bucle no se va a ejecutar nunca ya que:
 Do Until Not rs.eof   -> Not Rs.eof es True

... y supongo que eso no es lo que quieres que haga ¿no?...


Veamos, plantéate que quieres hacer y cómo quieres hacerlo, escribe en pseudocódigo la secuencia de acciones que hay que realizar para conseguir lo que quieres y una vez que lo tengas hecho y sea correcto, pasas a codificarlo.


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
mfafa Ver desplegable
Asiduo
Asiduo


Unido: 23/Septiembre/2009
Localización: España
Estado: Sin conexión
Puntos: 459
Enlace directo a este mensaje Enviado: 01/Junio/2019 a las 00:13
Hola!

Lo que quiero hacer me lo sé, pero no tengo ni idea como se hace.

Seguiré probando!

Gracias de nuevo.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: en línea
Puntos: 11009
Enlace directo a este mensaje Enviado: 01/Junio/2019 a las 09:33
Si quieres seguir con el método de ir probando códigos a ver si alguno funciona ... es una opción, pero dudo muchísimo que encuentres uno que haga exactamente lo que quieres.

De todas formas te voy a proponer dos opciones:




Editado por Mihura - 01/Junio/2019 a las 09:49
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 11918
Enlace directo a este mensaje Enviado: 01/Junio/2019 a las 10:52
Yo creo que algo más falta en esa demanda.

Lo que yo he entendido:
- tienes 8 registros en la tabla1 (pueden se 8 o 80, para el caso en lo mismo)
- quieres insertar esos 8 registros en una tabla2 365 veces (una por cada día del año)

Si es así, en la tabla 2 creo que falta un campo Fecha porque si no obtendrás 8 veces 365 registros iguales..

Con esas premisas cogemos papel y lapiz y empezamos a hacer un esquema de lo que queremos. Seria algo así:

- abrir recordsets. El de la tabla1 (rs1) como solo lectura, el de la tabla2 (rs2) solo para añadir,
- abrir un bucle de 365 iteraciones (dias)
- en cada iteración:
- situarte en el primer registro del rs1
- iterar por los 8 registros de rs1
- en cada iteración:
- lanzar un addnew en el rs2
- crear una fecha
- guardar los valores: Id, nombre y fecha 
- guardar el registro del rs2
- moverte al siguiente registro de rs1
- siguiente dia 
- cerrar recordsets

Una vez queda claro y lo hemos repasado para ver que no nos dejamos nada lo trasladamos a código. El paso de papel a código no lo deberias hacer completo. Empieza con las acciones más "exteriores" y ves llegando al "centro". Más o menos:
- declarar variables
- abrir y cerrar recordsets
- bucle 365
- bucle por rs1
- inserción de datos en rs2

Cada ejecución de código la haces paso a paso y analizas el contenido de las variables en la ventana de inmediato y/o inspección.

Esa técnica aplica a TODO en programación.

Un saludo
Xavi, un minyó de Terrassa

Mi web
Arriba
mfafa Ver desplegable
Asiduo
Asiduo


Unido: 23/Septiembre/2009
Localización: España
Estado: Sin conexión
Puntos: 459
Enlace directo a este mensaje Enviado: 06/Junio/2019 a las 17:46
Buenas!
Me fue difícil conseguirlo con el metodo RecordSet DAO,. lo maximo que he conseguido es rellenar toada la tabla con un nombre sólo.

Gracias a la ayuda que he recibido de otra fuente he podido conseguirlo con consultas.

Si alguien es capaz de conseguirlo como le planteado inicialmente le agradecería que me lo compartiera conmigo.

Os dejo el enlace de como le he conseguido.

http://www.filebig.net/files/4TpyrsiZVM

Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: Cárcel Brieva
Estado: Sin conexión
Puntos: 3350
Enlace directo a este mensaje Enviado: 06/Junio/2019 a las 19:29
Pues solo por sugerir


Set rs2 = db.OpenRecordset("tabla2", dbOpenDynaset)
Numero  ="select count(*) from tabla1"
for n = 1 to Numero
rs.MoveFirst
Do Until rs.EOF
    rs2.Edit
    rs2.Fields(1).Value = rs("id")
    rs2.Fields(2).Value = rs("Nombre")
    rs2.Update
    rs.MoveNext
    rs2.MoveNext
Loop
next n


Un saludo.

Luis
Estoy en el módulo psiquiátrico de la prisión de Brieva
Arriba
mfafa Ver desplegable
Asiduo
Asiduo


Unido: 23/Septiembre/2009
Localización: España
Estado: Sin conexión
Puntos: 459
Enlace directo a este mensaje Enviado: 06/Junio/2019 a las 22:28
Buenas!

Nada, me sigue dando el el mismo resultado, sólo en inserta una vez los 8 nombres.

Gracias Luis.
Arriba
jilo Ver desplegable
Colaborador
Colaborador


Unido: 19/Diciembre/2004
Localización: TAFALLA
Estado: Sin conexión
Puntos: 866
Enlace directo a este mensaje Enviado: 07/Junio/2019 a las 10:35
Hola
Me he bajado tu ejemplo y la verdad me pierdo con las consultas. Yo cuando hay que crear algo como lo que tu quieres suelo hacerlo con tablas. Me creo una tabla (Como una tabla auxiliar) con los campos como los necesito y borro o actualizo o lo que sea, a mi antojo. Así que partiendo de esta premisa en vez de explicartelo te dejo tu ejemplo apañado, a ver si es lo que necesitas.
https://1drv.ms/u/s!AlIYhsQ9-og1gRsl6JZL5GosQKrI?e=FJJSxs
Saludos
Espero te sirva !!!!!!
Iñaki
Arriba
mfafa Ver desplegable
Asiduo
Asiduo


Unido: 23/Septiembre/2009
Localización: España
Estado: Sin conexión
Puntos: 459
Enlace directo a este mensaje Enviado: 09/Junio/2019 a las 22:06
Buenas!

Muchísimas gracias Iñaki por la solución, me sirve y es otra opción más para solucionar mi duda.
De tanto darle vueltas por fin encontré la solución como lo había planteado inicialmente. Dejo el código aquí para añadir otra opción más.
Dim db As DAO.Database
   Dim rs1 As DAO.Recordset
   Dim rs2 As DAO.Recordset
   Set db = CurrentDb
   Set rs1 = db.OpenRecordset("SELECT * FROM Tabla1 ORDER BY Id", dbOpenDynaset, dbReadOnly)
   Set rs2 = db.OpenRecordset("SELECT * FROM Tabla2 ORDER BY Id_REA", dbOpenDynaset)
   If Not rs1.EOF Then
       Do Until rs2.EOF
           rs2.Edit
               rs2.Fields("Id").Value = rs1("Id").Value
               rs2.Fields("Adjunto").Value = rs1("Nombre").Value
           rs2.Update
           rs2.MoveNext
           rs1.MoveNext
           If rs1.EOF Then rs1.MoveFirst
       Loop
   End If
   rs1.Close
   rs2.Close
   Set rs1 = Nothing
   Set rs2 = Nothing


Muchas gracias a todos.

Un saludo.
Arriba
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable