Evitar traslape de datos en MS Access

Resulta que estoy implementando una base de datos y quiero evitar
los traslapes de información, para contextualizar la situación les daré una idea
de como esta elaborada la tabla que me produce
traslape:
Orden... Proc... PaU... Fini... Ffin... Hini... Fin... Dur... Clas
34234... TLHD-345-ERS... ERASE... 05-05... 05-05... 08:00... 09:00... 1... C1
432443... TLHD-456-CLN... CLEAN... 05-05... 05-05... 08:00... 10:00... 2... C1
23434... TLHD-345-CLN... CLEAN... 05-05... 05-05... 09:00... 11:00... 2... C1
65654... TLHD-456-MNT... MNTTO... 05-05... 05-05... 08:00... 16:00... 8... C1
Como ven hay dos tipos de traslape (uno como los datos1 y 3) y el otro es (como los datos 2 y 4) el de quiero evitar los dos.
El Proc representa el código mixto entre el tipo de acción y el responsable, en una consulta obtengo los responsables extrayendo parte del texto de Proc en un campo llamado Nom_Equipo que para el primero y tercero seria LHD 345 y para el segundo y cuarto es LHD 456, mi idea es que no pueda iniciar una acción para el mismo Responsable exactamente después de acabada una, ni tampoco hacer dos en simultaneo.
Para corregir esto se deben fusionar la dos o mas en una sola, dejando por código U y tipo igual al de mayor duración, para el caso del ejemplo la respuesta sería:
Orden... Proc... PaU... Fini... Ffin... Hini... Fin... Dur... Clas
23434... TLHD-345-CLN... CLEAN... 05-05... 05-05... 08:00... 11:00... 3... C1
65654... TLHD-456-MNT... MNTTO... 05-05... 05-05... 08:00... 16:00... 8... C1
Para el caso 2, como están en simultaneo, solo se deja la de mayor duración y la otra desaparece, pero en el caso1 se funcionan sumando la duración y tomando la Hini del que primero empieza y la Fin del que termina después.
Mi base de datos esta echa en Access 2007, necesito evitar esos traslapos, ya que los datos son vinculados desde excel y la tabla no se puede modificar.

Respuesta
1

Lo resolví usando el siguiente algoritmo:
Do Until rst1. EOF 'Guarda el nombre de equipo de todos los registro en una variable auxiliar
EQ = Trim(rst1. Fields(0))
GoTo 1000
rst1.MoveNext
Loop
Do Until rst1.EOF              'Para cada registro guarda el valor de sus campos
EQ1 = Trim(rst1.Fields(0))
INI1 = Trim(rst1.Fields(1))
FIN1 = Trim(rst1.Fields(2))
AV = Trim(rst1.Fields(3))
OT = Trim(rst1.Fields(4))
aviso = Trim(rst1.Fields(5))
Desc = Left(Trim(rst1.Fields(6)), 4)
UT = Trim(rst1.Fields(9))
PAU = Trim(rst1.Fields(10))
PT = Trim(rst1.Fields(12))
PRQ = Trim(rst1.Fields(13))
MIN = Trim(rst1.Fields(14))
If EQ <> EQ1 Then ' asegura reseteo de fechas al cambiar de equipo
Ini = #1/1/2000#
Fin = #1/2/2000#
End If

imprime:
If CDate(INI1) < CDate(Fin) Then 'si fecha de ini de registro n+1 es menor que fecha fin n, cambia valor
INI1 = Fin
cambi = "Y"
End If
If CDate(FIN1) < CDate(Fin) Then ' si fecha de fin es menor que fin de registro anterior, lo cambia, (avisos contenidos)
FIN1 = Fin
cambf = "Y"
End If
If CDate(INI1) = CDate(Fin) Then
esdet = 0
End If
If CDate(INI1) < Fecha1 And CDate(FIN1) > Fecha1 And CDate(FIN1) <= Fecha2 Then
DUR = CDbl((DateDiff("n", Fecha1, FIN1)) / 60)
str = "insert into Detenciones_sin_traslape(equipo,Finicio,Ffin,Cambioini,Cambiofin,Finireal,Ffinreal,Detencion,DurParada,Cl,Pauta,UTec,PtoTrabajo,Aviso,Orden,Parque, Mina)" & _
"values('" & EQ1 & "','" & Fecha1 & "','" & FIN1 & "','" & cambi & "','" & cambf & "','" & Fireal & "','" & Ffreal & "','" & esdet & "','" & DUR & "','" & aviso & "','" & PAU & "','" & UT & "','" & PT & "','" & AV & "','" & OT & "','" & PRQ & "','" & MIN & "')"
DoCmd.RunSQL str
End If
If CDate(INI1) >= Fecha1 And CDate(FIN1) <= Fecha2 Then
DUR = CDbl((DateDiff("n", INI1, FIN1)) / 60)
str = "insert into Detenciones_sin_traslape(equipo,Finicio,Ffin,Cambioini,Cambiofin,Finireal,Ffinreal,Detencion,DurParada,Cl,Pauta,UTec,PtoTrabajo,Aviso,Orden,Parque, Mina)" & _
"values('" & EQ1 & "','" & INI1 & "','" & FIN1 & "','" & cambi & "','" & cambf & "','" & Fireal & "','" & Ffreal & "','" & esdet & "','" & DUR & "','" & aviso & "','" & PAU & "','" & UT & "','" & PT & "','" & AV & "','" & OT & "','" & PRQ & "','" & MIN & "')"
DoCmd.RunSQL str
End If
If CDate(INI1) >= Fecha1 And CDate(INI1) < Fecha2 And CDate(FIN1) > Fecha2 Then
DUR = CDbl((DateDiff("n", INI1, Fecha2)) / 60)
str = "insert into Detenciones_sin_traslape(equipo,Finicio,Ffin,Cambioini,Cambiofin,Finireal,Ffinreal,Detencion,DurParada,Cl,Pauta,UTec,PtoTrabajo,Aviso,Orden,Parque, Mina)" & _
"values('" & EQ1 & "','" & INI1 & "','" & Fecha2 & "','" & cambi & "','" & cambf & "','" & Fireal & "','" & Ffreal & "','" & esdet & "','" & DUR & "','" & aviso & "','" & PAU & "','" & UT & "','" & PT & "','" & AV & "','" & OT & "','" & PRQ & "','" & MIN & "')"
DoCmd.RunSQL str
End If
End If
End If

Fin = FIN1
EQ = EQ1
cambi = "N"
cambf = "N"
esdet = 1
rst1.MoveNext
Loop

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas