Práce s databází Base z OpenOffice.org (11) – Formuláře: pokračování III.

base.png V jedenáctém dílu se počtvrté budeme zabývat formuláři. Úkol je jasný – doplnit formulář se samostatným rozevíracím seznamem tak, aby se výběr položky seznamu projevil i v dalších prvcích formuláře, např. v navigačním panelu. K tomu je potřebné vytvořit a zprovoznit makro. Běžný uživatel programů z kancelářského balíku by o makrech dnes asi měl aspoň něco vědět, takže by tento díl mohl být užitečný nejen kvůli práci s Base.  

Odpovědi na otázky ze shrnutí 10. dílu (seznamy ve formuláři)

  1. Jak se liší kombinované pole od seznamu? Kdy budou fungovat totožně?
    Kombinované pole má tvar běžného textového pole, ale šipkou na pravém okraji můžeme rozvinout a zobrazit více hodnot. Seznam má větší velikost než textové pole a zobrazuje trvale více hodnot. Když ale nastavíte u prvku Seznam vlastnost Rozbalit na hodnotu Ano, bude se chovat stejně jako Kombinované pole.
  2. Uveďte aspoň dvě přednosti tvorby formuláře v režimu návrhu oproti použití průvodce.
    Především se v minulém dílu ukázalo, že když použijete průvodce, jehož úlohou je ulehčit vám práci, udělat něco za vás, nemusí výsledek pracovat vždy správně. Převod kroků průvodce na výsledný produkt (např. formulář) tedy zatím v Base v některých případech nefunguje, a tomu se pak vyhneme použitím režimu návrhu. Práce v režimu návrhu může být také mnohdy rychlejší a přímočařejší než s průvodcem. No a některé věci prostě pomocí průvodce udělat nejdou.
  3. Uveďte dva problémy, se kterými jste se v tomto dílu u kombinovaného pole setkali, a zkuste vysvětlit jejich příčinu a možnost jejich řešení.
    Samostatná roletka, vytvořená pomocí průvodce, nemusí fungovat správně – nerozevírá se. I když ji ale vytvoříte v režimu návrhu, neaktualizuje se po výběru jiné položky formulář. To vyřeší makro, vysvětlené ve druhé části tohoto dílu.

Makra a jejich použití ve formuláři databáze Knihovna

Text tohoto dílu rozdělím do dvou částí.

  1. Seznámení s makry. Tato část je určena spíš pro začátečníky, obsahuje základní vysvětlení fungování maker v OpenOffice.org a příklad makra, který byste si mohli v rámci této přípravy vyzkoušet.
  2. Makro pro formulář s rozevíracím seznamem. Ve druhé části uvedu text makra, které je nutné pro fungování formuláře z předchozího dílu a způsob jeho zprovoznění.

První část: Seznámení s makry

Co je makro, zdroje informací

Pojem makro má víc významů. Nás zajímá makro jako malý program, který má v některém programu z kancelářského balíku provést jistou činnost. Ve velmi pěkné knize „OpenOffice.org – tipy a triky pro záznam a úpravu maker“ (budu ji značit zkratkou [Sobek]) píše autor Milan Sobek toto:

Makra umožňují automatizovat rutinní operace, usnadňují zpracování a vyhodnocování dat.“

Július Pastierik ve své elektronické knize „Makrá v OpenOffice.org“ [Pastierik], o které jsem se zmínil v závěru předchozího dílu, píše o makrech v libozvučné slovenštině toto:

„Priznám sa, že nemám rád zbytočné definície, a preto si dovolím predstaviť makro v kancelárskom balíku OpenOffice.org ako program, pomocou ktorého si dokážeme uľahčiť našu prácu s týmto programom alebo program, ktorý nám rozširuje jeho možnosti. ... Vývojom makier pre OpenOffice.org sa zaoberá pomerne dosť programátorov, ktorí výsledky svojej práce poskytujú zadarmo, ako sme u open-source programov vlastne zvyknutí, vrátane zdrojových textov aj iným. Z mnohých zdrojov takýchto makier spomeňme aspoň www.ooomacros.org/index.php. Mnohí tu určite nájdu zaujímavé makrá, ktoré priamo dokážu využiť pre svoju potrebu, iní aspoň inšpiráciu pre vlastnú tvorbu.“

Makro má tedy urychlit a usnadnit některé složitější činnosti (obzvláště když je potřebujete provádět opakovaně) nebo umožní věci, které by bez maker možné nebyly, např. zobrazení dialogového okna, automatické zavření dokumentu po jisté události apod.

Nejběžněji se s makry pracuje asi v tabulkových procesorech (Calc, Excel...), mohou pomoci i v textových procesorech (Writer, Word…). Především makrům v Calcu je věnována kniha [Sobek], Writeru i Calcu je věnována kniha [Pastierik]. O makrech v Base bohužel česky zatím kniha asi nevyšla, k dispozici je anglicky psaná literatura (Roberto Benitez: „Databases Programming – OpenOffice.org Base & Basic“), elektronická kniha „Andrew Pitonyak: OpenOffice.org Base – Macro Programming“ a další internetové zdroje.

Příklady makra

V první části tohoto dílu uvedu dva příklady a jejich stručné vysvětlení, nadále je budu označovat jako cvičná nebo pokusná makra. První makro je velmi jednoduché, druhé složitější. Začátečník by si mohl jeden z příkladů vyzkoušet.

Pokud nemáte alespoň malé zkušenosti s programováním, nebudete asi všemu rozumět, ale o to tu nejde; stačí vědět, co makro zhruba je, kde ho najít a jak ho zapojit do aplikace. Proto vysvětlení kódu (příkazů) následujících maker můžete klidně přeskočit.

Příklad 1: Makro č. 1 by mohlo mít třeba takovýto text (zdrojový kód):

sub Upozorneni  rem Vypíše upozornění, že na databázi se ještě pracuje
print "Dobrý den. Tato databáze není ještě hotová."
end sub

Vysvětlení zdrojového kódu:

  • Příkazem sub makro začíná (je zkratkou slova subroutine – podprocedura).
  • Příkaz rem znamená poznámku – komentář. Jde o informaci pro programátora, kterou program ignoruje – přeskočí (rem je zkratkou z remark – poznámka).
  • Příkaz print způsobí otevření jednoduchého dialogového okna, které zobrazí text v uvozovkách.

Příklad 2: Je složen ze dvou maker, makra č. 2 a 3, kde makro č. 2 za jisté podmínky spustí makro č. 3:

Sub UpozorneniSeZavrenim     ' makro č. 2
Rem Vypíše upozornění, že na databázi se ještě pracuje,
Rem a popř. zavře databázi
Rem deklarace proměnných
Dim Zprava As String       ' řetězec
Dim VzhledOkna As Integer  ' celé číslo
Dim NadpisOkna As String   ' řetězec
Dim NavratovaHodnota As Integer    ' celé číslo
Zprava = "Dobrý den. Tato databáze není ještě hotová, "
Zprava = Zprava + "takže vše ještě nefunguje, jak by mělo."
Zprava = Zprava + " Chcete pokračovat v práci?"  
REM Vzhled je dán součtem čísel 48 + 4 = 52
REM č. 48 znamená ikonu Vykřičník, č. 4 zajistí tlačítka Ano, Ne
VzhledOkna = 52 
NadpisOkna = "Úvodní informace"
Rem Návratová hodnota funkce MsgBox je při volbě Ano č. 6, při Ne č. 7
Rem Příkaz MsgBox zobrazí okno, ale také vrátí návratovou hodnotu
Rem (buď 6 nebo 7) do proměnné NavratovaHodnota
NavratovaHodnota = MsgBox(Zprava, VzhledOkna, NadpisOkna)
Rem Samotný příkaz okna by mohl vypadat: MsgBox Zprava, VzhledOkna, NadpisOkna
Rem Příkaz If – Then – End If pro větvení programu.
If NavratovaHodnota = "7" Then
Print "Nashledanou"
ZavritDatabazi
End If
end sub
Sub ZavritDatabazi     ' makro č. 3
Dim dokument
dokument = ThisComponent
If HasUnoInterfaces(dokument, "com.sun.star.util.XCloseable") Then
dokument.close(true)
Else
dokument.dispose()
End If
End Sub

Ke zdrojovému kódu jen pár dalších poznámek:

  • Jde o dvě makra, z makra č. 2 (UpozorneniSeZavrenim) bude za jistých podmínek vyvoláno makro č. 3 (ZavritDatabazi).
  • Komentář se dá zapsat kromě slova rem také pomocí znaku apostrof (').
  • Tato makra jsou psána v programovacím jazyce Basic, kde u příkazů na velikosti písmen nezáleží (třeba příkaz deklarace proměnné můžete psát jako dim, Dim i DIM). Ovšem u příkazů, které využívají API (Application Programming Interface čili aplikační programové rozhraní – standardizované rozhraní pro umožnění komunikace jiných programů zde s programy balíku OpenOffice.org) se doporučuje dodržovat velikost písmen podle popisu API (viz např. api.openoffice.org). Příkazy API jsou třeba ThisComponent, HasUnoInterfaces z makra č. 3 ZavritDatabazi.

API - Application Programming Interface. Úlohu API pro programátora bych snad mohl přirovnat třeba ke klávesnici a myši pro běžného uživatele počítače. Během let se výrobci dohodli na jistém standardu (u klávesnice rozložení běžných kláves, numerická klávesnice, funkční klávesy, u myši dvě tlačítka a jejich běžné funkce, rolovací kolečko) a běžný uživatel má jistotu, že libovolný osobní počítač tímto příslušenstvím dokáže ovládat. API kancelářského balíku OpenOffice.org nabízí zase programátorovi jasné metody a služby, kterými mohou jeho programy s balíkem spolupracovat. Metody a služby API už nejsou součástí programovacího jazyka Basic, ale pomocí příkazů Basicu k nim můžeme přistupovat.

  • Je možné příkazem Dim deklarovat proměnné (oznámit programu předem, jaké proměnné a jakých datových typů budou používány). Deklarace není většinou nutná, někdy však ano (v makru č. 3 u proměnné dokument, která zastupuje celou databázi v Base).
  • Chod programu můžete rozvětvit na dvě cesty příkazem IF – THEN – END IF. Pokud bude splněna podmínka za slovem IF, provedou se příkazy před slovem THEN. Jestliže podmínka splněna není, provedou se příkazy mezi slovy THEN a END IF. Jednodušší variantou je příkaz IF – END IF, kde druhá větev se slovem THEN prostě chybí. O tomto příkazu se můžete dočíst např. na stránce o mladším sourozenci Basicu, kterým je Visual Basic.NET.
  • Pokročilejší příkaz pro zobrazení dialogového okna je MsgBox (z Massage Box), ten má i parametry, nastavující nadpis okna a jeho vzhled (ikony, počet a druh tlačítek).
  • Příkaz MsgBox jako funkce (parametry budou uvedeny v závorkách) vrací hodnotu, podle které se může program dál řídit.
  • Z jednoho makra je možné volat makro jiné (příkaz ZavritDatabazi před koncem makra UpozorneniSeZavrenim).

Úkol 19, verze „A“, Úkol 18, verze „B“ (spíše dobrovolný): Pročtěte si předchozí ukázky zdrojového kódu a promyslete, co by tato makra (malé prográmky) po svém spuštění vykonala. Odpověď najdete na konci tohoto dílu.

Úkol 20, verze „A“, Úkol 19, verze „B“: Podle následujícího textu zprovozněte buď první (jednodušší) nebo druhou verzi výše uvedených maker. Pokud už máte s makry zkušenosti, jistě tento úkol můžete přeskočit.

Jak vytvořit makro? Editor maker.

Pro vytvoření makra jsou dvě možnosti:

  1. Nahrání makra pomocí záznamníku maker. Tato možnost se hodí jen pro jednoduchá makra, nedokážeme s ní vytvořit třeba dialogová okna, proto ji zde nevyužijeme. Ukázka tohoto postupu je např. v úvodu elektronické knihy pana Pastierika.
  2. Zápis zdrojového kódu makra v editoru maker. Tento způsob se nám bude hodit.

Editor maker je součástí vývojového prostředí v OpenOffice.org, tzv. IDE (Integrated Development Environment), které kromě editoru pro zápis kódu nabízí také pomůcky pro ladění makra.

IDE s editorem otevřete volbou Nástroje | Makra | Správce maker | OpenOffice.org Basic... (protože naše makra budou psána v základním jazyku maker pro OpenOffice.org, v Basicu).

Tato volba otevře dialogové okno Makra v OpenOffice.org Basic, ve kterém je třeba vybrat modul, který bude makro obsahovat, popř. nový modul vytvořit. Na obrázku je ukázka tohoto okna, vysvětlující komentář následuje za poznámkou.

Obrázek č. 1: Dialogové okno Makra v OpenOffice.org BasicObrázek č. 1: Dialogové okno Makra v OpenOffice.org Basic

Kde jsou makra uložena?

Makro – Modul – Knihovna – Knihovní kontejner. Makro je program, který je uložen v jisté hierarchii souborů a složek. Je zapsáno v jednom souboru – tzv. modulu. V modulu bývá zapsáno maker víc – všechna makra, která se podílejí na řešení společného úkolu. Moduly se ukládají do knihoven a knihovny do knihovních kontejnerů.

V předchozím obrázku vidíte tři knihovní kontejnery: Moje makra, Makra OpenOffice.org a Base-dil-11-... První dva najdete v OpenOffice.org vždy: kontejner Moje makra je určen pro makra, vytvořená uživatelem, v kontejneru Makra OpenOffice.org jsou makra tvůrců tohoto kancelářského balíku. Třetí knihovní kontejner se vytvoří automaticky při založení nového dokumentu a má stejný název jako dokument.

Při psaní makra musíte tedy otevřít nějaký modul, do kterého se příkazy makra vepíší. V obrázku byl vybrán modul Module1 z knihovny Base v knihovním kontejneru Moje makra. Samotné makro má název UpozorneniSeZavrenim a jeho zdrojový kód byl uveden výše (druhé ze tří maker). Pokud byste chtěli hotové makro upravovat, tímto způsobem ho vyberete a pak kliknete na tlačítko Upravit v pravé části okna. Tím otevřete editor maker v OpenOffice.org, ve kterém se makra dají upravovat a tvořit.

Obrázek č. 2: Kód makra v okně vývojového prostředí (IDE)Obrázek č. 2: Kód makra v okně vývojového prostředí (IDE)

Ve spodní části okna IDE si všimněte záložky s názvem modulu (Module1). Pokud by knihovna maker měla více modulů, budou zde všechny jejich záložky a s jejich pomocí můžete mezi moduly procházet.

Napište první makro

Víte už, jaký by mohl být zdrojový kód prvního pokusu pro seznámení s makry i jak by se mohl jmenovat modul, knihovna i knihovní kontejner, kam makro můžete uložit. Jestliže chcete splnit Úkol 20, verze „A“ nebo Úkol 19, verze „B“ (zprovozněte buď první – jednodušší – nebo druhou verzi výše uvedených maker), můžete se řídit následujícími radami:

(1). Volbou Nástroje | Makra | Správce maker | OpenOffice.org Basic... otevřete dialogové okno Makra v OpenOffice.org Basic.

(2). Klikněte na tlačítko Organizátor maker, abyste mohli vytvořit novou knihovnu maker, třeba s názvem Base. Otevře se okno Organizátor maker OpenOffice.org Basic. Zde vyberte třetí záložku Knihovny a klikněte na tlačítko Nový... Do textového pole Název v dalším okně Nová knihovna pak zapište její jméno (Base). Vše ukazuje obrázek.

 

Obrázek č. 3: Vytváříme novou knihovnu makerObrázek č. 3: Vytváříme novou knihovnu maker

(3). Po potvrzení názvu se nejmenší z oken zavře, pak zavřete i okno Organizátoru. Tím se vrátíte do okna Makra v OpenOffice.ogr Basic. Když otevřete (malým tlačítkem „plus“) novou knihovnu Base, zjistíte, že automaticky obsahuje jeden modul s názvem Module1 a v tomto modulu je zatím jediné makro s názvem Main. Klikněte na tento název makra a pak na tlačítko Upravit. Tím otevřete editor maker s modulem Module1.

(4). Zjistíte, že makro Main je zatím prázdné (obsahuje jen počáteční a koncový řádek Sub Main a End Sub. Pod toto makro nyní buď sami přepište kód výše uvedených maker (prvního, pokud jste si vybrali snazší verzi, nebo druhého a třetího u verze obtížnější), nebo snáze prostě vybraný zdrojový kód zkopírujte a do editoru vložte. Tyto změny v modulu uložte (nejrychleji volbou [Ctrl+S]).

(5). Editor maker (IDE) můžete zavřít.

Spuštění makra. Událost, spouštějící makro

Makro máte připravené, ale je ještě nutné umět ho spustit. I zde jsou dvě možnosti:

  1. Makro spustí přímo uživatel, a to volbou Nástroje | Makra | Spustit makro...
  2. Makro spustí Base (nebo jiný program kancelářského balíku) při výskytu nějaké události.

První možnost otevře dialogové okno s názvem Výběr makra, které nabízí dostupné knihovní kontejnery. V nich uživatel vyhledá vhodnou knihovnu a z ní vybere modul s makrem. V okně se zobrazí názvy maker v modulu, uživatel požadované vybere a spustí kliknutím na tlačítko Spustit. Okno je na obrázku č. 5 o něco níže. Tato možnost je ale dost těžkopádná a pro první zkušební makro, které se má samo spustit během načítání databáze, se nehodí. Doporučuji ale i tento způsob spuštění u pokusného makra vyzkoušet.

Druhá možnost je pro makra většinou výhodnější (rychlejší). Událostí, která makro spustí, může být např.:

  • Otevření dokumentu (to se týká zkušebního makra z této první části dílu),
  • Aktualizace záznamu databáze (tato událost se bude hodit pro makro ve formuláři v druhé části dílu),
  • Kliknutí na tlačítko ve formuláři apod.

Pro makra v tomto dílu použijete právě tuto druhou možnost, kdy makro spustí zvolená událost.

Spuštění zkušebního makra

Nastavení události pro spuštění makra vyzkoušejte nejdřív na zkušebním makru, které jste si před chvílí připravili. Postup je tento:

(1). V databázi Knihovna v Base zvolte volbu horního menu Nástroje | Přizpůsobit. Otevře se okno Přizpůsobit, které umožňuje nastavit ve čtyřech záložkách postupně položky Nabídek (menu) programu, klávesové zkratky, položky Panelů nástrojů (pro dotazy, formuláře apod.) a nakonec právě přiřazení akcí vybraným událostem. V dolní části okna si všimněte rozevíracího seznamu, ve kterém je zvolen dokument databáze Knihovna. Druhou volbou by byl OpenOffice.org, pak bychom vybrali událost týkající se celého kancelářského balíku.

Obrázek č. 4: Okno Přizpůsobit se záložkou UdálostiObrázek č. 4: Okno Přizpůsobit se záložkou Události

(2). V okně vyberte událost Otevřít dokument a potom klikněte na tlačítko Makro.

(3). V dalším okně Výběr makra vyberte pokusné makro, jehož zdrojový kód jste napsali nebo vložili do modulu v editoru maker. Toto okno bylo popsáno i o několik odstavců výše.

Obrázek č. 5: Vyberte makro, kterému chcete přiřadit událostiObrázek č. 5: Vyberte makro, kterému chcete přiřadit události

(4). V záložce Události okna Přizpůsobit se vybrané makro zobrazí i s názvem modulu a knihovny, např. takto: Base.Module1.UpozorneniSeZavrenim. Potvrďte přiřazení makra klávesou OK.

Mohli jste zvolit i jiný postup, který by vycházel z dříve uvedeného okna Makra v OpenOffice.org Basic, které otevřete výše uvedenou cestou Nástroje | Makra | Správce maker | OpenOffice.org Basic... (popř. se vraťte k obrázku č. 1). Zde stačí kliknout na tlačítko Přiřadit.

A to je vše. Zavřete okno databáze Knihovna a po jeho znovuotevření by se mělo makro projevit jedním nebo dvěma dialogovými okny, jak je to popsáno v odpovědi na otázku ze začátku tohoto dílu (odpověď je umístěna před koncem článku).

Druhá část: Makro pro formulář s rozevíracím seznamem

Opakování, účel makra

V předchozím dílu se nám podařilo ve formuláři vytvořit funkční jednoduchou roletku jako součást tabulky formuláře, např. pro výběr třídy při zápisu nového studenta jako čtenáře. Problémy nastaly, když rozevírací seznam měl být na formuláři jako samostatná komponenta:

  • Prvním problémem bylo zjištění, že vytvoření takové roletky v režimu průvodce formulářem není spolehlivé, roletka pak nemusí fungovat. Tento první problém jsme vyřešili tak, že jsme formulář se samostatným rozevíracím seznamem vytvořili v režimu návrhu (nikoli průvodcem).
  • Druhý problém spočíval v tom, že i takto vytvořená roletka nefungovala správně, protože po výběru nějaké hodnoty roletkou se neaktualizoval navigační panel (stále ukazoval číslo první položky), Base tedy nepřešel na jiný záznam, ale domníval se, že chceme měnit hodnotu položky v prvním záznamu. Tím nastávaly i problémy s integritou databáze (vypadalo to, jako byste chtěli duplikovat hodnoty primárního klíče apod.).

V druhé části tohoto dílu chceme vyřešit právě tento druhý problém. Uvedu potřebné makro a po úvodu v první části bude pro vás snadné je zprovoznit.

Úkol 21, verze „A“, Úkol 20, verze „B“: Podle následujícího textu opravte chybu ve fungování formuláře s kombinovaným polem jako samostatným ovládacím prvkem.

Popis makra

Makro zajistí po výběru jiné položky z kombinovaného pole aktualizaci formuláře – přechod na tuto položku. Jeho zdrojový kód by mohl být následující:

sub Aktualizace( oEventObject as object )
rem parametr makra oEventObject zastupuje objekt, volající makro,
'  čili zde kombinované pole
rem deklarace proměnných
dim oDataForm       ' proměnná, zastupující objekt formuláře
dim strSelectText   ' proměnná, zastupující vybraný text z komb. pole
dim oComboSelect    ' proměnná, zastupující rozevírací seznam - kombinované pole
dim nCount, nCounter as Integer
' nCound: počet položek seznamu, nCounter: pomocná proměnná cyklu
oDataForm = oEventObject.Source.Model.Parent   ' rodičem komb. pole je formulář
oComboSelect = oEventObject.Source     ' zdrojem činnosti je komb. pole
strSelectText = oComboSelect.SelectedText    ' funguje i oComboSelect.Text
' jen pomocný výpis vybrané položky, později tento výpis odstraňte
MsgBox "Byla vybrána položka " + oComboSelect.SelectedText
nCount = oComboSelect.getItemCount()   ' počet položek seznamu
' jen pomocný výpis vybrané položky, později tento výpis odstraňte
MsgBox "Počet položek je " + nCount
nCounter = 0   ' počáteční hodnota pomocné proměnné cyklu
' následující cyklus prochází položky kombinovaného pole,
' dokud nenajde uživatelem vybranou
Do While ( nCount > nCounter)
If strSelectText = oComboSelect.Items( nCounter ) then
' v cyklu se došlo k vybrané položce a provedou se dva následující příkazy
oDataForm.absolute(nCounter + 1)   ' přejde na položku číslo nCounter + 1
Exit Do   ' předčasně se ukončí cyklus
End If
' v cyklu se ještě nedošlo k vybrané položce a provede se jediný příkaz
nCounter = nCounter + 1
Loop   ' konec cyklu, znovu na podmínku Do While
end sub

Makro bylo převzato především z několika fór na toto téma a mírně upraveno. O metodách a příkazech můžete najít informace na stránkách o API (aplikačním programovém rozhraní) OpenOffice.org. Např. metoda absolute() je popsána na stránce rozhraní XResutlSet.

Zápis makra do modulu v editoru maker

Postup znáte z první části dílu. Připomínám jen, že k IDE s editorem maker se můžete dostat volbou Nástroje | Makra | Správce maker | OpenOffice.org Basic... V dialogovém okně Makra v OpenOffice.org Basic (viz obrázek č. 1) vyberete modul, který bude makro obsahovat (nebo můžete vytvořit nový). Pokud jste v první části založili knihovnu Base v knihovním kontejneru Moje Makra, můžete vybrat jeho modul s názvem Module1, do kterého jste už vepsali zkušební makro. Pak kliknete na tlačítko Upravit v pravé části okna. Tím otevřete editor maker (obrázek č. 2), kam můžete zdrojový kód makra opět vložit po zkopírování kódu uvedeného o pár odstavců výše. Změny v modulu uložte([Ctrl+s]), ale okno IDE ještě nechejte otevřené.

Sjednocení názvů komponent ve formuláři a v makru. Některá makra se odkazují na komponenty jejich skutečnými názvy (pro formulář používá Base přednastavený název MainForm, po vložení kombinovaného pole se této komponentě pravděpodobně nastaví název Kombinované pole, pokud ho v okně Vlastnosti nenastavíte jinak). Zde uvedené makro však podobné skutečné názvy nepoužívá, obchází to obecnými příkazy jako oEventObject.Source.Model.Parent a oEventObject.Source, kterými se odkaz na formulář a komponentu přiřadí pomocným proměnným (oDataForm, oComboSelect). O sjednocení názvů ve formuláři a v textu makra se tedy zde nemusíte starat.

Přiřazení makra události

I tuto činnost už znáte z první části dílu. Byly uvedeny dvě možnosti postupu, u tohoto makra musí být ale cesta k přiřazení makra ještě jiná. Proč? Pro naši potřebu bychom totiž mohli makra rozdělit na dva druhy takto:

  • Makra, týkající se celého dokumentu. To bylo např. pokusné makro z první části tohoto dílu, které mělo za úkol otevřít dialogové okno s hlášením při otevírání databáze Knihovna. Proto jste vybírali z událostí, spojených s celým dokumentem.
  • Makra, která se týkají jen jediného prvku, např. na formuláři. To je případ, kterým se zabýváme nyní, makro se má spustit při volbě jiné položky ovládacím prvkem Kombinované pole. Zde budeme makro přiřazovat události, týkající se jen tohoto ovládacího prvku. Asi byste přišli sami na to, že seznam těchto událostí najdete v jedné ze záložek okna Vlastnosti daného ovládacího prvku.

Tentokrát tedy nepoužijete volbu horního menu Nástroje | Přizpůsobit. Místo toho otevřete formulář v režimu návrhu (pravá klávesa myši, volba Upravit). Poté otevřete okno vlastností kombinovaného pole (např. dvojklikem na tento prvek). V okně přejděte do záložky Události. Tentokrát použijte událost Změna stavu položky, takže klikněte na tlačítko se třemi tečkami vpravo od této události. V okně Přiřadit akci použijte tlačítko Makro... Nakonec z dalšího dialogového okna Výběr makra (obrázek č. 5 výše) vyberte nové makro (v tomto článku má název Aktualizace). Přiřazení makra potvrďte klávesou OK.

Nyní zbývá jen činnost makra vyzkoušet. Ikonou Režim návrhu zap/vyp přejděte do normálního pracovního režimu formuláře. Když vyberete roletkou jiný obor, objeví se dvě hlášení (jaký obor byl vybrán a kolik je celkově oborů). Nakonec se formulář zaktualizuje podle vybraného oboru, což poznáte podle změny čísla na navigačním panelu v dolní části formuláře.

Úkol 22, verze „A“, Úkol 21, verze „B“: Upravte kód makra, použitého ve formuláři, aby nezobrazovalo informační okna s hlášením o vybrané položce a o počtu položek v seznamu.

Odpověď na otázku ze začátku tohoto dílu

Šlo o Úkol 19, verze „A“, Úkol 18, verze „B“ (Pročtěte si předchozí ukázky zdrojového kódu a promyslete, co by tato makra (malé prográmky) po svém spuštění vykonala.). Činnost maker je tato:

  1. První makro jen otevře jednoduché dialogové okno, které zobrazí text „Dobrý den. Tato databáze není ještě hotová.“
  2. Druhé makro po deklaraci proměnných postupně připraví textovou proměnnou s názvem Zprava, obsahující text „Dobrý den. Tato databáze není ještě hotová, takže vše ještě nefunguje, jak by mělo. Chcete pokračovat v práci?“ Potom se nastaví vzhled okna a jeho popisek („Úvodní informace“). Funkcí MsgBox(...) se zobrazí dialogové okno, které ale do programu vrátí hodnotu (číslo 6 nebo 7) podle toho, jestli uživatel klikne na tlačítko „Ano“ nebo „Ne“. Pokud bude návratová hodnota číslo 7, provedou se příkazy podmíněného příkazu If: zobrazí se dialog s textem „Nashledanou“ a vyvolá se třetí makro.
  3. Třetí makro je krátké, ale ne jednoduché. Jeho úkolem je správně – regulérně – zavřít databázi. Po deklaraci se proměnné dokument přiřadí odkaz na samotnou databázi, ve které makro běží (příkazem ThisComponent) a v podmíněném příkazu se zjišťuje, jestli se databáze Base hlásí k rozhraní XCloseable (jestli toto rozhraní implementuje). Pokud ano, bude program ukončen metodou close(true), pokud ne, bude ukončen příkazem dispose. Zde už se tedy používá dohodnutých příkazů aplikačního programového rozhraní (API) balíku OpenOffice.org.

Otázky na závěr – Shrnutí jedenáctého dílu

Seznámení s makry v Base, použití makra ve formuláři s roletkou

  1. Vysvětlete stručně, co je makro a k čemu se dá v programech kancelářského balíku použít.
  2. Makra se OpenOffice.org často píší v programovacím jazyku Basic. Napište podle ukázek zdrojového kódu, k čemu slouží v tomto jazyku příkazy SUB, REM, DIM, PRINT, MsgBox, IF – THEN – END IF.
  3. Uveďte aspoň jednu možnost, jakou je možné spustit běh makra.
  4. Zkuste stručně vysvětlit zkratky IDE (Integrated Development Environment) a API (Application Programming Interface).

Co vás čeká v dalším dílu?

Ve dvanáctém dílu seriálu o databázovém programu Base dodám, jak v opraveném formuláři s roletkou zadat nový obor a formulář dokončíme přidáním dalšího prvku. Bylo by také užitečné upravit makro, aby fungovalo nejen pro kombinované pole, ale také u ovládacího prvku seznam.

Později už snad nebude příliš obtížné připravit formulář pro zadávání dat do tabulek s vazbou M – M (už jste se seznámili s makry) a seriál se bude chýlit ke konci články o dotazech a sestavách.

(Jako ve škole) Průměr: 2,22 | Hodnotilo: 36
 

Komentáře

user avatar Martin
Odpovědět
Práce s databází Base z OpenOffice.org (11) – Formuláře: pokračování III.
8. 05. 2011, 00:48:16
Pane Svobodo,

skvělá práce tento seriál! Děkuji. Je tu spousta věcí, ke kterým jsem se ještě nedostal a hodlám je prostudovat.
V úvodu této kapitoly jsem ale, myslím, narazil na nepřesnost: Otázka číslo 1 Jak se liší kombinované pole od seznamu?
Mohou fungovat podobně, tedy jako roletka, ale podstata rozdílu je jinde: pole seznam se použije tam, kde je číselník definitivní, třeba seznam tříd, který je předem daný a neměnný, a pole seznam se vytvoří nad touto tabulkou. I kombinované pole lze vytvořit nad stejnou tabulkou - číselníkem, ale právě podstatný rozdíl je v tom, že u kombinovaného pole ve formuláři můžeme vepsat i jinou hodnotu, než obsahuje ten číselník. To ale není možné u pole se seznamem, tam je možné vepsat pouze hodnoty z toho číselníku.
user avatar redakce OpenOffice.cz
Odpovědět
Re:Práce s databází Base z OpenOffice.org (11) – Formuláře: pokračování III.
9. 05. 2011, 14:39:21
Pokud byste chtěl pana Svobodu podpořit a poděkovat mu, existuje možnost poslat finanční dar. Tento portál provozuje obecně prospěšná společnost Liberix, která disponuje omezenými finančními prostředky. Každá podpora je vřele vítána a děkujeme za ni. Pokud bude příchozí platba označena jménem autora, předáme ji. Pokud nebude, podpoříme třeba pana Pastierika - vyrábí pro OpenOffice.org doplňky. Jeho činnost podporujeme již mnoho měsíců, výsledky jsou zde ke stažení.

http://liberix.cz/podporte-nas/

Děkujeme dárcům i autorům.

Vlastimil Ott,
redakce OpenOffice.cz
Liberix, o.p.s.
user avatar neutr
Odpovědět
Re:Práce s databází Base z OpenOffice.org (11) – Formuláře: pokračování III.
8. 01. 2016, 14:36:58
Martine to co píšete je pravda. Také jsem se pokoušel (a nejen já) aby pan Svoboda pokračoval. Ale v té době byly zřejmě opravdové potíže s penězmi. Pan Ott to ví nejlépe. Byl v té době šéfredaktorem a zná pozadí a možná i všechny důvody proč to skončilo. To je také asi nepřímo důvod proč Vám na tento příspěvek odpověděl "podivným" způsobem.

Nicméně já jsem se snažil pana Svobodu vystopovat ve škole kde měl učit. Myslím že to byl nějaký gympl, ale už nevím kde. Tam se ale stopa ztratila a měl jsem dojem, že se přestěhoval (začal působit) v Brně. Z tohoto důvodu si myslím, že k předšasnému ukončení možná došlo na základě existenčních změn u pana Svobody. Takže nejspíě zapůsobilo vše dohromady.

Jinak s tím seznamem a Kombem je to trošku zapeklitější. Kdysi jsem ten problém popisoval ve fóru. Rozdílonost lze najít v obecné podobě například na Wiki. (jde ale o obecné ovládací prvky). Skutečně Combobox je odvozen z funkční kombinace seznamu (ListBox) a textového inputu. Ovšem tyto prvky může klasifikovat jako ActiveX. Tedy původ ve Windows. Ovšem AOO a LO jsou původem z Linuxu, takže tyto prvky jsou nějak portované pomocí UNO, nebo Java (nevím jak to dělají opravdu).

Jde vlastně jen o import/export s jinými formáty. Takže Linux může mít a má vlastní grafické zpracování a obsluhu. Takže Prvky v AOO (LO) neumí totéž co ty v HTML (XML ap). Jde sice o malé odchylky, ale jsou takové, nebo alespoň v určitých verzích byly. To platí právě o starších verzích. Takže pro pana Svobodu mesela být vodítkem nápověda tehdy aktuální verze. Tam hledejte původ té Vámi připomenuté nepřesnosti.

Jinak já se osobně zrovna zabývám databázemi a to k čemu se dopracovávám mne irituje. je potřeba znát plno triků - jako například používat navigátor, protože jinak to co potřebujete nesetrojíte. Sestrojit vazbu M:N vyžaduje trik který jsem sice jednou našel, ale podruhé jsem to musel dohledat znovu. Vazby 1:n nefungují jak mají a donutit databázi aby neco udělala je fakt kumšt. Přesto mám databáze všechn měst ulic a popisných čísel - a umím z toho těžit vzdálenosti (geotracing ap.). Souřadnice automaticky tahám makry z Google a cesty ze Seznamu. Je to (bude to) přepracovaná databáze z XML souboru která poskytuje MVCR ke stažení (služby - názvy ulic). Má to ale 51 MB ve formýtu XML a vyčůraně tam není schema, pžestože to popisují jako soubor XML se schematem. Obyčejný smrterlník to ani neotevře. To se musí dělat parserem, který je bez schematu nahraný. (Ale je toho více co se mi nelíbí na přístupnosti informací_()

Myslím že toho umín hodně, ale ne dost na to, abych udělal manuál k databázím v AOO, LO. Právě proto před panem Svobodou smekám. Já se pouštím do různých šíleností, ale tohodle bych asi nedal.
user avatar Ludmila
Odpovědět
Práce s databází Base z OpenOffice.org (11) – Formuláře: pokračování III.
7. 07. 2011, 21:42:07
Pane Svobodo, moc děkuji za celý ten cyklus i hodně zajímavé odkazy. Líbí se mi i didaktická stránka a jsem velmi ráda, že reagujete na požadavky k maturitní zkoušce. Dodal jste mi odvahu, že i cestou svobodného software je možné žáky k nové maturitě z informatiky přivést :-).
user avatar Josef Svoboda
Odpovědět
Re:Práce s databází Base z OpenOffice.org (11) – Formuláře: pokračování III.
10. 07. 2011, 20:11:13
Děkuji za Váš vzkaz. Pokud jste seriál použila ve výuce, byl bych rád, kdybyste mi napsala nějaký postřeh nebo nápad na vylepšení (seriál bude končit, chystám se pro konečnou verzi provést ještě nějaké úpravy a to by mi pomohlo). Buď do této diskuse nebo na můj mail.
Možná by kantorům i balíku OpenOffice mohlo pomoci, kdyby redakce portálu zřídila nějakou rubriku právě pro nás, kde by se daly publikovat přímo materiály pro výuku programů balíku, popř. články portálu, které by někdo vybral a uspořádal jako volné seriály, dál rady a postřehy k nim apod. Co myslíte?
user avatar redakce OpenOffice.cz
Odpovědět
Re:Re:Práce s databází Base z OpenOffice.org (11) – Formuláře: pokračování III.
12. 07. 2011, 08:53:41
Během prázdnin portál vylepšíme, takže budeme rádi, když do fóra napíšete návrhy:

http://forum.openoffice.cz/viewtopic.php?id=1708

Jinak je k dispozici wiki, můžeme vám zřídit blog a vaše materiály rádi uveřejníme také na www.linuxveskole.cz. Prosím tedy o konkrétní námět.

Děkujeme
user avatar Ludmila Chladkova
Odpovědět
Re:Re:Práce s databází Base z OpenOffice.org (11) – Formuláře: pokračování III.
21. 07. 2011, 19:59:24
Napad s portalem pro kantory se mi moc libi. Base bych chtela zacit ucit nekdy na podzim, odhadem rijen ci listopad, rada se pak o zkusenosti podelim (stredni odborna skola netechnickeho zamereni).
user avatar MŠi
Odpovědět
Práce s databází Base z OpenOffice.org (11) – Formuláře: pokračování III.
20. 09. 2011, 15:29:38
K případnému pokračování doporučuji uvážit ještě otázku následující údržby existující databáze. Zejména pokud je potřeba měnit strukturu způsobem, kterému se Base z nějakých důvodů brání (hlídá integritu vazeb, existující data a neobejte to wizardovsky). Nějaké nejzákladnější případy.

U malých kancelářských aplikací (myslím výslednou databázovou aplikaci vybudovanou v Base) ani nejde očekávat definitivní ideální analýzu a neměnnost podmínek.

Za dosavadní obsah děkuji. Minimálně je to pěkný startup a nápověda, co dále hledat v dokumentaci pro získání potřebné rutiny.
user avatar Nezapamatovatelnejmeno
Odpovědět
Práce s databází Base z OpenOffice.org (11) – Formuláře: pokračování III.
16. 12. 2011, 20:21:42
Děkuji za výborný seriál. Poslední díl je už staršího data, přitom bylo přislíbeno pokračování. Bude?
user avatar Eva Zatloukalová
Odpovědět
Práce s databází Base z OpenOffice.org (11) – Formuláře: pokračování III.
16. 04. 2012, 21:32:40
Vypadá to, že dokončení seriálu už nebude. Škoda. Nebo se mýlím?
Krásný den.
e.
user avatar Pavel Mráček
Odpovědět
Combo box
13. 04. 2014, 20:46:56
Dobrý den ,
jsem začátečník v linuxu .Upravil jsem makro dle popisu a na řádku programu oDataForm = oEventObject.Source.Model.Parent ' rodičem komb. pole je formulář se mi makro zastaví.Hlásí mi chybu "BASIC - chyba při běhu. Argument není volitelný" .
Můžete mi poradit.
Děkuji
user avatar Tomáš
Odpovědět
Práce s databází Base z OpenOffice.org (11) – Formuláře: pokračování III.
8. 01. 2016, 12:40:41
Dobrý den,
chtěl jsem se zeptat, zda tento seriál někde dále pokračuje, nebo takto skončil?
Děkuji za odpověď
user avatar Lukáš Jelínek
Odpovědět
Re:Práce s databází Base z OpenOffice.org (11) – Formuláře: pokračování III.
8. 01. 2016, 15:04:45
Dobrý den, seriál bohužel před 5 lety takto skončil. Zkusím se s panem Svobodou dohodnout, že by v něm pokračoval, resp. na něj navázal (protože úplně plynule pokračovat už těžko půjde, za ty roky se leccos změnilo).

Přidat názor

 

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích najdete v nápovědě. Diskuzi můžete sledovat pomocí RSS kanálu.

 
Josef Svoboda

Josef Svoboda

J. Svoboda učí M, F a IVT na Gymnáziu ve Frýdlantu nad Ostravicí

 
 
 
woo jaw demo hz