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.
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 Box1
až Box12. 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.
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.
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ů.