Formulář
SysRecurrence slouží k definici opakování nějaké úlohy. Nejčastěji se používá pro nastavení dávkových úloh, takže lze například určit, že se má přepočet skladu spouštět automaticky každou sobotu.
V základní podobě vypadá nějak takto:
V horní části se nastavuje datum, čas (+ časové pásmo) prvního spuštění a případná ukončovací podmínka (po určitém počtu opakování nebo k určitém datu).
V dolní části se pak definuje, jak se má úloha opakovat. Podle zvolené jednotky (minuty, hodiny, dny…) se v pravé části zobrazují další volby, například počet minut či den v týdnu.
V případě dávkových úloh je tento formulář přístupný pomocí tlačítka Opakování (Recurrence) v dialogu dávkové úlohy:
Získanou definici opakování je samozřejmě možné použít nejen pro dávkové úlohy, ale i třeba pro jednorázové generování plánovaných periodických úkolů a podobně.
Implementace
Otevřete-li formulář
SysRecurrence v AOT, zjistíte, že Design je zcela prázdný. Design je totiž generován dynamicky na základě zadaných parametrů – je možné například vybrat jen určité jednotky nebo umožnit nastavit jen datum startu a nikoli konkrétní čas. Tuto logiku obstarává třída
SysRecurrenceBuild.
Z třídy
SysRecurrenceBuild lze získat uživatelem zadané parametry opakování pomocí metody
recurrence(). Ta vrací hodnotu typu
SysRecurrenceData, což není nic jiného než obyčejný kontejner (v
SysRecurrenceBuild.update() můžete prozkoumat způsob jeho plnění).
SysRecurrenceData je pak možné zpracovávat pomocí třídy
SysRecurrence. Ta poskytuje například metodu
next(), vracející datum a čas dalšího opakování nebo metody čtoucí či modifikující
SysRecurrenceData (např.
setRecurrenceStartDate()).
Použití může vypadat například takto:
SysRecurrenceBuild recurrenceBuild = new SysRecurrenceBuild();
SysRecurrence recurrence = new SysRecurrence();
SysRecurrenceData recurrenceData;
date runDate;
timeOfDay runTime;
;
recurrence
.initBuildDialog(recurrenceBuild);
recurrence.runBuildDialog();
recurrenceData = recurrence.recurrence();
if (recurrenceBuild.closeOk())
{
runDate = SysRecurrence::getRecurrenceStartDate(recurrenceData);
runTime = SysRecurrence::getRecurrenceTime(recurrenceData);
while (runDate)
{
info(strFmt("%1 %2", runDate, time2str(runTime, -1, -1)));
[runDate, runTime] = SysRecurrence::next(recurrenceData, runDate, runTime);
}
}
Pokud jsou před vyvoláním dialogu změněny parametry
SysRecurrenceBuild, vygeneruje se odlišný formulář. Například zavoláním
recurrenceBuild.addUnit(SysRecurrenceUnit::Day);
recurrenceBuild.addUnit(SysRecurrenceUnit::Week);
recurrenceBuild.addUnit(SysRecurrenceUnit::Month);
recurrenceBuild.showTime(false);
získá dialog následující podobu:
Podobná, byť o něco složitější implementace se nachází ve třídě
SysRecurrenceRun. Právě tato třída je volána z dialogu dávkových úloh (tlačítko je automaticky přidáno v
BatchInfo.dialog()). Kromě podpory dávkových úloh umožňuje
SysRecurrenceRun snadnou implementaci do libovolného formuláře – stačí přidat menu item
SysRecurrenceRun a implementovat metodu
recurrence(), kam
SysRecurrenceRun předá kontejner
SysRecurrenceData. Dále jsou podporované metody
recurrenceText() pro textový popis opakování a
recurrenceUnits() a
recurrenceShowTime() pro ovlivnění designu formuláře. Ukázku lze najít na formuláři
Tutorial_Recurrence.
Tak člověk hledá na Googlu informace o SysRecurrenceBuild a co mu nevyběhne jako první odkaz :)
OdpovědětVymazat