Imprimir página | Cerrar ventana

Insertar x registros en una tabla

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=84523
Fecha de impresión: 19/Octubre/2019 a las 19:52


Tema: Insertar x registros en una tabla
Publicado por: mfafa
Asunto: Insertar x registros en una tabla
Fecha de publicación: 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.   




Respuestas:
Publicado por: mfafa
Fecha de publicación: 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" rel="nofollow - 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.


Publicado por: Mihura
Fecha de publicación: 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.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: mfafa
Fecha de publicación: 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.


Publicado por: Mihura
Fecha de publicación: 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.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: mfafa
Fecha de publicación: 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


Publicado por: Mihura
Fecha de publicación: 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.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: mfafa
Fecha de publicación: 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.


Publicado por: Mihura
Fecha de publicación: 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:

%3ca%20href=" rel="nofollow - www.mvp-access.com/foro/curso-de-access-y-vba_forum19.html ">Curso de Eduardo Olaz

" rel="nofollow - http://www.mvp-access.com/foro/para-empresas-contrate-aqu-profesionales_forum21.html" rel="nofollow - http://www.mvp-access.com/foro/para-empresas-contrate-aqu-profesionales_forum21.html ">Contrate a profesionales


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

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: xavi
Fecha de publicación: 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

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: mfafa
Fecha de publicación: 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" rel="nofollow - http://www.filebig.net/files/4TpyrsiZVM



Publicado por: lbauluz
Fecha de publicación: 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


-------------
Estos son mis principios. Si no le gustan... tengo otros


Publicado por: mfafa
Fecha de publicación: 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.


Publicado por: jilo
Fecha de publicación: 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


Publicado por: mfafa
Fecha de publicación: 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.


Publicado por: Mihura
Fecha de publicación: 09/Junio/2019 a las 22:33
El título del hilo es: "insertar x registros en una tabla", y el código que has posteado no inserta nada, solo edita.

O estoy muuuuu espeso, o algo no cuadra: el solución con el enunciado, o el enunciado con la solución ...


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

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: mfafa
Fecha de publicación: 09/Junio/2019 a las 23:47
Publicado originalmente por mfafa mfafa escribió:

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" rel="nofollow - 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.


Inicialmente quería insertar los registros en una tabla sin datos, pero como no pude conseguirlo llené la tabla con la fecha de los 365 días del año 2019, para así poder editar la tabla y añadirlos, y así lo reflejé en mi segundo mensaje y publiqué un ejemplo de ello.

Pido disculpas por la confusión que pudiera haber generado.

Muchas gracias.

Se puede cerrar el hilo

Saludos



Imprimir página | Cerrar ventana