Nedávno jsem byl pověřen vytvořením tiskopisů pro naši vnitřní firemní potřebu. Jednalo se o podpisové archy s použitím databázových dat. První volba padla na generátor sestav, ale po několika hodinách zkoušení (pravda, pracoval jsem s tím snad podruhé v životě) jsem tuto cestu vzdal.
Mám již nějaké zkušenosti s programováním a mezi jinými i s databází Base z OpenOffice.org, takže jsem se rozhodl vyřešit úkol tímto způsobem. Nechci tvrdit, že je to jediný možný nebo nejefektivnější a nejsnadnější způsob, prostě jsem se touto cestou vydal a při jejím řešení jsem se toho zase hodně naučil. Své zkušenosti bych vám chtěl touto cestou předat, snad i vás něčím tento článek obohatí.
Ve výchozím stavu jsem měl datový zdroj ODBC, ale pro tento příklad je makro přepsané na „obyčejnou“ databázi a úkol: vyhotovit sestavu členů. Těch je opravdu hodně a jsou rozděleni do jakýchsi „obvodů“. Sestavy by měly být pro každý z nich zvlášť.
Prvním problémem bylo vyřešit, jak se k datovému zdroji připojit. Nejsem znalec všech těch „com.sun.star“, ale mám vyhledávač Google a skvělé publikace od Andrewa Pitonyaka, tak s chutí do toho!
Jak na sestavy a propojení dat
Nalezený stručný návod se proměnil v jednoduchou funkci
getDataFromSourceRS(cStrediska) as Variant
která vytvoří připojení a vrací rovnou výsledek „zadrátovaného“ dotazu (tady jiný dotaz nevolám, takže „když to funguje, nesahám na to“...)
Vedlejším produktem tohoto ulehčení ovšem bylo (alespoň myslím, že to bylo právě tímto), že „zadrátovaná“ proměnná pro spojení nejde po použití uvolnit. Zřejmě zabírá nějaký slot pro spojení s MySQL (v původním dokumentu; předkládaná varianta je už spojená s nativním Base) a po asi 15 použitích vedla k zablokování spojení a nutnosti ukončení OpenOffice.org a pak znovuotevření dokumentu se sestavou. Vy šikovnější si můžete tuto funkci rozdělit na jednotlivé fáze (tj. připojení + vytažení a následné předání dat) a trošku je parametrizovat, aby byly univerzálnější.
Dalším krokem bylo načítání záznamů a jejich umísťování v tabulce. Než data do textové tabulky umístíte, nějakou si musíte vytvořit a naformátovat. Ale také případně smazat původní z předchozího načítání. Na to máme deletetables() a CreateTable(odoc, nColumns). Později insertNewRow(aDataRow) a jako perlička je ukazatel ve statusbaru řízený skrze objekt oSBar.setValue(nRow).
V sestavě je také nastavováno záhlaví a jsou do něj umísťována – kromě běžného textu – pole „číslo strany“ a „počet stran“.
oHeader.setString("") oHTextC = oHeader.createTextCursor() fldPages = oDoc.createInstance("com.sun.star.text.TextField.PageCount") fldPages.NumberingType = 4 fldCurPage = oDoc.createInstance("com.sun.star.text.TextField.PageNumber") fldCurPage.NumberingType = 4 fldCurPage.SubType = com.sun.star.text.PageNumberType.CURRENT oHeader.insertString(oHtextC, "Seznam členů střediska " & nStredisko & " " & sStredName & chr(9) & "strana ", False) oHeader.insertTextContent(oHTextC, fldCurPage, False) oHeader.insertString(oHtextC," / ", False) oHeader.insertTextContent(oHTextC, fldPages, False)
Ostatní části kódu, myslím, nepotřebují komentář.
V příloze najdete jak samotný textový dokument, tak databázový soubor. Databáze byla vytvořena generátorem osob vlastní výroby, a jistě není dokonalá. I v předkládané sestavě není vše jako v původní, zcela chybí část adresy a podobně, ale je to jen příklad, který se dá doladit dle potřeb.
Aby byla ukázka funkční, musíte databázový soubor členové.odb zaregistrovat. Registraci provedete prostřednictvím Nástroje | Volby | OpenOffice.org Base | Databáze – vyberete volbu nová a zvolíte soubor k registraci.
Stáhněte si ukázkový soubor Členové:
Stáhněte si ukázkový soubor Sestava studie: