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

Tema cerradoRellenar registros faltantes

 Responder Responder
Autor
Mensaje
mfafa Ver desplegable
Asiduo
Asiduo


Unido: 23/Septiembre/2009
Localización: España
Estado: Sin conexión
Puntos: 497
Enlace directo a este mensaje Tema: Rellenar registros faltantes
    Enviado: 16/Octubre/2020 a las 12:41
Hola!

Buenos días.

Tengo una tabla (Actividades) con los campos (ID; Días_Mes; Actividad) El campo "Id" es autonúmerico, el campo "Dias_Mes" tiene los días de un mes determinado, el campo "Actividad" se rellena por unos becarios que son siempre 4, pero nunca completan el mes, entonces, lo que pretendo es rellenar los huecos faltantes de esta tabla por nombres de 16 personas de otra tabla, y sí se insertan todas las personas que empiece por el primero.

Tabla Actividades

Id Dia_Mes Actividad
1 01/10/2020
2 02/10/2020 R3
3 03/10/2020
4 04/10/2020
5 05/10/2020 R3
6 06/10/2020
7 07/10/2020
8 08/10/2020
9 09/10/2020 R1
10 10/10/2020
11 11/10/2020
12 12/10/2020 R4
13 13/10/2020
14 14/10/2020 R2
15 15/10/2020
16 16/10/2020
17 17/10/2020
18 18/10/2020 R2
19 19/10/2020
20 20/10/2020
21 21/10/2020
22 22/10/2020 R4
23 23/10/2020
24 24/10/2020
25 25/10/2020
26 26/10/2020 R3
27 27/10/2020
28 28/10/2020
29 29/10/2020
30 30/10/2020
31 31/10/2020

 y quiero que sea así

Id Dia_Mes Actividad
1 01/10/2020 SOTO
2 02/10/2020 R3
3 03/10/2020 CASTAÑO
4 04/10/2020 CARPINTERO
5 05/10/2020 R3
6 06/10/2020 HERRERA
7 07/10/2020 HEVIA
8 08/10/2020 R2
9 09/10/2020 R1
10 10/10/2020 Fdz.Mtz
11 11/10/2020 GUTIERREZ
12 12/10/2020 R4
13 13/10/2020 RUBIO
14 14/10/2020 R2
15 15/10/2020 BERMEJO
16 16/10/2020 BLANCO
17 17/10/2020 ARGÜELLES
18 18/10/2020 R2
19 19/10/2020 SORIANO
20 20/10/2020 MIRANDA
21 21/10/2020 ARVIZA
22 22/10/2020 R4
23 23/10/2020 DELGADO
24 24/10/2020 R4
25 25/10/2020 CARBAYO
26 26/10/2020 R3
27 27/10/2020 TORRES
28 28/10/2020 R2
29 29/10/2020 SOTO
30 30/10/2020 R1
31 31/10/2020 R4

Muchas gracias.

Un Saludo.


Editado por mfafa - 16/Octubre/2020 a las 13:39
Arriba
emiliove Ver desplegable
Administrador
Administrador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5694
Enlace directo a este mensaje Enviado: 16/Octubre/2020 a las 15:20
Y en base a que asignas los nombres de las personas a cada registro.

Saludos.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13990
Enlace directo a este mensaje Enviado: 16/Octubre/2020 a las 16:03
¿Se puede usar VBA? ... como últimamente parece ser que está prohibido Big smile

Set RS = CurrentDb.OpenRecordset("SELECT * FROM Actividades WHERE Actividad = "")
Set RSPersonas = Currentdb.OpenRecordset("SELECT * FROM Personas ORDER BY ...", DbOpenSnapShot)
Do until Rs.Eof
    If RsPersonas.Eof then RsPersonas.MoveFirst
    Rs.Edit
    Rs.Actividad = RsPersonas!Persona
    Rs.update
    Rs.MoveNext
    RsPersonas.MoveNext
Loop
Rs.Close
RsPersonas.Close

En ORDER BY ponemos el orden de la tabla Personas que nos interese (y un WHERE si es preciso). Si se acaban los registros de personas volverá al primero.

Todo el código escrito al vuelo, habrá que comprobarlo.



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: 497
Enlace directo a este mensaje Enviado: 16/Octubre/2020 a las 16:04
Hola!

Gracias por responder, en base a la antigüedad de las personas. Están numerados del 1 al 16.

Un saludo.


Editado por mfafa - 16/Octubre/2020 a las 16:06
Arriba
mfafa Ver desplegable
Asiduo
Asiduo


Unido: 23/Septiembre/2009
Localización: España
Estado: Sin conexión
Puntos: 497
Enlace directo a este mensaje Enviado: 17/Octubre/2020 a las 12:11

Buenos días!!

Espectacular Jesús, funciona perfectamente. Handshake

Ahora y abusando de tu generosidad, otra duda, esto era para el mes de octubre, entonces la idea es que para el siguiente mes empiece por el siguiente al último que se registró para seguir la rueda de asignación. ¿ Cómo sería el código?

Un saludo.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13990
Enlace directo a este mensaje Enviado: 17/Octubre/2020 a las 12:41
Te doy las pautas de lo que tienes que hacer:

- para situar el recordset de personas lo primero tienes que averiguar el último código usado del mes anterior: un DMax con los parámetros adecuados
- a continuación antes de entrar en el bucle, sitúas el recordsedt con un findfirst con los criterios adecuados

Ya tienes (tenemos) tarea para el finde.

 
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: 497
Enlace directo a este mensaje Enviado: 19/Octubre/2020 a las 18:45
Buenas tardes a tod@s!!
Perdona el retraso ya que tuve un finde un poco alterado, jejeje.
Voy a comentar los pasos que he seguido para resolver el problema:-
1- He creado una consulta "[CActividades]" que me muestre sólo las personas. 
SELECT Actividades.Dia_Mes, Actividades.Num, Actividades.Actividad
FROM Actividades
WHERE (((Actividades.Actividad) Not In ("R1","R2","R3","R4")))
ORDER BY Actividades.Num;[/I]. 

2- con este código me posiciono en el último día:-
DLookup("[NUM]", "[CActividades]", "[Dia_Mes]= #" & DMax("[Dia_Mes]", "[CActividades]") & "#")

3- Así quedó el código:-
    Dim Db As DAO.Database
    Dim RS As DAO.Recordset
    Dim RsPersonas As DAO.Recordset
    Dim NumPersonas As Integer
    Dim NumActividad As Integer
    Set RS = CurrentDb.OpenRecordset("SELECT * FROM Actividades WHERE Actividad Is Null")
    Set RsPersonas = CurrentDb.OpenRecordset("SELECT * FROM Personas ORDER BY NUMERO", dbOpenSnapshot)
    NumPersonas = DLookup("[NUM]", "[CActividades]", "[Dia_Mes]= #" & DMax("[Dia_Mes]", "[CActividades]") & "#")
    NumActividad = DCount("ID", "Actividades") 
' si tiene registros empieza desde el siguiente al ultimo que se registró
If NumActividad > 0 Then
RsPersonas.FindFirst "[NUMERO] =" & NumPersonas + 1
 Do Until RS.EOF
    If RsPersonas.EOF Then RsPersonas.MoveFirst
    RS.Edit
    RS.Fields(2) = RsPersonas!NUMERO
    RS.Fields(3) = RsPersonas!Adjunto
    RS.Update
    RS.MoveNext
    RsPersonas.MoveNext
 Loop

' Si no empieza desde el principio
Else
 Do Until RS.EOF
    If RsPersonas.EOF Then RsPersonas.MoveFirst
    RS.Edit
    RS.Fields(2) = RsPersonas!NUMERO
    RS.Fields(3) = RsPersonas!Persona
    RS.Update
    RS.MoveNext
    RsPersonas.MoveNext
 Loop
End If
  RS.Close
  RsPersonas.Close
 Me.Lista6.Requery

Así que parece que funciona. Me gustaría saber tu opinión. 
Muchas gracias Jesús ClapClapClapClapClapClapClap 

Un saludo.


Editado por mfafa - 19/Octubre/2020 a las 21:40
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13990
Enlace directo a este mensaje Enviado: 20/Octubre/2020 a las 09:01
Para saber la última persona asignada no necesitas crearte una nueva consulta, basta con que abras un recordset sobre la tabla actividades del mes que quieres analizar, ordenado por fecha descendente y quedarte con el primer registro. 

Para posicionarte en el recordset de Personas, basta con un findfirst haciendo que la key sea > valor encontrado (mira en la ayuda de Access que vienen buenos ejemplos).

El If .... Else .... End If  que tienes montado te sobra, tecleas demasiado codigo, los pasos a dar son:
- buscas el codigo siguiente
- si lo hay te posicionas (en el caso de que no lo hagas estará en el primero)
- creas los registros faltantes


... pero si funciona, funciona ... Wink


Editado por Mihura - 20/Octubre/2020 a las 09:02
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: 497
Enlace directo a este mensaje Enviado: 03/Noviembre/2020 a las 19:03
Buenas tardes!

Hace unos días intento publicar una respuesta y ma sale un error de no tener permiso......

Gracias
Arriba
mfafa Ver desplegable
Asiduo
Asiduo


Unido: 23/Septiembre/2009
Localización: España
Estado: Sin conexión
Puntos: 497
Enlace directo a este mensaje Enviado: 03/Noviembre/2020 a las 19:16
Buenas tardes, Jesús!

Por motivos que ignoro no me deja publicar una respuesta con código, por lo que abro otro hilo.
http://www.mvp-access.com/foro/rellenar-registros-faltantes_topic85541.html
En este hilo me echó una mano amablemente Jesús y me reconedó otra forma de enfocar el código, y aqui quiero mostralo:-

   
On Error Resume Next
    Dim Db As DAO.Database
    Dim RS As DAO.Recordset
    Dim RsPersonas As DAO.Recordset
    Dim RsUltimo As DAO.Recordset
    Dim NumPersonas As Integer
    Dim NumActividad As Integer
    Dim StSQL As String

    Set RS = CurrentDb.OpenRecordset("SELECT * FROM Actividades WHERE Actividad Is Null")
    Set RsPersonas = CurrentDb.OpenRecordset("SELECT * FROM Personas ORDER BY NUMERO", dbOpenSnapshot)
    Set RsUltimo = CurrentDb.OpenRecordset("SELECT Num FROM Actividades WHERE Actividad Not In ('R1','R2','R3','R4') ORDER BY Dia_Mes DESC;")

 RsPersonas.FindFirst "[NUMERO] =" & RsUltimo!Num + 1
 If Not RsPersonas.NoMatch Then
 Do Until RS.EOF
    If RsPersonas.EOF Then RsPersonas.MoveFirst
    RS.Edit
    RS.Fields(2) = RsPersonas!NUMERO
    RS.Fields(3) = RsPersonas!Persona
    RS.Update
    RS.MoveNext
    RsPersonas.MoveNext
 Loop
 Else
  Do Until RS.EOF
    If RsPersonas.EOF Then RsPersonas.MoveFirst
    RS.Edit
    RS.Fields(2) = RsPersonas!NUMERO
    RS.Fields(3) = RsPersonas!Persona
    RS.Update
    RS.MoveNext


Muchas gracias.


Editado por mfafa - 03/Noviembre/2020 a las 19:17
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable