4. Řešení specializovaných problémů

4.1. Sledování úkolů pracovníků

V tomto příkladu máme za úkol sledovat přidělování jednotlivých úkolů pracovníkům s tím, že úkoly zasahují vždy do jednoho dne a během tohoto dne zabírají určený časový úsek. Aplikace se tedy podobá plánovacímu kalendáři. Takové aplikace se běžně dodávají a mají řadu možností, které budeme těžko realizovat. Zřejmě je náš úkol doplňkem nějaké rozsáhlejší aplikace, takže se vyplatí jej realizovat.

V ukázce řešení vyjdeme ze zjednodušené datové struktury, viz obr. 17.

Obr. 17. Zjednodušená datová struktura evidence úkolů

Obr. 18. Formulář pro vkládání údajů o úkolech

Na obr. 18 je ukázka jednoduchého formuláře pro editaci údajů o úkolech a otevření sestavy s jejich grafickým znázorněním. U otevření je důležité, aby bylo zadáno požadované datum, jinak by při formátování sestavy došlo k chybě. Obsluha stisku tlačítka je řešena procedurou:

Sub Sestava_pro_den__Click ()
On Error GoTo Err_Sestava_pro_den__Click
If IsNull(Forms![FPracovnici]![Datum]) Then
    MsgBox "Nejprve je potřeba zadat datum pro sestavu", 16, "STOP"
Else
    Dim DocName As String
    DocName = "RDenniZatizeni"
    DoCmd OpenReport DocName, A_PREVIEW
End If
Exit_Sestava_pro_den__Click:
    Exit Sub
Err_Sestava_pro_den__Click:
    MsgBox Error$
    Resume Exit_Sestava_pro_den__Click
    
End Sub

Na obr. 19. vidíme návrh vzhledu sestavy. V sekci Detail jsou umístěny objekty typu Rectangle s názvy Box1Box12. Jako obsluha události On Format sekce Detail je připojena procedura, která určí rozměry jednotlivých obdélníků podle času úkolů. Současně podle typu úkolu nastaví jejich barvu. U nevyužitých obdélníků nastaví jejich neviditelnost. Znamená to, že je možno zobrazit maximálně dvanáct úkolů. Tento počet byl se zadavatelem konzultován jako dostatečný i s rezervou.

Obr. 19. Návrh vzhledu sestavy s přehledem úkolů
Sub Detail1_Format (Cancel As Integer, FormatCount As Integer)
' *************************************************************
' Prtocedura zformátuje položky Box1 až Box12 podle času úkolů
' aktuální osoby
' *************************************************************
Dim D As Database, R As Recordset, I As Integer, S As String
Dim D1 As Double, D2 As Double
On Error GoTo Err_Detail1
Set D = DBENGINE(0)(0)
' Celý dotaz pro získání údajů aktuální osoby zní:
' SELECT DISTINCTROW Ukoly.* FROM Ukoly WHERE ((Ukoly.Osoba='FAR10') AND (Ukoly.Datum=#09/29/96#));
S = "SELECT DISTINCTROW Ukoly.* FROM Ukoly WHERE ((Ukoly.Osoba='" & Me.[Osoba] & "'));"
' Dotaz s datumem nelze použít, funkce Str převede datum s oddělovači tečka, požadováno je lomítko
Set R = D.OpenRecordset(S, DB_OPEN_SNAPSHOT)

I = 0
Do Until R.EOF
    If R![Datum] = Me.Datum Then
        I = I + 1
        If I < 12 Then
            S = "Box" & Trim(Str(I))
            D1 = Hour(R![Od]) + Minute(R![Od]) / 60
            Me(S).Left = (3 + D1 / 2) * 567
            D2 = Hour(R![Do]) + Minute(R![Do]) / 60
            Me(S).Width = ((D2 - D1) / 2) * 567
            Select Case R![Typ]
                Case 1
                    Me(S).BorderColor = 0
                    Me(S).BackColor = 0
                Case 2
                    Me(S).BorderColor = 16711680
                    Me(S).BackColor = 16711680
                Case 3
                    Me(S).BorderColor = 255
                    Me(S).BackColor = 255
                Case Else
                    Me(S).BorderColor = 65535
                    Me(S).BackColor = 65535
            End Select
            Me(S).Visible = True
        End If
    End If
    R.MoveNext
Loop
R.Close
Do Until I > 11
    I = I + 1
    S = "Box" & Trim(Str(I))
    Me(S).Visible = False
Loop
Exit Sub
Err_Detail1: Exit Sub
End Sub

Výsledná sestava je zobrazena na obr. 20.

Obr. 20. Vzhled sestavy s přehledem úkolů

Uvedený postup je možno snadno aplikovat např. na evidenci dlouhodobých úkolů se sestavou úkolů za zvolený měsíc apod. Je třeba si dobře promyslet potřebný počet objektů pro zobrazení úkolů.