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ů.