Duplicar registros de una consulta

Sobre el título del tema hay varias preguntas echas en este foro, pero no se si es la pregunta esta bien titulada.

Me explico.

Tengo una serie de contactos a los que invito a una acto. Una tabla es la de los contactos y otra relacionada por su ID, la de las invitaciones.

Mi pregunta sería como puedo una vez que hago la consulta de los invitados un año concreto, volver a invitarlos el año actual, pero sin tener que ir uno a uno.

Una idea sería duplicar los registros, pero si lo hago así me colocaría el mismo año.

Me podéis dar una idea de plantearlo.

3 respuestas

Respuesta
1

Jesús, puedes hacerlo de muchas formas. Realmente habría que saber como lo quieres hacer. Por ejemplo, si tengo la tabla Amigos

Y tengo tu tabla Invitaciones( que convendría saber como es)

En cualquier evento, para el ejemplo pongo un formulario pero lo podrías hacer desde cualquier sitio

Escribo un año y al pulsar Enter primero me comprueba que no los haya invitado ya ese año y en caso de que no sea así, me deja la tabla Invitaciones como

No le he puesto nada en FechaActo porque no sé si la quieres.

En este caso el código del evento Después de actualizar es

Private Sub Año_AfterUpdate()
If DCount("*", "invitaciones", "año=" & Me.Año & "") = 1 Then
MsgBox "Nene, ese año ya los has invitado", vbOKOnly + vbExclamation, "Tendrá que ser otro año"
Exit Sub
Else
DoCmd.SetWarnings False
DoCmd.RunSQL "insert into invitaciones(amigo) select amigo from amigos"
DoCmd.RunSQL "update invitaciones set año=" & Me.Año & " where año is null"
End If
End Sub

De todas formas, como tengo tu correo si quieres dímelo y te mando un par de ejemplos.

Respuesta
1

No sé si entendí su pregunta:

1. Haga una consulta de creación de tabla sobre los invitados del año que desea invitar

2. Haga una consulta de actualización sobre la tabla del paso 1 y cambie el año por 2023

3. Haga una consulta de datos anexados con base en la tabla del paso 1 y anexa a la tabla Invitados.

Gracias por tu respuesta Eduardo.

La consulta ya la tengo echa con el año que ya los había invitado.

Me dices que haga una consulta de actualización sobre esa consulta, y cambie el valor del año?

Lo haría mediante un botón?

Exacto ya tiene la consulta del año de los que había invitado, como la tiene como consulta de selección cámbiela por una consulta de creación de tabla.

Ahora, cree una consulta de actualización sobre la tabla que ha creado y actualice el año por 2023.

Con la misma tabla ya editada puede hacer una consulta de datos anexados y anexa a la tabla de invitados.

También lo puede por SQL.

Le dejo este ejemplo con SQL.

TABLA

Voy a volver a invitar los del año 2021, id=4 e id=5

FORMULARIO

Hago clic en Actualizar y obtengo:

Efectivamente aparecen los 2 registros.

CÓDIGO DEL BOTÓN ACTUALIZAR

Private Sub bntActualizar_Click()
  Dim strSQl As String
  Dim lnPeriodo As Integer
  If IsNull(Me.cboPeriodo) Then
     MsgBox "Debe indicar los invitados de algún año", vbInformation, "Cuidado"
     Me.cboPeriodo.SetFocus
     Exit Sub
  End If
  lnPeriodo = Year(Date)
  strSQl = "INSERT INTO Invitados ( idinvitado" & vbCrLf
  strSQl = strSQl & "           , periodo )SELECT Invitados.idinvitado" & vbCrLf
  strSQl = strSQl & "           ," & lnPeriodo & vbCrLf
  strSQl = strSQl & "        FROM Invitados" & vbCrLf
  strSQl = strSQl & "       WHERE Invitados.periodo=" & Me.cboPeriodo & ";"
  CurrentDb.Execute strSQl
End Sub
Respuesta
1

Esta es una consulta que duplica una parte de sus datos (modificando uno de ellos) que hace algo similar a lo que deseas.

Hay un campo más (un ID, autonumérico) que se generara automáticamente al insertar los registros.

INSERT INTO [aqui la tabla] ( Tipo, Mes, Valor, otro )
SELECT Tipo, [Mes]+20 AS xx, Valor, otro
FROM [la misma tabla]
WHERE Mes = 5;

Lo que hace es una seleccion de los registros que en el campo mes sea 5 y los vuelve a añadir a la misma tabla y en el campo mes el valor 25 (mes= 5 + 20 ).

Sin conocer los datos y sus relaciones es lo que puedo aportar.

Muchas gracias Enrique.

Lo pruebo y te digo.

Perdona mi tardanza en contestar.

Vale, perdonar pero he dado muy poca información.

Esta es la pantalla que tengo.

Desde la misma hago los filtros correspondientes a los contactos que he invitado otros años y además a que tipo de evento lo he invitado.

He probado la opción de Eduardo, y aunque tendré que resolver un problema con el campo año, ya que lo tenía como texto, y en el código me pide que sea de número, ha funcionado, lo único que no lo invita al evento concreto que quiero.

He puesto este código, y no se si voy bien:

Dim strSQl As String
Dim lnperiodo As Integer
If IsNull(Me.cboperiodo) Then
MsgBox "Debe indicar los invitados de algún año", vbInformation, "Cuidado"
Me.cboperiodo.SetFocus
Exit Sub
End If
lnperiodo = Year(Date)
strSQl = "INSERT INTO Protocolo ( Id" & vbCrLf
strSQl = strSQl & " , Año, Actos )SELECT Protocolo.Id" & vbCrLf
strSQl = strSQl & " ," & lnperiodo & vbCrLf
strSQl = strSQl & " FROM Protocolo" & vbCrLf
strSQl = strSQl & " WHERE Protocolo.Año=" & Me.cboperiodo & ";"
CurrentDb.Execute strSQl

De nuevo muchas gracias.

Como veréis el escudo indica de donde estoy haciendolo. 

¿La tabla admite crear registros con solo esos tres campos?.

Si lo admite esta SQL debería funcionar:

strSQL = "INSERT INTO Protocolo ( Id, Año, Actos) SELECT Id, '" & Year(Date) & "', Actos FROM Protocolo WHERE Año= '" & Me.cboperiodo & "'"

Apreciaras que he añadido comillas simples al dato destinado al año y al dato con que se compara (ya que en un texto que solo tiene dígitos, pero no es un numero)

Si además del año anterior se ha de añadir otra condición (el acto) se debería obtener de ¿otro combo? ... si se le denomina [CboActos] quedaría así:

strSQL = "INSERT INTO Protocolo ( Id, Año, Actos) SELECT Id, '" & Year(Date) & "', Actos FROM Protocolo WHERE Año= '" & Me.cboperiodo & "' AND Actos = '" & Me.CboActos & "'"

La SQL también se puede crear con el asistente grafico de consultas y una vez que devuelva los datos correctos: de 'vista diseño' a Vista SQL' y se podrá copiar (pocas cosas necesitaras modificarle).

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas