Alexandre Neves 27/12/2012, 21:12
Assis,
Esta escala está subvertida, pois o mesmo trabalhador pode ser incluído em mais que 1 turno no mesmo dia.
Mesmo assim, será:
Option Compare Database
Option Explicit
'código criado por Alexandre Neves
'em 2012-12-15
'para dteixa
'do fórum MaximoAccess
'If DCount("*", "Feriados", "DataFeriado=#" & Format(dtData, "mm-dd-yyyy") & "#") = 0 _
'And Weekday(dtData) <> 1 And Weekday(dtData) <> 7 Then
'For Turno = 1 To Forms!Rotina!NTurnos
Sub CriaTurnos()
On Error Resume Next
Dim RstOperadores As DAO.Recordset, RstTurnos As DAO.Recordset
Dim dtData As Date, Inicio As Date, Fim As Date, Turno As Byte
Set RstOperadores = CurrentDb.OpenRecordset("SELECT * FROM Operadores;")
Set RstTurnos = CurrentDb.OpenRecordset("SELECT * FROM Turnos;")
Inicio = Forms!Rotina!Inicio
Fim = Forms!Rotina!Fim
''''
CurrentDb.Execute "DELETE * FROM Turnos"
''''
For dtData = Inicio To Fim
RstTurnos.AddNew
RstTurnos(1) = dtData
For Turno = 1 To Forms!Rotina!NTurnos
If RstOperadores.EOF Then RstOperadores.MoveFirst
Verifica1:
If Not Trabalha(RstOperadores("Nome"), dtData) Then
If InStr(1, RstTurnos("Ausencia"), RstOperadores("Letra")) = 0 Then RstTurnos("Ausencia") = RstTurnos("Ausencia") & RstOperadores("Letra") & ","
If RstOperadores.EOF Then RstOperadores.MoveFirst Else RstOperadores.MoveNext
GoTo Verifica1
End If
RstTurnos(Turno + 1) = RstOperadores("Letra")
RstOperadores.MoveNext
If RstOperadores.EOF Then RstOperadores.MoveFirst
Verifica2:
If Not Trabalha(RstOperadores("Nome"), dtData) Then
If InStr(1, RstTurnos("Ausencia"), RstOperadores("Letra")) = 0 Then RstTurnos("Ausencia") = RstTurnos("Ausencia") & RstOperadores("Letra") & ","
If RstOperadores.EOF Then RstOperadores.MoveFirst Else RstOperadores.MoveNext
GoTo Verifica2
End If
RstTurnos(Turno + 1) = RstTurnos(Turno + 1) & "," & RstOperadores("Letra")
RstOperadores.MoveNext
If RstOperadores.EOF Then RstOperadores.MoveFirst
Verifica3:
If Not Trabalha(RstOperadores("Nome"), dtData) Then
If InStr(1, RstTurnos("Ausencia"), RstOperadores("Letra")) = 0 Then RstTurnos("Ausencia") = RstTurnos("Ausencia") & RstOperadores("Letra") & ","
If RstOperadores.EOF Then RstOperadores.MoveFirst Else RstOperadores.MoveNext
GoTo Verifica3
End If
RstTurnos(Turno + 1) = RstTurnos(Turno + 1) & "," & RstOperadores("Letra")
RstOperadores.MoveNext
If RstOperadores.EOF Then RstOperadores.MoveFirst
Verifica4:
If Not Trabalha(RstOperadores("Nome"), dtData) Then
If InStr(1, RstTurnos("Ausencia"), RstOperadores("Letra")) = 0 Then RstTurnos("Ausencia") = RstTurnos("Ausencia") & RstOperadores("Letra") & ","
If RstOperadores.EOF Then RstOperadores.MoveFirst Else RstOperadores.MoveNext
GoTo Verifica4
End If
'Ausencia
RstTurnos(Turno + 1) = RstTurnos(Turno + 1) & "," & RstOperadores("Letra")
If Len(RstTurnos("Ausencia")) > 0 And right(RstTurnos("Ausencia"), 1) = "," Then RstTurnos("Ausencia") = Mid(RstTurnos("Ausencia"), 1, Len(RstTurnos("Ausencia")) - 1)
RstOperadores.MoveNext
Next
RstTurnos.Update
Next
RstTurnos.MoveFirst
Do While Not RstTurnos.EOF
RstOperadores.MoveFirst
RstTurnos.Edit
Do While Not RstOperadores.EOF
If InStr(1, RstTurnos(2) & RstTurnos(3) & RstTurnos(4) & RstTurnos("Ausencia"), RstOperadores("Letra")) = 0 Then
RstTurnos("Descanso") = RstTurnos("Descanso") & RstOperadores("Letra") & ","
End If
If RstOperadores.EOF Then RstOperadores.MoveFirst Else RstOperadores.MoveNext
Loop
RstTurnos("Descanso") = Mid(RstTurnos("Descanso"), 1, Len(RstTurnos("Descanso")) - 1)
RstTurnos.Update
RstTurnos.MoveNext
Loop
Set RstTurnos = Nothing: Set RstOperadores = Nothing
End Sub
Function Trabalha(Operador As String, dtData As Date) As Boolean
If DCount("*", "Ausencias", "Operador='" & Operador & "' and #" & Format(dtData, "m-d-yyyy") & "# BETWEEN Inicio and Fim") = 0 Then Trabalha = True
End Function